srcdev-nuxt-components 9.4.11 → 9.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/skills/component-aria-landmark.md +1 -1
- package/.claude/skills/component-dynamic-slots.md +0 -1
- package/.claude/skills/component-export-types.md +3 -3
- package/.claude/skills/component-inline-action-button.md +7 -7
- package/.claude/skills/component-local-style-override.md +134 -50
- package/.claude/skills/component-naming.md +107 -0
- package/.claude/skills/components/action-menu.md +18 -14
- package/.claude/skills/components/alert-content.md +110 -0
- package/.claude/skills/components/alert-mask-core.md +15 -1
- package/.claude/skills/components/alert-masked-content.md +95 -0
- package/.claude/skills/components/auto-grid.md +21 -13
- package/.claude/skills/components/canvas-switcher.md +3 -3
- package/.claude/skills/components/capture-qr-code.md +19 -9
- package/.claude/skills/components/carousel-flip.md +3 -3
- package/.claude/skills/components/container-glow.md +2 -2
- package/.claude/skills/components/content-docs.md +9 -5
- package/.claude/skills/components/cookie-consent-banner.md +16 -17
- package/.claude/skills/components/dashboard-quad-grid.md +4 -4
- package/.claude/skills/components/decode-qr-code.md +15 -9
- package/.claude/skills/components/display-avatar.md +16 -31
- package/.claude/skills/components/display-chip.md +15 -10
- package/.claude/skills/components/display-dialog.md +3 -1
- package/.claude/skills/components/display-pill.md +17 -75
- package/.claude/skills/components/display-prompt.md +11 -19
- package/.claude/skills/components/display-qr-code.md +5 -0
- package/.claude/skills/components/display-theme-switch.md +7 -6
- package/.claude/skills/components/display-toast.md +5 -6
- package/.claude/skills/components/entry-animation.md +2 -5
- package/.claude/skills/components/eyebrow-text.md +6 -4
- package/.claude/skills/components/form-field.md +79 -0
- package/.claude/skills/components/form-fieldset.md +75 -0
- package/.claude/skills/components/form-wrapper.md +71 -0
- package/.claude/skills/components/glass-panel.md +60 -51
- package/.claude/skills/components/grid-stack.md +8 -2
- package/.claude/skills/components/header-block.md +1 -1
- package/.claude/skills/components/hero-text.md +8 -6
- package/.claude/skills/components/input-button.md +72 -0
- package/.claude/skills/components/input-checkbox-radio.md +149 -0
- package/.claude/skills/components/input-checkbox.md +148 -0
- package/.claude/skills/components/input-description.md +102 -0
- package/.claude/skills/components/input-error.md +105 -0
- package/.claude/skills/components/input-label.md +119 -0
- package/.claude/skills/components/{input-number-core.md → input-number.md} +41 -36
- package/.claude/skills/components/input-radio.md +95 -0
- package/.claude/skills/components/input-range-core.md +4 -4
- package/.claude/skills/components/input-select-core.md +1 -1
- package/.claude/skills/components/input-text-core.md +8 -6
- package/.claude/skills/components/input-textarea-core.md +4 -4
- package/.claude/skills/components/layout-grid-by-cols.md +31 -43
- package/.claude/skills/components/link-text.md +2 -2
- package/.claude/skills/components/opening-hours.md +116 -0
- package/.claude/skills/components/page-hero-highlights.md +35 -35
- package/.claude/skills/components/page-row.md +1 -1
- package/.claude/skills/components/pending-effect.md +63 -0
- package/.claude/skills/components/price-list.md +72 -0
- package/.claude/skills/components/pricing-card.md +3 -3
- package/.claude/skills/components/profile-section.md +6 -4
- package/.claude/skills/components/samaritan-prompt.md +140 -0
- package/.claude/skills/components/scroll-reveal-frame.md +21 -20
- package/.claude/skills/components/scroll-reveal-image.md +31 -21
- package/.claude/skills/components/service-detail.md +2 -2
- package/.claude/skills/components/services-card-grid.md +5 -4
- package/.claude/skills/components/services-card.md +12 -10
- package/.claude/skills/components/site-navigation.md +20 -6
- package/.claude/skills/components/slider-gallery.md +88 -0
- package/.claude/skills/components/social-icons-list.md +12 -6
- package/.claude/skills/components/tab-navigation.md +1 -1
- package/.claude/skills/components/text-block.md +68 -0
- package/.claude/skills/components/toggle-switch-core.md +3 -3
- package/.claude/skills/components/triple-toggle-switch.md +85 -0
- package/.claude/skills/composable-zod-validation.md +1 -1
- package/.claude/skills/consumer-styles-structure.md +153 -0
- package/.claude/skills/icon-sets.md +3 -3
- package/.claude/skills/icon-sizing.md +66 -0
- package/.claude/skills/index.md +35 -16
- package/.claude/skills/new-app-scaffold.md +45 -7
- package/.claude/skills/pull-request-description.md +1 -0
- package/.claude/skills/storybook-add-story.md +53 -5
- package/.claude/skills/testing-add-playwright.md +1 -1
- package/.claude/skills/theming-colour-ramps.md +25 -3
- package/.claude/skills/theming-component-token-pattern.md +16 -16
- package/.claude/skills/theming-override-default.md +7 -0
- package/.claude/skills/theming-partial-override.md +1 -1
- package/.claude/skills/theming-typography-tokens.md +1 -1
- package/.claude/skills/vercel-node-version.md +1 -1
- package/.vscode/srcdev-component-action-menu.code-snippets +42 -0
- package/.vscode/srcdev-component-alert-content.code-snippets +36 -0
- package/.vscode/srcdev-component-alert-masked-content.code-snippets +35 -0
- package/.vscode/srcdev-component-auto-grid.code-snippets +39 -0
- package/.vscode/srcdev-component-capture-decode-qr-code.code-snippets +28 -0
- package/.vscode/srcdev-component-content-docs.code-snippets +4 -4
- package/.vscode/srcdev-component-cookie-consent-banner.code-snippets +33 -0
- package/.vscode/srcdev-component-display-avatar.code-snippets +28 -0
- package/.vscode/srcdev-component-display-chip.code-snippets +27 -0
- package/.vscode/srcdev-component-display-pill.code-snippets +38 -0
- package/.vscode/srcdev-component-display-prompt.code-snippets +10 -54
- package/.vscode/srcdev-component-display-qr-code.code-snippets +22 -0
- package/.vscode/srcdev-component-eyebrow-text.code-snippets +19 -0
- package/.vscode/srcdev-component-form-field.code-snippets +25 -0
- package/.vscode/srcdev-component-form-fieldset.code-snippets +36 -0
- package/.vscode/srcdev-component-form-wrapper.code-snippets +30 -0
- package/.vscode/srcdev-component-glass-panel.code-snippets +38 -0
- package/.vscode/srcdev-component-grid-stack.code-snippets +49 -0
- package/.vscode/srcdev-component-input-button.code-snippets +27 -0
- package/.vscode/srcdev-component-input-checkbox-radio.code-snippets +60 -0
- package/.vscode/srcdev-component-input-checkbox.code-snippets +48 -0
- package/.vscode/srcdev-component-input-description.code-snippets +44 -0
- package/.vscode/srcdev-component-input-error.code-snippets +30 -0
- package/.vscode/srcdev-component-input-label.code-snippets +39 -0
- package/.vscode/srcdev-component-input-number.code-snippets +11 -11
- package/.vscode/srcdev-component-input-radio.code-snippets +58 -0
- package/.vscode/srcdev-component-layout-grid-by-cols.code-snippets +46 -0
- package/.vscode/srcdev-component-link-text.code-snippets +30 -0
- package/.vscode/srcdev-component-opening-hours.code-snippets +40 -0
- package/.vscode/srcdev-component-page-hero-highlights.code-snippets +37 -0
- package/.vscode/srcdev-component-page-row.code-snippets +47 -0
- package/.vscode/srcdev-component-pending-effect.code-snippets +26 -0
- package/.vscode/srcdev-component-price-list.code-snippets +37 -0
- package/.vscode/srcdev-component-pricing-card.code-snippets +2 -2
- package/.vscode/srcdev-component-profile-section.code-snippets +36 -0
- package/.vscode/srcdev-component-samaritan-prompt.code-snippets +60 -0
- package/.vscode/srcdev-component-scroll-reveal-frame.code-snippets +36 -0
- package/.vscode/srcdev-component-scroll-reveal-image.code-snippets +46 -0
- package/.vscode/srcdev-component-services-card.code-snippets +4 -4
- package/.vscode/srcdev-component-services-grids.code-snippets +36 -0
- package/.vscode/srcdev-component-site-navigation.code-snippets +26 -18
- package/.vscode/srcdev-component-slider-gallery.code-snippets +9 -0
- package/.vscode/srcdev-component-social-icons-list.code-snippets +24 -0
- package/.vscode/srcdev-component-stepper-list.code-snippets +39 -0
- package/.vscode/srcdev-component-text-block.code-snippets +31 -0
- package/.vscode/srcdev-component-triple-toggle-switch.code-snippets +30 -0
- package/README.md +2 -2
- package/app/app.config.ts +10 -0
- package/app/assets/styles/setup/02.colours/_orange.css +11 -11
- package/app/assets/styles/setup/02.colours/_theme-params.css +2 -2
- package/app/assets/styles/setup/03.theming/_default.css +1 -22
- package/app/assets/styles/setup/03.theming/_theme-slots.css +1 -1
- package/app/assets/styles/setup/03.theming/_warning.css +8 -10
- package/app/assets/styles/setup/04.elements/forms/02.typography.css +0 -14
- package/app/assets/styles/setup/04.elements/forms/06.button-geometry.css +1 -1
- package/app/assets/styles/setup/index.css +1 -1
- package/app/components/01.atoms/alert-mask/AlertMaskCore.vue +23 -5
- package/app/components/01.atoms/alert-mask/CONSUMER-STYLING.md +23 -5
- package/app/components/01.atoms/alert-mask/stories/AlertMaskCore.stories.ts +45 -19
- package/app/components/01.atoms/alert-mask/tests/AlertMaskCore.spec.ts +35 -1
- package/app/components/01.atoms/animations/animated-svg-text/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/animations/clip-element/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/animations/clip-element/ClipElement.vue +2 -2
- package/app/components/01.atoms/animations/container-glow/CONSUMER-STYLING.md +26 -5
- package/app/components/01.atoms/animations/entry/.nuxt/app.config.mjs +21 -0
- package/app/components/01.atoms/animations/entry/.nuxt/components.d.ts +66 -0
- package/app/components/01.atoms/animations/entry/.nuxt/imports.d.ts +30 -0
- package/app/components/01.atoms/animations/entry/.nuxt/manifest/meta/test.json +1 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/app.config.d.ts +35 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/build.d.ts +23 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/builder-env.d.ts +1 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/components.d.ts +71 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/imports.d.ts +386 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/middleware.d.ts +11 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/modules.d.ts +79 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-layouts.d.ts +17 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-nuxt.d.ts +64 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/plugins.d.ts +29 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/runtime-config.d.ts +32 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/shared-imports.d.ts +10 -0
- package/app/components/01.atoms/animations/entry/.nuxt/types/vue-shim.d.ts +0 -0
- package/app/components/01.atoms/animations/entry/.nuxtrc +1 -0
- package/app/components/01.atoms/animations/entry/CONSUMER-STYLING.md +65 -0
- package/app/components/01.atoms/animations/entry/EntryAnimation.vue +6 -5
- package/app/components/01.atoms/animations/entry/node_modules/.cache/nuxt/chrome-workspace.json +1 -0
- package/app/components/01.atoms/animations/entry/node_modules/.cache/vite/client/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +1 -0
- package/app/components/01.atoms/animations/entry/stories/EntryAnimation.stories.ts +1 -1
- package/app/components/01.atoms/animations/entry/tests/EntryAnimation.spec.ts +25 -0
- package/app/components/01.atoms/animations/glowing-border/CONSUMER-STYLING.md +24 -5
- package/app/components/01.atoms/animations/marquee-scroller/CONSUMER-STYLING.md +20 -0
- package/app/components/01.atoms/animations/rotating-carousel-image/CONSUMER-STYLING.md +17 -0
- package/app/components/01.atoms/animations/scroll-reveal-frame/CONSUMER-STYLING.md +77 -0
- package/app/components/01.atoms/animations/scroll-reveal-frame/ScrollRevealFrame.vue +37 -78
- package/app/components/01.atoms/animations/scroll-reveal-frame/stories/ScrollRevealFrame.stories.ts +48 -0
- package/app/components/01.atoms/animations/scroll-reveal-frame/tests/ScrollRevealFrame.spec.ts +40 -33
- package/app/components/01.atoms/animations/scroll-reveal-frame/tests/__snapshots__/ScrollRevealFrame.spec.ts.snap +4 -4
- package/app/components/01.atoms/animations/scroll-reveal-image/CONSUMER-STYLING.md +74 -0
- package/app/components/01.atoms/animations/scroll-reveal-image/ScrollRevealImage.vue +14 -44
- package/app/components/01.atoms/animations/scroll-reveal-image/stories/ScrollRevealImage.stories.ts +50 -1
- package/app/components/01.atoms/animations/scroll-reveal-image/tests/ScrollRevealImage.spec.ts +27 -20
- package/app/components/01.atoms/animations/scroll-reveal-image/tests/__snapshots__/ScrollRevealImage.spec.ts.snap +4 -4
- package/app/components/01.atoms/animations/section-parallax/CONSUMER-STYLING.md +21 -4
- package/app/components/01.atoms/animations/view-timeline/CONSUMER-STYLING.md +25 -0
- package/app/components/01.atoms/banner-video/CONSUMER-STYLING.md +12 -5
- package/app/components/01.atoms/canvas-switcher/CONSUMER-STYLING.md +20 -7
- package/app/components/01.atoms/canvas-switcher/CanvasSwitcher.vue +12 -7
- package/app/components/01.atoms/card/CONSUMER-STYLING.md +47 -42
- package/app/components/01.atoms/card/CardCore.vue +7 -17
- package/app/components/01.atoms/clipped-panel/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/content-wrappers/docs-pages/CONSUMER-STYLING.md +127 -0
- package/app/components/01.atoms/content-wrappers/docs-pages/ContentDocs.vue +44 -77
- package/app/components/01.atoms/content-wrappers/docs-pages/stories/ContentDocs.stories.ts +3 -3
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +14 -1
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts +2 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts +2 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/CONSUMER-STYLING.md +72 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/LayoutGridByCols.vue +26 -25
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/stories/LayoutGridByCols.stories.ts +91 -107
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/LayoutGridByCols.spec.ts +50 -15
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +5 -5
- package/app/components/01.atoms/display-banner/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/display-dialog/CONSUMER-STYLING.md +82 -54
- package/app/components/01.atoms/display-dialog/DisplayDialog.vue +38 -45
- package/app/components/01.atoms/display-dialog/stories/DisplayDialog.stories.ts +25 -0
- package/app/components/01.atoms/display-dialog/tests/DisplayDialog.spec.ts +21 -0
- package/app/components/01.atoms/display-pill/CONSUMER-STYLING.md +112 -0
- package/app/components/01.atoms/display-pill/DisplayPill.vue +88 -50
- package/app/components/01.atoms/display-pill/stories/DisplayPill.stories.ts +56 -3
- package/app/components/01.atoms/display-pill/tests/DisplayPill.spec.ts +104 -4
- package/app/components/01.atoms/display-pill/tests/__snapshots__/DisplayPill.spec.ts.snap +3 -3
- package/app/components/01.atoms/display-tooltip/CONSUMER-STYLING.md +22 -2
- package/app/components/01.atoms/display-tooltip/DisplayTooltip.vue +18 -26
- package/app/components/01.atoms/glass-panel/CONSUMER-STYLING.md +91 -0
- package/app/components/01.atoms/glass-panel/GlassPanel.vue +34 -30
- package/app/components/01.atoms/glass-panel/stories/GlassPanel.stories.ts +121 -0
- package/app/components/01.atoms/glass-panel/tests/GlassPanel.spec.ts +61 -0
- package/app/components/01.atoms/grids/auto-grid/AutoGrid.vue +5 -10
- package/app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md +76 -0
- package/app/components/01.atoms/grids/auto-grid/stories/AutoGrid.stories.ts +5 -4
- package/app/components/01.atoms/grids/auto-grid/tests/AutoGrid.spec.ts +8 -0
- package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +11 -2
- package/app/components/01.atoms/grids/grid-stack/CONSUMER-STYLING.md +76 -0
- package/app/components/01.atoms/grids/grid-stack/GridStack.vue +6 -1
- package/app/components/01.atoms/grids/grid-stack/stories/GridStack.stories.ts +1 -1
- package/app/components/01.atoms/grids/grid-stack/tests/GridStack.spec.ts +35 -0
- package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +11 -2
- package/app/components/01.atoms/navigation/breadcrumb/Breadcrumb.vue +5 -10
- package/app/components/01.atoms/navigation/breadcrumb/CONSUMER-STYLING.md +15 -0
- package/app/components/01.atoms/navigation/skip-links/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/navigation/tabs/CONSUMER-STYLING.md +21 -0
- package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +46 -8
- package/app/components/01.atoms/page-row/PageRow.vue +17 -13
- package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +8 -0
- package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +7 -11
- package/app/components/01.atoms/pop-over/CONSUMER-STYLING.md +13 -0
- package/app/components/01.atoms/qr-code/CONSUMER-STYLING.md +48 -0
- package/app/components/01.atoms/qr-code/DisplayQrCode.vue +5 -1
- package/app/components/01.atoms/qr-code/stories/DisplayQrCode.stories.ts +11 -3
- package/app/components/01.atoms/qr-code/tests/DisplayQrCode.spec.ts +15 -0
- package/app/components/01.atoms/text-block/CONSUMER-STYLING.md +49 -0
- package/app/components/01.atoms/text-block/TextBlock.vue +13 -5
- package/app/components/01.atoms/text-block/stories/TextBlock.stories.ts +84 -0
- package/app/components/01.atoms/text-block/tests/TextBlock.spec.ts +78 -0
- package/app/components/01.atoms/text-block/tests/__snapshots__/TextBlock.spec.ts.snap +7 -0
- package/app/components/01.atoms/text-blocks/eyebrow-text/CONSUMER-STYLING.md +56 -0
- package/app/components/01.atoms/text-blocks/eyebrow-text/EyebrowText.vue +10 -5
- package/app/components/01.atoms/text-blocks/eyebrow-text/tests/EyebrowText.spec.ts +11 -0
- package/app/components/01.atoms/text-blocks/header-block/CONSUMER-STYLING.md +16 -1
- package/app/components/01.atoms/text-blocks/hero-text/CONSUMER-STYLING.md +74 -0
- package/app/components/01.atoms/text-blocks/hero-text/HeroText.vue +14 -9
- package/app/components/01.atoms/text-blocks/hero-text/tests/HeroText.spec.ts +11 -0
- package/app/components/01.atoms/text-blocks/link-text/CONSUMER-STYLING.md +45 -0
- package/app/components/01.atoms/text-blocks/link-text/LinkText.vue +15 -8
- package/app/components/01.atoms/text-blocks/link-text/tests/LinkText.spec.ts +11 -0
- package/app/components/01.atoms/ui-block-decorated/CONSUMER-STYLING.md +13 -0
- package/app/components/02.molecules/action-menu/ActionMenu.vue +28 -30
- package/app/components/02.molecules/action-menu/{ActionMenuItemCore.vue → ActionMenuItem.vue} +12 -14
- package/app/components/02.molecules/action-menu/CONSUMER-STYLING.md +90 -76
- package/app/components/02.molecules/action-menu/stories/ActionMenu.stories.ts +48 -41
- package/app/components/02.molecules/action-menu/tests/ActionMenu.spec.ts +46 -1
- package/app/components/02.molecules/action-menu/tests/{ActionMenuItemCore.spec.ts → ActionMenuItem.spec.ts} +11 -5
- package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItem.spec.ts.snap +27 -0
- package/app/components/02.molecules/alert-content/AlertContent.vue +17 -8
- package/app/components/02.molecules/alert-content/AlertContentInner.vue +57 -30
- package/app/components/02.molecules/alert-content/CONSUMER-STYLING.md +84 -0
- package/app/components/02.molecules/alert-content/stories/AlertContent.stories.ts +39 -0
- package/app/components/02.molecules/alert-content/tests/AlertContent.spec.ts +32 -0
- package/app/components/02.molecules/alert-content/tests/AlertContentInner.spec.ts +32 -0
- package/app/components/02.molecules/alert-masked-content/AlertMaskedContent.vue +9 -5
- package/app/components/02.molecules/alert-masked-content/CONSUMER-STYLING.md +73 -0
- package/app/components/02.molecules/alert-masked-content/stories/AlertMaskedContent.stories.ts +91 -10
- package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +52 -0
- package/app/components/02.molecules/cookie-consent-banner/CONSUMER-STYLING.md +95 -0
- package/app/components/02.molecules/cookie-consent-banner/CookieConsentBanner.vue +149 -0
- package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/stories/CookieConsentBanner.stories.ts +22 -3
- package/app/components/{01.atoms → 02.molecules}/cookie-consent-banner/tests/CookieConsentBanner.spec.ts +81 -4
- package/app/components/02.molecules/display-avatar/CONSUMER-STYLING.md +63 -0
- package/app/components/02.molecules/display-avatar/DisplayAvatar.vue +120 -0
- package/app/components/{01.atoms → 02.molecules}/display-avatar/stories/DisplayAvatar.stories.ts +56 -14
- package/app/components/{01.atoms → 02.molecules}/display-avatar/tests/DisplayAvatar.spec.ts +43 -11
- package/app/components/02.molecules/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +11 -0
- package/app/components/02.molecules/display-chip/CONSUMER-STYLING.md +57 -0
- package/app/components/02.molecules/display-chip/DisplayChip.vue +50 -83
- package/app/components/02.molecules/display-chip/tests/DisplayChip.spec.ts +10 -10
- package/app/components/02.molecules/display-chip/tests/__snapshots__/DisplayChip.spec.ts.snap +4 -4
- package/app/components/02.molecules/display-theme-switch/CONSUMER-STYLING.md +25 -4
- package/app/components/02.molecules/display-theme-switch/DisplayThemeSwitch.vue +9 -6
- package/app/components/02.molecules/display-theme-switch/stories/DisplayThemeSwitch.stories.ts +6 -1
- package/app/components/02.molecules/display-theme-switch/tests/DisplayThemeSwitch.spec.ts +10 -1
- package/app/components/02.molecules/display-tooltip-defined/CONSUMER-STYLING.md +11 -0
- package/app/components/02.molecules/expandable/accordian/CONSUMER-STYLING.md +11 -4
- package/app/components/02.molecules/expandable/expanding-panel/CONSUMER-STYLING.md +12 -5
- package/app/components/02.molecules/expandable/expanding-panel-classic/CONSUMER-STYLING.md +12 -5
- package/app/components/02.molecules/input-copy/CONSUMER-STYLING.md +12 -5
- package/app/components/02.molecules/input-copy/InputCopy.vue +12 -25
- package/app/components/02.molecules/input-copy/stories/InputCopy.stories.ts +1 -1
- package/app/components/02.molecules/input-copy/tests/InputCopy.spec.ts +1 -1
- package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +13 -0
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +11 -0
- package/app/components/02.molecules/navigation/site-navigation/CONSUMER-STYLING.md +109 -0
- package/app/components/02.molecules/navigation/site-navigation/SiteNavigation.vue +37 -55
- package/app/components/02.molecules/navigation/site-navigation/stories/SiteNavigation.stories.ts +22 -1
- package/app/components/02.molecules/navigation/site-navigation/tests/SiteNavigation.spec.ts +41 -6
- package/app/components/02.molecules/navigation/tab-navigation/CONSUMER-STYLING.md +13 -8
- package/app/components/02.molecules/navigation/tab-navigation/TabNavigation.vue +18 -36
- package/app/components/02.molecules/navigation/tab-navigation/stories/TabNavigation.stories.ts +1 -1
- package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +1 -1
- package/app/components/02.molecules/opening-hours/CONSUMER-STYLING.md +134 -0
- package/app/components/02.molecules/opening-hours/OpeningHours.vue +352 -0
- package/app/components/02.molecules/opening-hours/stories/OpeningHours.stories.ts +127 -0
- package/app/components/02.molecules/opening-hours/tests/OpeningHours.spec.ts +228 -0
- package/app/components/02.molecules/opening-hours/tests/OpeningHours.structuredData.spec.ts +45 -0
- package/app/components/02.molecules/opening-hours/tests/__snapshots__/OpeningHours.spec.ts.snap +23 -0
- package/app/components/02.molecules/opening-hours/tests/buildOpeningHoursSpecification.spec.ts +52 -0
- package/app/components/02.molecules/price-list/CONSUMER-STYLING.md +106 -0
- package/app/components/02.molecules/price-list/PriceList.vue +48 -40
- package/app/components/02.molecules/price-list/stories/PriceList.stories.ts +15 -2
- package/app/components/02.molecules/price-list/tests/PriceList.spec.ts +39 -2
- package/app/components/02.molecules/price-list/tests/__snapshots__/PriceList.spec.ts.snap +4 -16
- package/app/components/02.molecules/pricing-card/CONSUMER-STYLING.md +23 -5
- package/app/components/02.molecules/pricing-card/PricingCard.vue +31 -61
- package/app/components/02.molecules/pricing-card/stories/PricingCard.stories.ts +2 -0
- package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +14 -1
- package/app/components/02.molecules/profile-section/CONSUMER-STYLING.md +53 -0
- package/app/components/02.molecules/profile-section/ProfileSection.vue +53 -66
- package/app/components/02.molecules/profile-section/tests/ProfileSection.spec.ts +4 -4
- package/app/components/02.molecules/profile-section/tests/__snapshots__/ProfileSection.spec.ts.snap +6 -12
- package/app/components/02.molecules/prompt/CONSUMER-STYLING.md +51 -0
- package/app/components/{01.atoms → 02.molecules}/prompt/DisplayPrompt.vue +23 -8
- package/app/components/{01.atoms → 02.molecules}/prompt/stories/DisplayPrompt.stories.ts +18 -1
- package/app/components/{01.atoms → 02.molecules}/prompt/tests/DisplayPrompt.spec.ts +37 -7
- package/app/components/02.molecules/qr-code/CONSUMER-STYLING.md +66 -0
- package/app/components/02.molecules/qr-code/CaptureQrCode.vue +31 -12
- package/app/components/02.molecules/qr-code/DecodeQrCode.vue +55 -19
- package/app/components/02.molecules/qr-code/stories/CaptureQrCode.stories.ts +56 -0
- package/app/components/02.molecules/qr-code/stories/DecodeQrCode.stories.ts +53 -0
- package/app/components/02.molecules/qr-code/tests/CaptureQrCode.spec.ts +68 -20
- package/app/components/02.molecules/qr-code/tests/DecodeQrCode.spec.ts +44 -8
- package/app/components/02.molecules/samaritan-prompt/CONSUMER-STYLING.md +118 -0
- package/app/components/02.molecules/samaritan-prompt/SamaritanPrompt.vue +108 -51
- package/app/components/02.molecules/samaritan-prompt/SamaritanPromptMixed.vue +63 -62
- package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPrompt.stories.ts +129 -0
- package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPromptMixed.stories.ts +124 -0
- package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPrompt.spec.ts +66 -0
- package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPromptMixed.spec.ts +95 -17
- package/app/components/02.molecules/select-menu/CONSUMER-STYLING.md +11 -2
- package/app/components/02.molecules/social-icons-list/CONSUMER-STYLING.md +43 -0
- package/app/components/02.molecules/social-icons-list/SocialIconsList.vue +15 -15
- package/app/components/02.molecules/social-icons-list/stories/SocialIconsList.stories.ts +6 -1
- package/app/components/02.molecules/social-icons-list/tests/SocialIconsList.spec.ts +22 -1
- package/app/components/02.molecules/social-icons-list/tests/__snapshots__/SocialIconsList.spec.ts.snap +3 -3
- package/app/components/02.molecules/stepper-list/CONSUMER-STYLING.md +44 -5
- package/app/components/02.molecules/stepper-list/StepperList.vue +23 -43
- package/app/components/02.molecules/stepper-list/tests/StepperList.spec.ts +9 -0
- package/app/components/{01.atoms → 02.molecules}/toast/CONSUMER-STYLING.md +14 -0
- package/app/components/{01.atoms → 02.molecules}/toast/DisplayToast.vue +1 -2
- package/app/components/{01.atoms → 02.molecules}/toast/DisplayToastProvider.vue +1 -2
- package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToast.stories.ts +1 -1
- package/app/components/{01.atoms → 02.molecules}/toast/stories/DisplayToastProvider.stories.ts +1 -1
- package/app/components/03.organisms/image-galleries/carousel-flip/CONSUMER-STYLING.md +13 -0
- package/app/components/03.organisms/image-galleries/slider-gallery/CONSUMER-STYLING.md +137 -0
- package/app/components/03.organisms/image-galleries/slider-gallery/SliderGallery.vue +378 -343
- package/app/components/03.organisms/image-galleries/slider-gallery/stories/SliderGallery.stories.ts +26 -1
- package/app/components/03.organisms/image-galleries/slider-gallery/tests/SliderGallery.spec.ts +102 -23
- package/app/components/03.organisms/image-galleries/slider-gallery/tests/__snapshots__/SliderGallery.spec.ts.snap +44 -44
- package/app/components/03.organisms/responsive-header/CONSUMER-STYLING.md +12 -1
- package/app/components/03.organisms/responsive-header/ResponsiveHeader.vue +0 -4
- package/app/components/03.organisms/services/service-detail/CONSUMER-STYLING.md +24 -3
- package/app/components/03.organisms/services/service-detail/ServiceDetail.vue +3 -3
- package/app/components/03.organisms/services/service-detail/stories/ServiceDetail.stories.ts +13 -13
- package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +1 -1
- package/app/components/03.organisms/services/service-summary/CONSUMER-STYLING.md +24 -7
- package/app/components/03.organisms/services/service-summary/ServiceSummary.vue +3 -3
- package/app/components/03.organisms/services/service-summary/stories/ServiceSummary.stories.ts +1 -1
- package/app/components/03.organisms/services/service-summary/tests/__snapshots__/ServiceSummary.spec.ts.snap +1 -1
- package/app/components/03.organisms/services/services-card/CONSUMER-STYLING.md +11 -2
- package/app/components/03.organisms/services/services-card/ServicesCard.vue +17 -26
- package/app/components/03.organisms/services/services-card/tests/ServicesCard.spec.ts +21 -0
- package/app/components/03.organisms/services/services-grids/CONSUMER-STYLING.md +50 -0
- package/app/components/03.organisms/services/services-grids/ServicesCardGrid.vue +9 -16
- package/app/components/03.organisms/services/services-grids/stories/ServicesCardGrid.stories.ts +6 -0
- package/app/components/03.organisms/services/services-grids/tests/ServicesCardGrid.spec.ts +18 -0
- package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServiceSummaryGrid.spec.ts.snap +3 -3
- package/app/components/03.organisms/services/services-grids/tests/__snapshots__/ServicesCardGrid.spec.ts.snap +3 -3
- package/app/components/03.organisms/site-header/CONSUMER-STYLING.md +12 -1
- package/app/components/04.templates/page-hero-highlights/CONSUMER-STYLING.md +103 -0
- package/app/components/04.templates/page-hero-highlights/PageHeroHighlights.vue +144 -193
- package/app/components/04.templates/page-hero-highlights/PageHeroHighlightsHeader.vue +27 -37
- package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlights.stories.ts +56 -60
- package/app/components/04.templates/page-hero-highlights/stories/PageHeroHighlightsHeader.stories.ts +2 -2
- package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlights.spec.ts +10 -10
- package/app/components/04.templates/page-hero-highlights/tests/PageHeroHighlightsHeader.spec.ts +7 -7
- package/app/components/04.templates/page-hero-highlights/tests/__snapshots__/PageHeroHighlights.spec.ts.snap +6 -6
- package/app/components/05.forms/form-errors/CONSUMER-STYLING.md +112 -0
- package/app/components/05.forms/form-errors/InputError.vue +101 -122
- package/app/components/05.forms/form-errors/stories/InputError.stories.ts +125 -0
- package/app/components/05.forms/form-errors/tests/InputError.spec.ts +82 -31
- package/app/components/05.forms/form-field/CONSUMER-STYLING.md +91 -0
- package/app/components/05.forms/form-field/FormField.vue +26 -35
- package/app/components/05.forms/form-field/stories/FormField.stories.ts +104 -0
- package/app/components/05.forms/form-field/tests/FormField.spec.ts +75 -0
- package/app/components/05.forms/form-fieldset/CONSUMER-STYLING.md +88 -0
- package/app/components/05.forms/form-fieldset/FormFieldset.vue +34 -28
- package/app/components/05.forms/form-fieldset/stories/FormFieldset.stories.ts +84 -0
- package/app/components/05.forms/form-fieldset/tests/FormFieldset.spec.ts +111 -0
- package/app/components/05.forms/form-wrapper/CONSUMER-STYLING.md +101 -0
- package/app/components/05.forms/form-wrapper/FormWrapper.vue +32 -15
- package/app/components/05.forms/form-wrapper/stories/FormWrapper.stories.ts +75 -0
- package/app/components/05.forms/form-wrapper/tests/FormWrapper.spec.ts +57 -0
- package/app/components/05.forms/input-button/CONSUMER-STYLING.md +52 -7
- package/app/components/05.forms/input-button/{InputButtonCore.vue → InputButton.vue} +60 -18
- package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts → input-button.playwright.ts} +5 -5
- package/app/components/05.forms/input-button/stories/{InputButtonCore.stories.ts → InputButton.stories.ts} +8 -10
- package/app/components/05.forms/input-button/tests/{InputButtonCore.spec.ts → InputButton.spec.ts} +75 -19
- package/app/components/05.forms/input-button/tests/__snapshots__/{InputButtonCore.spec.ts.snap → InputButton.spec.ts.snap} +18 -18
- package/app/components/05.forms/input-checkbox/CONSUMER-STYLING.md +93 -0
- package/app/components/05.forms/input-checkbox/MultipleCheckboxes.vue +19 -25
- package/app/components/05.forms/input-checkbox/SingleCheckbox.vue +17 -43
- package/app/components/05.forms/input-checkbox/stories/MultipleCheckboxes.stories.ts +104 -0
- package/app/components/05.forms/input-checkbox/stories/SingleCheckbox.stories.ts +75 -0
- package/app/components/05.forms/input-checkbox/tests/MultipleCheckboxes.spec.ts +91 -53
- package/app/components/05.forms/input-checkbox/tests/SingleCheckbox.spec.ts +112 -0
- package/app/components/05.forms/input-checkbox-radio/CONSUMER-STYLING.md +115 -35
- package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadio.vue +158 -0
- package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioButton.vue +102 -101
- package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioField.vue +100 -0
- package/app/components/05.forms/input-checkbox-radio/stories/{InputCheckboxRadioCore.stories.ts → InputCheckboxRadio.stories.ts} +23 -8
- package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioButton.stories.ts +60 -16
- package/app/components/05.forms/input-checkbox-radio/stories/InputCheckboxRadioField.stories.ts +93 -0
- package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadio.spec.ts +174 -0
- package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioButton.spec.ts +87 -0
- package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioField.spec.ts +87 -0
- package/app/components/05.forms/input-description/CONSUMER-STYLING.md +177 -0
- package/app/components/05.forms/input-description/InputDescription.vue +45 -24
- package/app/components/05.forms/input-description/stories/InputDescription.stories.ts +160 -0
- package/app/components/05.forms/input-description/tests/InputDescription.spec.ts +62 -386
- package/app/components/05.forms/input-label/CONSUMER-STYLING.md +134 -0
- package/app/components/05.forms/input-label/InputLabel.vue +99 -38
- package/app/components/05.forms/input-label/stories/InputLabel.stories.ts +236 -0
- package/app/components/05.forms/input-label/tests/InputLabel.spec.ts +113 -342
- package/app/components/05.forms/input-number/CONSUMER-STYLING.md +16 -7
- package/app/components/05.forms/input-number/{InputNumberCore.vue → InputNumber.vue} +6 -6
- package/app/components/05.forms/input-number/{variants/InputNumberDefault.vue → InputNumberField.vue} +12 -15
- package/app/components/05.forms/input-number/stories/{InputNumberCore.stories.ts → InputNumber.stories.ts} +6 -6
- package/app/components/05.forms/input-number/{variants/stories/InputNumberDefault.stories.ts → stories/InputNumberField.stories.ts} +5 -5
- package/app/components/05.forms/input-number/tests/{InputNumberCore.spec.ts → InputNumber.spec.ts} +2 -2
- package/app/components/05.forms/input-number/{variants/tests/InputNumberDefault.spec.ts → tests/InputNumberField.spec.ts} +8 -8
- package/app/components/05.forms/input-radio/CONSUMER-STYLING.md +70 -0
- package/app/components/05.forms/input-radio/MultipleRadiobuttons.vue +19 -30
- package/app/components/05.forms/input-radio/stories/MultipleRadiobuttons.stories.ts +116 -0
- package/app/components/05.forms/input-radio/tests/MultipleRadioButtons.spec.ts +125 -74
- package/app/components/05.forms/input-range/CONSUMER-STYLING.md +13 -0
- package/app/components/05.forms/input-range/InputRangeCore.vue +1 -1
- package/app/components/05.forms/input-range/{variants/InputRangeDefault.vue → InputRangeDefault.vue} +7 -11
- package/app/components/05.forms/input-range/{variants/tests → tests}/InputRangeDefault.spec.ts +1 -1
- package/app/components/05.forms/input-select/CONSUMER-STYLING.md +11 -2
- package/app/components/05.forms/input-select/{variants/InputSelectWithLabel.vue → InputSelectWithLabel.vue} +6 -9
- package/app/components/05.forms/input-select/stories/InputSelectWithLabel.stories.ts +1 -1
- package/app/components/05.forms/input-text/CONSUMER-STYLING.md +12 -3
- package/app/components/05.forms/input-text/{variants/InputPasswordWithLabel.vue → InputPasswordWithLabel.vue} +3 -3
- package/app/components/05.forms/input-text/{variants/InputTextAsNumberWithLabel.vue → InputTextAsNumberWithLabel.vue} +12 -15
- package/app/components/05.forms/input-text/InputTextCore.vue +8 -11
- package/app/components/05.forms/input-text/{variants/InputTextWithLabel.vue → InputTextWithLabel.vue} +9 -10
- package/app/components/05.forms/input-text/stories/InputPasswordWithLabel.stories.ts +1 -1
- package/app/components/05.forms/input-text/stories/InputTextAsNumberWithLabel.stories.ts +1 -1
- package/app/components/05.forms/input-text/stories/InputTextWithLabel.stories.ts +1 -1
- package/app/components/05.forms/input-text/tests/InputPasswordWithLabel.spec.ts +2 -1
- package/app/components/05.forms/input-text/tests/InputTextAsNumberWithLabel.spec.ts +1 -1
- package/app/components/05.forms/input-text/tests/InputTextWithLabel.spec.ts +2 -1
- package/app/components/05.forms/input-textarea/CONSUMER-STYLING.md +11 -2
- package/app/components/05.forms/input-textarea/{variants/InputTextareaWithLabel.vue → InputTextareaWithLabel.vue} +3 -7
- package/app/components/05.forms/input-textarea/stories/InputTextareaWithLabel.stories.ts +1 -1
- package/app/components/05.forms/patterns/stories/ContactForm.stories.ts +9 -10
- package/app/components/05.forms/patterns/stories/LoginForm.stories.ts +10 -10
- package/app/components/05.forms/patterns/stories/MigratedFieldsForm.stories.ts +246 -101
- package/app/components/05.forms/pending-effect/CONSUMER-STYLING.md +92 -0
- package/app/components/05.forms/pending-effect/PendingEffect.vue +52 -45
- package/app/components/05.forms/pending-effect/stories/PendingEffect.stories.ts +132 -0
- package/app/components/05.forms/pending-effect/tests/PendingEffect.spec.ts +67 -0
- package/app/components/05.forms/toggle-switch/CONSUMER-STYLING.md +11 -2
- package/app/components/05.forms/toggle-switch/ToggleSwitchCore.vue +10 -29
- package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabel.vue → ToggleSwitchWithLabel.vue} +5 -7
- package/app/components/05.forms/toggle-switch/{variants/ToggleSwitchWithLabelInline.vue → ToggleSwitchWithLabelInline.vue} +2 -4
- package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabel.stories.ts +1 -1
- package/app/components/05.forms/toggle-switch/stories/ToggleSwitchWithLabelInline.stories.ts +4 -1
- package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabel.spec.ts +26 -0
- package/app/components/05.forms/triple-toggle-switch/CONSUMER-STYLING.md +75 -62
- package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitch.vue +243 -0
- package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitch.stories.ts +104 -0
- package/app/components/05.forms/triple-toggle-switch/tests/TripleToggleSwitch.spec.ts +138 -0
- package/app/composables/tests/useCancellableTimer.spec.ts +48 -0
- package/app/composables/tests/useMaxChildWidth.spec.ts +67 -0
- package/app/composables/useCancellableTimer.ts +27 -7
- package/app/composables/useMaxChildWidth.ts +4 -6
- package/app/types/app-config.d.ts +10 -0
- package/app/types/components/cookie-consent-banner.d.ts +3 -0
- package/app/types/components/index.ts +6 -1
- package/app/types/components/opening-hours.d.ts +48 -0
- package/app/types/components/price-list.d.ts +11 -0
- package/app/types/components/profile-section.d.ts +6 -0
- package/app/types/components/samaritan-prompt.d.ts +13 -0
- package/app/types/components/services-card.d.ts +9 -0
- package/app/types/components/slider-gallery.d.ts +2 -0
- package/app/types/components/social-icons-list.d.ts +2 -0
- package/app/types/forms/types.forms.d.ts +3 -0
- package/app/types/forms/types.zodFormControl.d.ts +0 -3
- package/app/utils/opening-hours.ts +44 -0
- package/nuxt.config.ts +5 -1
- package/package.json +2 -2
- package/ramps.config.mjs +1 -1
- package/.claude/commands/create-commit-message.md +0 -13
- package/.claude/commands/create-release-notes.md +0 -34
- package/.claude/commands/migrate-component.md +0 -169
- package/.claude/commands/run-commit.md +0 -13
- package/.claude/component-ledger/artifact-url.txt +0 -1
- package/.claude/component-ledger/audit.json +0 -1
- package/.claude/component-ledger/build.mjs +0 -164
- package/.claude/component-ledger/output.html +0 -569
- package/.claude/component-ledger/template.html +0 -569
- package/.claude/hooks/check-component-update.sh +0 -95
- package/.claude/hooks/refresh-component-ledger.sh +0 -32
- package/.claude/settings.json +0 -134
- package/.claude/settings.local.json +0 -38
- package/.claude/skills/components/alert-content-inner.md +0 -60
- package/.claude/skills/components/navigation-horizontal.md +0 -99
- package/.claude/skills/components/samaritan-prompt-mixed.md +0 -139
- package/app/components/01.atoms/content-wrappers/content-columns-2/ContentColumns2.vue +0 -51
- package/app/components/01.atoms/content-wrappers/content-columns-2/stories/ContentColumns2.stories.ts +0 -110
- package/app/components/01.atoms/content-wrappers/content-columns-2/tests/ContentColumns2.spec.ts +0 -105
- package/app/components/01.atoms/content-wrappers/content-columns-2/tests/__snapshots__/ContentColumns2.spec.ts.snap +0 -14
- package/app/components/01.atoms/content-wrappers/content-width/ContentWidth.vue +0 -88
- package/app/components/01.atoms/content-wrappers/content-width/stories/ContentWidth.stories.ts +0 -362
- package/app/components/01.atoms/content-wrappers/content-width/tests/ContentWidth.spec.ts +0 -132
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/LayoutGridByWidth.vue +0 -70
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/stories/LayoutGridByWidth.stories.ts +0 -220
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/LayoutGridByWidth.spec.ts +0 -174
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGrid.spec.ts.snap +0 -36
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByCols.spec.ts.snap +0 -36
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-width/tests/__snapshots__/LayoutGridByWidth.spec.ts.snap +0 -36
- package/app/components/01.atoms/cookie-consent-banner/CookieConsentBanner.vue +0 -148
- package/app/components/01.atoms/display-avatar/DisplayAvatar.vue +0 -130
- package/app/components/01.atoms/display-avatar/tests/__snapshots__/DisplayAvatar.spec.ts.snap +0 -11
- package/app/components/02.molecules/action-menu/tests/__snapshots__/ActionMenuItemCore.spec.ts.snap +0 -27
- package/app/components/02.molecules/navigation/navigation-horizontal/NavigationHorizontal.vue +0 -162
- package/app/components/02.molecules/navigation/navigation-horizontal/stories/NavigationHorizontal.stories.ts +0 -373
- package/app/components/02.molecules/navigation/navigation-horizontal/tests/NavigationHorizontal.spec.ts +0 -152
- package/app/components/02.molecules/navigation/navigation-horizontal/tests/__snapshots__/NavigationHorizontal.spec.ts.snap +0 -17
- package/app/components/02.molecules/qr-code/stories/QrCode.stories.ts +0 -101
- package/app/components/03.organisms/colour-finder/ColourFinder.vue +0 -1519
- package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioCore.vue +0 -202
- package/app/components/05.forms/input-checkbox-radio/InputCheckboxRadioWithLabel.vue +0 -105
- package/app/components/05.forms/input-checkbox-radio/tests/InputCheckboxRadioCore.spec.ts +0 -320
- package/app/components/05.forms/triple-toggle-switch/TripleToggleSwitchCore.vue +0 -314
- package/app/components/05.forms/triple-toggle-switch/stories/TripleToggleSwitchCore.stories.ts +0 -63
- package/.vscode/{srcdev-component-dialog.code-snippets → srcdev-component-display-dialog.code-snippets} +0 -0
- package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToast.spec.ts +1 -1
- /package/app/components/{01.atoms → 02.molecules}/toast/tests/DisplayToastProvider.spec.ts +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-secondary-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-icons-tertiary-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-primary-pending-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-secondary-pill-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/combo-tertiary-readonly-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-default-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-error-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-success-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-theme-warning-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-primary-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-secondary-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-variant-tertiary-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/default-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/nuxt-icon-only-component-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pending-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-pill-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/state-readonly-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-chromium-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-firefox-darwin.png +0 -0
- /package/app/components/05.forms/input-button/playwright/{input-button-core.playwright.ts-snapshots → input-button.playwright.ts-snapshots}/with-both-nuxt-icon-components-webkit-darwin.png +0 -0
- /package/app/components/05.forms/input-range/{variants/stories → stories}/InputRangeDefault.stories.ts +0 -0
- /package/app/components/05.forms/input-select/{variants/tests → tests}/InputSelectWithLabel.spec.ts +0 -0
- /package/app/components/05.forms/input-textarea/{variants/tests → tests}/InputTextareaWithLabel.spec.ts +0 -0
- /package/app/components/05.forms/toggle-switch/{variants/tests → tests}/ToggleSwitchWithLabelInline.spec.ts +0 -0
- /package/app/types/components/{navigation-horizontal.d.ts → nav-item.d.ts} +0 -0
package/app/components/03.organisms/image-galleries/slider-gallery/stories/SliderGallery.stories.ts
CHANGED
|
@@ -18,6 +18,22 @@ const meta: Meta<typeof SliderGallery> = {
|
|
|
18
18
|
control: { type: "number", min: 100, step: 100 },
|
|
19
19
|
description: "Slide transition duration in milliseconds",
|
|
20
20
|
},
|
|
21
|
+
ariaLabel: {
|
|
22
|
+
control: { type: "text" },
|
|
23
|
+
description: "aria-label on the carousel region",
|
|
24
|
+
},
|
|
25
|
+
seeMoreText: {
|
|
26
|
+
control: { type: "text" },
|
|
27
|
+
description: "Link text for slides that have an href",
|
|
28
|
+
},
|
|
29
|
+
prevAriaLabel: { control: { type: "text" }, description: "Previous button aria-label" },
|
|
30
|
+
nextAriaLabel: { control: { type: "text" }, description: "Next button aria-label" },
|
|
31
|
+
prevIcon: { control: { type: "text" }, description: "Previous button icon" },
|
|
32
|
+
nextIcon: { control: { type: "text" }, description: "Next button icon" },
|
|
33
|
+
textScrim: {
|
|
34
|
+
control: { type: "boolean" },
|
|
35
|
+
description: "Gradient behind the slide text, matched to each slide's textBrightness",
|
|
36
|
+
},
|
|
21
37
|
styleClassPassthrough: {
|
|
22
38
|
control: "object",
|
|
23
39
|
description: "Additional CSS classes applied to the root element",
|
|
@@ -27,6 +43,13 @@ const meta: Meta<typeof SliderGallery> = {
|
|
|
27
43
|
autoRun: true,
|
|
28
44
|
autoRunInterval: 7000,
|
|
29
45
|
animationDuration: 3000,
|
|
46
|
+
textScrim: true,
|
|
47
|
+
ariaLabel: "Image gallery",
|
|
48
|
+
seeMoreText: "SEE MORE",
|
|
49
|
+
prevAriaLabel: "Previous image",
|
|
50
|
+
nextAriaLabel: "Next image",
|
|
51
|
+
prevIcon: "ic:outline-keyboard-arrow-left",
|
|
52
|
+
nextIcon: "ic:outline-keyboard-arrow-right",
|
|
30
53
|
styleClassPassthrough: [],
|
|
31
54
|
},
|
|
32
55
|
parameters: {
|
|
@@ -34,7 +57,7 @@ const meta: Meta<typeof SliderGallery> = {
|
|
|
34
57
|
docs: {
|
|
35
58
|
description: {
|
|
36
59
|
component:
|
|
37
|
-
"A full-screen image slider gallery with animated slide transitions, thumbnail navigation, arrow controls, and keyboard support. Gallery data is passed via v-model:galleryData.",
|
|
60
|
+
"A full-screen image slider gallery with animated slide transitions, thumbnail navigation, arrow controls, and keyboard support. Gallery data is passed via v-model:galleryData. Auto-advance pauses on hover/focus and is off under reduced motion; slides with an href get a see-more link.",
|
|
38
61
|
},
|
|
39
62
|
},
|
|
40
63
|
},
|
|
@@ -55,6 +78,7 @@ const sampleSlides: IGalleryData[] = [
|
|
|
55
78
|
description: "Vast mountain ranges stretching to the horizon at the golden hour of sunrise.",
|
|
56
79
|
thumbnail: { title: "Into the Wild", description: "Landscape" },
|
|
57
80
|
textBrightness: "light",
|
|
81
|
+
href: "#into-the-wild",
|
|
58
82
|
},
|
|
59
83
|
{
|
|
60
84
|
src: "https://picsum.photos/seed/gallery2/1920/1080",
|
|
@@ -65,6 +89,7 @@ const sampleSlides: IGalleryData[] = [
|
|
|
65
89
|
description: "Modern skyscrapers reflecting the warm hues of the setting sun.",
|
|
66
90
|
thumbnail: { title: "City Lights", description: "Architecture" },
|
|
67
91
|
textBrightness: "light",
|
|
92
|
+
href: "#city-lights",
|
|
68
93
|
},
|
|
69
94
|
{
|
|
70
95
|
src: "https://picsum.photos/seed/gallery3/1920/1080",
|
package/app/components/03.organisms/image-galleries/slider-gallery/tests/SliderGallery.spec.ts
CHANGED
|
@@ -94,25 +94,55 @@ describe("SliderGallery", () => {
|
|
|
94
94
|
expect(wrapper.classes()).toContain("slider-gallery");
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
+
// ─── Text scrim ───────────────────────────────────────────────────────────
|
|
98
|
+
|
|
99
|
+
it("adds has-text-scrim to the root by default", async () => {
|
|
100
|
+
const wrapper = await mountSuspended(SliderGallery);
|
|
101
|
+
expect(wrapper.classes()).toContain("has-text-scrim");
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
it("omits has-text-scrim when textScrim is false", async () => {
|
|
105
|
+
const wrapper = await mountSuspended(SliderGallery, { props: { galleryData: mockGalleryData, textScrim: false } });
|
|
106
|
+
expect(wrapper.classes()).not.toContain("has-text-scrim");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("toggles has-text-scrim when textScrim changes after mount", async () => {
|
|
110
|
+
const wrapper = await mountSuspended(SliderGallery);
|
|
111
|
+
await wrapper.setProps({ textScrim: false });
|
|
112
|
+
expect(wrapper.classes()).not.toContain("has-text-scrim");
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("marks each main slide with its textBrightness", async () => {
|
|
116
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
117
|
+
const slides = wrapper.findAll(".slider-gallery-list .slider-gallery-item");
|
|
118
|
+
expect(slides.map((slide) => slide.attributes("data-text-brightness"))).toEqual(["light", "dark", "light"]);
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("marks only slides with overlay text as data-has-text", async () => {
|
|
122
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
123
|
+
const slides = wrapper.findAll(".slider-gallery-list .slider-gallery-item");
|
|
124
|
+
expect(slides.map((slide) => slide.attributes("data-has-text") !== undefined)).toEqual([true, true, false]);
|
|
125
|
+
});
|
|
126
|
+
|
|
97
127
|
// ─── Loading state ────────────────────────────────────────────────────────
|
|
98
128
|
|
|
99
129
|
it("shows loading state before images load", async () => {
|
|
100
130
|
const wrapper = await mountSuspended(SliderGallery, {
|
|
101
131
|
props: { galleryData: mockGalleryData },
|
|
102
132
|
});
|
|
103
|
-
expect(wrapper.find(".loading
|
|
133
|
+
expect(wrapper.find(".slider-gallery-loading").exists()).toBe(true);
|
|
104
134
|
});
|
|
105
135
|
|
|
106
136
|
it("hides gallery content before images load", async () => {
|
|
107
137
|
const wrapper = await mountSuspended(SliderGallery, {
|
|
108
138
|
props: { galleryData: mockGalleryData },
|
|
109
139
|
});
|
|
110
|
-
expect(wrapper.find(".gallery-content").exists()).toBe(false);
|
|
140
|
+
expect(wrapper.find(".slider-gallery-content").exists()).toBe(false);
|
|
111
141
|
});
|
|
112
142
|
|
|
113
143
|
it("shows gallery content after image loads", async () => {
|
|
114
144
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
115
|
-
expect(wrapper.find(".gallery-content").exists()).toBe(true);
|
|
145
|
+
expect(wrapper.find(".slider-gallery-content").exists()).toBe(true);
|
|
116
146
|
});
|
|
117
147
|
|
|
118
148
|
it("dismisses loading state when galleryData is empty", async () => {
|
|
@@ -120,8 +150,8 @@ describe("SliderGallery", () => {
|
|
|
120
150
|
props: { galleryData: [] },
|
|
121
151
|
});
|
|
122
152
|
await nextTick();
|
|
123
|
-
//
|
|
124
|
-
expect(wrapper.find(".loading-
|
|
153
|
+
// loading finishes → the loading block gains is-loaded
|
|
154
|
+
expect(wrapper.find(".slider-gallery-loading.is-loaded").exists()).toBe(true);
|
|
125
155
|
});
|
|
126
156
|
|
|
127
157
|
it("resolves loading when first image errors", async () => {
|
|
@@ -133,31 +163,31 @@ describe("SliderGallery", () => {
|
|
|
133
163
|
await nextTick(); // extra tick — onerror → resolve → Promise.race → onMounted resume
|
|
134
164
|
vi.advanceTimersByTime(500);
|
|
135
165
|
await nextTick();
|
|
136
|
-
expect(wrapper.find(".gallery-content").exists()).toBe(true);
|
|
166
|
+
expect(wrapper.find(".slider-gallery-content").exists()).toBe(true);
|
|
137
167
|
});
|
|
138
168
|
|
|
139
169
|
// ─── Gallery items ────────────────────────────────────────────────────────
|
|
140
170
|
|
|
141
171
|
it("renders correct number of slide items", async () => {
|
|
142
172
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
143
|
-
expect(wrapper.findAll(".list .item")).toHaveLength(mockGalleryData.length);
|
|
173
|
+
expect(wrapper.findAll(".slider-gallery-list .slider-gallery-item")).toHaveLength(mockGalleryData.length);
|
|
144
174
|
});
|
|
145
175
|
|
|
146
176
|
it("renders correct number of thumbnail items", async () => {
|
|
147
177
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
148
|
-
expect(wrapper.findAll(".
|
|
178
|
+
expect(wrapper.findAll(".slider-gallery-thumbnails .slider-gallery-item")).toHaveLength(mockGalleryData.length);
|
|
149
179
|
});
|
|
150
180
|
|
|
151
181
|
it("renders slide image alt text correctly", async () => {
|
|
152
182
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
153
|
-
const images = wrapper.findAll(".list .item img");
|
|
183
|
+
const images = wrapper.findAll(".slider-gallery-list .slider-gallery-item img");
|
|
154
184
|
expect(images[0]?.attributes("alt")).toBe(mockGalleryData[0]?.alt);
|
|
155
185
|
expect(images[1]?.attributes("alt")).toBe(mockGalleryData[1]?.alt);
|
|
156
186
|
});
|
|
157
187
|
|
|
158
188
|
it("renders thumbnail images with lazy loading", async () => {
|
|
159
189
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
160
|
-
const thumbImages = wrapper.findAll(".
|
|
190
|
+
const thumbImages = wrapper.findAll(".slider-gallery-thumbnails .slider-gallery-item img");
|
|
161
191
|
thumbImages.forEach((img) => {
|
|
162
192
|
expect(img.attributes("loading")).toBe("lazy");
|
|
163
193
|
});
|
|
@@ -165,48 +195,48 @@ describe("SliderGallery", () => {
|
|
|
165
195
|
|
|
166
196
|
it("renders slide content fields when provided", async () => {
|
|
167
197
|
const wrapper = await mountAndLoad([mockGalleryData[0]!], mockImage);
|
|
168
|
-
expect(wrapper.find(".list .item .author").text()).toBe(mockGalleryData[0]!.stylist);
|
|
169
|
-
expect(wrapper.find(".list .item .title").text()).toBe(mockGalleryData[0]!.title);
|
|
170
|
-
expect(wrapper.find(".list .item .topic").text()).toBe(mockGalleryData[0]!.category);
|
|
171
|
-
expect(wrapper.find(".list .item .description").text()).toBe(mockGalleryData[0]!.description);
|
|
198
|
+
expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-author").text()).toBe(mockGalleryData[0]!.stylist);
|
|
199
|
+
expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-title").text()).toBe(mockGalleryData[0]!.title);
|
|
200
|
+
expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-topic").text()).toBe(mockGalleryData[0]!.category);
|
|
201
|
+
expect(wrapper.find(".slider-gallery-list .slider-gallery-item .slider-gallery-description").text()).toBe(mockGalleryData[0]!.description);
|
|
172
202
|
});
|
|
173
203
|
|
|
174
204
|
it("renders thumbnail content when provided", async () => {
|
|
175
205
|
const wrapper = await mountAndLoad([mockGalleryData[0]!], mockImage);
|
|
176
|
-
expect(wrapper.find(".
|
|
177
|
-
expect(wrapper.find(".
|
|
206
|
+
expect(wrapper.find(".slider-gallery-thumbnails .slider-gallery-item .slider-gallery-title").text()).toBe(mockGalleryData[0]!.thumbnail?.title);
|
|
207
|
+
expect(wrapper.find(".slider-gallery-thumbnails .slider-gallery-item .slider-gallery-description").text()).toBe(mockGalleryData[0]!.thumbnail?.description);
|
|
178
208
|
});
|
|
179
209
|
|
|
180
210
|
// ─── Navigation buttons ───────────────────────────────────────────────────
|
|
181
211
|
|
|
182
212
|
it("renders prev and next arrow buttons", async () => {
|
|
183
213
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
184
|
-
expect(wrapper.find("
|
|
185
|
-
expect(wrapper.find("
|
|
214
|
+
expect(wrapper.find(".slider-gallery-prev").exists()).toBe(true);
|
|
215
|
+
expect(wrapper.find(".slider-gallery-next").exists()).toBe(true);
|
|
186
216
|
});
|
|
187
217
|
|
|
188
218
|
it("prev button has accessible aria-label", async () => {
|
|
189
219
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
190
|
-
expect(wrapper.find("
|
|
220
|
+
expect(wrapper.find(".slider-gallery-prev").attributes("aria-label")).toBe("Previous image");
|
|
191
221
|
});
|
|
192
222
|
|
|
193
223
|
it("next button has accessible aria-label", async () => {
|
|
194
224
|
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
195
|
-
expect(wrapper.find("
|
|
225
|
+
expect(wrapper.find(".slider-gallery-next").attributes("aria-label")).toBe("Next image");
|
|
196
226
|
});
|
|
197
227
|
|
|
198
228
|
// ─── styleClassPassthrough ────────────────────────────────────────────────
|
|
199
229
|
|
|
200
230
|
it("applies a single styleClassPassthrough string", async () => {
|
|
201
231
|
const wrapper = await mountSuspended(SliderGallery, {
|
|
202
|
-
props: { styleClassPassthrough: "custom-gallery" },
|
|
232
|
+
props: { galleryData: [], styleClassPassthrough: "custom-gallery" },
|
|
203
233
|
});
|
|
204
234
|
expect(wrapper.classes()).toContain("custom-gallery");
|
|
205
235
|
});
|
|
206
236
|
|
|
207
237
|
it("applies multiple styleClassPassthrough classes from an array", async () => {
|
|
208
238
|
const wrapper = await mountSuspended(SliderGallery, {
|
|
209
|
-
props: { styleClassPassthrough: ["class-a", "class-b"] },
|
|
239
|
+
props: { galleryData: [], styleClassPassthrough: ["class-a", "class-b"] },
|
|
210
240
|
});
|
|
211
241
|
expect(wrapper.classes()).toContain("class-a");
|
|
212
242
|
expect(wrapper.classes()).toContain("class-b");
|
|
@@ -214,7 +244,7 @@ describe("SliderGallery", () => {
|
|
|
214
244
|
|
|
215
245
|
it("updates classes when styleClassPassthrough prop changes", async () => {
|
|
216
246
|
const wrapper = await mountSuspended(SliderGallery, {
|
|
217
|
-
props: { styleClassPassthrough: ["original"] },
|
|
247
|
+
props: { galleryData: [], styleClassPassthrough: ["original"] },
|
|
218
248
|
});
|
|
219
249
|
expect(wrapper.classes()).toContain("original");
|
|
220
250
|
await wrapper.setProps({ styleClassPassthrough: ["updated"] });
|
|
@@ -231,4 +261,53 @@ describe("SliderGallery", () => {
|
|
|
231
261
|
wrapper.unmount();
|
|
232
262
|
expect(spy).toHaveBeenCalledWith("keydown", expect.any(Function));
|
|
233
263
|
});
|
|
264
|
+
|
|
265
|
+
// ─── Carousel semantics and a11y ──────────────────────────────────────────
|
|
266
|
+
|
|
267
|
+
it("is a labelled carousel region", async () => {
|
|
268
|
+
const wrapper = await mountSuspended(SliderGallery, { props: { galleryData: [], ariaLabel: "Our work" } });
|
|
269
|
+
expect(wrapper.attributes("role")).toBe("region");
|
|
270
|
+
expect(wrapper.attributes("aria-roledescription")).toBe("carousel");
|
|
271
|
+
expect(wrapper.attributes("aria-label")).toBe("Our work");
|
|
272
|
+
});
|
|
273
|
+
|
|
274
|
+
it("does not use fixed ids on the arrow buttons", async () => {
|
|
275
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
276
|
+
expect(wrapper.find(".slider-gallery-prev").attributes("id")).toBeUndefined();
|
|
277
|
+
expect(wrapper.find(".slider-gallery-next").attributes("id")).toBeUndefined();
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
it("hides the decorative thumbnail strip from assistive tech", async () => {
|
|
281
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
282
|
+
expect(wrapper.find(".slider-gallery-thumbnails").attributes("aria-hidden")).toBe("true");
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
it("renders the see-more link only for slides with an href", async () => {
|
|
286
|
+
const data: IGalleryData[] = [{ ...mockGalleryData[0]!, href: "/work/1" }, mockGalleryData[1]!];
|
|
287
|
+
const wrapper = await mountAndLoad(data, mockImage);
|
|
288
|
+
const ctas = wrapper.findAll(".slider-gallery-cta");
|
|
289
|
+
expect(ctas).toHaveLength(1);
|
|
290
|
+
expect(ctas[0]!.attributes("href")).toBe("/work/1");
|
|
291
|
+
expect(ctas[0]!.text()).toBe("SEE MORE");
|
|
292
|
+
});
|
|
293
|
+
|
|
294
|
+
it("pauses auto-advance while hovered and resumes on leave", async () => {
|
|
295
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
296
|
+
await wrapper.trigger("mouseenter");
|
|
297
|
+
vi.advanceTimersByTime(7000);
|
|
298
|
+
await nextTick();
|
|
299
|
+
expect(wrapper.classes()).not.toContain("is-next");
|
|
300
|
+
await wrapper.trigger("mouseleave");
|
|
301
|
+
vi.advanceTimersByTime(7000);
|
|
302
|
+
await nextTick();
|
|
303
|
+
expect(wrapper.classes()).toContain("is-next");
|
|
304
|
+
});
|
|
305
|
+
|
|
306
|
+
it("does not auto-advance under prefers-reduced-motion", async () => {
|
|
307
|
+
vi.stubGlobal("matchMedia", vi.fn(() => ({ matches: true })));
|
|
308
|
+
const wrapper = await mountAndLoad(mockGalleryData, mockImage);
|
|
309
|
+
vi.advanceTimersByTime(7000);
|
|
310
|
+
await nextTick();
|
|
311
|
+
expect(wrapper.classes()).not.toContain("is-next");
|
|
312
|
+
});
|
|
234
313
|
});
|
|
@@ -1,69 +1,69 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
3
|
exports[`SliderGallery > renders correct HTML structure after load 1`] = `
|
|
4
|
-
"<div class="slider-gallery">
|
|
5
|
-
<div class="loading
|
|
6
|
-
<div class="
|
|
4
|
+
"<div class="slider-gallery has-text-scrim" role="region" aria-roledescription="carousel" aria-label="Image gallery">
|
|
5
|
+
<div class="slider-gallery-loading" role="status">
|
|
6
|
+
<div class="slider-gallery-spinner" aria-hidden="true"></div>
|
|
7
7
|
<p>Loading gallery...</p>
|
|
8
8
|
</div>
|
|
9
|
-
<div class="gallery-content">
|
|
10
|
-
<div class="list">
|
|
11
|
-
<div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="Slide 1" src="/_ipx/_/images/slide-1.jpg">
|
|
12
|
-
<div class="content light">
|
|
13
|
-
<div class="author
|
|
14
|
-
<div class="title
|
|
15
|
-
<div class="topic
|
|
16
|
-
<div class="description
|
|
17
|
-
|
|
9
|
+
<div class="slider-gallery-content">
|
|
10
|
+
<div class="slider-gallery-list">
|
|
11
|
+
<div class="slider-gallery-item" data-text-brightness="light" data-has-text=""><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="Slide 1" src="/_ipx/_/images/slide-1.jpg">
|
|
12
|
+
<div class="slider-gallery-item-content light">
|
|
13
|
+
<div class="slider-gallery-author">Stylist One</div>
|
|
14
|
+
<div class="slider-gallery-title">First Slide</div>
|
|
15
|
+
<div class="slider-gallery-topic">Fashion</div>
|
|
16
|
+
<div class="slider-gallery-description">Description for first slide</div>
|
|
17
|
+
<!--v-if-->
|
|
18
18
|
</div>
|
|
19
19
|
</div>
|
|
20
|
-
<div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="Slide 2" src="/_ipx/_/images/slide-2.jpg">
|
|
21
|
-
<div class="content dark">
|
|
22
|
-
|
|
23
|
-
<div class="title
|
|
24
|
-
<div class="topic
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
<div class="slider-gallery-item" data-text-brightness="dark" data-has-text=""><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="Slide 2" src="/_ipx/_/images/slide-2.jpg">
|
|
21
|
+
<div class="slider-gallery-item-content dark">
|
|
22
|
+
<!--v-if-->
|
|
23
|
+
<div class="slider-gallery-title">Second Slide</div>
|
|
24
|
+
<div class="slider-gallery-topic">Style</div>
|
|
25
|
+
<!--v-if-->
|
|
26
|
+
<!--v-if-->
|
|
27
27
|
</div>
|
|
28
28
|
</div>
|
|
29
|
-
<div class="item"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="Slide 3" src="/_ipx/_/images/slide-3.jpg">
|
|
30
|
-
<div class="content light">
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
29
|
+
<div class="slider-gallery-item" data-text-brightness="light"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="Slide 3" src="/_ipx/_/images/slide-3.jpg">
|
|
30
|
+
<div class="slider-gallery-item-content light">
|
|
31
|
+
<!--v-if-->
|
|
32
|
+
<!--v-if-->
|
|
33
|
+
<!--v-if-->
|
|
34
|
+
<!--v-if-->
|
|
35
|
+
<!--v-if-->
|
|
36
36
|
</div>
|
|
37
37
|
</div>
|
|
38
38
|
</div>
|
|
39
|
-
<div class="
|
|
40
|
-
<div class="item">
|
|
41
|
-
<div class="
|
|
42
|
-
<div class="content light">
|
|
43
|
-
<div class="title
|
|
44
|
-
<div class="description
|
|
39
|
+
<div class="slider-gallery-thumbnails" aria-hidden="true">
|
|
40
|
+
<div class="slider-gallery-item">
|
|
41
|
+
<div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-1.jpg 1x, /_ipx/_/images/slide-1.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-1.jpg">
|
|
42
|
+
<div class="slider-gallery-item-content light">
|
|
43
|
+
<div class="slider-gallery-title">Thumb 1</div>
|
|
44
|
+
<div class="slider-gallery-description">Thumb desc 1</div>
|
|
45
45
|
</div>
|
|
46
46
|
</div>
|
|
47
47
|
</div>
|
|
48
|
-
<div class="item">
|
|
49
|
-
<div class="
|
|
50
|
-
<div class="content dark">
|
|
51
|
-
<div class="title
|
|
52
|
-
<div class="description
|
|
48
|
+
<div class="slider-gallery-item">
|
|
49
|
+
<div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-2.jpg 1x, /_ipx/_/images/slide-2.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-2.jpg">
|
|
50
|
+
<div class="slider-gallery-item-content dark">
|
|
51
|
+
<div class="slider-gallery-title">Thumb 2</div>
|
|
52
|
+
<div class="slider-gallery-description">Thumb desc 2</div>
|
|
53
53
|
</div>
|
|
54
54
|
</div>
|
|
55
55
|
</div>
|
|
56
|
-
<div class="item">
|
|
57
|
-
<div class="
|
|
58
|
-
<div class="content light">
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
<div class="slider-gallery-item">
|
|
57
|
+
<div class="slider-gallery-thumbnail-overlay"><img data-nuxt-img="" srcset="/_ipx/_/images/slide-3.jpg 1x, /_ipx/_/images/slide-3.jpg 2x" alt="" loading="lazy" src="/_ipx/_/images/slide-3.jpg">
|
|
58
|
+
<div class="slider-gallery-item-content light">
|
|
59
|
+
<!--v-if-->
|
|
60
|
+
<!--v-if-->
|
|
61
61
|
</div>
|
|
62
62
|
</div>
|
|
63
63
|
</div>
|
|
64
64
|
</div>
|
|
65
|
-
<div class="arrows"><button
|
|
66
|
-
<div class="
|
|
65
|
+
<div class="slider-gallery-arrows"><button type="button" class="slider-gallery-prev" aria-label="Previous image"><span class="iconify i-ic:outline-keyboard-arrow-left slider-gallery-arrow-icon" aria-hidden="true"></span></button><button type="button" class="slider-gallery-next" aria-label="Next image"><span class="iconify i-ic:outline-keyboard-arrow-right slider-gallery-arrow-icon" aria-hidden="true"></span></button></div>
|
|
66
|
+
<div class="slider-gallery-progress" aria-hidden="true"></div>
|
|
67
67
|
</div>
|
|
68
68
|
</div>"
|
|
69
69
|
`;
|
|
@@ -28,7 +28,7 @@ are documented alongside it since that's where they're consumed.
|
|
|
28
28
|
|
|
29
29
|
---
|
|
30
30
|
|
|
31
|
-
## Global theming
|
|
31
|
+
## Global theming
|
|
32
32
|
|
|
33
33
|
Create `assets/styles/setup/07.components/responsive-header.css` in the consuming app and set
|
|
34
34
|
tokens on a scope class matching the one passed via `styleClassPassthrough`:
|
|
@@ -54,6 +54,16 @@ tokens on a scope class matching the one passed via `styleClassPassthrough`:
|
|
|
54
54
|
|
|
55
55
|
---
|
|
56
56
|
|
|
57
|
+
## Local overrides
|
|
58
|
+
|
|
59
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
60
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
61
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
62
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
63
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
57
67
|
## Notes
|
|
58
68
|
|
|
59
69
|
- Anything with async-loaded content (an `iconName` icon on a nav item, a new decorator inside
|
|
@@ -64,3 +74,4 @@ tokens on a scope class matching the one passed via `styleClassPassthrough`:
|
|
|
64
74
|
- `NavigationItems`' own tokens (`--overflow-nav-*`) are documented in its own skill doc since
|
|
65
75
|
they style the overflow-panel's *content*, distinct from `ResponsiveHeader`'s own tokens
|
|
66
76
|
above which style the top bar and the overflow *button*/*container*.
|
|
77
|
+
|
|
@@ -717,7 +717,6 @@ watch(
|
|
|
717
717
|
Set this token to a fixed value (or a small set of breakpoint-based values)
|
|
718
718
|
to avoid it. */
|
|
719
719
|
|
|
720
|
-
--_link-visibility-transition: none;
|
|
721
720
|
position: relative;
|
|
722
721
|
color: var(--responsive-header-color, inherit);
|
|
723
722
|
|
|
@@ -731,7 +730,6 @@ watch(
|
|
|
731
730
|
inline-size: var(--responsive-header-inline-size, 100%);
|
|
732
731
|
|
|
733
732
|
&.loaded {
|
|
734
|
-
--_link-visibility-transition: all 0.2s ease-in-out;
|
|
735
733
|
}
|
|
736
734
|
|
|
737
735
|
/* flex-grow: 1; */
|
|
@@ -746,7 +744,6 @@ watch(
|
|
|
746
744
|
--_link-margin-inline: 0.1rem;
|
|
747
745
|
--_link-focus-visible-outline-width: 0.2rem;
|
|
748
746
|
--_link-border-default: 2px solid transparent;
|
|
749
|
-
--_link-border-bottom-hover: var(--green-08);
|
|
750
747
|
|
|
751
748
|
grid-area: navStack;
|
|
752
749
|
display: flex;
|
|
@@ -816,7 +813,6 @@ watch(
|
|
|
816
813
|
--_icon-transform: scaleY(1);
|
|
817
814
|
|
|
818
815
|
margin-inline-start: 0;
|
|
819
|
-
/* transition: var(--_link-visibility-transition); */
|
|
820
816
|
|
|
821
817
|
&[open] {
|
|
822
818
|
--_icon-transform: scaleY(-1);
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
|
|
2
|
+
> **Changed 2026-09-27**: `--service-detail-hero-pill-bg` (and the hero text colour on the pills)
|
|
3
|
+
> never applied before, because `DisplayPill`'s `neutral` variant ignored the base tokens. It now
|
|
4
|
+
> falls back to them, so the hero pills are transparent with the hero text colour as documented.
|
|
1
5
|
# ServiceDetail — Consumer Styling Guide
|
|
2
6
|
|
|
3
7
|
## Layout building blocks
|
|
@@ -30,6 +34,8 @@ inside an outer, wider `PageRow` — see
|
|
|
30
34
|
notes in [page-row.md](../../../../../.claude/skills/components/page-row.md) for how nested page-rows
|
|
31
35
|
compose.
|
|
32
36
|
|
|
37
|
+
---
|
|
38
|
+
|
|
33
39
|
## Public token API
|
|
34
40
|
|
|
35
41
|
### Hero banner
|
|
@@ -46,7 +52,7 @@ compose.
|
|
|
46
52
|
| `--service-detail-hero-text-colour` | `white` | Colour of the breadcrumb, eyebrow, and title over the hero image |
|
|
47
53
|
| `--service-detail-breadcrumb-margin-block-end` | `0.8rem` | Space below the breadcrumb |
|
|
48
54
|
| `--service-detail-hero-pills-gap` | `0.8rem` | Gap between the duration and price pills |
|
|
49
|
-
| `--service-detail-hero-pill-bg` | `transparent` | Background of the price/duration pills (via `DisplayPill`'s `--
|
|
55
|
+
| `--service-detail-hero-pill-bg` | `transparent` | Background of the price/duration pills (via `DisplayPill`'s `--display-pill-background`) |
|
|
50
56
|
| `--service-detail-hero-pill-border-colour` | `currentColor` | Border colour of the price/duration pills |
|
|
51
57
|
|
|
52
58
|
The hero image is always `object-fit: cover` (not tokened) — only its anchor point changes
|
|
@@ -182,7 +188,7 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
|
|
|
182
188
|
|
|
183
189
|
---
|
|
184
190
|
|
|
185
|
-
## Global theming
|
|
191
|
+
## Global theming
|
|
186
192
|
|
|
187
193
|
```css
|
|
188
194
|
/* assets/styles/setup/07.components/service-detail.css */
|
|
@@ -193,7 +199,21 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
|
|
|
193
199
|
}
|
|
194
200
|
```
|
|
195
201
|
|
|
196
|
-
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
## Local overrides
|
|
205
|
+
|
|
206
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
207
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
208
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
209
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
210
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
211
|
+
|
|
212
|
+
**Caveat:** `ServiceDetail` re-declares `--display-pill-background`, `--display-pill-text-colour`,
|
|
213
|
+
`--display-pill-border-colour` and `--breadcrumb-colour` inside its hero, so ancestor values of those
|
|
214
|
+
never reach the hero pills or breadcrumb. Use the `--service-detail-hero-*` tokens instead.
|
|
215
|
+
|
|
216
|
+
### Page or section
|
|
197
217
|
|
|
198
218
|
```css
|
|
199
219
|
.our-services-page {
|
|
@@ -231,3 +251,4 @@ Section headings, sidebar labels, and CTA copy are **props**, not hardcoded stri
|
|
|
231
251
|
`@container` queries against the component's own width, not the viewport — they are not tokens
|
|
232
252
|
since resizing them would need corresponding `minmax()`/`grid-template-columns` changes too, not
|
|
233
253
|
just spacing (same rationale as `ServiceSummary`'s `--service-summary-grid-gap-desktop`).
|
|
254
|
+
|
|
@@ -326,9 +326,9 @@ watch(
|
|
|
326
326
|
flex-wrap: wrap;
|
|
327
327
|
gap: var(--service-detail-hero-pills-gap, 0.8rem);
|
|
328
328
|
|
|
329
|
-
--
|
|
330
|
-
--
|
|
331
|
-
--
|
|
329
|
+
--display-pill-background: var(--service-detail-hero-pill-bg, transparent);
|
|
330
|
+
--display-pill-text-colour: var(--service-detail-hero-text-colour, white);
|
|
331
|
+
--display-pill-border-colour: var(--service-detail-hero-pill-border-colour, currentColor);
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
334
|
}
|