srcdev-nuxt-components 9.6.19 → 9.6.20
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/rules/consumer/ids-from-useid.md +3 -2
- package/.claude/skills/component-compliance-checklist.md +5 -0
- package/.claude/skills/components/auto-grid.md +3 -1
- package/.claude/skills/components/capture-qr-code.md +9 -5
- package/.claude/skills/components/carousel-flip.md +41 -30
- package/.claude/skills/components/column-flow-grid.md +2 -0
- package/.claude/skills/components/dashboard-quad-grid.md +7 -2
- package/.claude/skills/components/dashboard-stats-grid.md +4 -0
- package/.claude/skills/components/decode-qr-code.md +7 -2
- package/.claude/skills/components/deep-expanding-menu-classic.md +31 -30
- package/.claude/skills/components/deep-expanding-menu.md +22 -21
- package/.claude/skills/components/grid-stack.md +2 -0
- package/.claude/skills/components/layout-grid-by-cols.md +2 -0
- package/.claude/skills/components/masonry-grid.md +9 -1
- package/.claude/skills/components/page-row.md +3 -0
- package/.claude/skills/components/samaritan-prompt.md +24 -8
- package/.claude/skills/components/site-header.md +16 -2
- package/.claude/skills/index.md +12 -12
- package/.claude/skills/storybook-add-story.md +25 -0
- package/.claude/skills/testing-add-unit-test.md +26 -0
- package/.vscode/srcdev-component-capture-decode-qr-code.code-snippets +11 -2
- package/.vscode/srcdev-component-carousel-flip.code-snippets +22 -4
- package/.vscode/srcdev-component-deep-expanding-menu-classic.code-snippets +32 -2
- package/.vscode/srcdev-component-deep-expanding-menu.code-snippets +31 -1
- package/.vscode/srcdev-component-samaritan-prompt.code-snippets +5 -4
- package/.vscode/srcdev-component-site-header.code-snippets +13 -1
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/CONSUMER-STYLING.md +12 -2
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/DashboardQuadGrid.vue +19 -17
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/stories/DashboardQuadGrid.stories.ts +42 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-quad-grid/tests/DashboardQuadGrid.spec.ts +31 -44
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/CONSUMER-STYLING.md +13 -1
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/DashboardStatsGrid.vue +40 -31
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/stories/DashboardStatsGrid.stories.ts +47 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/dashboard-stats-grid/tests/DashboardStatsGrid.spec.ts +51 -53
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/CONSUMER-STYLING.md +3 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/LayoutGridByCols.vue +4 -0
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/stories/LayoutGridByCols.stories.ts +47 -2
- package/app/components/01.atoms/content-wrappers/layout-grid/layout-grid-by-cols/tests/LayoutGridByCols.spec.ts +36 -23
- package/app/components/01.atoms/grids/auto-grid/AutoGrid.vue +7 -3
- package/app/components/01.atoms/grids/auto-grid/CONSUMER-STYLING.md +1 -1
- package/app/components/01.atoms/grids/auto-grid/stories/AutoGrid.stories.ts +46 -1
- package/app/components/01.atoms/grids/auto-grid/tests/AutoGrid.spec.ts +40 -27
- package/app/components/01.atoms/grids/auto-grid/tests/__snapshots__/AutoGrid.spec.ts.snap +1 -1
- package/app/components/01.atoms/grids/column-flow-grid/CONSUMER-STYLING.md +9 -0
- package/app/components/01.atoms/grids/column-flow-grid/ColumnFlowGrid.vue +3 -2
- package/app/components/01.atoms/grids/column-flow-grid/stories/ColumnFlowGrid.stories.ts +46 -0
- package/app/components/01.atoms/grids/column-flow-grid/tests/ColumnFlowGrid.spec.ts +24 -11
- package/app/components/01.atoms/grids/grid-stack/CONSUMER-STYLING.md +3 -0
- package/app/components/01.atoms/grids/grid-stack/GridStack.vue +2 -0
- package/app/components/01.atoms/grids/grid-stack/stories/GridStack.stories.ts +41 -0
- package/app/components/01.atoms/grids/grid-stack/tests/GridStack.spec.ts +26 -13
- package/app/components/01.atoms/grids/masonry-grid/CONSUMER-STYLING.md +15 -0
- package/app/components/01.atoms/grids/masonry-grid/MasonryGrid.vue +51 -31
- package/app/components/01.atoms/grids/masonry-grid/stories/MasonryGrid.stories.ts +48 -0
- package/app/components/01.atoms/grids/masonry-grid/tests/MasonryGrid.spec.ts +84 -29
- package/app/components/01.atoms/page-row/CONSUMER-STYLING.md +6 -1
- package/app/components/01.atoms/page-row/PageRow.vue +16 -15
- package/app/components/01.atoms/page-row/stories/PageRow.stories.ts +23 -0
- package/app/components/01.atoms/page-row/tests/PageRow.spec.ts +6 -5
- package/app/components/02.molecules/navigation/deep-expanding-menu/CONSUMER-STYLING.md +63 -44
- package/app/components/02.molecules/navigation/deep-expanding-menu/DeepExpandingMenu.vue +74 -37
- package/app/components/02.molecules/navigation/deep-expanding-menu/stories/DeepExpandingMenu.stories.ts +139 -19
- package/app/components/02.molecules/navigation/deep-expanding-menu/tests/DeepExpandingMenu.spec.ts +90 -27
- package/app/components/02.molecules/navigation/deep-expanding-menu/tests/__snapshots__/DeepExpandingMenu.spec.ts.snap +8 -8
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/CONSUMER-STYLING.md +58 -26
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/DeepExpandingMenuClassic.vue +113 -57
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/stories/DeepExpandingMenuClassic.stories.ts +139 -19
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/tests/DeepExpandingMenuClassic.spec.ts +140 -22
- package/app/components/02.molecules/navigation/deep-expanding-menu-classic/tests/__snapshots__/DeepExpandingMenuClassic.spec.ts.snap +9 -9
- package/app/components/02.molecules/qr-code/CONSUMER-STYLING.md +22 -7
- package/app/components/02.molecules/qr-code/CaptureQrCode.vue +63 -71
- package/app/components/02.molecules/qr-code/DecodeQrCode.vue +47 -10
- package/app/components/02.molecules/qr-code/stories/CaptureQrCode.stories.ts +114 -26
- package/app/components/02.molecules/qr-code/stories/DecodeQrCode.stories.ts +115 -24
- package/app/components/02.molecules/qr-code/tests/CaptureQrCode.spec.ts +124 -51
- package/app/components/02.molecules/qr-code/tests/DecodeQrCode.spec.ts +74 -25
- package/app/components/02.molecules/samaritan-prompt/CONSUMER-STYLING.md +22 -10
- package/app/components/02.molecules/samaritan-prompt/SamaritanPrompt.vue +30 -12
- package/app/components/02.molecules/samaritan-prompt/SamaritanPromptMixed.vue +34 -10
- package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPrompt.stories.ts +55 -4
- package/app/components/02.molecules/samaritan-prompt/stories/SamaritanPromptMixed.stories.ts +67 -7
- package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPrompt.spec.ts +113 -29
- package/app/components/02.molecules/samaritan-prompt/tests/SamaritanPromptMixed.spec.ts +92 -45
- package/app/components/03.organisms/image-galleries/carousel-flip/CONSUMER-STYLING.md +82 -29
- package/app/components/03.organisms/image-galleries/carousel-flip/CarouselFlip.vue +176 -113
- package/app/components/03.organisms/image-galleries/carousel-flip/stories/CarouselFlip.stories.ts +153 -23
- package/app/components/03.organisms/image-galleries/carousel-flip/tests/CarouselFlip.spec.ts +119 -63
- package/app/components/03.organisms/services/service-detail/tests/ServiceDetail.spec.ts +8 -8
- package/app/components/03.organisms/services/service-detail/tests/__snapshots__/ServiceDetail.spec.ts.snap +4 -4
- package/app/components/03.organisms/site-header/CONSUMER-STYLING.md +41 -23
- package/app/components/03.organisms/site-header/SiteHeader.vue +16 -21
- package/app/components/03.organisms/site-header/stories/SiteHeader.stories.ts +138 -0
- package/app/components/03.organisms/site-header/tests/SiteHeader.spec.ts +53 -26
- package/app/components/03.organisms/site-header/tests/__snapshots__/SiteHeader.spec.ts.snap +2 -2
- package/app/types/components/qr-code.d.ts +12 -0
- package/app/utils/graphemes.ts +8 -0
- package/package.json +1 -1
- package/app/components/01.atoms/animations/entry/.nuxt/app.config.mjs +0 -21
- package/app/components/01.atoms/animations/entry/.nuxt/components.d.ts +0 -66
- package/app/components/01.atoms/animations/entry/.nuxt/imports.d.ts +0 -30
- package/app/components/01.atoms/animations/entry/.nuxt/manifest/meta/test.json +0 -1
- package/app/components/01.atoms/animations/entry/.nuxt/types/app.config.d.ts +0 -35
- package/app/components/01.atoms/animations/entry/.nuxt/types/build.d.ts +0 -23
- package/app/components/01.atoms/animations/entry/.nuxt/types/builder-env.d.ts +0 -1
- package/app/components/01.atoms/animations/entry/.nuxt/types/components.d.ts +0 -71
- package/app/components/01.atoms/animations/entry/.nuxt/types/imports.d.ts +0 -386
- package/app/components/01.atoms/animations/entry/.nuxt/types/middleware.d.ts +0 -11
- package/app/components/01.atoms/animations/entry/.nuxt/types/modules.d.ts +0 -79
- package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-layouts.d.ts +0 -17
- package/app/components/01.atoms/animations/entry/.nuxt/types/nitro-nuxt.d.ts +0 -64
- package/app/components/01.atoms/animations/entry/.nuxt/types/plugins.d.ts +0 -29
- package/app/components/01.atoms/animations/entry/.nuxt/types/runtime-config.d.ts +0 -32
- package/app/components/01.atoms/animations/entry/.nuxt/types/shared-imports.d.ts +0 -10
- package/app/components/01.atoms/animations/entry/.nuxt/types/vue-shim.d.ts +0 -0
- package/app/components/01.atoms/animations/entry/.nuxtrc +0 -1
- package/app/components/01.atoms/animations/entry/node_modules/.cache/nuxt/chrome-workspace.json +0 -1
- package/app/components/01.atoms/animations/entry/node_modules/.cache/vite/client/vitest/da39a3ee5e6b4b0d3255bfef95601890afd80709/results.json +0 -1
- package/app/components/03.organisms/responsive-header/tests/.nuxt/app.config.mjs +0 -21
- package/app/components/03.organisms/responsive-header/tests/.nuxt/components.d.ts +0 -66
- package/app/components/03.organisms/responsive-header/tests/.nuxt/imports.d.ts +0 -30
- package/app/components/03.organisms/responsive-header/tests/.nuxt/manifest/meta/test.json +0 -1
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/app.config.d.ts +0 -35
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/build.d.ts +0 -23
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/builder-env.d.ts +0 -1
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/components.d.ts +0 -71
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/imports.d.ts +0 -386
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/middleware.d.ts +0 -11
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/modules.d.ts +0 -79
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/nitro-layouts.d.ts +0 -17
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/nitro-nuxt.d.ts +0 -64
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/plugins.d.ts +0 -29
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/runtime-config.d.ts +0 -32
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/shared-imports.d.ts +0 -10
- package/app/components/03.organisms/responsive-header/tests/.nuxt/types/vue-shim.d.ts +0 -0
- package/app/components/03.organisms/responsive-header/tests/node_modules/.cache/nuxt/chrome-workspace.json +0 -1
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<PageRow tag="div" :variant="pageRowVariant" :style-class-passthrough="styleClassPassthrough">
|
|
2
|
+
<PageRow tag="div" class="site-header-row" :variant="pageRowVariant" :style-class-passthrough="styleClassPassthrough">
|
|
3
3
|
<template #default>
|
|
4
4
|
<header class="site-header">
|
|
5
|
-
<nav class="home-
|
|
5
|
+
<nav class="site-header-home-nav" :aria-label="homeNavAriaLabel">
|
|
6
6
|
<SkipLinks>
|
|
7
7
|
<template #homeLink>
|
|
8
8
|
<slot name="branding"></slot>
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
</template>
|
|
34
34
|
|
|
35
35
|
<script setup lang="ts">
|
|
36
|
-
import type { ResponsiveHeaderProp } from "
|
|
36
|
+
import type { ResponsiveHeaderProp } from "~/types/components";
|
|
37
37
|
import PageRow from "../../01.atoms/page-row/PageRow.vue";
|
|
38
38
|
import SkipLinks from "../../01.atoms/navigation/skip-links/SkipLinks.vue";
|
|
39
39
|
import ResponsiveHeader from "../responsive-header/ResponsiveHeader.vue";
|
|
@@ -75,7 +75,7 @@ withDefaults(defineProps<Props>(), {
|
|
|
75
75
|
pageRowVariant: "content",
|
|
76
76
|
styleClassPassthrough: () => [],
|
|
77
77
|
navStyleClassPassthrough: () => [],
|
|
78
|
-
homeNavAriaLabel: "Home
|
|
78
|
+
homeNavAriaLabel: "Home navigation",
|
|
79
79
|
mainNavAriaLabel: "Main navigation",
|
|
80
80
|
secondaryNavAriaLabel: "Secondary navigation",
|
|
81
81
|
overflowMenuAriaLabel: "Overflow navigation menu",
|
|
@@ -88,32 +88,27 @@ const slots = useSlots();
|
|
|
88
88
|
|
|
89
89
|
<style lang="css">
|
|
90
90
|
@layer components {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
--site-header-gap (default: 2.4rem)
|
|
97
|
-
--site-header-padding-inline (default: 2.4rem)
|
|
98
|
-
--site-header-padding-block (default: 0px)
|
|
99
|
-
--site-header-bg (default: transparent)
|
|
100
|
-
--site-header-position (default: static)
|
|
101
|
-
--site-header-sticky-offset (default: 0px)
|
|
102
|
-
--site-header-z-index (default: 9)
|
|
103
|
-
──────────────────────────────────────────────────────────────────────── */
|
|
91
|
+
.site-header-row {
|
|
92
|
+
position: var(--site-header-position, static);
|
|
93
|
+
top: var(--site-header-sticky-offset, 0px);
|
|
94
|
+
z-index: var(--site-header-z-index, 9);
|
|
95
|
+
}
|
|
104
96
|
|
|
105
97
|
.site-header {
|
|
106
98
|
display: grid;
|
|
107
|
-
grid-template-columns:
|
|
99
|
+
grid-template-columns: fit-content(var(--site-header-branding-max-width, 50%)) minmax(0, 1fr);
|
|
108
100
|
align-items: center;
|
|
109
101
|
gap: var(--site-header-gap, 2.4rem);
|
|
110
102
|
padding-block: var(--site-header-padding-block, 0px);
|
|
111
103
|
padding-inline: var(--site-header-padding-inline, 2.4rem);
|
|
112
104
|
background-color: var(--site-header-bg, transparent);
|
|
113
|
-
position: var(--site-header-position, static);
|
|
114
|
-
top: var(--site-header-sticky-offset, 0px);
|
|
115
|
-
z-index: var(--site-header-z-index, 9);
|
|
116
105
|
width: 100%;
|
|
106
|
+
min-inline-size: 0;
|
|
107
|
+
|
|
108
|
+
.site-header-home-nav {
|
|
109
|
+
min-inline-size: 0;
|
|
110
|
+
overflow-wrap: anywhere;
|
|
111
|
+
}
|
|
117
112
|
}
|
|
118
113
|
}
|
|
119
114
|
</style>
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
import { ref } from "vue";
|
|
1
2
|
import SiteHeader from "../SiteHeader.vue";
|
|
3
|
+
import CanvasSwitcher from "../../../01.atoms/canvas-switcher/CanvasSwitcher.vue";
|
|
2
4
|
import type { Meta, StoryObj } from "@nuxtjs/storybook";
|
|
5
|
+
import type { MediaCanvas } from "~/types/components";
|
|
3
6
|
|
|
4
7
|
const meta: Meta<typeof SiteHeader> = {
|
|
5
8
|
title: "Organisms/Site Header",
|
|
@@ -34,6 +37,16 @@ const meta: Meta<typeof SiteHeader> = {
|
|
|
34
37
|
control: "object",
|
|
35
38
|
description: "Extra CSS classes applied to the nested ResponsiveHeader (targets its own token API)",
|
|
36
39
|
},
|
|
40
|
+
homeNavAriaLabel: {
|
|
41
|
+
control: "text",
|
|
42
|
+
description: "Accessible name of the branding nav landmark",
|
|
43
|
+
table: { category: "Accessibility", defaultValue: { summary: "Home navigation" } },
|
|
44
|
+
},
|
|
45
|
+
overflowButtonLabel: {
|
|
46
|
+
control: "text",
|
|
47
|
+
description: "Accessible name of the burger button (forwarded to ResponsiveHeader)",
|
|
48
|
+
table: { category: "Accessibility", defaultValue: { summary: "More navigation" } },
|
|
49
|
+
},
|
|
37
50
|
},
|
|
38
51
|
args: {
|
|
39
52
|
pageRowVariant: "content",
|
|
@@ -43,6 +56,16 @@ const meta: Meta<typeof SiteHeader> = {
|
|
|
43
56
|
styleClassPassthrough: [],
|
|
44
57
|
navStyleClassPassthrough: [],
|
|
45
58
|
},
|
|
59
|
+
parameters: {
|
|
60
|
+
docs: {
|
|
61
|
+
description: {
|
|
62
|
+
component:
|
|
63
|
+
"Site header row: a `#branding` slot inside a skip-links nav, then `ResponsiveHeader` for the main navigation, all inside a `PageRow`. " +
|
|
64
|
+
"Props: `responsiveNavLinks` (nav groups), `pageRowVariant`, collapse options forwarded to `ResponsiveHeader`, and label props for every landmark and button. " +
|
|
65
|
+
"Slots: `branding`, `secondaryNavigation`. Make it sticky with `--site-header-position: sticky` on the passthrough class.",
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
},
|
|
46
69
|
};
|
|
47
70
|
|
|
48
71
|
export default meta;
|
|
@@ -133,3 +156,118 @@ export const WithSecondaryNavigationSlot: Story = {
|
|
|
133
156
|
`,
|
|
134
157
|
}),
|
|
135
158
|
};
|
|
159
|
+
|
|
160
|
+
const brandingTemplate = `<a href="/" style="color:inherit;text-decoration:none;font-weight:600">{{ brand }}</a>`;
|
|
161
|
+
|
|
162
|
+
export const Sticky: Story = {
|
|
163
|
+
name: "Sticky (--site-header-position)",
|
|
164
|
+
args: {
|
|
165
|
+
styleClassPassthrough: ["site-header-sticky-demo"],
|
|
166
|
+
responsiveNavLinks: {
|
|
167
|
+
main: [
|
|
168
|
+
{ name: "Home", path: "/" },
|
|
169
|
+
{ name: "About", path: "/about" },
|
|
170
|
+
{ name: "Contact", path: "/contact" },
|
|
171
|
+
],
|
|
172
|
+
},
|
|
173
|
+
},
|
|
174
|
+
render: (args) => ({
|
|
175
|
+
components: { SiteHeader },
|
|
176
|
+
setup() {
|
|
177
|
+
return { args, brand: "Brand" };
|
|
178
|
+
},
|
|
179
|
+
template: `
|
|
180
|
+
<div>
|
|
181
|
+
<SiteHeader
|
|
182
|
+
v-bind="args"
|
|
183
|
+
style="--site-header-position: sticky; --site-header-bg: var(--theme-surface-subtle); --site-header-padding-block: 1.2rem;"
|
|
184
|
+
>
|
|
185
|
+
<template #branding>${brandingTemplate}</template>
|
|
186
|
+
</SiteHeader>
|
|
187
|
+
<div style="padding: 2.4rem; display: grid; gap: 1.6rem;">
|
|
188
|
+
<p v-for="n in 40" :key="n" style="margin: 0;">Scroll the page: the header stays pinned to the top. Paragraph {{ n }}.</p>
|
|
189
|
+
</div>
|
|
190
|
+
</div>
|
|
191
|
+
`,
|
|
192
|
+
}),
|
|
193
|
+
parameters: {
|
|
194
|
+
layout: "fullscreen",
|
|
195
|
+
docs: {
|
|
196
|
+
story: { inline: false, height: "480px" },
|
|
197
|
+
description: {
|
|
198
|
+
story:
|
|
199
|
+
"`--site-header-position: sticky` on the root. Until 2026-10-21 the sticky rule sat on the inner `<header>`, whose parent is exactly its height, so it never stuck; it now sits on the outer `.site-header-row`.",
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
export const StressTest: Story = {
|
|
206
|
+
name: "Stress Test (Worst-Case Data)",
|
|
207
|
+
args: {
|
|
208
|
+
responsiveNavLinks: {
|
|
209
|
+
firstNav: [
|
|
210
|
+
{ name: "Dienstleistungsübersicht", path: "/a" },
|
|
211
|
+
{
|
|
212
|
+
name: "Behandlungen und Pflegeangebote",
|
|
213
|
+
childLinksTitle: "Alle Behandlungen in Northtown",
|
|
214
|
+
childLinks: [
|
|
215
|
+
{ name: "Supercalifragilisticexpialidociousandthensome", path: "/b1" },
|
|
216
|
+
{ name: "🙂 Emoji link", path: "/b2" },
|
|
217
|
+
{ name: "<b>Not bold</b>", path: "/b3" },
|
|
218
|
+
],
|
|
219
|
+
},
|
|
220
|
+
{ name: "مرحبا", path: "/c" },
|
|
221
|
+
{ name: "x", path: "/d" },
|
|
222
|
+
...Array.from({ length: 8 }, (_, i) => ({ name: `Item ${i + 1}`, path: `/item-${i + 1}` })),
|
|
223
|
+
],
|
|
224
|
+
secondNav: [
|
|
225
|
+
{ name: "Contact", path: "/contact" },
|
|
226
|
+
{ name: "Contact", path: "/contact" },
|
|
227
|
+
],
|
|
228
|
+
},
|
|
229
|
+
collapseAtMainNavIntersection: true,
|
|
230
|
+
},
|
|
231
|
+
render: (args) => ({
|
|
232
|
+
components: { SiteHeader },
|
|
233
|
+
setup() {
|
|
234
|
+
return { args, brand: "Alex Morgan Hair, Beauty and Wellbeing Studio of Northtown" };
|
|
235
|
+
},
|
|
236
|
+
template: `
|
|
237
|
+
<SiteHeader v-bind="args">
|
|
238
|
+
<template #branding>${brandingTemplate}</template>
|
|
239
|
+
</SiteHeader>
|
|
240
|
+
`,
|
|
241
|
+
}),
|
|
242
|
+
decorators: [
|
|
243
|
+
(story, context) => ({
|
|
244
|
+
components: { story, CanvasSwitcher },
|
|
245
|
+
setup() {
|
|
246
|
+
const canvasName = ref<MediaCanvas>(context.parameters.initialCanvas ?? "fullWidthCanvas");
|
|
247
|
+
return { canvasName };
|
|
248
|
+
},
|
|
249
|
+
template: `
|
|
250
|
+
<div style="padding: 1.2rem 1.6rem; border-block-end: 1px solid currentColor;">
|
|
251
|
+
<CanvasSwitcher v-model:canvas-name="canvasName" />
|
|
252
|
+
</div>
|
|
253
|
+
<div :class="canvasName" style="margin-inline: auto; outline: 1px dashed currentColor;">
|
|
254
|
+
<story />
|
|
255
|
+
</div>
|
|
256
|
+
`,
|
|
257
|
+
}),
|
|
258
|
+
],
|
|
259
|
+
parameters: {
|
|
260
|
+
layout: "fullscreen",
|
|
261
|
+
initialCanvas: "tabletCanvas",
|
|
262
|
+
docs: {
|
|
263
|
+
story: { inline: false, height: "520px" },
|
|
264
|
+
description: {
|
|
265
|
+
story:
|
|
266
|
+
"A long brand name and 14 hostile nav items at every `CanvasSwitcher` width, with `collapseAtMainNavIntersection` on. Check that: the brand column takes at most half the row " +
|
|
267
|
+
"(`--site-header-branding-max-width`) and wraps instead of squeezing the nav to nothing; the nav collapses into the burger rather than overflowing; " +
|
|
268
|
+
"the long German, emoji, `<b>` and right-to-left labels render as text and wrap in the dropdown; the duplicate `Contact` links both render. " +
|
|
269
|
+
"Set `responsiveNavLinks` to `{}` in Controls: the header shows just the brand.",
|
|
270
|
+
},
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest";
|
|
1
|
+
import { describe, it, expect, afterEach, vi } from "vitest";
|
|
2
2
|
import { mountSuspended } from "@nuxt/test-utils/runtime";
|
|
3
3
|
import SiteHeader from "../SiteHeader.vue";
|
|
4
|
-
import type { ResponsiveHeaderProp } from "
|
|
4
|
+
import type { ResponsiveHeaderProp } from "~/types/components";
|
|
5
5
|
|
|
6
6
|
const navLinks: ResponsiveHeaderProp = {
|
|
7
7
|
firstNav: [{ name: "Home", path: "/" }],
|
|
@@ -21,39 +21,49 @@ const responsiveHeaderStub = {
|
|
|
21
21
|
template: `<div class="responsive-header-stub"><slot name="secondaryNavigation"></slot></div>`,
|
|
22
22
|
};
|
|
23
23
|
|
|
24
|
+
const mounted: Awaited<ReturnType<typeof mountSuspended>>[] = [];
|
|
25
|
+
|
|
26
|
+
const mountHeader = async (options: { props?: Record<string, unknown>; slots?: Record<string, string> } = {}) => {
|
|
27
|
+
const wrapper = await mountSuspended(SiteHeader, {
|
|
28
|
+
...options,
|
|
29
|
+
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
30
|
+
});
|
|
31
|
+
mounted.push(wrapper);
|
|
32
|
+
return wrapper;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
afterEach(() => {
|
|
36
|
+
mounted.splice(0).forEach((wrapper) => wrapper.unmount());
|
|
37
|
+
vi.restoreAllMocks();
|
|
38
|
+
});
|
|
39
|
+
|
|
24
40
|
describe("SiteHeader", () => {
|
|
25
41
|
it("mounts without error", async () => {
|
|
26
|
-
const wrapper = await
|
|
27
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
28
|
-
});
|
|
42
|
+
const wrapper = await mountHeader();
|
|
29
43
|
expect(wrapper.vm).toBeTruthy();
|
|
30
44
|
});
|
|
31
45
|
|
|
32
46
|
it("renders the branding slot inside SkipLinks' homeLink slot", async () => {
|
|
33
|
-
const wrapper = await
|
|
47
|
+
const wrapper = await mountHeader({
|
|
34
48
|
slots: { branding: "<a href='/' class='brand-link'>Brand</a>" },
|
|
35
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
36
49
|
});
|
|
37
50
|
expect(wrapper.find(".skip-links__home .brand-link").exists()).toBe(true);
|
|
38
51
|
});
|
|
39
52
|
|
|
40
53
|
it("does not render the secondaryNavigation slot when not provided", async () => {
|
|
41
|
-
const wrapper = await
|
|
42
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
43
|
-
});
|
|
54
|
+
const wrapper = await mountHeader();
|
|
44
55
|
expect(wrapper.text()).not.toContain("Extra nav");
|
|
45
56
|
});
|
|
46
57
|
|
|
47
58
|
it("forwards the secondaryNavigation slot through to ResponsiveHeader", async () => {
|
|
48
|
-
const wrapper = await
|
|
59
|
+
const wrapper = await mountHeader({
|
|
49
60
|
slots: { secondaryNavigation: "<span>Extra nav</span>" },
|
|
50
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
51
61
|
});
|
|
52
62
|
expect(wrapper.text()).toContain("Extra nav");
|
|
53
63
|
});
|
|
54
64
|
|
|
55
65
|
it("forwards responsiveNavLinks and other nav props to ResponsiveHeader", async () => {
|
|
56
|
-
const wrapper = await
|
|
66
|
+
const wrapper = await mountHeader({
|
|
57
67
|
props: {
|
|
58
68
|
responsiveNavLinks: navLinks,
|
|
59
69
|
gapBetweenFirstAndSecondNav: 24,
|
|
@@ -61,7 +71,6 @@ describe("SiteHeader", () => {
|
|
|
61
71
|
allowExpandOnGesture: false,
|
|
62
72
|
navStyleClassPassthrough: ["site-header-nav"],
|
|
63
73
|
},
|
|
64
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
65
74
|
});
|
|
66
75
|
const responsiveHeader = wrapper.findComponent(responsiveHeaderStub);
|
|
67
76
|
expect(responsiveHeader.props("responsiveNavLinks")).toEqual(navLinks);
|
|
@@ -72,32 +81,50 @@ describe("SiteHeader", () => {
|
|
|
72
81
|
});
|
|
73
82
|
|
|
74
83
|
it("passes pageRowVariant through to the root PageRow", async () => {
|
|
75
|
-
const wrapper = await
|
|
84
|
+
const wrapper = await mountHeader({
|
|
76
85
|
props: { pageRowVariant: "full" },
|
|
77
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
78
86
|
});
|
|
79
|
-
expect(wrapper.find(".page-row
|
|
87
|
+
expect(wrapper.find(".page-row[data-variant=\"full\"]").exists()).toBe(true);
|
|
80
88
|
});
|
|
81
89
|
|
|
82
90
|
it("defaults pageRowVariant to content", async () => {
|
|
83
|
-
const wrapper = await
|
|
84
|
-
|
|
85
|
-
});
|
|
86
|
-
expect(wrapper.find(".page-row.content").exists()).toBe(true);
|
|
91
|
+
const wrapper = await mountHeader();
|
|
92
|
+
expect(wrapper.find(".page-row[data-variant=\"content\"]").exists()).toBe(true);
|
|
87
93
|
});
|
|
88
94
|
|
|
89
95
|
it("applies styleClassPassthrough to the root PageRow", async () => {
|
|
90
|
-
const wrapper = await
|
|
96
|
+
const wrapper = await mountHeader({
|
|
91
97
|
props: { styleClassPassthrough: ["header"] },
|
|
92
|
-
global: { stubs: { ResponsiveHeader: responsiveHeaderStub } },
|
|
93
98
|
});
|
|
94
99
|
expect(wrapper.find(".page-row.header").exists()).toBe(true);
|
|
95
100
|
});
|
|
96
101
|
|
|
97
|
-
it("
|
|
98
|
-
const wrapper = await
|
|
99
|
-
|
|
102
|
+
it("puts the sticky hook on the outer row, not the inner header", async () => {
|
|
103
|
+
const wrapper = await mountHeader({ props: { styleClassPassthrough: ["header"] } });
|
|
104
|
+
expect(wrapper.classes()).toContain("site-header-row");
|
|
105
|
+
expect(wrapper.classes()).toContain("header");
|
|
106
|
+
expect(wrapper.find("header.site-header").classes()).not.toContain("site-header-row");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("labels the branding nav landmark, defaulting to Home navigation", async () => {
|
|
110
|
+
const fallback = await mountHeader();
|
|
111
|
+
expect(fallback.find("nav.site-header-home-nav").attributes("aria-label")).toBe("Home navigation");
|
|
112
|
+
|
|
113
|
+
const custom = await mountHeader({ props: { homeNavAriaLabel: "Startseite" } });
|
|
114
|
+
expect(custom.find("nav.site-header-home-nav").attributes("aria-label")).toBe("Startseite");
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("renders the brand alone when there are no nav links", async () => {
|
|
118
|
+
const wrapper = await mountHeader({
|
|
119
|
+
props: { responsiveNavLinks: {} },
|
|
120
|
+
slots: { branding: "<a href='/' class='brand-link'>Brand</a>" },
|
|
100
121
|
});
|
|
122
|
+
expect(wrapper.find(".brand-link").exists()).toBe(true);
|
|
123
|
+
expect(wrapper.findComponent(responsiveHeaderStub).props("responsiveNavLinks")).toEqual({});
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("renders correct HTML structure with default props", async () => {
|
|
127
|
+
const wrapper = await mountHeader();
|
|
101
128
|
expect(wrapper.html()).toMatchSnapshot();
|
|
102
129
|
});
|
|
103
130
|
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
|
|
2
2
|
|
|
3
3
|
exports[`SiteHeader > renders correct HTML structure with default props 1`] = `
|
|
4
|
-
"<div class="page-row content">
|
|
4
|
+
"<div class="page-row site-header-row" data-variant="content">
|
|
5
5
|
<header class="site-header">
|
|
6
|
-
<nav class="home-
|
|
6
|
+
<nav class="site-header-home-nav" aria-label="Home navigation">
|
|
7
7
|
<div class="skip-links">
|
|
8
8
|
<div class="skip-links__home"></div>
|
|
9
9
|
<nav class="skip-links__nav" aria-label="Skip navigation"><a href="#main-content" class="skip-links__link">Skip to main content</a><a href="#footer-content" class="skip-links__link">Skip to footer</a></nav>
|
|
@@ -5,3 +5,15 @@ export interface QrCodeVariant {
|
|
|
5
5
|
marker: SVGVariant
|
|
6
6
|
pixel: SVGVariant
|
|
7
7
|
}
|
|
8
|
+
|
|
9
|
+
export type CaptureQrCodeErrorName =
|
|
10
|
+
| "NotAllowedError"
|
|
11
|
+
| "NotFoundError"
|
|
12
|
+
| "NotSupportedError"
|
|
13
|
+
| "NotReadableError"
|
|
14
|
+
| "OverconstrainedError"
|
|
15
|
+
| "StreamApiNotSupportedError"
|
|
16
|
+
| "InsecureContextError"
|
|
17
|
+
| "StreamLoadTimeoutError"
|
|
18
|
+
|
|
19
|
+
export type CaptureQrCodeErrorMessages = Partial<Record<CaptureQrCodeErrorName | "default", string>>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const segmenter =
|
|
2
|
+
typeof Intl !== "undefined" && "Segmenter" in Intl ? new Intl.Segmenter(undefined, { granularity: "grapheme" }) : null;
|
|
3
|
+
|
|
4
|
+
// User-perceived characters, so a typewriter never shows half an emoji or a stray combining mark.
|
|
5
|
+
export function splitGraphemes(text: string): string[] {
|
|
6
|
+
if (!segmenter) return Array.from(text);
|
|
7
|
+
return Array.from(segmenter.segment(text), (segment) => segment.segment);
|
|
8
|
+
}
|
package/package.json
CHANGED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { defuFn } from 'defu'
|
|
3
|
-
|
|
4
|
-
const inlineConfig = {
|
|
5
|
-
"nuxt": {}
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
/** client **/
|
|
9
|
-
import { _replaceAppConfig } from '#app/config'
|
|
10
|
-
|
|
11
|
-
// Vite - webpack is handled directly in #app/config
|
|
12
|
-
if (import.meta.dev && !import.meta.nitro && import.meta.hot) {
|
|
13
|
-
import.meta.hot.accept((newModule) => {
|
|
14
|
-
_replaceAppConfig(newModule.default)
|
|
15
|
-
})
|
|
16
|
-
}
|
|
17
|
-
/** client-end **/
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
export default /*@__PURE__*/ defuFn(inlineConfig)
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { DefineComponent, SlotsType } from 'vue'
|
|
3
|
-
type IslandComponent<T> = DefineComponent<{}, {refresh: () => Promise<void>}, {}, {}, {}, {}, {}, {}, {}, {}, {}, {}, SlotsType<{ fallback: { error: unknown } }>> & T
|
|
4
|
-
|
|
5
|
-
type HydrationStrategies = {
|
|
6
|
-
hydrateOnVisible?: IntersectionObserverInit | true
|
|
7
|
-
hydrateOnIdle?: number | true
|
|
8
|
-
hydrateOnInteraction?: keyof HTMLElementEventMap | Array<keyof HTMLElementEventMap> | true
|
|
9
|
-
hydrateOnMediaQuery?: string
|
|
10
|
-
hydrateAfter?: number
|
|
11
|
-
hydrateWhen?: boolean
|
|
12
|
-
hydrateNever?: true
|
|
13
|
-
}
|
|
14
|
-
type LazyComponent<T> = DefineComponent<HydrationStrategies, {}, {}, {}, {}, {}, {}, { hydrated: () => void }> & T
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
export const NuxtWelcome: typeof import("../../../../../../node_modules/nuxt/dist/app/components/welcome.vue")['default']
|
|
18
|
-
export const NuxtLayout: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-layout")['default']
|
|
19
|
-
export const NuxtErrorBoundary: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default']
|
|
20
|
-
export const ClientOnly: typeof import("../../../../../../node_modules/nuxt/dist/app/components/client-only")['default']
|
|
21
|
-
export const DevOnly: typeof import("../../../../../../node_modules/nuxt/dist/app/components/dev-only")['default']
|
|
22
|
-
export const ServerPlaceholder: typeof import("../../../../../../node_modules/nuxt/dist/app/components/server-placeholder")['default']
|
|
23
|
-
export const NuxtLink: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-link")['default']
|
|
24
|
-
export const NuxtLoadingIndicator: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-loading-indicator")['default']
|
|
25
|
-
export const NuxtTime: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-time.vue")['default']
|
|
26
|
-
export const NuxtRouteAnnouncer: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-route-announcer")['default']
|
|
27
|
-
export const NuxtAnnouncer: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-announcer")['default']
|
|
28
|
-
export const NuxtImg: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtImg']
|
|
29
|
-
export const NuxtPicture: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtPicture']
|
|
30
|
-
export const NuxtPage: typeof import("../../../../../../node_modules/nuxt/dist/pages/runtime/page-placeholder")['default']
|
|
31
|
-
export const NoScript: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['NoScript']
|
|
32
|
-
export const Link: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Link']
|
|
33
|
-
export const Base: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Base']
|
|
34
|
-
export const Title: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Title']
|
|
35
|
-
export const Meta: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Meta']
|
|
36
|
-
export const Style: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Style']
|
|
37
|
-
export const Head: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Head']
|
|
38
|
-
export const Html: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Html']
|
|
39
|
-
export const Body: typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Body']
|
|
40
|
-
export const NuxtIsland: typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-island")['default']
|
|
41
|
-
export const LazyNuxtWelcome: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/welcome.vue")['default']>
|
|
42
|
-
export const LazyNuxtLayout: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-layout")['default']>
|
|
43
|
-
export const LazyNuxtErrorBoundary: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-error-boundary.vue")['default']>
|
|
44
|
-
export const LazyClientOnly: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/client-only")['default']>
|
|
45
|
-
export const LazyDevOnly: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/dev-only")['default']>
|
|
46
|
-
export const LazyServerPlaceholder: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/server-placeholder")['default']>
|
|
47
|
-
export const LazyNuxtLink: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-link")['default']>
|
|
48
|
-
export const LazyNuxtLoadingIndicator: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-loading-indicator")['default']>
|
|
49
|
-
export const LazyNuxtTime: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-time.vue")['default']>
|
|
50
|
-
export const LazyNuxtRouteAnnouncer: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-route-announcer")['default']>
|
|
51
|
-
export const LazyNuxtAnnouncer: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-announcer")['default']>
|
|
52
|
-
export const LazyNuxtImg: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtImg']>
|
|
53
|
-
export const LazyNuxtPicture: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-stubs")['NuxtPicture']>
|
|
54
|
-
export const LazyNuxtPage: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/pages/runtime/page-placeholder")['default']>
|
|
55
|
-
export const LazyNoScript: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['NoScript']>
|
|
56
|
-
export const LazyLink: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Link']>
|
|
57
|
-
export const LazyBase: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Base']>
|
|
58
|
-
export const LazyTitle: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Title']>
|
|
59
|
-
export const LazyMeta: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Meta']>
|
|
60
|
-
export const LazyStyle: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Style']>
|
|
61
|
-
export const LazyHead: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Head']>
|
|
62
|
-
export const LazyHtml: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Html']>
|
|
63
|
-
export const LazyBody: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/head/runtime/components")['Body']>
|
|
64
|
-
export const LazyNuxtIsland: LazyComponent<typeof import("../../../../../../node_modules/nuxt/dist/app/components/nuxt-island")['default']>
|
|
65
|
-
|
|
66
|
-
export const componentNames: string[]
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
export { useScriptTriggerConsent, useScriptEventPage, useScriptTriggerElement, useScript, useScriptGoogleAnalytics, useScriptPlausibleAnalytics, useScriptCrisp, useScriptClarity, useScriptCloudflareWebAnalytics, useScriptVercelAnalytics, useScriptPostHog, useScriptFathomAnalytics, useScriptMatomoAnalytics, useScriptMixpanelAnalytics, useScriptBingUet, useScriptGoogleTagManager, useScriptGoogleAdsense, useScriptGoogleRecaptcha, useScriptGoogleSignIn, useScriptSegment, useScriptMetaPixel, useScriptXPixel, useScriptTikTokPixel, useScriptIntercom, useScriptHotjar, useScriptStripe, useScriptLemonSqueezy, useScriptVimeoPlayer, useScriptYouTubePlayer, useScriptGoogleMaps, useScriptNpm, useScriptUmamiAnalytics, useScriptSnapchatPixel, useScriptRybbitAnalytics, useScriptDatabuddyAnalytics, useScriptRedditPixel, useScriptPayPal, useScriptGravatar, useScriptAhrefsAnalytics, useScriptLinkedInInsight, useScriptCalendly, useScriptUsercentrics } from '#app/composables/script-stubs';
|
|
2
|
-
export { isVue2, isVue3 } from 'vue-demi';
|
|
3
|
-
export { defineNuxtLink } from '#app/components/nuxt-link';
|
|
4
|
-
export { useNuxtApp, tryUseNuxtApp, defineNuxtPlugin, definePayloadPlugin, useRuntimeConfig, defineAppConfig } from '#app/nuxt';
|
|
5
|
-
export { useAppConfig, updateAppConfig } from '#app/config';
|
|
6
|
-
export { defineNuxtComponent } from '#app/composables/component';
|
|
7
|
-
export { useAsyncData, useLazyAsyncData, useNuxtData, refreshNuxtData, clearNuxtData, createUseAsyncData } from '#app/composables/asyncData';
|
|
8
|
-
export { useHydration } from '#app/composables/hydrate';
|
|
9
|
-
export { callOnce } from '#app/composables/once';
|
|
10
|
-
export { useState, clearNuxtState } from '#app/composables/state';
|
|
11
|
-
export { clearError, createError, isNuxtError, showError, useError } from '#app/composables/error';
|
|
12
|
-
export { useFetch, useLazyFetch, createUseFetch } from '#app/composables/fetch';
|
|
13
|
-
export { useCookie, refreshCookie } from '#app/composables/cookie';
|
|
14
|
-
export { onPrehydrate, prerenderRoutes, useRequestHeader, useRequestHeaders, useResponseHeader, useRequestEvent, useRequestFetch, setResponseStatus } from '#app/composables/ssr';
|
|
15
|
-
export { onNuxtReady } from '#app/composables/ready';
|
|
16
|
-
export { preloadComponents, prefetchComponents, preloadRouteComponents } from '#app/composables/preload';
|
|
17
|
-
export { abortNavigation, addRouteMiddleware, defineNuxtRouteMiddleware, setPageLayout, navigateTo, useRoute, useRouter, onBeforeRouteLeave, onBeforeRouteUpdate } from '#app/composables/router';
|
|
18
|
-
export { isPrerendered, loadPayload, preloadPayload, definePayloadReducer, definePayloadReviver } from '#app/composables/payload';
|
|
19
|
-
export { useLoadingIndicator } from '#app/composables/loading-indicator';
|
|
20
|
-
export { getAppManifest, getRouteRules } from '#app/composables/manifest';
|
|
21
|
-
export { reloadNuxtApp } from '#app/composables/chunk';
|
|
22
|
-
export { useRequestURL } from '#app/composables/url';
|
|
23
|
-
export { usePreviewMode } from '#app/composables/preview';
|
|
24
|
-
export { useRouteAnnouncer } from '#app/composables/route-announcer';
|
|
25
|
-
export { useAnnouncer } from '#app/composables/announcer';
|
|
26
|
-
export { useRuntimeHook } from '#app/composables/runtime-hook';
|
|
27
|
-
export { useHead, useHeadSafe, useServerHeadSafe, useServerHead, useSeoMeta, useServerSeoMeta, injectHead } from '#app/composables/head';
|
|
28
|
-
export { withCtx, withDirectives, withKeys, withMemo, withModifiers, withScopeId, onActivated, onBeforeMount, onBeforeUnmount, onBeforeUpdate, onDeactivated, onErrorCaptured, onMounted, onRenderTracked, onRenderTriggered, onServerPrefetch, onUnmounted, onUpdated, computed, customRef, isProxy, isReactive, isReadonly, isRef, markRaw, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, toRaw, toRef, toRefs, triggerRef, unref, watch, watchEffect, watchPostEffect, watchSyncEffect, onWatcherCleanup, isShallow, effect, effectScope, getCurrentScope, onScopeDispose, defineComponent, defineAsyncComponent, resolveComponent, getCurrentInstance, h, inject, hasInjectionContext, nextTick, provide, toValue, useModel, useAttrs, useCssModule, useSlots, useTransitionState, useId, useTemplateRef, useShadowRoot, useCssVars, Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue';
|
|
29
|
-
export { requestIdleCallback, cancelIdleCallback } from '#app/compat/idle-callback';
|
|
30
|
-
export { defineLazyHydrationComponent } from '#app/composables/lazy-hydration';
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import type { AppConfigInput, CustomAppConfig } from 'nuxt/schema'
|
|
3
|
-
import type { Defu } from 'defu'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
declare global {
|
|
7
|
-
const defineAppConfig: <C extends AppConfigInput> (config: C) => C
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
declare const inlineConfig = {
|
|
11
|
-
"nuxt": {}
|
|
12
|
-
}
|
|
13
|
-
type ResolvedAppConfig = Defu<typeof inlineConfig, []>
|
|
14
|
-
type IsAny<T> = 0 extends 1 & T ? true : false
|
|
15
|
-
|
|
16
|
-
type MergedAppConfig<Resolved extends Record<string, unknown>, Custom extends Record<string, unknown>> = {
|
|
17
|
-
[K in keyof (Resolved & Custom)]: K extends keyof Custom
|
|
18
|
-
? unknown extends Custom[K]
|
|
19
|
-
? Resolved[K]
|
|
20
|
-
: IsAny<Custom[K]> extends true
|
|
21
|
-
? Resolved[K]
|
|
22
|
-
: Custom[K] extends Record<string, any>
|
|
23
|
-
? Resolved[K] extends Record<string, any>
|
|
24
|
-
? MergedAppConfig<Resolved[K], Custom[K]>
|
|
25
|
-
: Exclude<Custom[K], undefined>
|
|
26
|
-
: Exclude<Custom[K], undefined>
|
|
27
|
-
: Resolved[K]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
declare module 'nuxt/schema' {
|
|
31
|
-
interface AppConfig extends MergedAppConfig<ResolvedAppConfig, CustomAppConfig> { }
|
|
32
|
-
}
|
|
33
|
-
declare module '@nuxt/schema' {
|
|
34
|
-
interface AppConfig extends MergedAppConfig<ResolvedAppConfig, CustomAppConfig> { }
|
|
35
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
declare module "#build/app-component.mjs";
|
|
2
|
-
declare module "#build/nitro.client.mjs";
|
|
3
|
-
declare module "#build/plugins.client.mjs";
|
|
4
|
-
declare module "#build/css.mjs";
|
|
5
|
-
declare module "#build/fetch.mjs";
|
|
6
|
-
declare module "#build/error-component.mjs";
|
|
7
|
-
declare module "#build/global-polyfills.mjs";
|
|
8
|
-
declare module "#build/layouts.mjs";
|
|
9
|
-
declare module "#build/middleware.mjs";
|
|
10
|
-
declare module "#build/nuxt.config.mjs";
|
|
11
|
-
declare module "#build/paths.mjs";
|
|
12
|
-
declare module "#build/root-component.mjs";
|
|
13
|
-
declare module "#build/plugins.server.mjs";
|
|
14
|
-
declare module "#build/test-component-wrapper.mjs";
|
|
15
|
-
declare module "#build/pages.mjs";
|
|
16
|
-
declare module "#build/router.options.mjs";
|
|
17
|
-
declare module "#build/unhead-options.mjs";
|
|
18
|
-
declare module "#build/unhead.config.mjs";
|
|
19
|
-
declare module "#build/components.plugin.mjs";
|
|
20
|
-
declare module "#build/component-names.mjs";
|
|
21
|
-
declare module "#build/components.islands.mjs";
|
|
22
|
-
declare module "#build/component-chunk.mjs";
|
|
23
|
-
declare module "#build/route-rules.mjs";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import "vite/client";
|