kmcom-nuxt-layers 1.0.2 → 1.1.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/README.md +44 -0
- package/docs/ARCHITECTURE.md +196 -0
- package/docs/USAGE.md +175 -0
- package/layers/content/app/.DS_Store +0 -0
- package/layers/content/package.json +1 -1
- package/layers/core/app/.DS_Store +0 -0
- package/layers/core/nuxt.config.ts +1 -1
- package/layers/core/package.json +1 -2
- package/layers/forms/app/.DS_Store +0 -0
- package/layers/forms/package.json +1 -2
- package/layers/layout/app/.DS_Store +0 -0
- package/layers/layout/package.json +1 -2
- package/layers/motion/app/.DS_Store +0 -0
- package/layers/motion/package.json +1 -2
- package/layers/shader/app/.DS_Store +0 -0
- package/layers/shader/package.json +1 -1
- package/layers/theme/app/.DS_Store +0 -0
- package/layers/theme/package.json +1 -2
- package/layers/ui/app/.DS_Store +0 -0
- package/layers/ui/nuxt.config.ts +1 -1
- package/layers/ui/package.json +1 -1
- package/package.json +69 -3
- package/.claude/rules/nuxt-layers.md +0 -23
- package/.claude/rules/typescript.md +0 -16
- package/.claude/rules/vue-components.md +0 -34
- package/.claude/settings.local.json +0 -81
- package/.editorconfig +0 -27
- package/.github/workflows/npm-publish.yml +0 -33
- package/.oxlintrc.json +0 -10
- package/.prettierignore +0 -87
- package/CLAUDE.md +0 -71
- package/apps/playground/README.md +0 -75
- package/apps/playground/app/app.config.ts +0 -10
- package/apps/playground/app/app.vue +0 -12
- package/apps/playground/app/components/AmbientBackground.client.vue +0 -795
- package/apps/playground/app/components/ShaderDemoCanvas.client.vue +0 -636
- package/apps/playground/app/components/ShaderImageDemo.client.vue +0 -211
- package/apps/playground/app/pages/ambient.vue +0 -387
- package/apps/playground/app/pages/content.vue +0 -200
- package/apps/playground/app/pages/core.vue +0 -560
- package/apps/playground/app/pages/forms.vue +0 -645
- package/apps/playground/app/pages/index.vue +0 -257
- package/apps/playground/app/pages/layout.vue +0 -591
- package/apps/playground/app/pages/locomotive-scroll.vue +0 -738
- package/apps/playground/app/pages/motion.vue +0 -848
- package/apps/playground/app/pages/shader.vue +0 -1701
- package/apps/playground/app/pages/theme.vue +0 -115
- package/apps/playground/app/pages/ui.vue +0 -656
- package/apps/playground/content/blog/hello-world.md +0 -127
- package/apps/playground/content/blog/second-post.md +0 -99
- package/apps/playground/content/blog/third-post.md +0 -33
- package/apps/playground/content/gallery/autumn-collection.md +0 -57
- package/apps/playground/content/gallery/summer-collection.md +0 -52
- package/apps/playground/content/pages/index.md +0 -132
- package/apps/playground/content/portfolio/project-one.md +0 -90
- package/apps/playground/content/portfolio/project-two.md +0 -96
- package/apps/playground/content.config.ts +0 -93
- package/apps/playground/nuxt.config.ts +0 -99
- package/apps/playground/package.json +0 -17
- package/apps/playground/public/favicon.ico +0 -0
- package/apps/playground/public/robots.txt +0 -2
- package/apps/playground/tsconfig.json +0 -25
- package/eslint.config.mjs +0 -223
- package/eslint.configCOPY.mjs +0 -216
- package/eslintconfigCURRENT.mjs +0 -244
- package/eslintconfigOLD.mjs +0 -178
- package/files for claude/Scroller.vue +0 -31
- package/files for claude/TextMarquee.vue +0 -255
- package/files for claude/gsap.client.ts +0 -18
- package/files for claude/gsap.ts +0 -10
- package/files for claude/scroll.ts +0 -28
- package/layers/content/content.config.ts +0 -93
- package/layers/core/tailwind.config.js +0 -28
- package/layers/layout/.nuxtrc +0 -1
- package/layers/layout/CLAUDE.MD +0 -186
- package/layers/layout/GRID_SYSTEM.md +0 -993
- package/layers/layout/README.md +0 -73
- package/layers/layout/tailwind.config.js +0 -28
- package/layers/motion/README.md +0 -107
- package/layers/motion/TASKS.MD +0 -16
- package/layers/shader/AGENTS.MD +0 -195
- package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierignore +0 -6
- package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierrc +0 -18
- package/layers/shader/additional-modular-tsl-shaders-for-claude/LICENSE +0 -21
- package/layers/shader/additional-modular-tsl-shaders-for-claude/README.md +0 -100
- package/layers/shader/additional-modular-tsl-shaders-for-claude/index.html +0 -13
- package/layers/shader/additional-modular-tsl-shaders-for-claude/jsconfig.json +0 -30
- package/layers/shader/additional-modular-tsl-shaders-for-claude/package.json +0 -18
- package/layers/shader/additional-modular-tsl-shaders-for-claude/pnpm-lock.yaml +0 -633
- package/layers/shader/additional-modular-tsl-shaders-for-claude/public/vite.svg +0 -1
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketch/webgpu_sketch.js +0 -128
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/index.css +0 -87
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/sketches_dropdown.js +0 -169
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/index.css +0 -25
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/main.js +0 -93
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/router.js +0 -43
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/flare-1.js +0 -68
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/noise/dawn-1.js +0 -56
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/bulge_distortion.js +0 -35
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/swirl_distortion.js +0 -35
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/wave_distortion.js +0 -43
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/common.js +0 -145
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_3d.js +0 -53
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_4d.js +0 -55
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/fbm.js +0 -163
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/perlin_noise_3d.js +0 -70
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_3d.js +0 -59
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_4d.js +0 -72
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/turbulence.js +0 -41
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/canvas_weave_pattern.js +0 -26
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/grain_texture_pattern.js +0 -10
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/led_pattern.js +0 -45
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/pixellation_pattern.js +0 -15
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/speckled_noise_pattern.js +0 -34
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/vignette_pattern.js +0 -21
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/bulge_distortion_effect.js +0 -27
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/chromatic_aberration_effect.js +0 -45
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/crt_scanline_effect.js +0 -45
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/dither_effect.js +0 -126
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/grain_texture_effect.js +0 -21
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/halftone_effect.js +0 -44
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/led_effect.js +0 -31
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/pixellation_effect.js +0 -29
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/swirl_distortion_effect.js +0 -25
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/vignette_effect.js +0 -22
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/wave_distortion_effect.js +0 -27
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/cosine_palette.js +0 -15
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/tonemapping.js +0 -151
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom.js +0 -13
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom_edge_pattern.js +0 -20
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/domain_index.js +0 -11
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/median3.js +0 -22
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/repeating_pattern.js +0 -13
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/screen_aspect_uv.js +0 -14
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/lighting.js +0 -60
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/complex.js +0 -86
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/coordinates.js +0 -119
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/operations.js +0 -24
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/shapes.js +0 -182
- package/layers/shader/additional-modular-tsl-shaders-for-claude/src/utils/math.js +0 -33
- package/layers/shader/additional-modular-tsl-shaders-for-claude/vite.config.js +0 -23
- package/layers/shader/modular-tsl-shaders-for-claude/common/blend.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/common/noise.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/common/shapes.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/common/vertexFresnel.tsl +0 -9
- package/layers/shader/modular-tsl-shaders-for-claude/common/vertexPlane.tsl +0 -6
- package/layers/shader/modular-tsl-shaders-for-claude/effects/background.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/effects/gradient.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/effects/gradientLegend.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/effects/simpleGradient.tsl +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/aurora.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/fragmentsTech.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/fresnel.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/linearGradient.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/meshGradient.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/noise.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/paperShading.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/radial.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/shaderGradient.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/layers/stripe.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/materials/createMaterial.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/utils/glslUtils.ts +0 -1
- package/layers/shader/modular-tsl-shaders-for-claude/utils/palette.ts +0 -1
- package/layers/theme/server/plugins/theme-fouc.ts +0 -51
- package/layers/ui/CLAUDE.MD +0 -325
- package/playgroundOLD/app.config.ts +0 -5
- package/playgroundOLD/nuxt.config.ts +0 -12
- package/pnpm-workspace.yaml +0 -6
- package/prettier.config.cjs +0 -19
- package/stylelint.config.mjs +0 -111
- package/turbo.json +0 -16
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# kmcom-nuxt-layers
|
|
2
|
+
|
|
3
|
+
Composable Nuxt 4 layers for building scalable Vue applications. Pick only the layers you need.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install kmcom-nuxt-layers
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// nuxt.config.ts
|
|
13
|
+
export default defineNuxtConfig({
|
|
14
|
+
extends: [
|
|
15
|
+
'kmcom-nuxt-layers/layers/core',
|
|
16
|
+
'kmcom-nuxt-layers/layers/ui',
|
|
17
|
+
// add more layers as needed
|
|
18
|
+
]
|
|
19
|
+
})
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Layers
|
|
23
|
+
|
|
24
|
+
| Layer | Description |
|
|
25
|
+
|-------|-------------|
|
|
26
|
+
| **core** | Foundation — Nuxt UI, VueUse, Pinia, loading screen, error handling, scroll guard |
|
|
27
|
+
| **ui** | Design system — typography, color, media, branding components |
|
|
28
|
+
| **layout** | Page structure — grids, containers, spacing |
|
|
29
|
+
| **motion** | Animations — GSAP, Locomotive Scroll |
|
|
30
|
+
| **shader** | 3D / WebGPU — Three.js, TresJS |
|
|
31
|
+
| **forms** | Validation — Zod-based form system |
|
|
32
|
+
| **theme** | Theming — color mode, accent colors |
|
|
33
|
+
| **content** | CMS — @nuxt/content, Nuxt Studio |
|
|
34
|
+
|
|
35
|
+
All layers depend on `core`. Always list `core` first in `extends`.
|
|
36
|
+
|
|
37
|
+
## Documentation
|
|
38
|
+
|
|
39
|
+
- **[Usage Guide](docs/USAGE.md)** — installation, configuration examples, layer dependencies
|
|
40
|
+
- **[Architecture](docs/ARCHITECTURE.md)** — internal structure, alias system, dev workflow
|
|
41
|
+
|
|
42
|
+
## License
|
|
43
|
+
|
|
44
|
+
ISC
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
# Architecture
|
|
2
|
+
|
|
3
|
+
Internal documentation for the `kmcom-nuxt-layers` monorepo.
|
|
4
|
+
|
|
5
|
+
## Monorepo Structure
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
nuxt-layers/
|
|
9
|
+
├── apps/
|
|
10
|
+
│ └── playground/ # Demo / development Nuxt app
|
|
11
|
+
├── layers/
|
|
12
|
+
│ ├── core/ # Base utilities, plugins, error handling
|
|
13
|
+
│ ├── ui/ # Typography, color, media primitives
|
|
14
|
+
│ ├── layout/ # Grid, containers, page structure
|
|
15
|
+
│ ├── motion/ # GSAP + Locomotive Scroll animations
|
|
16
|
+
│ ├── shader/ # Three.js / TresJS WebGPU shaders
|
|
17
|
+
│ ├── forms/ # Zod-based form validation
|
|
18
|
+
│ ├── theme/ # Color mode, accent colors, accessibility
|
|
19
|
+
│ └── content/ # @nuxt/content integration, Nuxt Studio
|
|
20
|
+
├── packages/ # Shared utilities (placeholder)
|
|
21
|
+
├── pnpm-workspace.yaml
|
|
22
|
+
├── turbo.json
|
|
23
|
+
└── package.json
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**Tooling:** pnpm workspaces for dependency management, Turbo for parallel task orchestration (`build`, `dev`, `lint`, `typecheck`).
|
|
27
|
+
|
|
28
|
+
## Layer Pattern
|
|
29
|
+
|
|
30
|
+
Each layer under `layers/` is an independent Nuxt-extendable package. A layer's `package.json` declares `"main": "./nuxt.config.ts"`, making it resolvable by Nuxt's `extends` mechanism.
|
|
31
|
+
|
|
32
|
+
Typical layer directory structure:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
layers/<name>/
|
|
36
|
+
├── nuxt.config.ts # Layer config (alias, modules, css, plugins)
|
|
37
|
+
├── app.config.ts # Typed runtime config with defaults
|
|
38
|
+
├── package.json # name, main, dependencies
|
|
39
|
+
├── app/
|
|
40
|
+
│ ├── assets/css/main.css # Layer-specific CSS
|
|
41
|
+
│ ├── components/ # Auto-imported Vue components
|
|
42
|
+
│ ├── composables/ # Auto-imported composables
|
|
43
|
+
│ ├── plugins/ # Nuxt plugins
|
|
44
|
+
│ ├── types/ # TypeScript type definitions
|
|
45
|
+
│ └── utils/ # Utility functions
|
|
46
|
+
└── .playground/ # Isolated dev/test app for this layer
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Alias System
|
|
50
|
+
|
|
51
|
+
Each layer registers a `#layers/<name>` alias pointing to its own root directory via `import.meta.dirname`:
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
// layers/core/nuxt.config.ts
|
|
55
|
+
alias: {
|
|
56
|
+
'#layers/core': import.meta.dirname,
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
This allows layers to reference their own files with stable paths that resolve correctly both in the monorepo and when consumed from `node_modules`:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
css: ['#layers/core/app/assets/css/main.css'],
|
|
64
|
+
plugins: ['#layers/core/app/plugins/init.ts'],
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Layer Dependency Graph
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
core (foundation — no dependencies)
|
|
71
|
+
├── ui (typography, color, media)
|
|
72
|
+
├── layout (grid, containers)
|
|
73
|
+
├── motion (GSAP, Locomotive Scroll)
|
|
74
|
+
├── shader (Three.js, TresJS)
|
|
75
|
+
├── forms (Zod validation)
|
|
76
|
+
├── theme (color mode, accents)
|
|
77
|
+
└── content (@nuxt/content, Nuxt Studio)
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
All layers depend on `core`. The `core` layer must always be listed first in `extends`.
|
|
81
|
+
|
|
82
|
+
## Playground Composition System
|
|
83
|
+
|
|
84
|
+
The `apps/playground/nuxt.config.ts` supports selective layer loading via the `PLAYGROUND_LAYERS` environment variable.
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
# Load only core + ui
|
|
88
|
+
PLAYGROUND_LAYERS=core,ui pnpm -F playground dev
|
|
89
|
+
|
|
90
|
+
# Load all layers (default when env var is unset)
|
|
91
|
+
pnpm dev
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
The `resolveExtendedLayers()` function:
|
|
95
|
+
1. Parses `PLAYGROUND_LAYERS` as a comma-separated list
|
|
96
|
+
2. Auto-includes each layer's dependencies (defined in `LAYER_DEPENDENCIES`)
|
|
97
|
+
3. Returns paths in correct order (dependencies first, following `AVAILABLE_LAYERS` order)
|
|
98
|
+
|
|
99
|
+
## CSS Cascade
|
|
100
|
+
|
|
101
|
+
Each layer loads its own CSS via the `css` array in `nuxt.config.ts`:
|
|
102
|
+
|
|
103
|
+
```ts
|
|
104
|
+
css: ['#layers/<name>/app/assets/css/main.css']
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
- **core** imports Tailwind CSS 4 and Nuxt UI base styles
|
|
108
|
+
- **theme** uses a separate `theme.css` file for color mode variables
|
|
109
|
+
- Layer CSS is loaded in `extends` order, so core styles are always available to downstream layers
|
|
110
|
+
|
|
111
|
+
## Component Auto-Import
|
|
112
|
+
|
|
113
|
+
Nuxt auto-discovers components from all extended layers' `app/components/` directories. No manual registration needed.
|
|
114
|
+
|
|
115
|
+
The shader layer uses explicit component registration with `global: true` for its WebGPU components:
|
|
116
|
+
|
|
117
|
+
```ts
|
|
118
|
+
components: [{
|
|
119
|
+
path: './app/components',
|
|
120
|
+
pathPrefix: false,
|
|
121
|
+
global: true,
|
|
122
|
+
}]
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## app.config.ts
|
|
126
|
+
|
|
127
|
+
Each layer provides typed runtime configuration via `app.config.ts` with sensible defaults. Consumers can override any value in their own `app.config.ts`.
|
|
128
|
+
|
|
129
|
+
Key config namespaces:
|
|
130
|
+
- `coreLayer` — loading screen, error handling, scroll guard, 404 page
|
|
131
|
+
- `motion` — Lenis smooth scroll, GSAP ScrollTrigger integration
|
|
132
|
+
- `themeLayer` — accent colors, default accent
|
|
133
|
+
|
|
134
|
+
Type augmentation is done via `declare module '@nuxt/schema'` in each layer's `app.config.ts`.
|
|
135
|
+
|
|
136
|
+
## Git Subtree Management
|
|
137
|
+
|
|
138
|
+
Layers are managed as git subtrees from separate upstream repositories:
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Push layer changes to upstream
|
|
142
|
+
git subtree push --prefix=layers/<layer> <remote-url> main
|
|
143
|
+
|
|
144
|
+
# Pull updates from upstream
|
|
145
|
+
git subtree pull --prefix=layers/<layer> <remote-url> main --squash
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
Always commit changes to the monorepo first, then push to upstream if needed.
|
|
149
|
+
|
|
150
|
+
## Dev Workflow
|
|
151
|
+
|
|
152
|
+
```bash
|
|
153
|
+
# Start all layers via playground
|
|
154
|
+
pnpm dev
|
|
155
|
+
|
|
156
|
+
# Start specific layer combinations
|
|
157
|
+
pnpm dev:core # core only
|
|
158
|
+
pnpm dev:ui # core + ui
|
|
159
|
+
pnpm dev:layout # core + ui + layout
|
|
160
|
+
pnpm dev:motion # core + motion
|
|
161
|
+
|
|
162
|
+
# Build / lint / typecheck (all packages via Turbo)
|
|
163
|
+
pnpm build
|
|
164
|
+
pnpm lint
|
|
165
|
+
pnpm typecheck
|
|
166
|
+
|
|
167
|
+
# Layer-specific tasks
|
|
168
|
+
pnpm layer:core # turbo dev for core
|
|
169
|
+
pnpm build:core # turbo build for core
|
|
170
|
+
|
|
171
|
+
# Clean everything
|
|
172
|
+
pnpm clean
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## .playground Directories
|
|
176
|
+
|
|
177
|
+
Each layer has a `.playground/` directory containing a minimal Nuxt app for isolated development and testing of that layer. These are used by the `dev` script in each layer's `package.json`:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
cd layers/core && pnpm dev # runs nuxi dev .playground
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
Some layers (ui, content) support standalone mode via environment variables (`UI_STANDALONE`, `CONTENT_STANDALONE`) which auto-extends core when running outside the monorepo playground.
|
|
184
|
+
|
|
185
|
+
## Layer Details
|
|
186
|
+
|
|
187
|
+
| Layer | Description |
|
|
188
|
+
|-------|-------------|
|
|
189
|
+
| **core** | Foundation layer. Nuxt UI, VueUse, device detection, Pinia, loading screen, error handler, scroll guard, feature detection, PWA support (production only). |
|
|
190
|
+
| **ui** | Design system primitives. Typography components (Headline, CodeBlock, QuoteBlock), color system, media/picture component, site branding, breakpoint types. |
|
|
191
|
+
| **layout** | Page structure. Grid systems, containers, spacing, layout compositions with breakpoint-based responsiveness. |
|
|
192
|
+
| **motion** | Animation layer. GSAP with ScrollTrigger, Locomotive Scroll (Lenis) smooth scrolling, motion composables. Transpiles GSAP for SSR. |
|
|
193
|
+
| **shader** | WebGPU/WebGL layer. Three.js + TresJS integration, TSL shader support, post-processing. Includes custom shader utilities and auto-imported shader modules. |
|
|
194
|
+
| **forms** | Form validation layer. Zod schema-based validation, form composables, typed form components. |
|
|
195
|
+
| **theme** | Theming layer. Color mode switching, accent color palette, theme plugin, CSS custom properties for dynamic theming. |
|
|
196
|
+
| **content** | Content management layer. @nuxt/content integration, better-sqlite3 for local content DB, optional Nuxt Studio support. |
|
package/docs/USAGE.md
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
# Usage Guide
|
|
2
|
+
|
|
3
|
+
How to consume `kmcom-nuxt-layers` in your Nuxt 4 project.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install kmcom-nuxt-layers
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Basic Usage
|
|
12
|
+
|
|
13
|
+
Add layers to the `extends` array in your `nuxt.config.ts`. Each layer is referenced by its filesystem path within the package:
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
// nuxt.config.ts
|
|
17
|
+
export default defineNuxtConfig({
|
|
18
|
+
extends: [
|
|
19
|
+
'kmcom-nuxt-layers/layers/core',
|
|
20
|
+
'kmcom-nuxt-layers/layers/ui',
|
|
21
|
+
]
|
|
22
|
+
})
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Nuxt resolves each layer via the `package.json` → `"main": "./nuxt.config.ts"` entry. No import maps or special configuration needed.
|
|
26
|
+
|
|
27
|
+
## Available Layers
|
|
28
|
+
|
|
29
|
+
| Layer | Extends Path | Depends On | Required Dependencies |
|
|
30
|
+
|-------|-------------|------------|----------------------|
|
|
31
|
+
| **core** | `kmcom-nuxt-layers/layers/core` | — | `nuxt`, `@nuxt/ui`, `pinia`, `@vueuse/nuxt`, `@nuxtjs/device` |
|
|
32
|
+
| **ui** | `kmcom-nuxt-layers/layers/ui` | core | — |
|
|
33
|
+
| **layout** | `kmcom-nuxt-layers/layers/layout` | core | — |
|
|
34
|
+
| **motion** | `kmcom-nuxt-layers/layers/motion` | core | `gsap`, `locomotive-scroll` |
|
|
35
|
+
| **shader** | `kmcom-nuxt-layers/layers/shader` | core | `three`, `@tresjs/nuxt`, `@tresjs/core`, `@tresjs/cientos`, `@tresjs/post-processing` |
|
|
36
|
+
| **forms** | `kmcom-nuxt-layers/layers/forms` | core | `zod` |
|
|
37
|
+
| **theme** | `kmcom-nuxt-layers/layers/theme` | core | — |
|
|
38
|
+
| **content** | `kmcom-nuxt-layers/layers/content` | core | `@nuxt/content`, `better-sqlite3` |
|
|
39
|
+
|
|
40
|
+
## Layer Dependency Rules
|
|
41
|
+
|
|
42
|
+
1. **Always include `core` first** — all other layers depend on it
|
|
43
|
+
2. **Order matters** — list `core` before any layer that depends on it
|
|
44
|
+
3. **Only include what you need** — each layer is independent (apart from the core dependency)
|
|
45
|
+
|
|
46
|
+
## Layer-Specific Dependencies
|
|
47
|
+
|
|
48
|
+
Install additional dependencies only for the layers you use:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Motion layer
|
|
52
|
+
npm install gsap locomotive-scroll
|
|
53
|
+
|
|
54
|
+
# Shader layer
|
|
55
|
+
npm install three @tresjs/nuxt @tresjs/core @tresjs/cientos @tresjs/post-processing
|
|
56
|
+
|
|
57
|
+
# Forms layer
|
|
58
|
+
npm install zod
|
|
59
|
+
|
|
60
|
+
# Content layer
|
|
61
|
+
npm install @nuxt/content better-sqlite3
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Configuration Examples
|
|
65
|
+
|
|
66
|
+
### Core + UI (design system)
|
|
67
|
+
|
|
68
|
+
```ts
|
|
69
|
+
export default defineNuxtConfig({
|
|
70
|
+
extends: [
|
|
71
|
+
'kmcom-nuxt-layers/layers/core',
|
|
72
|
+
'kmcom-nuxt-layers/layers/ui',
|
|
73
|
+
]
|
|
74
|
+
})
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Core + UI + Layout (full page structure)
|
|
78
|
+
|
|
79
|
+
```ts
|
|
80
|
+
export default defineNuxtConfig({
|
|
81
|
+
extends: [
|
|
82
|
+
'kmcom-nuxt-layers/layers/core',
|
|
83
|
+
'kmcom-nuxt-layers/layers/ui',
|
|
84
|
+
'kmcom-nuxt-layers/layers/layout',
|
|
85
|
+
]
|
|
86
|
+
})
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### Core + Motion (animations)
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
npm install gsap locomotive-scroll
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
export default defineNuxtConfig({
|
|
97
|
+
extends: [
|
|
98
|
+
'kmcom-nuxt-layers/layers/core',
|
|
99
|
+
'kmcom-nuxt-layers/layers/motion',
|
|
100
|
+
]
|
|
101
|
+
})
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Full Stack
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
npm install gsap locomotive-scroll three @tresjs/nuxt @tresjs/core @tresjs/cientos @tresjs/post-processing zod @nuxt/content better-sqlite3
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```ts
|
|
111
|
+
export default defineNuxtConfig({
|
|
112
|
+
extends: [
|
|
113
|
+
'kmcom-nuxt-layers/layers/core',
|
|
114
|
+
'kmcom-nuxt-layers/layers/ui',
|
|
115
|
+
'kmcom-nuxt-layers/layers/layout',
|
|
116
|
+
'kmcom-nuxt-layers/layers/motion',
|
|
117
|
+
'kmcom-nuxt-layers/layers/shader',
|
|
118
|
+
'kmcom-nuxt-layers/layers/forms',
|
|
119
|
+
'kmcom-nuxt-layers/layers/theme',
|
|
120
|
+
'kmcom-nuxt-layers/layers/content',
|
|
121
|
+
]
|
|
122
|
+
})
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Overriding Layer Config
|
|
126
|
+
|
|
127
|
+
Each layer provides typed runtime defaults via `app.config.ts`. Override any value in your own `app.config.ts`:
|
|
128
|
+
|
|
129
|
+
```ts
|
|
130
|
+
// app.config.ts
|
|
131
|
+
export default defineAppConfig({
|
|
132
|
+
// Core layer overrides
|
|
133
|
+
coreLayer: {
|
|
134
|
+
loading: {
|
|
135
|
+
enabled: false, // Disable loading screen
|
|
136
|
+
},
|
|
137
|
+
scrollGuard: {
|
|
138
|
+
enabled: false, // Disable scroll guard
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
|
|
142
|
+
// Motion layer overrides
|
|
143
|
+
motion: {
|
|
144
|
+
lenis: {
|
|
145
|
+
duration: 0.8, // Faster smooth scroll
|
|
146
|
+
smoothTouch: true, // Enable on touch devices
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
|
|
150
|
+
// Theme layer overrides
|
|
151
|
+
themeLayer: {
|
|
152
|
+
defaultAccent: 'indigo', // Change default accent color
|
|
153
|
+
accents: ['blue', 'indigo', 'violet', 'purple'], // Limit palette
|
|
154
|
+
},
|
|
155
|
+
})
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Available Config Namespaces
|
|
159
|
+
|
|
160
|
+
| Namespace | Layer | Key Options |
|
|
161
|
+
|-----------|-------|-------------|
|
|
162
|
+
| `coreLayer.loading` | core | `enabled`, `minDuration`, `maxDuration`, `background`, `textColor` |
|
|
163
|
+
| `coreLayer.scrollGuard` | core | `enabled`, `strict`, `excludeSelectors`, `debug` |
|
|
164
|
+
| `coreLayer.errors` | core | `logToConsole`, `logToExternal`, `externalUrl` |
|
|
165
|
+
| `coreLayer.notFound` | core | `icon`, `title`, `description`, `showHomeButton`, `actions`, `suggestions` |
|
|
166
|
+
| `motion` | motion | `gsapScrollTrigger`, `lenis.*` (duration, smoothWheel, smoothTouch, etc.) |
|
|
167
|
+
| `themeLayer` | theme | `accents`, `defaultAccent` |
|
|
168
|
+
|
|
169
|
+
## Optional Modules
|
|
170
|
+
|
|
171
|
+
Some modules used in the layers are optional or dev-only:
|
|
172
|
+
|
|
173
|
+
- **`@nuxt/eslint`** — Loaded only in development (`NODE_ENV !== 'production'`). Install if you want layer-provided ESLint config during dev.
|
|
174
|
+
- **`@vite-pwa/nuxt`** — Loaded only in production by the core layer. Install if you want PWA support.
|
|
175
|
+
- **`nuxt-studio`** — Optional peer dependency of the content layer. Install for Nuxt Studio CMS integration.
|
|
Binary file
|
|
Binary file
|
package/layers/core/package.json
CHANGED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/layers/ui/nuxt.config.ts
CHANGED
package/layers/ui/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,8 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "kmcom-nuxt-layers",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0
|
|
5
|
-
"description": "",
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"description": "Composable Nuxt 4 layers for building scalable Vue applications",
|
|
6
|
+
"files": [
|
|
7
|
+
"layers/*/nuxt.config.ts",
|
|
8
|
+
"layers/*/app.config.ts",
|
|
9
|
+
"layers/*/package.json",
|
|
10
|
+
"layers/*/tsconfig.json",
|
|
11
|
+
"layers/*/app/**",
|
|
12
|
+
"docs/"
|
|
13
|
+
],
|
|
6
14
|
"keywords": [],
|
|
7
15
|
"author": "Kieran Mansfield",
|
|
8
16
|
"license": "ISC",
|
|
@@ -15,7 +23,65 @@
|
|
|
15
23
|
"nuxt": "^4.0.0",
|
|
16
24
|
"@nuxt/ui": "^4.0.0",
|
|
17
25
|
"pinia": "^3.0.0",
|
|
18
|
-
"@vueuse/nuxt": "^14.0.0"
|
|
26
|
+
"@vueuse/nuxt": "^14.0.0",
|
|
27
|
+
"@nuxtjs/device": "^4.0.0",
|
|
28
|
+
"gsap": "^3.12.0",
|
|
29
|
+
"locomotive-scroll": "^5.0.0",
|
|
30
|
+
"three": "^0.170.0",
|
|
31
|
+
"@tresjs/nuxt": "^5.0.0",
|
|
32
|
+
"@tresjs/core": "^5.0.0",
|
|
33
|
+
"@tresjs/cientos": "^5.0.0",
|
|
34
|
+
"@tresjs/post-processing": "^3.0.0",
|
|
35
|
+
"zod": "^3.20.0",
|
|
36
|
+
"@nuxt/content": "^3.0.0",
|
|
37
|
+
"better-sqlite3": "^12.0.0",
|
|
38
|
+
"@nuxt/eslint": "^1.0.0",
|
|
39
|
+
"@vite-pwa/nuxt": "^1.0.0",
|
|
40
|
+
"nuxt-studio": "^1.0.0"
|
|
41
|
+
},
|
|
42
|
+
"peerDependenciesMeta": {
|
|
43
|
+
"@nuxtjs/device": {
|
|
44
|
+
"optional": true
|
|
45
|
+
},
|
|
46
|
+
"gsap": {
|
|
47
|
+
"optional": true
|
|
48
|
+
},
|
|
49
|
+
"locomotive-scroll": {
|
|
50
|
+
"optional": true
|
|
51
|
+
},
|
|
52
|
+
"three": {
|
|
53
|
+
"optional": true
|
|
54
|
+
},
|
|
55
|
+
"@tresjs/nuxt": {
|
|
56
|
+
"optional": true
|
|
57
|
+
},
|
|
58
|
+
"@tresjs/core": {
|
|
59
|
+
"optional": true
|
|
60
|
+
},
|
|
61
|
+
"@tresjs/cientos": {
|
|
62
|
+
"optional": true
|
|
63
|
+
},
|
|
64
|
+
"@tresjs/post-processing": {
|
|
65
|
+
"optional": true
|
|
66
|
+
},
|
|
67
|
+
"zod": {
|
|
68
|
+
"optional": true
|
|
69
|
+
},
|
|
70
|
+
"@nuxt/content": {
|
|
71
|
+
"optional": true
|
|
72
|
+
},
|
|
73
|
+
"better-sqlite3": {
|
|
74
|
+
"optional": true
|
|
75
|
+
},
|
|
76
|
+
"@nuxt/eslint": {
|
|
77
|
+
"optional": true
|
|
78
|
+
},
|
|
79
|
+
"@vite-pwa/nuxt": {
|
|
80
|
+
"optional": true
|
|
81
|
+
},
|
|
82
|
+
"nuxt-studio": {
|
|
83
|
+
"optional": true
|
|
84
|
+
}
|
|
19
85
|
},
|
|
20
86
|
"devDependencies": {
|
|
21
87
|
"@commitlint/cli": "^20.4.1",
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "layers/**/*"
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Nuxt Layers Development
|
|
7
|
-
|
|
8
|
-
## Layer Structure
|
|
9
|
-
Each layer is an independent package that extends Nuxt apps with:
|
|
10
|
-
- Components (`components/`)
|
|
11
|
-
- Composables (`composables/`)
|
|
12
|
-
- Utilities (`utils/`)
|
|
13
|
-
- Nuxt config (`nuxt.config.ts`)
|
|
14
|
-
|
|
15
|
-
## Best Practices
|
|
16
|
-
- Layers should be self-contained and composable
|
|
17
|
-
- Avoid circular dependencies between layers
|
|
18
|
-
- Test changes against the playground app
|
|
19
|
-
|
|
20
|
-
## Layer Dependencies
|
|
21
|
-
- `ui` → depends on nothing
|
|
22
|
-
- `layout` → may use `ui` components
|
|
23
|
-
- `core` → base utilities, no UI dependencies
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
paths:
|
|
3
|
-
- "**/*.ts"
|
|
4
|
-
- "**/*.tsx"
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# TypeScript Conventions
|
|
8
|
-
|
|
9
|
-
## Style
|
|
10
|
-
- No semicolons, single quotes, ES5 trailing commas
|
|
11
|
-
- Max line length: 100 characters
|
|
12
|
-
|
|
13
|
-
## Type Definitions
|
|
14
|
-
- Prefer interfaces for object shapes
|
|
15
|
-
- Use type aliases for unions/intersections
|
|
16
|
-
- Export types alongside implementations
|