kmcom-nuxt-layers 2.2.12 → 2.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 (102) hide show
  1. package/docs/FEEDS.md +1 -2
  2. package/layers/animations/app/composables/useMagneticElement.ts +11 -9
  3. package/layers/animations/app/composables/useTiltEffect.ts +11 -9
  4. package/layers/animations/app/utils/pointerMotion.ts +31 -0
  5. package/layers/canvas/app/components/ShaderCanvas.vue +2 -2
  6. package/layers/content/app/composables/useCollectionItems.ts +28 -0
  7. package/layers/content/app/composables/useGalleryItems.ts +8 -14
  8. package/layers/content/app/composables/usePortfolioItems.ts +10 -18
  9. package/layers/core/app/composables/useBrowser.ts +9 -82
  10. package/layers/core/app/composables/useFeatures.ts +3 -27
  11. package/layers/core/app/plugins/init.ts +157 -135
  12. package/layers/core/app/utils/browserInfo.ts +115 -0
  13. package/layers/core/app/utils/featureClasses.ts +40 -0
  14. package/layers/core/app/utils/helpers.test.ts +51 -0
  15. package/layers/feeds/app/components/Feeds/Index.vue +1 -1
  16. package/layers/feeds/app/components/Feeds/RouteCard.vue +3 -9
  17. package/layers/feeds/app/utils/feed-catalog.ts +9 -4
  18. package/layers/feeds/nuxt.config.ts +0 -1
  19. package/layers/feeds/server/utils/content-adapter.test.ts +68 -0
  20. package/layers/feeds/server/utils/content-adapter.ts +2 -22
  21. package/layers/feeds/server/utils/feed-author.ts +32 -0
  22. package/layers/feeds/server/utils/feed-config.ts +88 -0
  23. package/layers/feeds/server/utils/feed-service.ts +11 -30
  24. package/layers/feeds/server/utils/feed-xml.ts +26 -0
  25. package/layers/feeds/server/utils/formats/rss.ts +10 -15
  26. package/layers/feeds/server/utils/formats.test.ts +71 -0
  27. package/layers/forms/app/components/Form/Field.vue +42 -30
  28. package/layers/forms/app/utils/fieldProps.ts +65 -0
  29. package/layers/layout/app/components/Layout/Grid/Item.vue +29 -146
  30. package/layers/layout/app/utils/gridPlacementStyle.ts +195 -0
  31. package/layers/mailer/app/types/mailer.ts +7 -25
  32. package/layers/mailer/server/utils/email.ts +28 -13
  33. package/layers/mailer/server/utils/hooks.ts +1 -20
  34. package/layers/navigation/app/composables/useSite.ts +2 -9
  35. package/layers/navigation/app/utils/site.ts +26 -0
  36. package/layers/routing/app/utils/resolveRoute.test.ts +47 -0
  37. package/layers/routing/app/utils/resolveRoute.ts +19 -10
  38. package/layers/scripts/app/composables/useAnalytics.ts +8 -41
  39. package/layers/scripts/app/composables/useGtm.ts +6 -13
  40. package/layers/scripts/app/utils/scriptClients.ts +70 -0
  41. package/layers/scroll/app/composables/useSmoothScroll.ts +9 -43
  42. package/layers/scroll/app/utils/scroll.ts +103 -0
  43. package/layers/seo/app/composables/useSeoConfig.ts +3 -9
  44. package/layers/seo/app/utils/seoConfig.ts +38 -0
  45. package/layers/shader/app/components/Material/AmbientAurora.client.vue +11 -33
  46. package/layers/shader/app/components/Material/AmbientFlow.client.vue +10 -37
  47. package/layers/shader/app/components/Material/AmbientGradientMesh.client.vue +10 -37
  48. package/layers/shader/app/components/Material/AmbientNebula.client.vue +12 -37
  49. package/layers/shader/app/components/Material/AmbientOcean.client.vue +9 -33
  50. package/layers/shader/app/components/Material/Gradient.client.vue +25 -46
  51. package/layers/shader/app/components/Material/Image.client.vue +10 -55
  52. package/layers/shader/app/components/Material/Node.client.vue +18 -5
  53. package/layers/shader/app/components/Material/Noise.client.vue +9 -43
  54. package/layers/shader/app/components/Preset/ThemeBubble.client.vue +2 -1
  55. package/layers/shader/app/components/Preset/ThemeFlow.client.vue +2 -1
  56. package/layers/shader/app/components/Preset/ThemeGradient.client.vue +2 -1
  57. package/layers/shader/app/components/Preset/ThemeLavaLamp.client.vue +2 -1
  58. package/layers/shader/app/components/Preset/ThemePlasma.client.vue +2 -1
  59. package/layers/shader/app/components/Preset/ThemeWave.client.vue +2 -1
  60. package/layers/shader/app/components/Shader/Background.client.vue +44 -24
  61. package/layers/shader/app/composables/useAmbientMaterials.ts +5 -1
  62. package/layers/shader/app/composables/useShader.ts +38 -23
  63. package/layers/shader/app/composables/useShaderGraph.ts +11 -6
  64. package/layers/shader/app/composables/useShaderMixBlend.ts +4 -4
  65. package/layers/shader/app/composables/useShaderRuntime.ts +0 -1
  66. package/layers/shader/app/composables/useShaderVec2.ts +2 -4
  67. package/layers/shader/app/composables/useThemePreset.ts +34 -8
  68. package/layers/shader/app/composables/useUniformWatchers.ts +15 -0
  69. package/layers/shader/app/composables/useUniforms.ts +0 -1
  70. package/layers/shader/app/shaders/common/blend.ts +4 -4
  71. package/layers/shader/app/shaders/common/effects.ts +38 -21
  72. package/layers/shader/app/shaders/common/grain.ts +46 -49
  73. package/layers/shader/app/shaders/common/lighting.ts +17 -15
  74. package/layers/shader/app/shaders/common/math.ts +2 -4
  75. package/layers/shader/app/shaders/common/nodes.ts +17 -0
  76. package/layers/shader/app/shaders/common/palette.ts +21 -11
  77. package/layers/shader/app/shaders/common/patterns.ts +25 -14
  78. package/layers/shader/app/shaders/common/shapes.ts +97 -88
  79. package/layers/shader/app/shaders/common/uv.ts +33 -34
  80. package/layers/shader/app/shaders/createMaterial.ts +92 -78
  81. package/layers/shader/app/shaders/layers/paperShading.ts +22 -10
  82. package/layers/shader/app/shaders/layers/shaderGradient.ts +46 -21
  83. package/layers/shader/app/utils/tsl/tween.ts +2 -4
  84. package/layers/shader/package.json +5 -1
  85. package/layers/starter/app/components/StarterDesignSystem.vue +1913 -0
  86. package/layers/starter/app/components/StarterHome.vue +407 -0
  87. package/layers/starter/nuxt.config.ts +15 -0
  88. package/layers/starter/package.json +10 -0
  89. package/layers/theme/app/components/ThemePicker/Menu.vue +3 -25
  90. package/layers/theme/app/composables/useThemePreferenceModels.ts +39 -0
  91. package/layers/theme/server/plugins/theme-fouc.ts +1 -92
  92. package/layers/theme/server/utils/accent-css.ts +75 -0
  93. package/layers/typography/app/composables/typography.ts +3 -7
  94. package/layers/visual/app/composables/accent.ts +2 -9
  95. package/layers/visual/app/composables/gradient.ts +33 -46
  96. package/layers/visual/app/composables/picture.ts +2 -79
  97. package/layers/visual/app/utils/colorTokens.ts +23 -0
  98. package/layers/visual/app/utils/gradientStyle.ts +41 -0
  99. package/layers/visual/app/utils/responsiveSizes.ts +49 -0
  100. package/package.json +17 -5
  101. package/layers/feeds/app/utils/feed-catalog.test.ts +0 -71
  102. package/layers/feeds/server/routes/feed/discovery.get.ts +0 -31
@@ -106,102 +106,116 @@ const sideMap: Record<string, Side> = {
106
106
  double: DoubleSide,
107
107
  }
108
108
 
109
- // ============================================
110
- // Factory Functions
111
- // ============================================
112
-
113
- /**
114
- * Create a shader material from a shader type
115
- */
116
- export function createShaderMaterial<T extends ShaderType>(
109
+ function createShaderUniforms<T extends ShaderType>(
117
110
  type: T,
118
- shaderOptions?: ShaderOptions<T>,
119
- materialOptions?: MaterialOptions
120
- ): ShaderMaterialResult<T> {
121
- const {
122
- transparent = false,
123
- side = 'double',
124
- opacity = 1,
125
- depthTest = true,
126
- depthWrite = true,
127
- } = materialOptions || {}
111
+ shaderOptions?: ShaderOptions<T>
112
+ ): ShaderUniforms<T> {
113
+ switch (type) {
114
+ case 'stripe':
115
+ return createStripeGradientUniforms(shaderOptions as StripeGradientOptions) as ShaderUniforms<T>
116
+ case 'meshGradient':
117
+ return createMeshGradientUniforms(shaderOptions as MeshGradientOptions) as ShaderUniforms<T>
118
+ case 'aurora':
119
+ return createAuroraUniforms(shaderOptions as AuroraOptions) as ShaderUniforms<T>
120
+ case 'shaderGradient':
121
+ return createShaderGradientUniforms(shaderOptions as ShaderGradientOptions) as ShaderUniforms<T>
122
+ case 'paperShading':
123
+ return createPaperShadingUniforms(shaderOptions as PaperShadingOptions) as ShaderUniforms<T>
124
+ }
125
+ }
128
126
 
129
- let uniforms: ShaderUniforms<T>
130
- let colorNode: TSLNode
127
+ function createShaderColorNode<T extends ShaderType>(type: T, uniforms: ShaderUniforms<T>): TSLNode {
128
+ switch (type) {
129
+ case 'stripe':
130
+ return stripeGradient(uniforms as StripeGradientUniforms)
131
+ case 'meshGradient':
132
+ return meshGradient(uniforms as MeshGradientUniforms)
133
+ case 'aurora':
134
+ return aurora(uniforms as AuroraUniforms)
135
+ case 'shaderGradient':
136
+ return shaderGradient(uniforms as ShaderGradientUniforms)
137
+ case 'paperShading':
138
+ return paperShading(uniforms as PaperShadingUniforms)
139
+ }
140
+ }
131
141
 
132
- // Create uniforms and color node based on type
142
+ function updateShaderUniforms<T extends ShaderType>(
143
+ type: T,
144
+ uniforms: ShaderUniforms<T>,
145
+ options: Partial<ShaderOptions<T>>
146
+ ): void {
133
147
  switch (type) {
134
148
  case 'stripe':
135
- uniforms = createStripeGradientUniforms(
136
- shaderOptions as StripeGradientOptions
137
- ) as ShaderUniforms<T>
138
- colorNode = stripeGradient(uniforms as StripeGradientUniforms)
139
- break
149
+ updateStripeGradientUniforms(
150
+ uniforms as StripeGradientUniforms,
151
+ options as Partial<StripeGradientOptions>
152
+ )
153
+ return
140
154
  case 'meshGradient':
141
- uniforms = createMeshGradientUniforms(
142
- shaderOptions as MeshGradientOptions
143
- ) as ShaderUniforms<T>
144
- colorNode = meshGradient(uniforms as MeshGradientUniforms)
145
- break
155
+ updateMeshGradientUniforms(
156
+ uniforms as MeshGradientUniforms,
157
+ options as Partial<MeshGradientOptions>
158
+ )
159
+ return
146
160
  case 'aurora':
147
- uniforms = createAuroraUniforms(shaderOptions as AuroraOptions) as ShaderUniforms<T>
148
- colorNode = aurora(uniforms as AuroraUniforms)
149
- break
161
+ updateAuroraUniforms(uniforms as AuroraUniforms, options as Partial<AuroraOptions>)
162
+ return
150
163
  case 'shaderGradient':
151
- uniforms = createShaderGradientUniforms(
152
- shaderOptions as ShaderGradientOptions
153
- ) as ShaderUniforms<T>
154
- colorNode = shaderGradient(uniforms as ShaderGradientUniforms)
155
- break
164
+ updateShaderGradientUniforms(
165
+ uniforms as ShaderGradientUniforms,
166
+ options as Partial<ShaderGradientOptions>
167
+ )
168
+ return
156
169
  case 'paperShading':
157
- uniforms = createPaperShadingUniforms(
158
- shaderOptions as PaperShadingOptions
159
- ) as ShaderUniforms<T>
160
- colorNode = paperShading(uniforms as PaperShadingUniforms)
161
- break
162
- default:
163
- throw new Error(`Unknown shader type: ${type}`)
170
+ updatePaperShadingUniforms(
171
+ uniforms as PaperShadingUniforms,
172
+ options as Partial<PaperShadingOptions>
173
+ )
164
174
  }
175
+ }
176
+
177
+ function applyMaterialOptions(
178
+ material: MeshBasicNodeMaterial,
179
+ colorNode: TSLNode,
180
+ options?: MaterialOptions
181
+ ): void {
182
+ const {
183
+ transparent = false,
184
+ side = 'double',
185
+ opacity = 1,
186
+ depthTest = true,
187
+ depthWrite = true,
188
+ } = options || {}
165
189
 
166
- // Create material
167
- const material = new MeshBasicNodeMaterial()
168
- material.colorNode = transparent ? vec4(colorNode, opacity) : colorNode
169
190
  material.transparent = transparent
170
191
  material.side = sideMap[side] || DoubleSide
171
192
  material.depthTest = depthTest
172
193
  material.depthWrite = depthWrite
194
+ material.colorNode = transparent ? vec4(colorNode, opacity) : colorNode
195
+ }
196
+
197
+ // ============================================
198
+ // Factory Functions
199
+ // ============================================
200
+
201
+ /**
202
+ * Create a shader material from a shader type
203
+ */
204
+ export function createShaderMaterial<T extends ShaderType>(
205
+ type: T,
206
+ shaderOptions?: ShaderOptions<T>,
207
+ materialOptions?: MaterialOptions
208
+ ): ShaderMaterialResult<T> {
209
+ const uniforms = createShaderUniforms(type, shaderOptions)
210
+ const colorNode = createShaderColorNode(type, uniforms)
211
+
212
+ // Create material
213
+ const material = new MeshBasicNodeMaterial()
214
+ applyMaterialOptions(material, colorNode, materialOptions)
173
215
 
174
216
  // Update function
175
217
  const update = (options: Partial<ShaderOptions<T>>) => {
176
- switch (type) {
177
- case 'stripe':
178
- updateStripeGradientUniforms(
179
- uniforms as StripeGradientUniforms,
180
- options as Partial<StripeGradientOptions>
181
- )
182
- break
183
- case 'meshGradient':
184
- updateMeshGradientUniforms(
185
- uniforms as MeshGradientUniforms,
186
- options as Partial<MeshGradientOptions>
187
- )
188
- break
189
- case 'aurora':
190
- updateAuroraUniforms(uniforms as AuroraUniforms, options as Partial<AuroraOptions>)
191
- break
192
- case 'shaderGradient':
193
- updateShaderGradientUniforms(
194
- uniforms as ShaderGradientUniforms,
195
- options as Partial<ShaderGradientOptions>
196
- )
197
- break
198
- case 'paperShading':
199
- updatePaperShadingUniforms(
200
- uniforms as PaperShadingUniforms,
201
- options as Partial<PaperShadingOptions>
202
- )
203
- break
204
- }
218
+ updateShaderUniforms(type, uniforms, options)
205
219
  }
206
220
 
207
221
  // Dispose function
@@ -9,6 +9,18 @@ import { grain as grainFn, paperTexture } from '../common/grain'
9
9
  import { fbm2D, simplexNoise2D } from '../common/noise'
10
10
  import type { FloatUniform, TSLNode } from '../types'
11
11
 
12
+ const DEFAULT_PAPER_SHADING_OPTIONS = {
13
+ paperColor: '#f5f0e6',
14
+ inkColor: '#1a1a1a',
15
+ inkColor2: '#3d5a80',
16
+ speed: 0.1,
17
+ textureIntensity: 0.15,
18
+ flowIntensity: 1,
19
+ grainIntensity: 0.08,
20
+ bleed: 0.5,
21
+ edgeDarkness: 0.3,
22
+ } as const
23
+
12
24
  export type PaperShadingOptions = {
13
25
  /** Base paper color */
14
26
  paperColor?: string
@@ -49,16 +61,16 @@ export function createPaperShadingUniforms(
49
61
  options: PaperShadingOptions = {}
50
62
  ): PaperShadingUniforms {
51
63
  const {
52
- paperColor = '#f5f0e6',
53
- inkColor = '#1a1a1a',
54
- inkColor2 = '#3d5a80',
55
- speed = 0.1,
56
- textureIntensity = 0.15,
57
- flowIntensity = 1,
58
- grainIntensity = 0.08,
59
- bleed = 0.5,
60
- edgeDarkness = 0.3,
61
- } = options
64
+ paperColor,
65
+ inkColor,
66
+ inkColor2,
67
+ speed,
68
+ textureIntensity,
69
+ flowIntensity,
70
+ grainIntensity,
71
+ bleed,
72
+ edgeDarkness,
73
+ } = { ...DEFAULT_PAPER_SHADING_OPTIONS, ...options }
62
74
 
63
75
  return {
64
76
  paperColor: uniform(new Color(paperColor)),
@@ -8,6 +8,31 @@ import { cos, mix, pow, sin, smoothstep, time as tslTime, uniform, uv, vec2, vec
8
8
  import { fbm2D, simplexNoise2D } from '../common/noise'
9
9
  import type { FloatUniform, TSLNode } from '../types'
10
10
 
11
+ const DEFAULT_SHADER_GRADIENT_OPTIONS = {
12
+ color1: '#ff5722',
13
+ color2: '#673ab7',
14
+ color3: '#2196f3',
15
+ speed: 0.4,
16
+ morphIntensity: 1,
17
+ grain: 0.03,
18
+ lightX: 0.5,
19
+ lightY: 0.5,
20
+ brightness: 1,
21
+ zoom: 1,
22
+ } as const
23
+
24
+ function setNumberUniform(uniform: FloatUniform, value: number | undefined): void {
25
+ if (value !== undefined) {
26
+ uniform.value = value
27
+ }
28
+ }
29
+
30
+ function setColorUniform(uniform: TSLNode, value: string | undefined): void {
31
+ if (value !== undefined) {
32
+ uniform.value = new Color(value)
33
+ }
34
+ }
35
+
11
36
  export type ShaderGradientOptions = {
12
37
  /** Primary color */
13
38
  color1?: string
@@ -51,17 +76,17 @@ export function createShaderGradientUniforms(
51
76
  options: ShaderGradientOptions = {}
52
77
  ): ShaderGradientUniforms {
53
78
  const {
54
- color1 = '#ff5722',
55
- color2 = '#673ab7',
56
- color3 = '#2196f3',
57
- speed = 0.4,
58
- morphIntensity = 1,
59
- grain = 0.03,
60
- lightX = 0.5,
61
- lightY = 0.5,
62
- brightness = 1,
63
- zoom = 1,
64
- } = options
79
+ color1,
80
+ color2,
81
+ color3,
82
+ speed,
83
+ morphIntensity,
84
+ grain,
85
+ lightX,
86
+ lightY,
87
+ brightness,
88
+ zoom,
89
+ } = { ...DEFAULT_SHADER_GRADIENT_OPTIONS, ...options }
65
90
 
66
91
  return {
67
92
  color1: uniform(new Color(color1)),
@@ -139,14 +164,14 @@ export function updateShaderGradientUniforms(
139
164
  uniforms: ShaderGradientUniforms,
140
165
  options: Partial<ShaderGradientOptions>
141
166
  ): void {
142
- if (options.color1 !== undefined) uniforms.color1.value = new Color(options.color1)
143
- if (options.color2 !== undefined) uniforms.color2.value = new Color(options.color2)
144
- if (options.color3 !== undefined) uniforms.color3.value = new Color(options.color3)
145
- if (options.speed !== undefined) uniforms.speed.value = options.speed
146
- if (options.morphIntensity !== undefined) uniforms.morphIntensity.value = options.morphIntensity
147
- if (options.grain !== undefined) uniforms.grain.value = options.grain
148
- if (options.lightX !== undefined) uniforms.lightX.value = options.lightX
149
- if (options.lightY !== undefined) uniforms.lightY.value = options.lightY
150
- if (options.brightness !== undefined) uniforms.brightness.value = options.brightness
151
- if (options.zoom !== undefined) uniforms.zoom.value = options.zoom
167
+ setColorUniform(uniforms.color1, options.color1)
168
+ setColorUniform(uniforms.color2, options.color2)
169
+ setColorUniform(uniforms.color3, options.color3)
170
+ setNumberUniform(uniforms.speed, options.speed)
171
+ setNumberUniform(uniforms.morphIntensity, options.morphIntensity)
172
+ setNumberUniform(uniforms.grain, options.grain)
173
+ setNumberUniform(uniforms.lightX, options.lightX)
174
+ setNumberUniform(uniforms.lightY, options.lightY)
175
+ setNumberUniform(uniforms.brightness, options.brightness)
176
+ setNumberUniform(uniforms.zoom, options.zoom)
152
177
  }
@@ -14,11 +14,9 @@ export type TweenHandle = {
14
14
  */
15
15
  export function tweenUniform(
16
16
  uniformNode: { value: number },
17
- from: number,
18
- to: number,
19
- duration: number,
20
- easing?: (t: number) => number
17
+ ...args: [from: number, to: number, duration: number, easing?: (t: number) => number]
21
18
  ): TweenHandle {
19
+ const [from, to, duration, easing] = args
22
20
  let startTime: number | null = null
23
21
  let cancelled = false
24
22
  let resolvePromise: () => void
@@ -10,6 +10,10 @@
10
10
  "lint": "eslint ."
11
11
  },
12
12
  "dependencies": {
13
- "@vueuse/core": "catalog:"
13
+ "@vueuse/core": "catalog:",
14
+ "three": "catalog:"
15
+ },
16
+ "devDependencies": {
17
+ "@types/three": "catalog:"
14
18
  }
15
19
  }