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
|
@@ -19,10 +19,24 @@
|
|
|
19
19
|
}
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
+
---
|
|
23
|
+
|
|
22
24
|
## Text content — props, not CSS
|
|
23
25
|
|
|
24
26
|
`items` and `separator` are props. There is no hardcoded copy to override in CSS.
|
|
25
27
|
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
## Local overrides
|
|
31
|
+
|
|
32
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
33
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
34
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
35
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
36
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
26
40
|
## Notes
|
|
27
41
|
|
|
28
42
|
- An item renders as a `NuxtLink` when it has a `to`, otherwise as `<span aria-current="page">` —
|
|
@@ -30,3 +44,4 @@
|
|
|
30
44
|
- The separator (`aria-hidden="true"`) is only rendered between items, never after the last one.
|
|
31
45
|
- `--breadcrumb-colour` is what `ServiceDetail` overrides internally (to `white` by default) so
|
|
32
46
|
the breadcrumb reads over its hero image — see `ServiceDetail`'s `CONSUMER-STYLING.md`.
|
|
47
|
+
|
|
@@ -25,7 +25,20 @@
|
|
|
25
25
|
}
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
---
|
|
29
|
+
|
|
28
30
|
## Links are prop-driven
|
|
29
31
|
|
|
30
32
|
The set of skip links is provided via the `links` prop (`{ href, label }[]`), not slots — see the
|
|
31
33
|
skill doc for the default value and localisation notes.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Local overrides
|
|
38
|
+
|
|
39
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
40
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
41
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
42
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
43
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
44
|
+
|
|
@@ -35,6 +35,8 @@
|
|
|
35
35
|
}
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
+
---
|
|
39
|
+
|
|
38
40
|
## Colour tokens are flat values, not light-dark() pairs
|
|
39
41
|
|
|
40
42
|
Every colour token above defaults to a single flat `--slate-*` value rather than a
|
|
@@ -48,6 +50,8 @@ own override in `light-dark()`:
|
|
|
48
50
|
}
|
|
49
51
|
```
|
|
50
52
|
|
|
53
|
+
---
|
|
54
|
+
|
|
51
55
|
## Tab-label text colour tracks the indicator behind it
|
|
52
56
|
|
|
53
57
|
Hover and active can have different background colours (`--tabs-hover-indicator-colour` vs.
|
|
@@ -65,6 +69,8 @@ either indicator background, override its matching text-colour token to keep con
|
|
|
65
69
|
}
|
|
66
70
|
```
|
|
67
71
|
|
|
72
|
+
---
|
|
73
|
+
|
|
68
74
|
## Tabs spanned by a jump keep their normal styling
|
|
69
75
|
|
|
70
76
|
When the active tab (or hover) jumps across several tabs at once (e.g. clicking tab 5 while tab 1
|
|
@@ -85,15 +91,30 @@ literally the same colour as the indicator sliding beneath it (invisible). If yo
|
|
|
85
91
|
`--tabs-active-indicator-colour`, check it still differs enough from `--tabs-list-item-colour` (or
|
|
86
92
|
override that too) to avoid the same collision recurring.
|
|
87
93
|
|
|
94
|
+
---
|
|
95
|
+
|
|
88
96
|
## Indicator visibility is prop-driven, not tokens
|
|
89
97
|
|
|
90
98
|
Whether the hover highlight, active highlight, and underline indicator render at all is controlled
|
|
91
99
|
by the `trackHover`/`trackActive`/`trackIndicator` boolean props (all default `true`), since they
|
|
92
100
|
also gate whether the underlying DOM nodes are created — not just their styling.
|
|
93
101
|
|
|
102
|
+
---
|
|
103
|
+
|
|
94
104
|
## Movement/position values are private
|
|
95
105
|
|
|
96
106
|
`--_x-active`, `--_x-hovered`, `--_width-active`, `--_width-hovered`, `--_y-active`, `--_y-hovered`,
|
|
97
107
|
`--_y-height`, `--_y-width`, and `--_transition-duration` are computed at runtime from the tab
|
|
98
108
|
elements' measured layout (`offsetLeft`/`offsetWidth`/etc. in `useTabs`) and aren't meaningful to
|
|
99
109
|
override directly — use `transitionDuration` (a prop, in ms) to control indicator movement speed.
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## Local overrides
|
|
114
|
+
|
|
115
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
116
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
117
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
118
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
119
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
120
|
+
|
|
@@ -12,9 +12,30 @@ or instance) without touching the component itself.
|
|
|
12
12
|
| `--page-row-content-max-width` | `1064px` | Maximum width of the `content` column track |
|
|
13
13
|
| `--page-row-inset-content-max-width` | `840px` | Maximum width of the `inset-content` column track |
|
|
14
14
|
|
|
15
|
+
Private (not public API): `--_minimum-content-padding`,
|
|
16
|
+
`--_content-max-width`, `--_inset-content-max-width` (resolved copies of the tokens above) and the
|
|
17
|
+
computed tracks `--_full-track-min`, `--_full-track`, `--_popout-track`, `--_content-track`,
|
|
18
|
+
`--_inset-content-track`.
|
|
19
|
+
|
|
20
|
+
> Changed 2026-09-27: the computed tracks used to be unprefixed `--full`, `--popout`, `--content`
|
|
21
|
+
> and `--inset-content`. Declared on every `.page-row`, they overwrote any consumer variable with
|
|
22
|
+
> the same (very generic) name inside a page row. They are internal and now carry the `--_` prefix.
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## State hooks
|
|
27
|
+
|
|
28
|
+
| Hook | When |
|
|
29
|
+
|---|---|
|
|
30
|
+
| `.page-row.full`, `.popout`, `.content`, `.inset-content` | The `variant` prop (default `content`). Sets the row's own track when nested, and the default track for its direct non-PageRow children |
|
|
31
|
+
| `[data-align="start"]`, `[data-align="end"]` | The `align` prop on a nested row: bleeds to the left or right edge instead of centring |
|
|
32
|
+
|
|
33
|
+
Direct children of a `.page-row` are grid items placed on a named track (`full`, `popout`,
|
|
34
|
+
`content`, `inset-content`). Place your own child elsewhere with e.g. `grid-column: popout`.
|
|
35
|
+
|
|
15
36
|
---
|
|
16
37
|
|
|
17
|
-
## Global theming
|
|
38
|
+
## Global theming
|
|
18
39
|
|
|
19
40
|
Create `assets/styles/setup/07.components/page-row.css` in the consuming app and set tokens on
|
|
20
41
|
`:root`. These values apply to every `PageRow` instance across the site.
|
|
@@ -31,7 +52,20 @@ Create `assets/styles/setup/07.components/page-row.css` in the consuming app and
|
|
|
31
52
|
|
|
32
53
|
---
|
|
33
54
|
|
|
34
|
-
##
|
|
55
|
+
## Local overrides
|
|
56
|
+
|
|
57
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
58
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
59
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
60
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
61
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
62
|
+
|
|
63
|
+
**Caveat:** a nested `.page-row` re-declares `--_minimum-content-padding` as
|
|
64
|
+
`var(--page-row-minimum-content-padding, 0px)`, so nested rows get no gutter by default. If you set
|
|
65
|
+
`--page-row-minimum-content-padding` on an ancestor, nested rows inherit that value and pick up the
|
|
66
|
+
gutter too. Reset it to `0px` on nested rows if that's not what you want.
|
|
67
|
+
|
|
68
|
+
### Page or section
|
|
35
69
|
|
|
36
70
|
Override track widths for a specific page by scoping tokens under the page wrapper. No `:deep()`
|
|
37
71
|
is required (component styles are unscoped).
|
|
@@ -46,9 +80,7 @@ is required (component styles are unscoped).
|
|
|
46
80
|
}
|
|
47
81
|
```
|
|
48
82
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
## Per-instance overrides via inline style
|
|
83
|
+
### One instance: inline style
|
|
52
84
|
|
|
53
85
|
```vue
|
|
54
86
|
<PageRow
|
|
@@ -59,9 +91,7 @@ is required (component styles are unscoped).
|
|
|
59
91
|
</PageRow>
|
|
60
92
|
```
|
|
61
93
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
## Per-instance overrides via styleClassPassthrough
|
|
94
|
+
### One instance: style-class-passthrough
|
|
65
95
|
|
|
66
96
|
```vue
|
|
67
97
|
<PageRow variant="content" :style-class-passthrough="['narrow']">
|
|
@@ -80,6 +110,13 @@ is required (component styles are unscoped).
|
|
|
80
110
|
|
|
81
111
|
---
|
|
82
112
|
|
|
113
|
+
## Class passthrough
|
|
114
|
+
|
|
115
|
+
`style-class-passthrough` adds classes to the root `.page-row` element, alongside the variant
|
|
116
|
+
class. Tokens set on a passthrough class land for that row and any rows nested in it.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
83
120
|
## Notes
|
|
84
121
|
|
|
85
122
|
- Track widths are derived from the four tokens using `calc()` — changing one token shifts all
|
|
@@ -88,3 +125,4 @@ is required (component styles are unscoped).
|
|
|
88
125
|
narrow screens; it also sets the outer `full` gutter minimum.
|
|
89
126
|
- The component applies no padding, margin, or background — those are always set by the consuming
|
|
90
127
|
app on the PageRow element or its children.
|
|
128
|
+
|
|
@@ -28,8 +28,13 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
28
28
|
styleClassPassthrough: () => [],
|
|
29
29
|
});
|
|
30
30
|
|
|
31
|
-
const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
|
|
31
|
+
const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
|
|
32
32
|
const { headingId, ariaLabelledby } = useAriaLabelledById(props.tag);
|
|
33
|
+
|
|
34
|
+
watch(
|
|
35
|
+
() => props.styleClassPassthrough,
|
|
36
|
+
() => resetElementClasses(props.styleClassPassthrough)
|
|
37
|
+
);
|
|
33
38
|
</script>
|
|
34
39
|
|
|
35
40
|
<style lang="css">
|
|
@@ -42,7 +47,6 @@ const { headingId, ariaLabelledby } = useAriaLabelledById(props.tag);
|
|
|
42
47
|
*/
|
|
43
48
|
.page-row {
|
|
44
49
|
--_minimum-content-padding: var(--page-row-minimum-content-padding, 1rem);
|
|
45
|
-
--_popout-max-width: var(--page-row-popout-max-width, 1400px);
|
|
46
50
|
--_content-max-width: var(--page-row-content-max-width, 1064px);
|
|
47
51
|
--_inset-content-max-width: var(--page-row-inset-content-max-width, 840px);
|
|
48
52
|
|
|
@@ -54,31 +58,31 @@ const { headingId, ariaLabelledby } = useAriaLabelledById(props.tag);
|
|
|
54
58
|
max(0px, calc((var(--_content-max-width) + var(--_minimum-content-padding) * 2 - 100%) / 2))
|
|
55
59
|
);
|
|
56
60
|
|
|
57
|
-
--
|
|
58
|
-
--
|
|
59
|
-
--
|
|
61
|
+
--_full-track: minmax(var(--_full-track-min), 1fr);
|
|
62
|
+
--_popout-track: minmax(0, calc((var(--page-row-popout-max-width, 1400px) - var(--_content-max-width)) * 0.5));
|
|
63
|
+
--_content-track: clamp(
|
|
60
64
|
0px,
|
|
61
65
|
calc((100% - var(--_minimum-content-padding) * 2 - var(--_inset-content-max-width)) * 0.5),
|
|
62
66
|
calc((var(--_content-max-width) - var(--_inset-content-max-width)) * 0.5)
|
|
63
67
|
);
|
|
64
|
-
--
|
|
68
|
+
--_inset-content-track: min(var(--_inset-content-max-width), 100% - var(--_minimum-content-padding) * 2);
|
|
65
69
|
|
|
66
70
|
display: grid;
|
|
67
71
|
grid-template-columns:
|
|
68
72
|
[full-start]
|
|
69
|
-
var(--
|
|
73
|
+
var(--_full-track)
|
|
70
74
|
[popout-start]
|
|
71
|
-
var(--
|
|
75
|
+
var(--_popout-track)
|
|
72
76
|
[content-start]
|
|
73
|
-
var(--
|
|
77
|
+
var(--_content-track)
|
|
74
78
|
[inset-content-start]
|
|
75
|
-
var(--
|
|
79
|
+
var(--_inset-content-track)
|
|
76
80
|
[inset-content-end]
|
|
77
|
-
var(--
|
|
81
|
+
var(--_content-track)
|
|
78
82
|
[content-end]
|
|
79
|
-
var(--
|
|
83
|
+
var(--_popout-track)
|
|
80
84
|
[popout-end]
|
|
81
|
-
var(--
|
|
85
|
+
var(--_full-track)
|
|
82
86
|
[full-end];
|
|
83
87
|
|
|
84
88
|
container-type: inline-size;
|
|
@@ -147,6 +147,8 @@ const NestingTemplate: StoryFn = () => ({
|
|
|
147
147
|
|
|
148
148
|
export const NestingPattern = NestingTemplate.bind({});
|
|
149
149
|
NestingPattern.parameters = {
|
|
150
|
+
// Fixed showcase: hardcoded values, so Controls would do nothing here.
|
|
151
|
+
controls: { disable: true },
|
|
150
152
|
docs: {
|
|
151
153
|
description: {
|
|
152
154
|
story:
|
|
@@ -199,6 +201,8 @@ const ComparisonTemplate: StoryFn = () => ({
|
|
|
199
201
|
|
|
200
202
|
export const WidthComparison = ComparisonTemplate.bind({});
|
|
201
203
|
WidthComparison.parameters = {
|
|
204
|
+
// Fixed showcase: hardcoded values, so Controls would do nothing here.
|
|
205
|
+
controls: { disable: true },
|
|
202
206
|
docs: {
|
|
203
207
|
description: {
|
|
204
208
|
story: "Side-by-side comparison of all four main track widths.",
|
|
@@ -260,6 +264,8 @@ const AlignTemplate: StoryFn = () => ({
|
|
|
260
264
|
|
|
261
265
|
export const Alignment = AlignTemplate.bind({});
|
|
262
266
|
Alignment.parameters = {
|
|
267
|
+
// Fixed showcase: hardcoded values, so Controls would do nothing here.
|
|
268
|
+
controls: { disable: true },
|
|
263
269
|
docs: {
|
|
264
270
|
description: {
|
|
265
271
|
story:
|
|
@@ -302,6 +308,8 @@ const A11yTemplate: StoryFn = () => ({
|
|
|
302
308
|
|
|
303
309
|
export const AriaLabelledBy = A11yTemplate.bind({});
|
|
304
310
|
AriaLabelledBy.parameters = {
|
|
311
|
+
// Fixed showcase: hardcoded values, so Controls would do nothing here.
|
|
312
|
+
controls: { disable: true },
|
|
305
313
|
docs: {
|
|
306
314
|
description: {
|
|
307
315
|
story:
|
|
@@ -3,15 +3,6 @@ import { h } from "vue";
|
|
|
3
3
|
import { mountSuspended } from "@nuxt/test-utils/runtime";
|
|
4
4
|
import PageRow from "../PageRow.vue";
|
|
5
5
|
|
|
6
|
-
const mockElementClasses = { value: "" };
|
|
7
|
-
const mockUseStyleClassPassthrough = vi.fn(() => ({
|
|
8
|
-
elementClasses: mockElementClasses,
|
|
9
|
-
}));
|
|
10
|
-
|
|
11
|
-
vi.mock("#imports", () => ({
|
|
12
|
-
useStyleClassPassthrough: mockUseStyleClassPassthrough,
|
|
13
|
-
}));
|
|
14
|
-
|
|
15
6
|
describe("PageRow", () => {
|
|
16
7
|
let wrapper: Awaited<ReturnType<typeof mountSuspended>>;
|
|
17
8
|
|
|
@@ -28,7 +19,6 @@ describe("PageRow", () => {
|
|
|
28
19
|
|
|
29
20
|
beforeEach(() => {
|
|
30
21
|
vi.clearAllMocks();
|
|
31
|
-
mockElementClasses.value = "";
|
|
32
22
|
});
|
|
33
23
|
|
|
34
24
|
afterEach(() => {
|
|
@@ -95,7 +85,6 @@ describe("PageRow", () => {
|
|
|
95
85
|
|
|
96
86
|
describe("Props — styleClassPassthrough", () => {
|
|
97
87
|
it("forwards string class via elementClasses", async () => {
|
|
98
|
-
mockElementClasses.value = "custom-class";
|
|
99
88
|
await createWrapper({ styleClassPassthrough: "custom-class" });
|
|
100
89
|
expect(wrapper.classes()).toContain("custom-class");
|
|
101
90
|
});
|
|
@@ -105,6 +94,13 @@ describe("PageRow", () => {
|
|
|
105
94
|
expect(wrapper.classes()).toContain("class-a");
|
|
106
95
|
expect(wrapper.classes()).toContain("class-b");
|
|
107
96
|
});
|
|
97
|
+
|
|
98
|
+
it("updates classes when styleClassPassthrough changes after mount", async () => {
|
|
99
|
+
await createWrapper({ styleClassPassthrough: ["original"] });
|
|
100
|
+
await wrapper.setProps({ styleClassPassthrough: ["updated"] });
|
|
101
|
+
expect(wrapper.classes()).not.toContain("original");
|
|
102
|
+
expect(wrapper.classes()).toContain("updated");
|
|
103
|
+
});
|
|
108
104
|
});
|
|
109
105
|
|
|
110
106
|
describe("Props — align", () => {
|
|
@@ -40,6 +40,18 @@ Or scope to a single instance via `styleClassPassthrough`:
|
|
|
40
40
|
<PopOver style-class-passthrough="promo-pop-over">...</PopOver>
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Local overrides
|
|
46
|
+
|
|
47
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
48
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
49
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
50
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
51
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
43
55
|
## Notes
|
|
44
56
|
|
|
45
57
|
- Built on the native Popover API (`popover`/`popovertarget`) and CSS anchor-positioning
|
|
@@ -52,3 +64,4 @@ Or scope to a single instance via `styleClassPassthrough`:
|
|
|
52
64
|
semantics with arrow-key navigation), `PopOver` is a generic disclosure: both `trigger` and
|
|
53
65
|
`content` slots are entirely consumer-supplied, and it always renders its own visible close
|
|
54
66
|
button rather than relying on click-outside/Escape alone.
|
|
67
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# DisplayQrCode — Consumer Styling Guide
|
|
2
|
+
|
|
3
|
+
## Public token API
|
|
4
|
+
|
|
5
|
+
| Token | Default | Controls |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| `--display-qr-code-size` | the `size` prop (`256px`) | Width of the code; height follows via `aspect-ratio: 1 / 1` |
|
|
8
|
+
|
|
9
|
+
Module colours are props, not tokens: `black-color` (default `currentColor`) and `white-color`
|
|
10
|
+
(default `transparent`). They're written into the SVG by `nuxt-qrcode`. Because the dark modules
|
|
11
|
+
default to `currentColor`, setting `color` on the element or an ancestor recolours them.
|
|
12
|
+
|
|
13
|
+
> Changed 2026-09-27: `--display-qr-code-size` is new. When set, it takes precedence over the
|
|
14
|
+
> `size` prop, so a layout can resize codes without touching every instance.
|
|
15
|
+
|
|
16
|
+
No private `--_` tokens.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## State hooks
|
|
21
|
+
|
|
22
|
+
The root is the `nuxt-qrcode` SVG with class `.display-qr-code`, `role="img"` and an
|
|
23
|
+
`aria-label` (the `aria-label` prop, default `"QR code"`). There are no state classes.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Local overrides
|
|
28
|
+
|
|
29
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
30
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
31
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
32
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
33
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
34
|
+
|
|
35
|
+
### Page or section
|
|
36
|
+
|
|
37
|
+
```css
|
|
38
|
+
.my-page {
|
|
39
|
+
--display-qr-code-size: 18rem;
|
|
40
|
+
color: var(--brand-primary); /* dark modules, when black-color is left at currentColor */
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## Class passthrough
|
|
47
|
+
|
|
48
|
+
`style-class-passthrough` adds classes to the root SVG. Reactive after mount.
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
:radius
|
|
7
7
|
:black-color
|
|
8
8
|
:white-color
|
|
9
|
+
role="img"
|
|
10
|
+
:aria-label="ariaLabel"
|
|
9
11
|
:class="[elementClasses]"
|
|
10
12
|
/>
|
|
11
13
|
</template>
|
|
@@ -20,6 +22,7 @@ interface Props {
|
|
|
20
22
|
blackColor?: string;
|
|
21
23
|
whiteColor?: string;
|
|
22
24
|
size?: string;
|
|
25
|
+
ariaLabel?: string;
|
|
23
26
|
styleClassPassthrough?: string | string[];
|
|
24
27
|
}
|
|
25
28
|
|
|
@@ -29,6 +32,7 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
29
32
|
blackColor: "currentColor",
|
|
30
33
|
whiteColor: "transparent",
|
|
31
34
|
size: "256px",
|
|
35
|
+
ariaLabel: "QR code",
|
|
32
36
|
styleClassPassthrough: () => [],
|
|
33
37
|
});
|
|
34
38
|
|
|
@@ -44,7 +48,7 @@ watch(
|
|
|
44
48
|
@layer components {
|
|
45
49
|
.display-qr-code {
|
|
46
50
|
aspect-ratio: 1 / 1;
|
|
47
|
-
width: v-bind(size);
|
|
51
|
+
width: var(--display-qr-code-size, v-bind(size));
|
|
48
52
|
}
|
|
49
53
|
}
|
|
50
54
|
</style>
|
|
@@ -31,6 +31,11 @@ const meta: Meta<typeof DisplayQrCodeComponent> = {
|
|
|
31
31
|
description: "Color of the QR code background",
|
|
32
32
|
table: { category: "Appearance" },
|
|
33
33
|
},
|
|
34
|
+
ariaLabel: {
|
|
35
|
+
control: { type: "text" },
|
|
36
|
+
description: "Accessible name for the QR image (override for a more specific or translated label)",
|
|
37
|
+
table: { category: "Accessibility" },
|
|
38
|
+
},
|
|
34
39
|
variant: { table: { disable: true } },
|
|
35
40
|
styleClassPassthrough: { table: { disable: true } },
|
|
36
41
|
},
|
|
@@ -40,6 +45,7 @@ const meta: Meta<typeof DisplayQrCodeComponent> = {
|
|
|
40
45
|
radius: 0,
|
|
41
46
|
blackColor: "#000000",
|
|
42
47
|
whiteColor: "transparent",
|
|
48
|
+
ariaLabel: "QR code",
|
|
43
49
|
styleClassPassthrough: [],
|
|
44
50
|
},
|
|
45
51
|
};
|
|
@@ -52,6 +58,7 @@ interface QrStoryArgs {
|
|
|
52
58
|
radius: number;
|
|
53
59
|
blackColor: string;
|
|
54
60
|
whiteColor: string;
|
|
61
|
+
ariaLabel: string;
|
|
55
62
|
styleClassPassthrough: string[];
|
|
56
63
|
}
|
|
57
64
|
|
|
@@ -68,12 +75,13 @@ const DisplayTemplate: StoryFn<QrStoryArgs> = (args, { parameters }) => ({
|
|
|
68
75
|
template: `
|
|
69
76
|
<div style="padding: 40px; display: flex; align-items: center; justify-content: center; background: #f5f5f5; border-radius: 8px;">
|
|
70
77
|
<DisplayQrCodeComponent
|
|
71
|
-
:
|
|
78
|
+
:qr-value="args.qrValue"
|
|
72
79
|
:variant="variant"
|
|
73
80
|
:radius="args.radius"
|
|
74
|
-
:
|
|
75
|
-
:
|
|
81
|
+
:black-color="args.blackColor"
|
|
82
|
+
:white-color="args.whiteColor"
|
|
76
83
|
:size="args.size"
|
|
84
|
+
:aria-label="args.ariaLabel"
|
|
77
85
|
:style-class-passthrough="args.styleClassPassthrough"
|
|
78
86
|
/>
|
|
79
87
|
</div>
|
|
@@ -137,3 +137,18 @@ describe("DisplayQrCode", () => {
|
|
|
137
137
|
expect(wrapper.classes()).toContain("updated");
|
|
138
138
|
});
|
|
139
139
|
});
|
|
140
|
+
|
|
141
|
+
describe("DisplayQrCode accessibility", () => {
|
|
142
|
+
it("exposes the QR code as an image with a default accessible name", async () => {
|
|
143
|
+
const wrapper = await mountSuspended(DisplayQrCode, { props: { qrValue: "https://example.com" } });
|
|
144
|
+
expect(wrapper.attributes("role")).toBe("img");
|
|
145
|
+
expect(wrapper.attributes("aria-label")).toBe("QR code");
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
it("uses the ariaLabel prop as the accessible name", async () => {
|
|
149
|
+
const wrapper = await mountSuspended(DisplayQrCode, {
|
|
150
|
+
props: { qrValue: "https://example.com", ariaLabel: "Scan to open our booking page" },
|
|
151
|
+
});
|
|
152
|
+
expect(wrapper.attributes("aria-label")).toBe("Scan to open our booking page");
|
|
153
|
+
});
|
|
154
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# TextBlock — Consumer Styling Guide
|
|
2
|
+
|
|
3
|
+
`TextBlock` is a plain wrapper whose only styling is vertical padding. Both edges default to the
|
|
4
|
+
global fluid spacing token `--fluid-space-48-96` (`clamp(3rem, …, 6rem)`, i.e. 30px–60px).
|
|
5
|
+
|
|
6
|
+
## Tokens
|
|
7
|
+
|
|
8
|
+
| Token | Default | Controls |
|
|
9
|
+
|-------|---------|----------|
|
|
10
|
+
| `--text-block-padding-block-start` | `var(--fluid-space-48-96)` | `padding-block-start` |
|
|
11
|
+
| `--text-block-padding-block-end` | `var(--fluid-space-48-96)` | `padding-block-end` |
|
|
12
|
+
|
|
13
|
+
```css
|
|
14
|
+
/* Tighter lead block on one page */
|
|
15
|
+
.price-list-page {
|
|
16
|
+
--text-block-padding-block-start: var(--fluid-space-24-48);
|
|
17
|
+
--text-block-padding-block-end: 0;
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
You don't need to redeclare the default padding in your own CSS to get it; the component ships it.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Local overrides
|
|
26
|
+
|
|
27
|
+
Set the tokens above on an element you own (a page or section class, or a class added with
|
|
28
|
+
`:style-class-passthrough`): they inherit down into the component. Keep the block **unlayered** (no
|
|
29
|
+
`@layer` wrapper) so it beats the library's `@layer components`. If your own file uses
|
|
30
|
+
`<style scoped>`, tokens set on your element still work, but selectors that reach inside the component need
|
|
31
|
+
`:deep()`. Patterns and examples: `.claude/skills/component-local-style-override.md`.
|
|
32
|
+
|
|
33
|
+
### One instance
|
|
34
|
+
|
|
35
|
+
Add your own class through `styleClassPassthrough` and set the tokens on it:
|
|
36
|
+
|
|
37
|
+
```vue
|
|
38
|
+
<TextBlock :style-class-passthrough="['page-lead']">…</TextBlock>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```css
|
|
42
|
+
.page-lead {
|
|
43
|
+
--text-block-padding-block-end: 0;
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
`.text-block` is declared inside `@layer components`, so any unlayered consumer rule on the class
|
|
48
|
+
itself also wins, but prefer the tokens so the fallback chain stays intact.
|
|
49
|
+
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<component :is="tag" class="text-block" :class="[elementClasses]">
|
|
3
|
-
<slot name="default"></slot>
|
|
2
|
+
<component :is="tag" class="text-block" :class="[elementClasses]" :aria-labelledby="ariaLabelledby">
|
|
3
|
+
<slot name="default" :heading-id="headingId"></slot>
|
|
4
4
|
</component>
|
|
5
5
|
</template>
|
|
6
6
|
|
|
@@ -14,14 +14,22 @@ const props = withDefaults(defineProps<Props>(), {
|
|
|
14
14
|
styleClassPassthrough: () => [],
|
|
15
15
|
});
|
|
16
16
|
|
|
17
|
-
const { elementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
|
|
17
|
+
const { elementClasses, resetElementClasses } = useStyleClassPassthrough(props.styleClassPassthrough);
|
|
18
|
+
const { headingId, ariaLabelledby } = useAriaLabelledById(() => props.tag);
|
|
19
|
+
|
|
20
|
+
watch(
|
|
21
|
+
() => props.styleClassPassthrough,
|
|
22
|
+
(newVal) => {
|
|
23
|
+
resetElementClasses(newVal ?? []);
|
|
24
|
+
}
|
|
25
|
+
);
|
|
18
26
|
</script>
|
|
19
27
|
|
|
20
28
|
<style lang="css">
|
|
21
29
|
@layer components {
|
|
22
30
|
.text-block {
|
|
23
|
-
padding-block-start: var(--fluid-space-48-96);
|
|
24
|
-
padding-block-end: var(--fluid-space-48-96);
|
|
31
|
+
padding-block-start: var(--text-block-padding-block-start, var(--fluid-space-48-96));
|
|
32
|
+
padding-block-end: var(--text-block-padding-block-end, var(--fluid-space-48-96));
|
|
25
33
|
}
|
|
26
34
|
}
|
|
27
35
|
</style>
|