kmcom-nuxt-layers 4.0.1 → 5.0.1

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 (99) hide show
  1. package/docs/PEER-DEPENDENCY-MISMATCHES.md +48 -0
  2. package/docs/VITE-PLUS-MIGRATION.md +246 -0
  3. package/docs/superpowers/plans/2026-09-03-layout-layer-fluid-rebuild.md +8 -8
  4. package/docs/superpowers/specs/2026-08-30-layer-taxonomy-tier-7-design.md +1 -1
  5. package/docs/superpowers/specs/2026-08-31-swiss-grid-layer-design.md +3 -3
  6. package/docs/superpowers/specs/2026-09-03-layout-layer-fluid-rebuild-design.md +3 -3
  7. package/layers/content/app/components/Blog/Article.vue +1 -1
  8. package/layers/content/app/components/Gallery/Detail.vue +8 -8
  9. package/layers/content/app/components/Gallery/Grid.vue +8 -8
  10. package/layers/content/app/components/Gallery/ImageDetail.vue +6 -6
  11. package/layers/content/app/components/Gallery/Lightbox.vue +3 -3
  12. package/layers/content/app/components/NuxtContent/Detail.vue +1 -1
  13. package/layers/content/app/components/NuxtContent/List.vue +1 -1
  14. package/layers/content/app/components/Portfolio/ColorPalette.vue +5 -5
  15. package/layers/content/app/components/Portfolio/Detail.vue +1 -1
  16. package/layers/content/app/components/Portfolio/List.vue +1 -1
  17. package/layers/content/app/components/Portfolio/Typography.vue +5 -5
  18. package/layers/content/app/components/content/Figure.vue +1 -1
  19. package/layers/core/app/assets/css/layout.css +1 -1
  20. package/layers/core/app/components/DiagnosticsPage.vue +15 -15
  21. package/layers/core/app/components/Element.test.ts +1 -1
  22. package/layers/core/app/components/ElementTw.test.ts +1 -1
  23. package/layers/core/app/components/ErrorBoundary.vue +5 -5
  24. package/layers/core/app/composables/useElementGrid.test.ts +1 -1
  25. package/layers/core/app/composables/useElementInteraction.test.ts +1 -1
  26. package/layers/core/app/composables/useElementLayout.test.ts +1 -1
  27. package/layers/core/app/composables/useElementSizing.test.ts +1 -1
  28. package/layers/core/app/composables/useElementSurface.test.ts +1 -1
  29. package/layers/core/app/composables/useLayoutAttrs.test.ts +1 -1
  30. package/layers/core/app/error.vue +1 -1
  31. package/layers/core/app/pages/[...slug].vue +2 -2
  32. package/layers/core/app/utils/browserInfo.test.ts +1 -1
  33. package/layers/core/app/utils/featureClasses.test.ts +1 -1
  34. package/layers/core/app/utils/scrollGuardClamp.test.ts +1 -1
  35. package/layers/core/app/utils/styleToTailwindClasses.test.ts +1 -1
  36. package/layers/data/forms/app/utils/contact-schema.test.ts +1 -1
  37. package/layers/data/forms/app/utils/fieldProps.test.ts +1 -1
  38. package/layers/data/metadata/providers/comicvine/server/utils/metadata-comicvine/normalise.test.ts +1 -1
  39. package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/client.test.ts +1 -1
  40. package/layers/data/metadata/providers/google-books/server/utils/metadata-google-books/normalise.test.ts +1 -1
  41. package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/client.test.ts +1 -1
  42. package/layers/data/metadata/providers/openlibrary/server/utils/metadata-openlibrary/normalise.test.ts +1 -1
  43. package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/client.test.ts +1 -1
  44. package/layers/data/metadata/providers/themoviedb/server/utils/metadata-tmdb/normalise.test.ts +1 -1
  45. package/layers/data/metadata/server/utils/metadata/cache.test.ts +1 -1
  46. package/layers/data/metadata/server/utils/metadata/provider-registry.test.ts +1 -1
  47. package/layers/data/metadata/server/utils/metadata/search.test.ts +1 -1
  48. package/layers/delivery/feeds/app/assets/css/feeds.css +23 -11
  49. package/layers/delivery/feeds/app/components/Feeds/Index.vue +10 -10
  50. package/layers/delivery/feeds/app/components/Feeds/RouteCard.vue +1 -1
  51. package/layers/delivery/feeds/public/feed/style.css +16 -16
  52. package/layers/delivery/feeds/server/utils/content-adapter.test.ts +1 -1
  53. package/layers/delivery/feeds/server/utils/feed-author.test.ts +1 -1
  54. package/layers/delivery/feeds/server/utils/feed-config.test.ts +1 -1
  55. package/layers/delivery/feeds/server/utils/formats.test.ts +1 -1
  56. package/layers/delivery/scripts/app/components/BaselineStatus.vue +3 -1
  57. package/layers/delivery/seo/app/utils/seoConfig.test.ts +1 -1
  58. package/layers/design-system/theming/app/assets/css/theme.css +0 -1
  59. package/layers/design-system/theming/app/components/ThemePicker/AccentButton.vue +2 -2
  60. package/layers/design-system/theming/app/components/ThemePicker/Menu.vue +3 -3
  61. package/layers/design-system/theming/app/composables/useAccentColor.ts +4 -1
  62. package/layers/design-system/theming/app/plugins/theme.client.ts +15 -13
  63. package/layers/design-system/theming/app/utils/themeAdapter.ts +1 -1
  64. package/layers/design-system/theming/nuxt.config.ts +1 -1
  65. package/layers/design-system/theming/server/utils/accent-css.test.ts +1 -1
  66. package/layers/design-system/theming/server/utils/fouc-config.test.ts +1 -1
  67. package/layers/design-system/typography/app/components/Typography/TextStroke.vue +1 -1
  68. package/layers/design-system/visual/app/assets/css/visual.css +0 -1
  69. package/layers/design-system/visual/app/components/Accent/Scene.vue +2 -2
  70. package/layers/design-system/visual/app/components/Tint/Overlay.vue +1 -1
  71. package/layers/design-system/visual/app/utils/colorTokens.test.ts +1 -1
  72. package/layers/design-system/visual/app/utils/gradientStyle.test.ts +1 -1
  73. package/layers/design-system/visual/app/utils/responsiveSizes.test.ts +1 -1
  74. package/layers/motion/animations/app/components/Motion/Marquee.vue +1 -1
  75. package/layers/motion/animations/app/components/Motion/MarqueeText.vue +3 -3
  76. package/layers/motion/scroll/app/components/Motion/HorizontalScroll.vue +1 -1
  77. package/layers/motion/scroll/app/components/Motion/PinnedSection.vue +2 -2
  78. package/layers/motion/scroll/app/components/Motion/ScrollProgress.vue +2 -2
  79. package/layers/motion/scroll/app/components/Motion/ScrollStats.vue +6 -6
  80. package/layers/motion/transitions/app/assets/css/transitions.css +12 -12
  81. package/layers/render/canvas/nuxt.config.ts +1 -1
  82. package/layers/render/canvas/package.json +2 -1
  83. package/layers/render/shader/app/assets/css/shader.css +5 -5
  84. package/layers/render/shader/app/shaders/common/grain.ts +1 -1
  85. package/layers/render/shader/app/types/tsl.ts +1 -1
  86. package/layers/render/shader/app/utils/tsl/index.ts +2 -0
  87. package/layers/structure/grid/app/assets/css/grid.css +2 -0
  88. package/layers/structure/grid/app/composables/useGridTracks.test.ts +1 -1
  89. package/layers/structure/grid/app/types/tracks.test.ts +1 -1
  90. package/layers/structure/grid/app/utils/placement.test.ts +1 -1
  91. package/layers/structure/layout/app/components/Layout/Grid/Debug.vue +1 -1
  92. package/layers/structure/layout/app/components/Layout/Page/Header.vue +3 -3
  93. package/layers/structure/layout/app/components/Layout/Page/index.vue +16 -11
  94. package/layers/structure/layout/app/utils/gridPlacementStyle.test.ts +1 -1
  95. package/layers/structure/navigation/app/components/Mast/Nav.vue +1 -1
  96. package/layers/structure/navigation/app/components/Mast/NavModal.vue +2 -2
  97. package/layers/structure/navigation/app/utils/site.test.ts +1 -1
  98. package/layers/structure/routing/app/utils/resolveRoute.test.ts +1 -1
  99. package/package.json +26 -45
@@ -30,15 +30,15 @@
30
30
  <template v-if="back">
31
31
  <UButton :to="back" variant="ghost" icon="i-lucide-arrow-left" />
32
32
  <div>
33
- <h1 class="text-3xl font-bold text-highlighted">{{ title }}</h1>
33
+ <h1 class="text-highlighted text-3xl font-bold">{{ title }}</h1>
34
34
  <p v-if="description" class="text-muted">{{ description }}</p>
35
35
  </div>
36
36
  </template>
37
37
 
38
38
  <!-- Centered page header (homepage, section intros) -->
39
39
  <template v-else>
40
- <h1 class="text-4xl font-bold text-highlighted">{{ title }}</h1>
41
- <p v-if="description" class="mt-3 text-lg text-muted">{{ description }}</p>
40
+ <h1 class="text-highlighted text-4xl font-bold">{{ title }}</h1>
41
+ <p v-if="description" class="text-muted mt-3 text-lg">{{ description }}</p>
42
42
  </template>
43
43
  </div>
44
44
  </template>
@@ -2,9 +2,12 @@
2
2
  /**
3
3
  * LayoutPage — canonical page wrapper for the Swiss Grid System.
4
4
  *
5
- * This is a fragment component (no wrapper element). The grid root is already
6
- * provided by LayoutMain at the layout level via <main class="grid-root">.
7
- * Adding another grid-root wrapper here would nest grids and misalign everything.
5
+ * The grid root is already provided by LayoutMain at the layout level via
6
+ * <main class="grid-root">. Adding another grid-root wrapper here would nest grids and
7
+ * misalign everything, so the single root element below is `display: contents` — it
8
+ * generates no box, and the header section and slot content still lay out as direct
9
+ * children of the grid root. A real root element (rather than a fragment) is what Vue's
10
+ * <Transition> and Nuxt's page-root check (NUXT_E4004) require.
8
11
  *
9
12
  * Responsibilities:
10
13
  * - SEO via useHead()
@@ -57,13 +60,15 @@
57
60
  </script>
58
61
 
59
62
  <template>
60
- <!-- Optional visible page header — rendered as a grid section -->
61
- <LayoutSection v-if="showHeader">
62
- <LayoutGridItem preset="centered">
63
- <LayoutPageHeader :title v-bind="description !== undefined ? { description } : {}" />
64
- </LayoutGridItem>
65
- </LayoutSection>
63
+ <div class="contents">
64
+ <!-- Optional visible page header — rendered as a grid section -->
65
+ <LayoutSection v-if="showHeader">
66
+ <LayoutGridItem preset="centered">
67
+ <LayoutPageHeader :title v-bind="description !== undefined ? { description } : {}" />
68
+ </LayoutGridItem>
69
+ </LayoutSection>
66
70
 
67
- <!-- Page content — direct children of grid-root (via LayoutMain in the layout) -->
68
- <slot />
71
+ <!-- Page content — grid items of grid-root (via LayoutMain in the layout) -->
72
+ <slot />
73
+ </div>
69
74
  </template>
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
 
3
3
  import {
4
4
  buildGridPlacementClasses,
@@ -6,7 +6,7 @@
6
6
  <template>
7
7
  <button
8
8
  aria-label="Open navigation menu"
9
- class="fixed right-0 top-0 flex cursor-pointer items-center justify-center border-0 bg-transparent p-4"
9
+ class="fixed top-0 right-0 flex cursor-pointer items-center justify-center border-0 bg-transparent p-4"
10
10
  :style="{ zIndex: z }"
11
11
  @click="() => open()"
12
12
  >
@@ -41,7 +41,7 @@
41
41
  :style="{ zIndex: useGridConfig().useZIndex('modal') }"
42
42
  >
43
43
  <button
44
- class="absolute right-[5vw] top-[3vh] cursor-pointer border-0 bg-transparent p-2"
44
+ class="absolute top-[3vh] right-[5vw] cursor-pointer border-0 bg-transparent p-2"
45
45
  aria-label="Close navigation"
46
46
  @click="dismiss"
47
47
  >
@@ -52,7 +52,7 @@
52
52
  <button
53
53
  v-for="link in links"
54
54
  :key="link.id"
55
- class="cursor-pointer border-0 bg-transparent px-4 py-3 text-3xl uppercase tracking-widest transition-all"
55
+ class="cursor-pointer border-0 bg-transparent px-4 py-3 text-3xl tracking-widest uppercase transition-all"
56
56
  :class="activeSection === link.id ? 'font-normal' : 'font-light'"
57
57
  @click="() => handleNav(link)"
58
58
  >
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
 
3
3
  import { resolveSiteConfig } from './site'
4
4
 
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
 
3
3
  import type { FeatureValue, RouteResolution, RoutingLayerConfig } from '../types/routing'
4
4
  import { resolveRoute } from './resolveRoute'
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kmcom-nuxt-layers",
3
3
  "private": false,
4
- "version": "4.0.1",
4
+ "version": "5.0.1",
5
5
  "description": "Composable Nuxt 4 layers for building scalable Vue applications",
6
6
  "exports": {
7
7
  "./layers/core": "./layers/core/nuxt.config.ts",
@@ -77,18 +77,18 @@
77
77
  "@nuxt/scripts": "^0.11.0 || ^1.0.0",
78
78
  "@nuxt/ui": "^4.8.1",
79
79
  "@nuxtjs/device": "^4.0.0",
80
- "@nuxtjs/seo": "^5.0.0",
80
+ "@nuxtjs/seo": "^5.0.0 || ^6.0.0",
81
81
  "@tresjs/cientos": "^5.7.2",
82
82
  "@tresjs/core": "^5.8.1",
83
83
  "@tresjs/nuxt": "^5.6.1",
84
84
  "@tresjs/post-processing": "^3.7.2",
85
85
  "@vite-pwa/nuxt": "^1.1.1",
86
- "@vueuse/nuxt": "^14.3.0",
87
- "better-sqlite3": "^12.10.0",
86
+ "@vueuse/nuxt": "^14.3.0 || ^15.0.0",
87
+ "better-sqlite3": "^12.10.0 || ^13.0.0",
88
88
  "gsap": "^3.15.0",
89
89
  "locomotive-scroll": "^5.0.1",
90
90
  "nuxt": "^4.4.7",
91
- "pinia": "^3.0.4",
91
+ "pinia": "^3.0.4 || ^4.1.0",
92
92
  "tailwindcss": "^4.3.0",
93
93
  "three": ">=0.184.0",
94
94
  "v-gsap-nuxt": ">=1.5.12",
@@ -148,12 +148,9 @@
148
148
  }
149
149
  },
150
150
  "devDependencies": {
151
- "@commitlint/cli": "^21.0.2",
152
- "@commitlint/config-conventional": "^21.0.2",
153
151
  "@culur/config-stylelint": "^1.7.2",
154
152
  "@eslint/json": "^1.2.0",
155
153
  "@eslint/markdown": "^8.0.3",
156
- "@ianvs/prettier-plugin-sort-imports": "^4.7.1",
157
154
  "@iconify-json/lucide": "^1.2.126",
158
155
  "@netlify/nuxt": "0.3.7",
159
156
  "@nuxt/eslint": "^1.15.2",
@@ -162,7 +159,8 @@
162
159
  "@nuxt/test-utils": "^4.0.3",
163
160
  "@nuxt/ui": "latest",
164
161
  "@nuxtjs/device": "^4.0.0",
165
- "@oxc-parser/binding-darwin-arm64": "^0.134.0",
162
+ "@nuxtjs/seo": "^5.0.0",
163
+ "better-sqlite3": "^12.10.0",
166
164
  "@perplex-digital/stylelint-config": "^17.4.0",
167
165
  "@pinia/nuxt": "^0.11.3",
168
166
  "@playwright/test": "1.61.0",
@@ -171,7 +169,7 @@
171
169
  "@typescript-eslint/eslint-plugin": "^8.60.1",
172
170
  "@typescript-eslint/parser": "^8.60.1",
173
171
  "@vitejs/plugin-vue": "^6.0.8",
174
- "@vitest/coverage-v8": "^4.1.11",
172
+ "@vitest/coverage-v8": "5.0.5",
175
173
  "@vue/eslint-config-typescript": "^14.7.0",
176
174
  "@vue/test-utils": "^2.4.10",
177
175
  "@vueuse/core": "^14.3.0",
@@ -180,48 +178,35 @@
180
178
  "@webgpu/types": "^0.1.72",
181
179
  "browserslist": "^4.28.8",
182
180
  "browserslist-config-baseline": "^0.5.0",
183
- "changesets": "^1.0.2",
184
181
  "csstype": "^3.2.3",
185
- "cypress": "^15.16.0",
186
- "depcheck": "^1.4.7",
187
182
  "eslint": "^10.4.1",
188
183
  "eslint-plugin-compat": "^7.0.2",
189
- "eslint-plugin-glsl": "0.0.0-wip",
190
184
  "eslint-plugin-pnpm": "^1.6.1",
191
- "eslint-plugin-prettier": "^5.5.6",
192
- "eslint-plugin-unicorn": "^64.0.0",
193
- "eslint-plugin-unused-imports": "^4.4.1",
194
185
  "eslint-plugin-vue": "^10.9.2",
195
186
  "fallow": "^2.92.1",
196
187
  "happy-dom": "^20.10.3",
197
188
  "netlify-cli": "^26.1.0",
198
189
  "npm-check-updates": "^22.2.2",
199
- "nuxt": "latest",
190
+ "nuxt": "4.6.1",
200
191
  "pinia": "^4.0.3",
201
192
  "postcss-html": "^1.8.1",
202
- "prettier": "^3.8.3",
203
- "prettier-plugin-css-order": "^2.2.0",
204
- "prettier-plugin-glsl": "^0.3.1",
205
- "prettier-plugin-organize-attributes": "^1.0.0",
206
- "prettier-plugin-tailwind-styled-components": "^2.0.2",
207
- "prettier-plugin-tailwindcss": "^0.8.1",
208
193
  "stylelint": "^17.12.0",
209
194
  "stylelint-config-recommended-vue": "^1.6.1",
210
195
  "stylelint-config-standard": "^40.0.0",
211
196
  "stylelint-config-standard-vue": "^1.0.0",
212
197
  "stylelint-config-tailwindcss": "^1.0.1",
213
198
  "stylelint-no-unsupported-browser-features": "^8.1.1",
214
- "stylelint-prettier": "^5.0.3",
215
199
  "tailwindcss": "latest",
216
- "turbo": "^2.9.18",
200
+ "turbo": "^2.11.8",
217
201
  "type-fest": "^5.7.0",
218
202
  "typescript": "^6",
219
203
  "vite-plugin-checker": "^0.14.5",
220
- "vitest": "^4.1.11",
204
+ "vitest": "5.0.5",
221
205
  "vue": "3.5.35",
222
206
  "vue-tsc": "3.3.11",
223
207
  "zod": "^4.4.3",
224
- "zod-to-json-schema": "^3.25.2"
208
+ "zod-to-json-schema": "^3.25.2",
209
+ "vite-plus": "1.3.0"
225
210
  },
226
211
  "browserslist": [
227
212
  "last 2 Chrome major versions",
@@ -237,10 +222,6 @@
237
222
  "engines": {
238
223
  "node": ">=24 <25"
239
224
  },
240
- "volta": {
241
- "node": "24.16.0",
242
- "pnpm": "11.5.3"
243
- },
244
225
  "scripts": {
245
226
  "dev": "pnpm -F playground dev",
246
227
  "dev:debug": "pnpm -F debug dev",
@@ -251,25 +232,25 @@
251
232
  "dev:database": "PLAYGROUND_LAYERS=core,database pnpm -F playground dev",
252
233
  "dev:auth": "PLAYGROUND_LAYERS=core,auth pnpm -F playground dev",
253
234
  "build": "turbo run build",
254
- "lint": "turbo run lint",
255
- "lint:fix": "turbo run lint -- --fix",
235
+ "lint": "vp lint && turbo run lint",
236
+ "lint:fix": "vp lint --fix && turbo run lint -- --fix",
256
237
  "lint:style": "stylelint \"**/*.{vue,scss,css}\"",
257
238
  "lint:style:fix": "stylelint \"**/*.{vue,scss,css}\" --fix",
258
- "format": "prettier --write .",
259
- "format:check": "prettier --check .",
239
+ "format": "vp fmt .",
240
+ "format:check": "vp fmt --check .",
260
241
  "check": "pnpm run lint && pnpm run typecheck && pnpm run format:check",
261
242
  "fix": "pnpm run format && pnpm run lint:fix && pnpm run lint:style:fix",
262
- "fix:layer": "f(){ pnpm turbo run lint --filter \"./layers/$1\" -- --fix && prettier --write \"layers/$1\"; }; f",
263
- "fix:app": "f(){ pnpm turbo run lint --filter \"./apps/$1\" -- --fix && prettier --write \"apps/$1\"; }; f",
243
+ "fix:layer": "f(){ pnpm turbo run lint --filter \"./layers/$1\" -- --fix && vp fmt \"layers/$1\"; }; f",
244
+ "fix:app": "f(){ pnpm turbo run lint --filter \"./apps/$1\" -- --fix && vp fmt \"apps/$1\"; }; f",
264
245
  "validate": "pnpm run check && pnpm run build",
265
246
  "typecheck": "vue-tsc --noEmit -p tsconfig.typecheck.json",
266
- "test": "vitest run",
267
- "test:coverage": "vitest run --coverage",
268
- "test:watch": "vitest",
269
- "test:unit": "vitest run --project unit",
270
- "test:vitest": "vitest run --project vitest",
271
- "test:vue": "vitest run --project vue",
272
- "test:nuxt": "vitest run --project nuxt",
247
+ "test": "vp test run",
248
+ "test:coverage": "vp test run --coverage",
249
+ "test:watch": "vp test",
250
+ "test:unit": "vp test run --project unit",
251
+ "test:vitest": "vp test run --project vitest",
252
+ "test:vue": "vp test run --project vue",
253
+ "test:nuxt": "vp test run --project nuxt",
273
254
  "test:playwright": "playwright test",
274
255
  "test:e2e": "playwright test",
275
256
  "clean": "pnpm -r exec rm -rf .nuxt .output .data",