srcdev-nuxt-components 9.2.11 → 9.3.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.
Files changed (25) hide show
  1. package/app/app.config.ts +1 -1
  2. package/app/assets/styles/setup/01.config/index.css +2 -2
  3. package/app/assets/styles/setup/02.colours/index.css +8 -8
  4. package/app/assets/styles/setup/03.theming/index.css +6 -6
  5. package/app/assets/styles/setup/04.elements/forms/index.css +2 -2
  6. package/app/assets/styles/setup/04.elements/index.css +1 -1
  7. package/app/assets/styles/setup/05.typography/01.tokens/index.css +3 -3
  8. package/app/assets/styles/setup/05.typography/02.utility-classes/index.css +6 -6
  9. package/app/assets/styles/setup/05.typography/index.css +2 -2
  10. package/app/assets/styles/setup/06.utility-classes/animations/index.css +4 -4
  11. package/app/assets/styles/setup/06.utility-classes/index.css +3 -3
  12. package/app/assets/styles/setup/06.utility-classes/spacing/index.css +3 -3
  13. package/app/assets/styles/setup/a11y/index.css +1 -1
  14. package/app/assets/styles/setup/index.css +7 -7
  15. package/app/components/01.atoms/content-wrappers/docs-pages/tests/ContentDocs.spec.ts +3 -1
  16. package/app/components/02.molecules/alert-masked-content/tests/AlertMaskedContent.spec.ts +9 -5
  17. package/app/components/02.molecules/expandable/expanding-panel/tests/ExpandingPanel.spec.ts +6 -0
  18. package/app/components/02.molecules/navigation/site-navigation/tests/SiteNavigation.spec.ts +9 -5
  19. package/app/components/02.molecules/navigation/tab-navigation/tests/TabNavigation.spec.ts +9 -5
  20. package/app/components/03.organisms/image-galleries/slider-gallery/tests/SliderGallery.spec.ts +5 -1
  21. package/app/components/alert-mask/tests/AlertMaskCore.spec.ts +9 -5
  22. package/app/composables/tests/useContainerBreakpoints.spec.ts +27 -7
  23. package/app/composables/tests/useWhatsApp.spec.ts +10 -4
  24. package/nuxt.config.ts +9 -0
  25. package/package.json +26 -21
package/app/app.config.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { SemanticTheme, DisplayPromptTheme, DisplayToastTheme, DisplayToastPosition, DisplayToastAlignment } from "~/types/components";
1
+ import type { SemanticTheme, DisplayPromptTheme, DisplayToastTheme, DisplayToastPosition, DisplayToastAlignment } from "./types/components";
2
2
 
3
3
  export default defineAppConfig({
4
4
  srcdev: {
@@ -1,2 +1,2 @@
1
- @import "./_normalise";
2
- @import "./_head";
1
+ @import "./_normalise.css";
2
+ @import "./_head.css";
@@ -1,8 +1,8 @@
1
- @import "./_theme-params";
2
- @import "./_amber";
3
- @import "./_blue";
4
- @import "./_green";
5
- @import "./_orange";
6
- @import "./_red";
7
- @import "./_slate";
8
- @import "./_sunset";
1
+ @import "./_theme-params.css";
2
+ @import "./_amber.css";
3
+ @import "./_blue.css";
4
+ @import "./_green.css";
5
+ @import "./_orange.css";
6
+ @import "./_red.css";
7
+ @import "./_slate.css";
8
+ @import "./_sunset.css";
@@ -1,6 +1,6 @@
1
- @import "./theme-ramp";
2
- @import "./_theme-slots";
3
- @import "./_default";
4
- @import "./_error";
5
- @import "./_success";
6
- @import "./_warning";
1
+ @import "./theme-ramp.css";
2
+ @import "./_theme-slots.css";
3
+ @import "./_default.css";
4
+ @import "./_error.css";
5
+ @import "./_success.css";
6
+ @import "./_warning.css";
@@ -1,7 +1,7 @@
1
- @import "./00.element-defaults";
1
+ @import "./00.element-defaults.css";
2
2
  @import "./01.field-layout-container-level.css";
3
3
  @import "./02.typography.css";
4
- @import "./03.generic-input-geometry";
4
+ @import "./03.generic-input-geometry.css";
5
5
  @import "./04.slot-icon-system.css";
6
6
  @import "./05.checkbox-radio-geometry.css";
7
7
  @import "./06.button-geometry.css";
@@ -1 +1 @@
1
- @import "./forms/";
1
+ @import "./forms/index.css";
@@ -1,3 +1,3 @@
1
- @import "./_font-family";
2
- @import "./_reponsive-font-sizes";
3
- @import "./_timing-functions";
1
+ @import "./_font-family.css";
2
+ @import "./_reponsive-font-sizes.css";
3
+ @import "./_timing-functions.css";
@@ -1,9 +1,9 @@
1
- @import "./_font-classes-page-heading";
2
- @import "./_font-classes-page-body";
3
- @import "./_font-classes-page-link";
4
- @import "./_font-classes-section";
5
- @import "./_font-classes-article";
6
- @import "./_font-classes-card";
1
+ @import "./_font-classes-page-heading.css";
2
+ @import "./_font-classes-page-body.css";
3
+ @import "./_font-classes-page-link.css";
4
+ @import "./_font-classes-section.css";
5
+ @import "./_font-classes-article.css";
6
+ @import "./_font-classes-card.css";
7
7
  @import "./_generic-font-classes.css";
8
8
  @import "./_generic-font-variation-settings.css";
9
9
  @import "./_generic-font-weights.css";
@@ -1,2 +1,2 @@
1
- @import "./01.tokens";
2
- @import "./02.utility-classes";
1
+ @import "./01.tokens/index.css";
2
+ @import "./02.utility-classes/index.css";
@@ -1,5 +1,5 @@
1
- @import "./_entry-zoom-reveal";
2
- @import "./_entry-slide-in";
3
- @import "./_entry-exit-blur";
4
- @import "./_auto-rotate";
1
+ @import "./_entry-zoom-reveal.css";
2
+ @import "./_entry-slide-in.css";
3
+ @import "./_entry-exit-blur.css";
4
+ @import "./_auto-rotate.css";
5
5
  @import "./_animation-scroller-x.css";
@@ -1,4 +1,4 @@
1
- @import "./animations/";
2
- @import "./spacing/";
1
+ @import "./animations/index.css";
2
+ @import "./spacing/index.css";
3
3
  /* @import "./layout/"; */
4
- @import "./_a11y";
4
+ @import "./_a11y.css";
@@ -1,3 +1,3 @@
1
- @import "./_fluid-spacing";
2
- @import "./_margin";
3
- @import "./_padding";
1
+ @import "./_fluid-spacing.css";
2
+ @import "./_margin.css";
3
+ @import "./_padding.css";
@@ -1 +1 @@
1
- @import "./_variables";
1
+ @import "./_variables.css";
@@ -1,9 +1,9 @@
1
1
  @layer reset, colours, theming, form-tokens, typography, a11y, components, utilities, consumer;
2
2
 
3
- @import "./01.config/" layer(reset);
4
- @import "./02.colours/" layer(colours);
5
- @import "./03.theming/" layer(theming);
6
- @import "./04.elements/" layer(form-tokens);
7
- @import "./05.typography/" layer(typography);
8
- @import "./a11y/" layer(a11y);
9
- @import "./06.utility-classes/" layer(utilities);
3
+ @import "./01.config/index.css" layer(reset);
4
+ @import "./02.colours/index.css" layer(colours);
5
+ @import "./03.theming/index.css" layer(theming);
6
+ @import "./04.elements/index.css" layer(form-tokens);
7
+ @import "./05.typography/index.css" layer(typography);
8
+ @import "./a11y/index.css" layer(a11y);
9
+ @import "./06.utility-classes/index.css" layer(utilities);
@@ -9,7 +9,9 @@ beforeEach(() => {
9
9
  resizeCallback = null;
10
10
  vi.stubGlobal(
11
11
  "ResizeObserver",
12
- vi.fn((callback: ResizeObserverCallback) => {
12
+ // Vitest 4: a mock's implementation must be a regular function (not an
13
+ // arrow function) to remain constructible via `new`.
14
+ vi.fn(function (callback: ResizeObserverCallback) {
13
15
  resizeCallback = callback;
14
16
  return {
15
17
  observe: vi.fn(),
@@ -2,11 +2,15 @@ import { describe, it, expect, vi, beforeEach } from "vitest";
2
2
  import { mountSuspended } from "@nuxt/test-utils/runtime";
3
3
  import AlertMaskedContent from "../AlertMaskedContent.vue";
4
4
 
5
- const mockResizeObserver = vi.fn(() => ({
6
- observe: vi.fn(),
7
- unobserve: vi.fn(),
8
- disconnect: vi.fn(),
9
- }));
5
+ // Vitest 4: a mock's implementation must be a regular function (not an
6
+ // arrow function) to remain constructible via `new`.
7
+ const mockResizeObserver = vi.fn(function () {
8
+ return {
9
+ observe: vi.fn(),
10
+ unobserve: vi.fn(),
11
+ disconnect: vi.fn(),
12
+ };
13
+ });
10
14
 
11
15
  vi.stubGlobal("ResizeObserver", mockResizeObserver);
12
16
 
@@ -437,6 +437,12 @@ describe("ExpandingPanel", () => {
437
437
  await wrapper.find("summary").trigger("click");
438
438
  expect(vm.isPanelOpen).toBe(true);
439
439
 
440
+ // vueuse's onClickOutside debounces re-entrant clicks via a real setTimeout(0) that
441
+ // flips an internal "isProcessingClick" flag back off. With fake timers active
442
+ // (test/vitest.setup.ts) that flag never resets on its own, so the summary click
443
+ // above would otherwise permanently suppress the very next click. Advance past it.
444
+ vi.advanceTimersByTime(0);
445
+
440
446
  document.body.dispatchEvent(new MouseEvent("click", { bubbles: true }));
441
447
  await nextTick();
442
448
 
@@ -5,11 +5,15 @@ import SiteNavigation from "../SiteNavigation.vue";
5
5
  import type { NavItemData } from "~/types/components/navigation-horizontal.d";
6
6
 
7
7
  // useResizeObserver (from @vueuse/core) requires ResizeObserver
8
- const mockResizeObserver = vi.fn(() => ({
9
- observe: vi.fn(),
10
- unobserve: vi.fn(),
11
- disconnect: vi.fn(),
12
- }));
8
+ // Vitest 4: a mock's implementation must be a regular function (not an
9
+ // arrow function) to remain constructible via `new`.
10
+ const mockResizeObserver = vi.fn(function () {
11
+ return {
12
+ observe: vi.fn(),
13
+ unobserve: vi.fn(),
14
+ disconnect: vi.fn(),
15
+ };
16
+ });
13
17
 
14
18
  beforeEach(() => {
15
19
  vi.stubGlobal("ResizeObserver", mockResizeObserver);
@@ -5,11 +5,15 @@ import TabNavigation from "../TabNavigation.vue";
5
5
  import type { NavItemData } from "~/types/components/navigation-horizontal.d";
6
6
 
7
7
  // useResizeObserver (from @vueuse/core) requires ResizeObserver
8
- const mockResizeObserver = vi.fn(() => ({
9
- observe: vi.fn(),
10
- unobserve: vi.fn(),
11
- disconnect: vi.fn(),
12
- }));
8
+ // Vitest 4: a mock's implementation must be a regular function (not an
9
+ // arrow function) to remain constructible via `new`.
10
+ const mockResizeObserver = vi.fn(function () {
11
+ return {
12
+ observe: vi.fn(),
13
+ unobserve: vi.fn(),
14
+ disconnect: vi.fn(),
15
+ };
16
+ });
13
17
 
14
18
  beforeEach(() => {
15
19
  vi.stubGlobal("ResizeObserver", mockResizeObserver);
@@ -63,7 +63,11 @@ describe("SliderGallery", () => {
63
63
  mockImage = { src: "", onload: null, onerror: null };
64
64
  vi.stubGlobal(
65
65
  "Image",
66
- vi.fn(() => mockImage)
66
+ // Vitest 4: a mock's implementation must be a regular function (not an
67
+ // arrow function) to remain constructible via `new`.
68
+ vi.fn(function () {
69
+ return mockImage;
70
+ })
67
71
  );
68
72
  });
69
73
 
@@ -23,11 +23,15 @@ interface AlertMaskCoreInstance {
23
23
  }
24
24
 
25
25
  // Mock ResizeObserver
26
- const mockResizeObserver = vi.fn(() => ({
27
- observe: vi.fn(),
28
- unobserve: vi.fn(),
29
- disconnect: vi.fn(),
30
- }));
26
+ // Vitest 4: a mock's implementation must be a regular function (not an
27
+ // arrow function) to remain constructible via `new`.
28
+ const mockResizeObserver = vi.fn(function () {
29
+ return {
30
+ observe: vi.fn(),
31
+ unobserve: vi.fn(),
32
+ disconnect: vi.fn(),
33
+ };
34
+ });
31
35
 
32
36
  vi.stubGlobal("ResizeObserver", mockResizeObserver);
33
37
 
@@ -1,4 +1,4 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
2
  import { nextTick, ref } from "vue";
3
3
  import { useContainerBreakpoints } from "../useContainerBreakpoints";
4
4
 
@@ -8,7 +8,9 @@ beforeEach(() => {
8
8
  resizeCallback = null;
9
9
  vi.stubGlobal(
10
10
  "ResizeObserver",
11
- vi.fn((callback: ResizeObserverCallback) => {
11
+ // Vitest 4: a mock's implementation must be a regular function (not an
12
+ // arrow function) to remain constructible via `new`.
13
+ vi.fn(function (callback: ResizeObserverCallback) {
12
14
  resizeCallback = callback;
13
15
  return {
14
16
  observe: vi.fn(),
@@ -19,6 +21,10 @@ beforeEach(() => {
19
21
  );
20
22
  });
21
23
 
24
+ afterEach(() => {
25
+ document.body.innerHTML = "";
26
+ });
27
+
22
28
  function triggerResize(el: HTMLElement, width: number) {
23
29
  Object.defineProperty(el, "offsetWidth", { value: width, configurable: true });
24
30
  resizeCallback?.(
@@ -27,15 +33,29 @@ function triggerResize(el: HTMLElement, width: number) {
27
33
  );
28
34
  }
29
35
 
36
+ // @vueuse/core's useElementSize reads the element's initial width in onMounted via
37
+ // `offsetWidth - computed padding/border`, ahead of any ResizeObserver callback. happy-dom's
38
+ // getComputedStyle() only resolves real "0px" values (rather than "") for padding/border on an
39
+ // element that's actually attached to the document — a detached `createElement` div keeps
40
+ // returning "", so parseFloat() turns the subtraction into NaN. Zero the box model AND attach
41
+ // the element so that initial-width read is a real, non-NaN value.
42
+ function createEl(): HTMLElement {
43
+ const el = document.createElement("div");
44
+ el.style.padding = "0px";
45
+ el.style.border = "0px";
46
+ document.body.appendChild(el);
47
+ return el;
48
+ }
49
+
30
50
  describe("useContainerBreakpoints", () => {
31
51
  it("defaults active to base when narrower than the smallest breakpoint", () => {
32
- const el = ref<HTMLElement | null>(document.createElement("div"));
52
+ const el = ref<HTMLElement | null>(createEl());
33
53
  const { active } = useContainerBreakpoints(undefined, el);
34
54
  expect(active.value).toBe("base");
35
55
  });
36
56
 
37
57
  it("updates active as the observed element's width crosses breakpoints", async () => {
38
- const el = ref<HTMLElement | null>(document.createElement("div"));
58
+ const el = ref<HTMLElement | null>(createEl());
39
59
  const { active } = useContainerBreakpoints(undefined, el);
40
60
 
41
61
  triggerResize(el.value as HTMLElement, 700);
@@ -48,7 +68,7 @@ describe("useContainerBreakpoints", () => {
48
68
  });
49
69
 
50
70
  it("greaterOrEqual/smaller reflect the current width against a named breakpoint", async () => {
51
- const el = ref<HTMLElement | null>(document.createElement("div"));
71
+ const el = ref<HTMLElement | null>(createEl());
52
72
  const { greaterOrEqual, smaller } = useContainerBreakpoints(undefined, el);
53
73
  const isLg = greaterOrEqual("lg");
54
74
  const isSmallerThanMd = smaller("md");
@@ -63,7 +83,7 @@ describe("useContainerBreakpoints", () => {
63
83
  });
64
84
 
65
85
  it("between returns true only within the [min, max) range", async () => {
66
- const el = ref<HTMLElement | null>(document.createElement("div"));
86
+ const el = ref<HTMLElement | null>(createEl());
67
87
  const { between } = useContainerBreakpoints(undefined, el);
68
88
  const isTablet = between("sm", "lg");
69
89
 
@@ -77,7 +97,7 @@ describe("useContainerBreakpoints", () => {
77
97
  });
78
98
 
79
99
  it("supports a custom breakpoints map", async () => {
80
- const el = ref<HTMLElement | null>(document.createElement("div"));
100
+ const el = ref<HTMLElement | null>(createEl());
81
101
  const { active } = useContainerBreakpoints({ narrow: 400, wide: 900 }, el);
82
102
 
83
103
  triggerResize(el.value as HTMLElement, 500);
@@ -6,8 +6,14 @@ const PHONE_NUMBER = "447700900000";
6
6
 
7
7
  // mockNuxtImport intercepts Nuxt's auto-import resolution — vi.stubGlobal cannot.
8
8
  // Use vi.hoisted so the mock function is available before module evaluation.
9
+ // Nuxt's own router plugin also calls useRuntimeConfig() during app init and
10
+ // reads `.app.baseURL` — the mock must include that shape too, or app
11
+ // initialization throws before the test body runs.
9
12
  const { useRuntimeConfigMock } = vi.hoisted(() => ({
10
- useRuntimeConfigMock: vi.fn(() => ({ public: { whatsappNumber: PHONE_NUMBER } })),
13
+ useRuntimeConfigMock: vi.fn(() => ({
14
+ public: { whatsappNumber: PHONE_NUMBER },
15
+ app: { baseURL: "/" },
16
+ })),
11
17
  }));
12
18
 
13
19
  mockNuxtImport("useRuntimeConfig", () => useRuntimeConfigMock);
@@ -17,7 +23,7 @@ describe("useWhatsApp", () => {
17
23
 
18
24
  beforeEach(() => {
19
25
  windowOpenSpy = vi.spyOn(window, "open").mockImplementation(() => null);
20
- useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: PHONE_NUMBER } });
26
+ useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: PHONE_NUMBER }, app: { baseURL: "/" } });
21
27
  });
22
28
 
23
29
  afterEach(() => {
@@ -85,14 +91,14 @@ describe("useWhatsApp", () => {
85
91
  });
86
92
 
87
93
  it("does not call window.open when number is not configured", () => {
88
- useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: "" } });
94
+ useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: "" }, app: { baseURL: "/" } });
89
95
  const { openWhatsApp } = useWhatsApp();
90
96
  openWhatsApp([{ label: "Name", value: "Jane" }]);
91
97
  expect(windowOpenSpy).not.toHaveBeenCalled();
92
98
  });
93
99
 
94
100
  it("logs a warning when number is not configured", () => {
95
- useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: "" } });
101
+ useRuntimeConfigMock.mockReturnValue({ public: { whatsappNumber: "" }, app: { baseURL: "/" } });
96
102
  const warnSpy = vi.spyOn(console, "warn").mockImplementation(() => {});
97
103
  const { openWhatsApp } = useWhatsApp();
98
104
  openWhatsApp([{ label: "Name", value: "Jane" }]);
package/nuxt.config.ts CHANGED
@@ -130,6 +130,15 @@ export default defineNuxtConfig({
130
130
  ...(isStandalone ? ["vue-qrcode-reader"] : []),
131
131
  ],
132
132
  },
133
+ // Vite 8 (pulled in by Nuxt 4.5) defaults build.cssMinify to "lightningcss" instead of
134
+ // "esbuild". lightningcss has an open bug where it drops the unprefixed `backdrop-filter`
135
+ // once autoprefixer adds `-webkit-backdrop-filter` alongside it, breaking glass/blur effects
136
+ // (see https://github.com/vitejs/vite/issues/22649) — this repo relies on backdrop-filter in
137
+ // several components (GlassPanel, SiteNavigation, TabNavigation, DisplayDialog, ColourFinder,
138
+ // MagneticNavigation). Pin back to esbuild until upstream fixes it.
139
+ build: {
140
+ cssMinify: "esbuild",
141
+ },
133
142
  },
134
143
  vue: {
135
144
  runtimeCompiler: true,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "srcdev-nuxt-components",
3
3
  "type": "module",
4
- "version": "9.2.11",
4
+ "version": "9.3.0",
5
5
  "main": "nuxt.config.ts",
6
6
  "types": "types.d.ts",
7
7
  "license": "MIT",
@@ -90,33 +90,35 @@
90
90
  "@iconify-json/akar-icons": "1.2.7",
91
91
  "@iconify-json/bi": "1.2.7",
92
92
  "@iconify-json/bitcoin-icons": "1.2.5",
93
- "@iconify-json/gravity-ui": "1.2.12",
93
+ "@iconify-json/gravity-ui": "1.2.14",
94
94
  "@iconify-json/ic": "*",
95
- "@iconify-json/logos": "1.2.11",
96
- "@iconify-json/lucide": "*",
97
- "@iconify-json/material-symbols": "1.2.73",
95
+ "@iconify-json/logos": "1.2.13",
96
+ "@iconify-json/lucide": "1.2.124",
97
+ "@iconify-json/material-symbols": "1.2.89",
98
98
  "@iconify-json/mdi": "1.2.3",
99
99
  "@iconify-json/radix-icons": "*",
100
- "@nuxt/eslint": "1.15.2",
100
+ "@nuxt/eslint": "1.17.0",
101
101
  "@nuxt/schema": "4.4.6",
102
- "@nuxt/test-utils": "3.23.0",
102
+ "@nuxt/test-utils": "4.1.0",
103
103
  "@nuxtjs/storybook": "9.1.0-29374011.dab79ae",
104
- "@playwright/test": "1.60.0",
104
+ "@playwright/test": "1.62.1",
105
105
  "@storybook/addon-a11y": "10.0.7",
106
106
  "@storybook/addon-docs": "10.0.7",
107
107
  "@storybook/builder-vite": "10.0.7",
108
- "@vue/test-utils": "2.4.10",
109
- "@vueuse/core": "14.3.0",
110
- "eslint": "10.4.0",
108
+ "@vue/test-utils": "2.4.11",
109
+ "@vueuse/core": "14.4.0",
110
+ "eslint": "10.8.1",
111
111
  "eslint-plugin-storybook": "10.0.7",
112
- "happy-dom": "20.9.0",
112
+ "happy-dom": "20.11.2",
113
113
  "nuxt-qrcode": "0.4.10",
114
+ "oxc-parser": "0.131.0",
114
115
  "patch-package": "8.0.1",
115
- "release-it": "20.0.1",
116
+ "release-it": "21.0.2",
116
117
  "storybook": "10.0.7",
117
- "typescript": "~5.8.3",
118
- "vitest": "3.2.4",
119
- "vue-tsc": "3.3.1"
118
+ "typescript": "5.9.3",
119
+ "vitest": "4.1.11",
120
+ "vue-router": "5.2.0",
121
+ "vue-tsc": "3.3.10"
120
122
  },
121
123
  "release-it": {
122
124
  "$schema": "https://unpkg.com/release-it/schema/release-it.json",
@@ -130,15 +132,18 @@
130
132
  },
131
133
  "dependencies": {
132
134
  "@nuxt/fonts": "0.14.0",
133
- "@nuxt/icon": "2.2.2",
134
- "@nuxt/image": "2.0.0",
135
- "@oddbird/css-anchor-positioning": "0.9.0",
136
- "@pinia/nuxt": "0.11.3",
135
+ "@nuxt/icon": "2.5.0",
136
+ "@nuxt/image": "2.1.0",
137
+ "@oddbird/css-anchor-positioning": "0.10.2",
138
+ "@pinia/nuxt": "1.0.2",
137
139
  "@vueuse/motion": "3.0.3",
138
140
  "focus-trap-vue": "4.1.0",
139
141
  "nuxt": "4.4.6",
140
- "pinia": "3.0.4",
142
+ "pinia": "4.0.3",
141
143
  "pinia-plugin-persistedstate": "4.7.1",
142
144
  "zod": "4.4.3"
145
+ },
146
+ "overrides": {
147
+ "vue-router": "5.2.0"
143
148
  }
144
149
  }