srcdev-nuxt-components 9.4.12 → 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 +12 -5
- package/app/components/02.molecules/pricing-card/PricingCard.vue +28 -60
- package/app/components/02.molecules/pricing-card/tests/PricingCard.spec.ts +1 -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
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
# AlertContent / AlertContentInner
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
`AlertContent` is a themed alert panel: an accent stripe on the left, then an icon, a title and/or
|
|
6
|
+
message, an optional row of action buttons, and an optional dismiss button. `data-theme` (from the
|
|
7
|
+
required `theme` prop) drives every colour through the `--theme-*` tokens, so it works in light and
|
|
8
|
+
dark mode.
|
|
9
|
+
|
|
10
|
+
`AlertContentInner` is the shared inside (icon, body, actions, dismiss) used by both `AlertContent`
|
|
11
|
+
and `AlertMaskedContent`. `DisplayToast`, `DisplayToastProvider` and `DisplayPrompt` pick one of
|
|
12
|
+
those two with `<component :is>`, so props and slots added here should be forwarded by both
|
|
13
|
+
wrappers. Don't use `AlertContentInner` directly in pages.
|
|
14
|
+
|
|
15
|
+
**Location**: `app/components/02.molecules/alert-content/AlertContent.vue`, `AlertContentInner.vue`
|
|
16
|
+
|
|
17
|
+
> **Changed 2026-09-27**: skill doc renamed from `alert-content-inner.md`. Added the `showIcon` prop
|
|
18
|
+
> and `#actions` slot, public `--alert-content-*` tokens for the previously hardcoded values, and
|
|
19
|
+
> renamed `.title`/`.content` to `.alert-content-title`/`.alert-content-text`.
|
|
20
|
+
|
|
21
|
+
## Props
|
|
22
|
+
|
|
23
|
+
Same on `AlertContent`, `AlertContentInner` and `AlertMaskedContent`:
|
|
24
|
+
|
|
25
|
+
| Prop | Type | Default | Notes |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `theme` | `SemanticTheme` | — | **Required.** Default icon, and `data-theme` on `AlertContent`'s root. |
|
|
28
|
+
| `customIcon` | `string` | `undefined` | Icon name override. |
|
|
29
|
+
| `showIcon` | `boolean` | `true` | Set `false` to drop the icon column entirely (no empty space left). |
|
|
30
|
+
| `dismissible` | `boolean` | `false` | Shows the dismiss button, which emits `dismiss`. |
|
|
31
|
+
| `contentId` | `string` | `undefined` | `id` on `.alert-content-body`, for `aria-describedby` wiring. |
|
|
32
|
+
| `ariaLive` | `"polite" \| "assertive" \| "off"` | `undefined` | `aria-live` on `.alert-content-body`. Leave unset for static content (e.g. a banner present on page load). |
|
|
33
|
+
|
|
34
|
+
## Slots
|
|
35
|
+
|
|
36
|
+
| Slot | Description |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `#icon` | Replaces the icon (inside the `aria-hidden` icon region). |
|
|
39
|
+
| `#title` | Title line (`<p class="alert-content-title">`). |
|
|
40
|
+
| `#content` | Message text (`<p class="alert-content-text">`), so phrasing content only. |
|
|
41
|
+
| `#actions` | A wrapping, right-aligned (`--alert-content-actions-justify`) row of controls under the message. Sits **outside** `.alert-content-body`, so it isn't part of the `aria-live` region or the `contentId` description. |
|
|
42
|
+
| `#dismissIcon` | Replaces the dismiss button icon. |
|
|
43
|
+
| `#dismissLabel` | Screen-reader label for the dismiss button (default `"Close"`); pass translated text here. |
|
|
44
|
+
|
|
45
|
+
## Events
|
|
46
|
+
|
|
47
|
+
| Event | When |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `dismiss` | The dismiss button is clicked. |
|
|
50
|
+
|
|
51
|
+
## app.config defaults
|
|
52
|
+
|
|
53
|
+
Icon names, per theme and for the dismiss button, are configurable globally. One change covers every
|
|
54
|
+
toast, prompt and any other component built on `AlertContentInner`.
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
export default defineAppConfig({
|
|
58
|
+
srcdev: {
|
|
59
|
+
alertContent: {
|
|
60
|
+
icons: {
|
|
61
|
+
info: "heroicons:information-circle",
|
|
62
|
+
success: "heroicons:check-circle",
|
|
63
|
+
warning: "heroicons:exclamation-triangle",
|
|
64
|
+
error: "heroicons:x-circle",
|
|
65
|
+
},
|
|
66
|
+
dismissIcon: "heroicons:x-mark",
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
})
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Resolution chain: **`customIcon` prop → app.config icons → hardcoded fallback**. The `#dismissIcon`
|
|
73
|
+
slot always wins over app.config.
|
|
74
|
+
|
|
75
|
+
## Usage
|
|
76
|
+
|
|
77
|
+
```vue
|
|
78
|
+
<AlertContent theme="success">
|
|
79
|
+
<template #title>Saved</template>
|
|
80
|
+
<template #content>Your changes have been saved.</template>
|
|
81
|
+
</AlertContent>
|
|
82
|
+
|
|
83
|
+
<!-- Action row (right-aligned by default), custom icon -->
|
|
84
|
+
<AlertContent theme="info" custom-icon="material-symbols:cookie-outline">
|
|
85
|
+
<template #title>Cookies</template>
|
|
86
|
+
<template #content>We use cookies to understand how the site is used.</template>
|
|
87
|
+
<template #actions>
|
|
88
|
+
<InputButton type="button" variant="tertiary" button-text="Reject" @click="reject" />
|
|
89
|
+
<InputButton type="button" variant="primary" button-text="Accept" @click="accept" />
|
|
90
|
+
</template>
|
|
91
|
+
</AlertContent>
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Styling
|
|
95
|
+
|
|
96
|
+
Full token list in `CONSUMER-STYLING.md` next to the component. Outer shape (`AlertContent` only):
|
|
97
|
+
`--alert-content-accent`, `-accent-width`, `-border`, `-border-radius-start`/`-end`. Inside (applies to
|
|
98
|
+
`AlertMaskedContent` too): `--alert-content-inner-background`, `-gap`, `-padding`, `-text-colour`,
|
|
99
|
+
`-icon-colour`, `-icon-size`, `-title-font-size`, `-text-font-size`, `-body-gap`,
|
|
100
|
+
`-actions-spacing`, `-actions-gap`, `-actions-justify` (default `flex-end`, right-aligned), and the `-dismiss-*` tokens.
|
|
101
|
+
|
|
102
|
+
## Notes
|
|
103
|
+
|
|
104
|
+
- `AlertMaskedContent` sets `--alert-content-inner-background: transparent` on its own root so the
|
|
105
|
+
SVG mask shows through; change its fill with `--alert-masked-content-background` instead.
|
|
106
|
+
- `AlertContent`'s root is `display: grid` so the inner stretches to the root's height (e.g. in a
|
|
107
|
+
stretched row next to a taller alert) instead of showing the accent colour below it.
|
|
108
|
+
- The inner is a flex row (icon | main | dismiss), so a missing icon or dismiss button leaves no
|
|
109
|
+
empty column or stray gap. Before 2026-09-27 it was a fixed three-column grid, and a
|
|
110
|
+
non-dismissible alert carried an empty trailing column plus its gap.
|
|
@@ -63,6 +63,12 @@ accent-bordered alert shape.
|
|
|
63
63
|
- An SVG outer path (rounded rect using `radiusLeft`/`radiusRight`) and inner path (the same rect
|
|
64
64
|
inset by the border thicknesses) are computed from that measurement, and the region between them
|
|
65
65
|
is masked to `borderColour`; the inner region is filled with `backgroundColour`.
|
|
66
|
+
- Each instance gets its own mask id (`alert-mask-<useId>`), so several masks on one page don't
|
|
67
|
+
share a shape. The SVG is `aria-hidden`.
|
|
68
|
+
- `borderColour`/`backgroundColour` are applied as `fill` **styles**, not attributes, so a `var()`
|
|
69
|
+
value (e.g. `var(--theme-accent)`, or a consumer token) resolves against the element's ancestors.
|
|
70
|
+
A `var(--theme-*)` colour needs a `data-theme` ancestor to resolve.
|
|
71
|
+
- The `ResizeObserver` is disconnected on unmount.
|
|
66
72
|
- The slot content itself sits in a separate `.alert-mask-content` div, inset by the same border
|
|
67
73
|
thicknesses via internal `--_inset-*` custom properties, so it visually sits inside the drawn
|
|
68
74
|
border without overlapping it.
|
|
@@ -71,7 +77,9 @@ accent-bordered alert shape.
|
|
|
71
77
|
|
|
72
78
|
Unlike most components in this library, `AlertMaskCore` has no public `--alert-mask-core-*` CSS
|
|
73
79
|
custom properties — the SVG path geometry can't be driven by `var()`, so `config` is the entire
|
|
74
|
-
override surface (colour included).
|
|
80
|
+
override surface (colour included). Colour strings may be `var()` references, so a wrapper
|
|
81
|
+
component can expose its own tokens through them (as `AlertMaskedContent` does with
|
|
82
|
+
`--alert-masked-content-border-colour`/`-background`). See CONSUMER-STYLING.md.
|
|
75
83
|
|
|
76
84
|
## Notes
|
|
77
85
|
|
|
@@ -82,3 +90,9 @@ override surface (colour included). See CONSUMER-STYLING.md.
|
|
|
82
90
|
`--_height`/`--_inset-inline-start`/`--_inset-inline-end`/`--_inset-block-start`/
|
|
83
91
|
`--_inset-block-end` (they're JS-computed plumbing, not a consumer override surface — `config`
|
|
84
92
|
already covers that). No behaviour change.
|
|
93
|
+
- Changed 2026-09-27: the mask id was a hardcoded `borderMask`, so with more than one instance on a
|
|
94
|
+
page (e.g. stacked masked toasts) every instance used the first one's mask shape; now unique per
|
|
95
|
+
instance via `useId()`. Also: SVG marked `aria-hidden`, colours applied as `fill` styles so `var()`
|
|
96
|
+
resolves reliably, and the `ResizeObserver` is disconnected on unmount (it previously leaked).
|
|
97
|
+
Stories now render over a photo/gradient backdrop with a `data-theme` wrapper; on the plain canvas
|
|
98
|
+
they looked flat grey.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: AlertMaskedContent
|
|
3
|
+
description: AlertMaskedContent — AlertContentInner inside AlertMaskCore's SVG mask (accent border cut-out + translucent fill); the masked variant DisplayToast/DisplayPrompt swap in
|
|
4
|
+
type: reference
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# AlertMaskedContent
|
|
8
|
+
|
|
9
|
+
## Overview
|
|
10
|
+
|
|
11
|
+
The "glass" sibling of `AlertContent`. Same icon/title/body/dismiss layout (the shared
|
|
12
|
+
`AlertContentInner`), but instead of an opaque surface it sits inside `AlertMaskCore`, which draws
|
|
13
|
+
an accent-coloured border as an SVG cut-out and a translucent fill, so the page behind shows
|
|
14
|
+
through.
|
|
15
|
+
|
|
16
|
+
Used internally by `DisplayToast` (`appearance.masked: true`) and `DisplayPrompt`
|
|
17
|
+
(`:masked="true"`). Use it directly when you want a standalone alert over imagery or a gradient.
|
|
18
|
+
|
|
19
|
+
**Location**: `app/components/02.molecules/alert-masked-content/AlertMaskedContent.vue`
|
|
20
|
+
|
|
21
|
+
## Props
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Default | Notes |
|
|
24
|
+
|---|---|---|---|
|
|
25
|
+
| `theme` | `SemanticTheme` | — | **Required.** Sets `data-theme` on the root; drives the accent colour and default icon. |
|
|
26
|
+
| `customIcon` | `string` | `undefined` | Icon name override (see `alert-content.md` for the resolution chain). |
|
|
27
|
+
| `showIcon` | `boolean` | `true` | Render the icon column. |
|
|
28
|
+
| `dismissible` | `boolean` | `false` | Shows the dismiss button. |
|
|
29
|
+
| `contentId` | `string` | `undefined` | `id` on `.alert-content-body`, for `aria-describedby` wiring. |
|
|
30
|
+
| `ariaLive` | `"polite" \| "assertive" \| "off"` | `undefined` | `aria-live` on `.alert-content-body`. |
|
|
31
|
+
| `maskConfig` | `AlertMaskConfig` | `undefined` | Merged over the defaults below; any field you set wins. |
|
|
32
|
+
|
|
33
|
+
Default mask config:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
{
|
|
37
|
+
borderColour: "var(--alert-masked-content-border-colour, var(--theme-accent))",
|
|
38
|
+
backgroundColour: "var(--alert-masked-content-background, color-mix(in oklab, var(--theme-surface-subtle) 80%, transparent))",
|
|
39
|
+
radiusLeft: 8, radiusRight: 4,
|
|
40
|
+
borderLeft: 6, borderTop: 1, borderRight: 1, borderBottom: 1,
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Slots
|
|
45
|
+
|
|
46
|
+
Forwarded to `AlertContentInner`: `#icon`, `#title`, `#content`, `#actions` (a button row under the message, outside the live body), `#dismissIcon`, `#dismissLabel`
|
|
47
|
+
(sr-only dismiss label, default `"Close"`; pass translated text here).
|
|
48
|
+
|
|
49
|
+
## Events
|
|
50
|
+
|
|
51
|
+
| Event | Payload | When |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `dismiss` | — | The dismiss button is clicked. |
|
|
54
|
+
|
|
55
|
+
## Usage
|
|
56
|
+
|
|
57
|
+
```vue
|
|
58
|
+
<AlertMaskedContent theme="success" dismissible @dismiss="hide">
|
|
59
|
+
<template #title>Saved</template>
|
|
60
|
+
<template #content>Your changes have been saved.</template>
|
|
61
|
+
</AlertMaskedContent>
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Colour via tokens (inherits from any ancestor you own):
|
|
65
|
+
|
|
66
|
+
```vue
|
|
67
|
+
<div style="--alert-masked-content-border-colour: white; --alert-masked-content-background: oklch(20% 0.05 260 / 0.6);">
|
|
68
|
+
<AlertMaskedContent theme="info">...</AlertMaskedContent>
|
|
69
|
+
</div>
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Geometry via `maskConfig`:
|
|
73
|
+
|
|
74
|
+
```vue
|
|
75
|
+
<AlertMaskedContent theme="info" :mask-config="{ radiusLeft: 16, radiusRight: 16, borderLeft: 2 }">...</AlertMaskedContent>
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
## Styling
|
|
79
|
+
|
|
80
|
+
See `CONSUMER-STYLING.md` next to the component. Public tokens:
|
|
81
|
+
`--alert-masked-content-border-colour`, `--alert-masked-content-background`. The root sets
|
|
82
|
+
`--alert-content-inner-background: transparent` on itself so the mask shows through.
|
|
83
|
+
|
|
84
|
+
## Notes
|
|
85
|
+
|
|
86
|
+
- Needs something behind it to read as a mask. On a plain page it's just a grey-ish box. The
|
|
87
|
+
Storybook "Over Imagery" story compares it with `AlertContent` over photos and gradients.
|
|
88
|
+
- The default fill is `--theme-surface-subtle` at 80% (via `color-mix()`), the surface
|
|
89
|
+
`--theme-text` is designed for, so contrast holds in light and dark mode. Changed 2026-09-27:
|
|
90
|
+
it was `rgba(0, 0, 0, 0.3)`, which put dark light-mode text on a darkened backdrop.
|
|
91
|
+
- Changed 2026-09-27: colours are now overridable via the two public tokens (previously fixed
|
|
92
|
+
literals, reachable only through `maskConfig`), and the transparent inner background uses
|
|
93
|
+
`AlertContentInner`'s public `--alert-content-inner-background` instead of reaching into its
|
|
94
|
+
private `--_alert-content-inner-bg`. `AlertMaskCore` now gives each instance a unique mask id,
|
|
95
|
+
so several masked alerts on one page (e.g. stacked toasts) no longer all use the first one's shape.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
`AutoGrid` is a responsive auto-fit CSS grid wrapper. It renders whatever named slots the consumer provides, auto-fitting columns to a minimum of `
|
|
5
|
+
`AutoGrid` is a responsive auto-fit CSS grid wrapper. It renders whatever named slots the consumer provides, auto-fitting columns to a minimum of `300px` each (or stepping 250/300/350px by container width with `is-responsive`). Column count and gap are controlled via CSS custom properties, making layout adjustments a single-line style override rather than a prop change.
|
|
6
6
|
|
|
7
7
|
---
|
|
8
8
|
|
|
@@ -37,18 +37,28 @@ When filling from a data array, use a dynamic slot name in a `v-for`:
|
|
|
37
37
|
| Prop (template form) | Type | Default | Notes |
|
|
38
38
|
| -------------------------- | ------------------------------------------- | ------- | --------------------------------------------- |
|
|
39
39
|
| `tag` | `"div" \| "section" \| "article" \| "main"` | `"div"` | Use a semantic tag for page landmark regions. |
|
|
40
|
+
| `is-responsive` | `boolean` | `false` | Adds `.is-responsive`: column minimum steps small → default → large via `@container` queries at 768px / 1024px. Needs a `container-type: inline-size` ancestor. |
|
|
40
41
|
| `:style-class-passthrough` | `string \| string[]` | `[]` | Extra CSS classes on the root element. |
|
|
41
42
|
|
|
42
43
|
---
|
|
43
44
|
|
|
44
45
|
## CSS custom properties
|
|
45
46
|
|
|
46
|
-
|
|
47
|
+
Set these on the grid itself (`style`, passthrough class) or on any ancestor you own; they inherit
|
|
48
|
+
in. Full reference: `app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md`.
|
|
47
49
|
|
|
48
|
-
| Property
|
|
49
|
-
|
|
|
50
|
-
| `--auto-grid-
|
|
51
|
-
| `--auto-grid-
|
|
50
|
+
| Property | Default | Notes |
|
|
51
|
+
| ---------------------------------- | ------- | ---------------------------------------------------------------------------- |
|
|
52
|
+
| `--auto-grid-gap` | `1rem` | Grid gap between items. |
|
|
53
|
+
| `--auto-grid-min-col-size-default` | `300px` | Minimum column width when `is-responsive` is off; the 768px+ step when on. |
|
|
54
|
+
| `--auto-grid-min-col-size-small` | `250px` | `is-responsive` only: minimum column width below 768px container width. |
|
|
55
|
+
| `--auto-grid-min-col-size-large` | `350px` | `is-responsive` only: minimum column width at 1024px+ container width. |
|
|
56
|
+
|
|
57
|
+
There is no `--auto-grid-min-col-size` token (an earlier version of this doc listed one; it never
|
|
58
|
+
existed in the component). Use `--auto-grid-min-col-size-default`.
|
|
59
|
+
|
|
60
|
+
> Changed 2026-09-27: the tokens used to be declared on `.auto-grid` itself, so ancestor values
|
|
61
|
+
> never landed. Defaults are now `var()` fallbacks at the point of use.
|
|
52
62
|
|
|
53
63
|
### Fixed column count
|
|
54
64
|
|
|
@@ -63,7 +73,7 @@ Override `grid-template-columns` directly — there is no single token for this:
|
|
|
63
73
|
### Narrower minimum item width
|
|
64
74
|
|
|
65
75
|
```vue
|
|
66
|
-
<AutoGrid style="--auto-grid-min-col-size: 180px;">
|
|
76
|
+
<AutoGrid style="--auto-grid-min-col-size-default: 180px;">
|
|
67
77
|
...
|
|
68
78
|
</AutoGrid>
|
|
69
79
|
```
|
|
@@ -154,11 +164,9 @@ See [component-aria-landmark.md](../component-aria-landmark.md) for the full lan
|
|
|
154
164
|
Use CSS custom properties for layout, not utility classes.
|
|
155
165
|
Delete this block if no overrides are needed.
|
|
156
166
|
─────────────────────────────────────────────────────────────────── */
|
|
157
|
-
.auto-grid {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
--auto-grid-gap: 2rem;
|
|
161
|
-
}
|
|
167
|
+
.my-auto-grid {
|
|
168
|
+
--auto-grid-min-col-size-default: 200px;
|
|
169
|
+
--auto-grid-gap: 2rem;
|
|
162
170
|
}
|
|
163
171
|
</style>
|
|
164
172
|
```
|
|
@@ -171,5 +179,5 @@ See [component-local-style-override.md](../component-local-style-override.md) fo
|
|
|
171
179
|
|
|
172
180
|
- Auto-imported in Nuxt — no manual import needed.
|
|
173
181
|
- Slot names can be anything — semantic (`#revenue`) or indexed (`#item-0`). Document order determines render order.
|
|
174
|
-
- `--auto-grid-min-col-size` controls the minimum column width; `auto-fit` fills as many columns as will fit.
|
|
182
|
+
- `--auto-grid-min-col-size-default` controls the minimum column width; `auto-fit` fills as many columns as will fit.
|
|
175
183
|
- To fix the column count, override `grid-template-columns` directly (e.g. `style="grid-template-columns: repeat(3, 1fr)"`) — there is no single token for this.
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
`CanvasSwitcher` renders a row of icon buttons (mobile / tablet / laptop / desktop / full width)
|
|
6
6
|
for switching a bound `MediaCanvas` value — typically used to drive a preview/demo wrapper's width
|
|
7
|
-
while working on a responsive component in Storybook. Each button is an `
|
|
7
|
+
while working on a responsive component in Storybook. Each button is an `InputButton`
|
|
8
8
|
(`variant="tertiary"`, icon-only), giving it the library's standard button focus ring and hover
|
|
9
9
|
state for free instead of a raw `<button>`.
|
|
10
10
|
|
|
@@ -55,7 +55,7 @@ actually imported somewhere, since Nuxt only bundles a component's SFC styles wh
|
|
|
55
55
|
|
|
56
56
|
- Component is auto-imported in Nuxt — no import needed.
|
|
57
57
|
- No accessible-name prop is needed on the buttons — each one's `button-text` ("Mobile", "Tablet",
|
|
58
|
-
etc.) is rendered screen-reader-only by `
|
|
58
|
+
etc.) is rendered screen-reader-only by `InputButton`'s icon-only handling, and the selected
|
|
59
59
|
button is marked via `aria-pressed="true"` rather than a private CSS-only "current" class.
|
|
60
60
|
- See `CONSUMER-STYLING.md` in the component's own folder for the full `--canvas-switcher-*` token
|
|
61
|
-
API. Button-level tokens (surface/hover/focus) belong to `
|
|
61
|
+
API. Button-level tokens (surface/hover/focus) belong to `InputButton`, not this component.
|
|
@@ -4,6 +4,8 @@ Live camera QR code scanner. Streams the device camera, detects QR codes in real
|
|
|
4
4
|
|
|
5
5
|
**File**: `app/components/02.molecules/qr-code/CaptureQrCode.vue`
|
|
6
6
|
|
|
7
|
+
> **Changed 2026-09-28:** root class `.capture-qr-stream` → `.capture-qr-code`; `.camera-stopped`, `.camera-error`, `.scanned-results` → `.capture-qr-code-stopped`, `-error`, `-results`. Copy is now props, the error block is `role="alert"` with an `#error` slot, and the reset button is `InputButton`.
|
|
8
|
+
|
|
7
9
|
## Prerequisites
|
|
8
10
|
|
|
9
11
|
The `nuxt-qrcode` Nuxt module must be registered in the consuming app's `nuxt.config.ts`:
|
|
@@ -21,16 +23,24 @@ Camera access requires a secure context (HTTPS or localhost) and the user granti
|
|
|
21
23
|
|
|
22
24
|
| Prop | Type | Default | Description |
|
|
23
25
|
|------|------|---------|-------------|
|
|
26
|
+
| `camera-stopped-label` | `string` | `"Camera stopped"` | Message while the camera is stopped (tab hidden, route leave) |
|
|
27
|
+
| `reset-camera-label` | `string` | `"Reset camera"` | Reset button text in the error state |
|
|
24
28
|
| `style-class-passthrough` | `string \| string[]` | `[]` | Extra classes on the root element |
|
|
25
29
|
|
|
30
|
+
## Slots
|
|
31
|
+
|
|
32
|
+
| Slot | Scope | Description |
|
|
33
|
+
|------|-------|-------------|
|
|
34
|
+
| `#error` | `{ error, message, reset }` | Replaces the default error content (message + reset button). `error` is the `Error.name` (e.g. `NotAllowedError`), so you can show your own translated copy per case; call `reset()` to retry. |
|
|
35
|
+
|
|
26
36
|
## CSS classes
|
|
27
37
|
|
|
28
38
|
| Class | Where | Description |
|
|
29
39
|
|-------|-------|-------------|
|
|
30
|
-
| `.capture-qr-
|
|
31
|
-
| `.
|
|
32
|
-
| `.
|
|
33
|
-
| `.
|
|
40
|
+
| `.capture-qr-code` | root | always present |
|
|
41
|
+
| `.capture-qr-code-stopped` | inner | shown when camera is off but no error |
|
|
42
|
+
| `.capture-qr-code-error` | inner | shown when an error has occurred |
|
|
43
|
+
| `.capture-qr-code-results` | inner | polite live region, always rendered; its `<ul>` appears once a code is decoded |
|
|
34
44
|
|
|
35
45
|
## Behaviour
|
|
36
46
|
|
|
@@ -38,9 +48,9 @@ Camera access requires a secure context (HTTPS or localhost) and the user granti
|
|
|
38
48
|
- When the page becomes hidden (tab switch, minimize), the camera stops and media streams are released
|
|
39
49
|
- On route leave (`onBeforeRouteLeave`), the camera stops and streams are released
|
|
40
50
|
- On `<KeepAlive>` deactivate/activate, camera is stopped/restarted accordingly
|
|
41
|
-
- If the user denies camera permission or another error occurs, the `.
|
|
51
|
+
- If the user denies camera permission or another error occurs, the `.capture-qr-code-error` state is shown with the error message and a **Reset camera** button
|
|
42
52
|
- Detected QR codes replace the previous results — each scan is a fresh result set
|
|
43
|
-
- Results are displayed as a `<ul>` inside `.
|
|
53
|
+
- Results are displayed as a `<ul>` inside `.capture-qr-code-results`
|
|
44
54
|
|
|
45
55
|
## Usage
|
|
46
56
|
|
|
@@ -61,18 +71,18 @@ With styling:
|
|
|
61
71
|
The root element is a square (`aspect-ratio: 1 / 1`) by default. Override in a consuming page or component:
|
|
62
72
|
|
|
63
73
|
```css
|
|
64
|
-
.my-scanner.capture-qr-
|
|
74
|
+
.my-scanner.capture-qr-code {
|
|
65
75
|
aspect-ratio: auto;
|
|
66
76
|
max-width: 40rem;
|
|
67
77
|
}
|
|
68
78
|
|
|
69
|
-
.my-scanner .
|
|
79
|
+
.my-scanner .capture-qr-code-error {
|
|
70
80
|
padding: 1.6rem;
|
|
71
81
|
border-radius: 0.8rem;
|
|
72
82
|
background-color: var(--theme-surface-error);
|
|
73
83
|
}
|
|
74
84
|
|
|
75
|
-
.my-scanner .
|
|
85
|
+
.my-scanner .capture-qr-code-results {
|
|
76
86
|
margin-block-start: 1.6rem;
|
|
77
87
|
font-size: 1.4rem;
|
|
78
88
|
}
|
|
@@ -14,7 +14,7 @@ dynamic slots keyed by `carouselDataIds`. It supports swipe, arrow-key, marker-c
|
|
|
14
14
|
prev/next-button navigation, and four `buttonLayout` variants for positioning the prev/next
|
|
15
15
|
buttons relative to the marker controls.
|
|
16
16
|
|
|
17
|
-
Has live production usage
|
|
17
|
+
Has live production usage in a consumer app — check before making a breaking change to its
|
|
18
18
|
default rendered output.
|
|
19
19
|
|
|
20
20
|
## Props
|
|
@@ -125,8 +125,8 @@ See [CONSUMER-STYLING.md](../../app/components/03.organisms/image-galleries/caro
|
|
|
125
125
|
properties that were never declared anywhere, with no fallback. Per CSS spec this makes the
|
|
126
126
|
whole declaration invalid at computed-value time, so the item edge-preview offset and the
|
|
127
127
|
width caps were silently never applying in production. Now declared as real public tokens with
|
|
128
|
-
real defaults (`80rem`/`80rem`/`4rem`) — this is a visible change to the live carousel
|
|
129
|
-
|
|
128
|
+
real defaults (`80rem`/`80rem`/`4rem`) — this is a visible change to the live carousel in
|
|
129
|
+
a consumer app, done deliberately after confirming with the maintainer.
|
|
130
130
|
- Removed dead commented-out code in `itemWidthOffsetStr`'s computed (an unreachable
|
|
131
131
|
`if (props.allowCarouselOverflow)` branch, entirely commented out, that duplicated the live
|
|
132
132
|
branch's logic).
|
|
@@ -93,8 +93,8 @@ apply instantly instead of fading).
|
|
|
93
93
|
- 2026-09-20 migration: renamed from `ContainerGlowCore` to `ContainerGlow` — the `Core` suffix in
|
|
94
94
|
this library denotes a primitive with a non-Core wrapper built on top of it (`InputTextCore` →
|
|
95
95
|
`InputTextWithLabel`, `AlertMaskCore` → `AlertMaskedContent`), and this component has no such
|
|
96
|
-
sibling. Checked all consumer repos first; found one real usage in
|
|
97
|
-
|
|
96
|
+
sibling. Checked all consumer repos first; found one real usage in a defunct
|
|
97
|
+
demo app, left as a follow-up for that repo rather than edited here.
|
|
98
98
|
- Moved from `app/components/container-glow/` (unplaced) into
|
|
99
99
|
`01.atoms/animations/container-glow/`.
|
|
100
100
|
- The `Config` type was previously an inline, non-exported interface with **all fields required**,
|
|
@@ -123,9 +123,9 @@ Building this component's forced-open/forced-closed cycling surfaced a real bug
|
|
|
123
123
|
|
|
124
124
|
## Icons
|
|
125
125
|
|
|
126
|
-
`DocsNavItem.icon` is optional (any icon name resolvable by `<Icon>`, e.g. Lucide set: `"lucide:rocket"`). Items without an icon still align correctly with icon-bearing items — the link is `display: grid` with a fixed-width icon column (`--docs-
|
|
126
|
+
`DocsNavItem.icon` is optional (any icon name resolvable by `<Icon>`, e.g. Lucide set: `"lucide:rocket"`). Items without an icon still align correctly with icon-bearing items — the link is `display: grid` with a fixed-width icon column (`--content-docs-link-icon-size`), not `flex`, so an absent icon doesn't collapse the label leftward.
|
|
127
127
|
|
|
128
|
-
To move the icon to the end of the link instead of the start, set `--docs-nav-link-icon-order` (or `--docs-page-nav-link-icon-order`) to `rtl` (default `ltr`). This uses a `direction` flip to mirror which physical side the fixed-width column renders on, rather than swapping `grid-column` values directly — swapping columns would put the label into the icon-sized track and squeeze it. The icon and label content reset `direction: ltr` internally so text/glyphs don't visually mirror.
|
|
128
|
+
To move the icon to the end of the link instead of the start, set `--content-docs-nav-link-icon-order` (or `--content-docs-page-nav-link-icon-order`) to `rtl` (default `ltr`). This uses a `direction` flip to mirror which physical side the fixed-width column renders on, rather than swapping `grid-column` values directly — swapping columns would put the label into the icon-sized track and squeeze it. The icon and label content reset `direction: ltr` internally so text/glyphs don't visually mirror.
|
|
129
129
|
|
|
130
130
|
---
|
|
131
131
|
|
|
@@ -137,7 +137,7 @@ All `--content-docs-*` tokens can be overridden at global, page, or instance sco
|
|
|
137
137
|
- `-font-size`, `-font-weight`, `-color`, `-bg`, `-margin`, `-padding-block`, `-padding-inline`
|
|
138
138
|
|
|
139
139
|
**Panel tokens** (shared: `--content-docs-panel-*`, per-side: `--content-docs-{nav,page-nav}-panel-bg`):
|
|
140
|
-
- `-bg` (default: `
|
|
140
|
+
- `-bg` (default: `var(--page-bg)`), `-padding-block`, `-padding-inline`, `-border-radius`
|
|
141
141
|
|
|
142
142
|
**Link tokens** (shared: `--content-docs-link-*`, per-side: `--content-docs-{nav,page-nav}-link-*`):
|
|
143
143
|
- `-font-size`, `-padding-block`, `-padding-inline`, `-margin-block`, `-border-radius`, `-color`, `-bg`, `-hover-bg`, `-hover-color`, `-active-bg`, `-active-color`
|
|
@@ -147,8 +147,12 @@ All `--content-docs-*` tokens can be overridden at global, page, or instance sco
|
|
|
147
147
|
- `--content-docs-page-nav-column-width` (default `22rem`, desktop `docsPageNav` track)
|
|
148
148
|
- `--content-docs-page-nav-column-width-tablet` (default `20rem`, tablet's single fixed track — `docsNav` is full-width at tablet)
|
|
149
149
|
|
|
150
|
-
**Icon tokens** (
|
|
151
|
-
- `--docs-
|
|
150
|
+
**Icon tokens** (shared by both link lists; renamed from `--docs-*` to `--content-docs-*` 2026-09-27, no consumer used the old names):
|
|
151
|
+
- `--content-docs-link-icon-gap`, `--content-docs-link-icon-size` (applied as `font-size` on the icon, pitfall #24), `--content-docs-nav-link-icon-order` (`ltr`/`rtl`), `--content-docs-page-nav-link-icon-order`
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
Full token reference with defaults: `app/components/01.atoms/content-wrappers/docs-pages/CONSUMER-STYLING.md`.
|
|
152
156
|
|
|
153
157
|
---
|
|
154
158
|
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
Fixed, non-modal banner shown while cookie consent is undecided (`useCookieConsent().status === 'unset'`). Accept/Reject buttons call `acceptAll()`/`rejectAll()` on [[composable-cookie-consent]] directly — no `v-model`, no emits to wire up. Pair with [[composable-analytics]] (or any other consent-gated script) which reads the same consent state.
|
|
5
|
+
Fixed, non-modal banner built on `AlertContent` (see `alert-content.md`), shown while cookie consent is undecided (`useCookieConsent().status === 'unset'`). Accept/Reject buttons call `acceptAll()`/`rejectAll()` on [[composable-cookie-consent]] directly — no `v-model`, no emits to wire up. Pair with [[composable-analytics]] (or any other consent-gated script) which reads the same consent state.
|
|
6
6
|
|
|
7
|
-
**Location**: `app/components/
|
|
7
|
+
**Location**: `app/components/02.molecules/cookie-consent-banner/CookieConsentBanner.vue`
|
|
8
8
|
|
|
9
9
|
**Types**: `~/types/components` — `CookieConsentBannerProps`, `CookieConsentStatus`
|
|
10
10
|
|
|
@@ -14,7 +14,10 @@ Fixed, non-modal banner shown while cookie consent is undecided (`useCookieConse
|
|
|
14
14
|
|
|
15
15
|
| Prop | Type | Default | Notes |
|
|
16
16
|
|---|---|---|---|
|
|
17
|
-
| `theme` | `SemanticTheme` | `"info"` |
|
|
17
|
+
| `theme` | `SemanticTheme` | `"info"` | Passed to `AlertContent`: panel colours, accent stripe and the accept button, via `--theme-*`. |
|
|
18
|
+
| `ariaLabel` | `string` | `"Cookie consent"` | Accessible name for the banner's `role="region"`. Pass translated copy in non-English apps. |
|
|
19
|
+
| `icon` | `string` | `"material-symbols:cookie-outline"` | Iconify name for the alert icon (`AlertContent`'s `customIcon`). |
|
|
20
|
+
| `showIcon` | `boolean` | `true` | Render the icon column. |
|
|
18
21
|
| `styleClassPassthrough` | `string \| string[]` | `[]` | Extra classes on the root element. |
|
|
19
22
|
|
|
20
23
|
### app.config defaults
|
|
@@ -36,6 +39,7 @@ Resolution chain: **prop → app.config → hardcoded fallback**.
|
|
|
36
39
|
|
|
37
40
|
| Slot | Purpose | Default |
|
|
38
41
|
|---|---|---|
|
|
42
|
+
| `title` | Title line above the message | "Cookies" |
|
|
39
43
|
| `message` | The consent message body | "This site uses cookies to understand how it's used. You can accept or reject them." |
|
|
40
44
|
| `acceptLabel` | Accept button text | "Accept" |
|
|
41
45
|
| `rejectLabel` | Reject button text | "Reject" |
|
|
@@ -57,7 +61,8 @@ useAnalytics();
|
|
|
57
61
|
<div class="page-layout">
|
|
58
62
|
<slot />
|
|
59
63
|
<DisplayToastProvider position="top" alignment="right" :max-visible="3" />
|
|
60
|
-
<CookieConsentBanner>
|
|
64
|
+
<CookieConsentBanner :aria-label="t('global.cookieConsent.ariaLabel')">
|
|
65
|
+
<template #title>{{ t("global.cookieConsent.title") }}</template>
|
|
61
66
|
<template #message>{{ t("global.cookieConsent.message") }}</template>
|
|
62
67
|
<template #acceptLabel>{{ t("global.cookieConsent.accept") }}</template>
|
|
63
68
|
<template #rejectLabel>{{ t("global.cookieConsent.reject") }}</template>
|
|
@@ -68,21 +73,15 @@ useAnalytics();
|
|
|
68
73
|
|
|
69
74
|
## CSS / styling
|
|
70
75
|
|
|
71
|
-
|
|
76
|
+
Panel styling is `AlertContent`'s `--alert-content-*` tokens; the banner adds position/motion and button tokens (`--cookie-consent-banner-*`). Full detail, and a "neutral panel" recipe for the old white look, in `CONSUMER-STYLING.md` next to the component.
|
|
72
77
|
|
|
73
|
-
|
|
74
|
-
|---|---|
|
|
75
|
-
| `--privacy-notice-banner-z-index` | `999999` |
|
|
76
|
-
| `--privacy-notice-banner-gutter` | `1.6rem` |
|
|
77
|
-
| `--privacy-notice-banner-max-width` | `64rem` |
|
|
78
|
-
| `--privacy-notice-banner-border-radius` | `0.8rem` |
|
|
79
|
-
| `--privacy-notice-banner-border` | `0.1rem solid light-dark(var(--slate-10), var(--slate-02))` |
|
|
80
|
-
| `--privacy-notice-banner-background` | `light-dark(var(--slate-00), var(--slate-10))` |
|
|
81
|
-
| `--privacy-notice-banner-transition-duration` | `200ms` |
|
|
78
|
+
The banner is **teleported to `<body>`**, so set tokens on `:root`/`html`/`body` or through `style-class-passthrough`, not on a page wrapper.
|
|
82
79
|
|
|
83
80
|
## Notes
|
|
84
81
|
|
|
85
|
-
- **Teleported to `<body>`** — like `DisplayToastProvider`, query it in tests via `document.querySelector(".
|
|
86
|
-
- **No focus trap / backdrop** — this is a dismiss-by-decision banner, not a modal. It collapses via a `grid-template-rows` transition (same mechanic as `DisplayPrompt`) once `status` leaves `"unset"`, rather than unmounting.
|
|
82
|
+
- **Teleported to `<body>`** — like `DisplayToastProvider`, query it in tests via `document.querySelector(".cookie-consent-banner")`, not `wrapper.find(...)`.
|
|
83
|
+
- **No focus trap / backdrop** — this is a dismiss-by-decision banner, not a modal. It collapses via a `grid-template-rows` transition (same mechanic as `DisplayPrompt`) once `status` leaves `"unset"`, rather than unmounting. When closed it is `visibility: hidden`, so its buttons leave the tab order and accessibility tree (before 2026-09-27 they stayed focusable while invisible).
|
|
87
84
|
- **Only ever one instance** — `useCookieConsent()`'s underlying state is a module-scope singleton, so mounting the banner twice in one app just duplicates the UI, it doesn't create separate consent state.
|
|
88
|
-
- To let a visitor change their mind later (e.g. from a cookie-policy page), call `useCookieConsent().rejectAll()` or clear the `
|
|
85
|
+
- To let a visitor change their mind later (e.g. from a cookie-policy page), call `useCookieConsent().rejectAll()` or clear the `privacy-notice-consent` cookie — the banner reappears since `status` returns to `"unset"` only once the cookie is gone; `rejectAll()` itself sets it to `"denied"`, which keeps the banner hidden but stops GA. Expose a dedicated "reset my choice" affordance if you want the banner itself to resurface.
|
|
86
|
+
- 2026-09-27 migration: classes/tokens/test ids renamed `privacy-notice-banner` → `cookie-consent-banner`; `light-dark()` defaults replaced with light values plus an explicit text colour; single-use private pass-throughs inlined and the hardcoded spacing, button and colour values promoted to public tokens; `ariaLabel` prop (was a hardcoded "Cookie consent"); closed banner hidden from keyboard and screen readers; visible `:focus-visible` outline on the buttons; reduced-motion support; `styleClassPassthrough` now reactive. Added CONSUMER-STYLING.md and a snippet.
|
|
87
|
+
- 2026-09-27 (later the same day): rebuilt on `AlertContent` (`:custom-icon`, `:show-icon`, title/message/actions slots). New `title` slot (default "Cookies") and `icon`/`showIcon` props. The panel now follows the semantic theme in light and dark mode instead of a fixed white panel, with a left accent stripe instead of a top border and right-aligned buttons. The banner's own panel tokens were removed in favour of `--alert-content-*`.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
## Overview
|
|
4
4
|
|
|
5
|
-
`DashboardQuadGrid` (renamed from `LayoutGridA`) is a fixed 4-panel dashboard layout. Unlike
|
|
6
|
-
`LayoutGridByCols
|
|
5
|
+
`DashboardQuadGrid` (renamed from `LayoutGridA`) is a fixed 4-panel dashboard layout. Unlike the generic
|
|
6
|
+
grids (`LayoutGridByCols`, `AutoGrid`), its column arrangement isn't configurable — it has four
|
|
7
7
|
**named** slots (`slot1`–`slot4`) with a fixed responsive arrangement that changes shape (not
|
|
8
8
|
just column count) across breakpoints, designed for dashboard-style layouts (one primary panel
|
|
9
9
|
plus three supporting panels).
|
|
@@ -46,7 +46,7 @@ own container width, not the viewport.
|
|
|
46
46
|
horizontally across the top-right; `slot3`/`slot4` sit in the bottom-right.
|
|
47
47
|
|
|
48
48
|
This shape is structural — there is no prop to reconfigure it. If you need an arbitrary
|
|
49
|
-
column count instead, use `LayoutGridByCols
|
|
49
|
+
column count instead, use `LayoutGridByCols` (fixed count) or `AutoGrid` (auto-fit by minimum width).
|
|
50
50
|
|
|
51
51
|
---
|
|
52
52
|
|
|
@@ -94,5 +94,5 @@ See [CONSUMER-STYLING.md](../../app/components/01.atoms/content-wrappers/layout-
|
|
|
94
94
|
- Renamed from `LayoutGridA` during the 2026-09-21 compliance migration; previously lived
|
|
95
95
|
unplaced at `app/components/layout-grids/LayoutGridA.vue` with options-style props and no
|
|
96
96
|
public CSS tokens (its geometry values were hardcoded px literals).
|
|
97
|
-
- For a generic, arbitrary-column-count grid, use `LayoutGridByCols
|
|
97
|
+
- For a generic, arbitrary-column-count grid, use `LayoutGridByCols` or `AutoGrid` instead
|
|
98
98
|
— this component's 4-slot shape is fixed and specifically dashboard-oriented.
|