kmcom-nuxt-layers 2.2.6 → 2.2.8

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 (201) hide show
  1. package/docs/FEEDS.md +197 -0
  2. package/docs/LAYERS-FIXES.md +101 -0
  3. package/docs/MIGRATION.md +627 -0
  4. package/docs/feed-layer.md +374 -0
  5. package/docs/patch-picture-provider-type.md +52 -0
  6. package/docs/shaderGuide.md +2071 -0
  7. package/docs/types-architecture.md +234 -0
  8. package/layers/animations/app/components/Motion/CountUp.vue +1 -2
  9. package/layers/animations/app/components/Motion/Magnetic.vue +1 -2
  10. package/layers/animations/app/components/Motion/Marquee.vue +2 -5
  11. package/layers/animations/app/components/Motion/MarqueeText.vue +1 -2
  12. package/layers/animations/app/components/Motion/Tilt.vue +1 -2
  13. package/layers/animations/app/composables/useCountUp.ts +4 -1
  14. package/layers/animations/app/composables/useMagneticElement.ts +1 -3
  15. package/layers/animations/app/composables/useMarqueeCopies.ts +3 -3
  16. package/layers/animations/app/types/animations.ts +8 -0
  17. package/layers/animations/app/types/index.ts +1 -0
  18. package/layers/animations/package.json +4 -1
  19. package/layers/canvas/app/components/ShaderCanvas.vue +4 -4
  20. package/layers/canvas/app/composables/useRendererCapabilities.ts +19 -15
  21. package/layers/canvas/app/types/index.ts +1 -0
  22. package/layers/canvas/package.json +2 -1
  23. package/layers/canvas/tsconfig.json +2 -1
  24. package/layers/content/app/components/Blog/Card.vue +5 -5
  25. package/layers/content/app/components/Gallery/AmbientImage.vue +3 -3
  26. package/layers/content/app/components/Gallery/Card.vue +3 -3
  27. package/layers/content/app/components/NuxtContent/Detail.vue +5 -1
  28. package/layers/content/app/components/NuxtContent/Surround.vue +5 -3
  29. package/layers/content/app/components/NuxtContent/Toc.vue +1 -1
  30. package/layers/content/app/components/Portfolio/Card.vue +5 -5
  31. package/layers/content/app/components/content/Figure.vue +3 -3
  32. package/layers/content/app/types/index.ts +1 -0
  33. package/layers/content/package.json +2 -1
  34. package/layers/core/app/composables/useErrorLog.ts +9 -11
  35. package/layers/core/app/utils/helpers.ts +14 -12
  36. package/layers/core/nuxt.config.ts +1 -0
  37. package/layers/feeds/app/plugins/feed-head.ts +1 -2
  38. package/layers/feeds/package.json +2 -1
  39. package/layers/feeds/server/routes/feed/discovery.get.ts +1 -2
  40. package/layers/feeds/server/utils/content-adapter.ts +3 -2
  41. package/layers/forms/app/components/Form/Field.vue +4 -4
  42. package/layers/forms/app/types/index.ts +1 -0
  43. package/layers/forms/package.json +2 -1
  44. package/layers/layout/app/components/Layout/Grid/Item.vue +33 -19
  45. package/layers/layout/app/components/Layout/Page/Container.vue +11 -11
  46. package/layers/layout/app/components/Layout/Page/Header.vue +1 -1
  47. package/layers/layout/app/components/Layout/Page/index.vue +1 -1
  48. package/layers/layout/app/components/Layout/Section/Gallery.vue +6 -1
  49. package/layers/layout/app/components/Layout/Section/Title.vue +1 -1
  50. package/layers/layout/app/types/index.ts +1 -0
  51. package/layers/layout/package.json +2 -1
  52. package/layers/mailer/app/types/index.ts +1 -0
  53. package/layers/mailer/app/types/mailer.ts +25 -0
  54. package/layers/mailer/package.json +2 -1
  55. package/layers/motion/package.json +2 -1
  56. package/layers/navigation/app/components/Links/Group.vue +1 -0
  57. package/layers/navigation/app/components/Links/Named.vue +2 -0
  58. package/layers/navigation/app/types/index.ts +1 -0
  59. package/layers/navigation/package.json +4 -1
  60. package/layers/page-transitions/package.json +4 -1
  61. package/layers/routing/app/types/app-config.d.ts +3 -1
  62. package/layers/routing/app/types/index.ts +1 -0
  63. package/layers/routing/package.json +2 -1
  64. package/layers/scripts/app/composables/useGtm.ts +1 -1
  65. package/layers/scripts/app/types/index.ts +1 -0
  66. package/layers/scripts/app/types/scripts.ts +14 -0
  67. package/layers/scripts/package.json +2 -1
  68. package/layers/scroll/app/components/Motion/ScrollScene.vue +3 -1
  69. package/layers/scroll/app/composables/useScrollSteps.ts +2 -9
  70. package/layers/scroll/app/composables/useSectionProgress.ts +2 -1
  71. package/layers/scroll/app/plugins/locomotive-scroll.client.ts +1 -8
  72. package/layers/scroll/app/types/index.ts +1 -0
  73. package/layers/scroll/app/types/scroll.ts +32 -0
  74. package/layers/scroll/package.json +3 -0
  75. package/layers/seo/package.json +2 -1
  76. package/layers/shader/app/components/Material/Fresnel.client.vue +1 -1
  77. package/layers/shader/app/components/Material/Image.client.vue +1 -1
  78. package/layers/shader/app/components/Material/Node.client.vue +7 -7
  79. package/layers/shader/app/components/Material/Noise.client.vue +1 -1
  80. package/layers/shader/app/components/Node/Color.client.vue +17 -20
  81. package/layers/shader/app/components/Node/Noise.client.vue +31 -34
  82. package/layers/shader/app/components/Pipeline/Aurora.client.vue +4 -8
  83. package/layers/shader/app/components/Pipeline/BilinearGradient.client.vue +8 -11
  84. package/layers/shader/app/components/Pipeline/BillowNoise.client.vue +4 -8
  85. package/layers/shader/app/components/Pipeline/BrightnessContrast.client.vue +6 -2
  86. package/layers/shader/app/components/Pipeline/CellularNoise.client.vue +4 -8
  87. package/layers/shader/app/components/Pipeline/Checkerboard.client.vue +4 -8
  88. package/layers/shader/app/components/Pipeline/Circle.client.vue +5 -8
  89. package/layers/shader/app/components/Pipeline/Clouds.client.vue +4 -8
  90. package/layers/shader/app/components/Pipeline/ColorBurnBlend.client.vue +2 -19
  91. package/layers/shader/app/components/Pipeline/ColorDodgeBlend.client.vue +2 -19
  92. package/layers/shader/app/components/Pipeline/ColourRamp.client.vue +5 -9
  93. package/layers/shader/app/components/Pipeline/ConicGradient.client.vue +5 -8
  94. package/layers/shader/app/components/Pipeline/Cross.client.vue +4 -8
  95. package/layers/shader/app/components/Pipeline/CurlNoise.client.vue +3 -7
  96. package/layers/shader/app/components/Pipeline/DarkenBlend.client.vue +2 -19
  97. package/layers/shader/app/components/Pipeline/DayNightCycle.client.vue +5 -8
  98. package/layers/shader/app/components/Pipeline/DiagonalGradient.client.vue +5 -8
  99. package/layers/shader/app/components/Pipeline/DiamondGradient.client.vue +5 -8
  100. package/layers/shader/app/components/Pipeline/DifferenceBlend.client.vue +2 -19
  101. package/layers/shader/app/components/Pipeline/DomainWarpedNoise.client.vue +4 -8
  102. package/layers/shader/app/components/Pipeline/Dots.client.vue +4 -8
  103. package/layers/shader/app/components/Pipeline/DuoTone.client.vue +5 -9
  104. package/layers/shader/app/components/Pipeline/ExclusionBlend.client.vue +3 -23
  105. package/layers/shader/app/components/Pipeline/ExponentialFog.client.vue +4 -7
  106. package/layers/shader/app/components/Pipeline/FilmBurn.client.vue +4 -7
  107. package/layers/shader/app/components/Pipeline/Flame.client.vue +4 -8
  108. package/layers/shader/app/components/Pipeline/FocalGradient.client.vue +5 -8
  109. package/layers/shader/app/components/Pipeline/GodRays.client.vue +4 -7
  110. package/layers/shader/app/components/Pipeline/GradientNoise.client.vue +4 -8
  111. package/layers/shader/app/components/Pipeline/Grid.client.vue +4 -8
  112. package/layers/shader/app/components/Pipeline/Halation.client.vue +3 -7
  113. package/layers/shader/app/components/Pipeline/HardLightBlend.client.vue +2 -19
  114. package/layers/shader/app/components/Pipeline/Haze.client.vue +4 -7
  115. package/layers/shader/app/components/Pipeline/Hexagon.client.vue +4 -8
  116. package/layers/shader/app/components/Pipeline/LensFlare.client.vue +4 -7
  117. package/layers/shader/app/components/Pipeline/LightenBlend.client.vue +2 -19
  118. package/layers/shader/app/components/Pipeline/LinearGradient4.client.vue +2 -2
  119. package/layers/shader/app/components/Pipeline/Marble.client.vue +4 -8
  120. package/layers/shader/app/components/Pipeline/MonochromeTint.client.vue +3 -7
  121. package/layers/shader/app/components/Pipeline/MultiplyBlend.client.vue +2 -19
  122. package/layers/shader/app/components/Pipeline/NoisyGradient.client.vue +4 -8
  123. package/layers/shader/app/components/Pipeline/NoisyGradientBlend.client.vue +4 -8
  124. package/layers/shader/app/components/Pipeline/OverlayBlend.client.vue +2 -19
  125. package/layers/shader/app/components/Pipeline/Polygon.client.vue +4 -8
  126. package/layers/shader/app/components/Pipeline/RaymarchTunnel.client.vue +4 -7
  127. package/layers/shader/app/components/Pipeline/Rectangle.client.vue +4 -8
  128. package/layers/shader/app/components/Pipeline/RidgedNoise.client.vue +4 -8
  129. package/layers/shader/app/components/Pipeline/Ring.client.vue +4 -8
  130. package/layers/shader/app/components/Pipeline/ScreenBlend.client.vue +2 -19
  131. package/layers/shader/app/components/Pipeline/SkyAtmosphere.client.vue +6 -9
  132. package/layers/shader/app/components/Pipeline/SoftLightBlend.client.vue +2 -19
  133. package/layers/shader/app/components/Pipeline/SplitTone.client.vue +4 -8
  134. package/layers/shader/app/components/Pipeline/Star.client.vue +4 -8
  135. package/layers/shader/app/components/Pipeline/Stripes.client.vue +4 -8
  136. package/layers/shader/app/components/Pipeline/Tint.client.vue +4 -7
  137. package/layers/shader/app/components/Pipeline/Triangle.client.vue +4 -8
  138. package/layers/shader/app/components/Pipeline/ValueNoise.client.vue +4 -8
  139. package/layers/shader/app/components/Pipeline/VoronoiEdges.client.vue +4 -8
  140. package/layers/shader/app/components/Pipeline/Water.client.vue +5 -8
  141. package/layers/shader/app/components/Pipeline/WaveBendLayer.client.vue +4 -7
  142. package/layers/shader/app/components/Pipeline/WaveColourLayer.client.vue +3 -7
  143. package/layers/shader/app/components/Pipeline/Wood.client.vue +4 -8
  144. package/layers/shader/app/components/Preset/Aurora.client.vue +15 -21
  145. package/layers/shader/app/components/Preset/Flow.client.vue +2 -1
  146. package/layers/shader/app/components/Preset/GradientMesh.client.vue +2 -1
  147. package/layers/shader/app/components/Preset/Nebula.client.vue +2 -1
  148. package/layers/shader/app/components/Preset/Ocean.client.vue +2 -1
  149. package/layers/shader/app/components/Preset/ThemeAurora.client.vue +30 -90
  150. package/layers/shader/app/components/Preset/ThemeBubble.client.vue +30 -91
  151. package/layers/shader/app/components/Preset/ThemeFlow.client.vue +30 -90
  152. package/layers/shader/app/components/Preset/ThemeGradient.client.vue +30 -91
  153. package/layers/shader/app/components/Preset/ThemeLavaLamp.client.vue +30 -90
  154. package/layers/shader/app/components/Preset/ThemePlasma.client.vue +30 -90
  155. package/layers/shader/app/components/Preset/ThemeWave.client.vue +30 -90
  156. package/layers/shader/app/components/Shader/Background.client.vue +4 -4
  157. package/layers/shader/app/components/Shader/Host.client.vue +31 -33
  158. package/layers/shader/app/components/Shader/Runtime.client.vue +15 -23
  159. package/layers/shader/app/composables/useAmbientMaterials.ts +53 -51
  160. package/layers/shader/app/composables/useShaderMixBlend.ts +26 -0
  161. package/layers/shader/app/composables/useThemePreset.ts +75 -0
  162. package/layers/shader/app/shaders/common/noise.ts +2 -7
  163. package/layers/shader/app/shaders/types.ts +6 -6
  164. package/layers/shader/app/types/tsl.ts +7 -25
  165. package/layers/shader/app/types/uniforms.ts +2 -1
  166. package/layers/shader/app/utils/tsl/color.ts +7 -1
  167. package/layers/shader/package.json +2 -1
  168. package/layers/theme/app/components/ThemePicker/Colors.vue +1 -3
  169. package/layers/theme/app/types/app-config.d.ts +4 -2
  170. package/layers/theme/app/types/index.ts +1 -0
  171. package/layers/theme/app/types/theme.ts +3 -18
  172. package/layers/theme/package.json +2 -1
  173. package/layers/theme/server/plugins/theme-fouc.ts +1 -1
  174. package/layers/transitions/package.json +4 -1
  175. package/layers/typography/app/components/Typography/CodeBlock.vue +2 -2
  176. package/layers/typography/app/components/Typography/Headline.vue +2 -2
  177. package/layers/typography/app/components/Typography/HeadlineScreen.vue +1 -1
  178. package/layers/typography/app/components/Typography/QuoteBlock.vue +4 -1
  179. package/layers/typography/app/components/Typography/TextStroke.vue +2 -0
  180. package/layers/typography/app/components/Typography/index.vue +36 -27
  181. package/layers/typography/app/composables/typography.ts +27 -21
  182. package/layers/typography/app/types/colors.ts +9 -29
  183. package/layers/typography/app/types/index.ts +2 -0
  184. package/layers/typography/package.json +4 -1
  185. package/layers/ui/package.json +2 -1
  186. package/layers/visual/app/app.config.ts +5 -2
  187. package/layers/visual/app/components/Accent/Blob.vue +20 -20
  188. package/layers/visual/app/components/Accent/Scene.vue +2 -2
  189. package/layers/visual/app/components/Base/Modal.vue +2 -2
  190. package/layers/visual/app/components/Gradient/Background.vue +2 -2
  191. package/layers/visual/app/components/Gradient/Text.vue +2 -2
  192. package/layers/visual/app/components/Media/Picture.vue +3 -1
  193. package/layers/visual/app/components/Progress/Bar.vue +6 -6
  194. package/layers/visual/app/components/Tint/Overlay.vue +14 -14
  195. package/layers/visual/app/composables/accent.ts +10 -8
  196. package/layers/visual/app/composables/tint.ts +7 -7
  197. package/layers/visual/app/types/index.ts +6 -0
  198. package/layers/visual/app/types/media.ts +4 -2
  199. package/layers/visual/app/types/tint.ts +2 -1
  200. package/layers/visual/package.json +4 -1
  201. package/package.json +5 -2
@@ -1,41 +1,33 @@
1
1
  <script setup lang="ts">
2
- const props = withDefaults(
3
- defineProps<{
4
- speed?: number
5
- accentColor?: string
6
- darkMode?: boolean
7
- mouseSmoothing?: number
8
- }>(),
9
- {
10
- speed: 1.0,
11
- accentColor: '#8b5cf6',
12
- darkMode: true,
13
- mouseSmoothing: 0.1,
14
- }
15
- )
2
+ const {
3
+ speed = 1.0,
4
+ accentColor = '#8b5cf6',
5
+ darkMode = true,
6
+ mouseSmoothing = 0.1,
7
+ } = defineProps<{
8
+ speed?: number
9
+ accentColor?: string
10
+ darkMode?: boolean
11
+ mouseSmoothing?: number
12
+ }>()
16
13
 
17
- const runtime = useShaderRuntime({
18
- speed: props.speed,
19
- accentColor: props.accentColor,
20
- darkMode: props.darkMode,
21
- mouseSmoothing: props.mouseSmoothing,
22
- })
14
+ const runtime = useShaderRuntime({ speed, accentColor, darkMode, mouseSmoothing })
23
15
 
24
16
  // Watch props and update runtime uniforms
25
17
  watch(
26
- () => props.speed,
18
+ () => speed,
27
19
  (val) => runtime.time.setSpeed(val)
28
20
  )
29
21
 
30
22
  watch(
31
- () => props.accentColor,
23
+ () => accentColor,
32
24
  (val) => {
33
25
  runtime.accentColor.value = val
34
26
  }
35
27
  )
36
28
 
37
29
  watch(
38
- () => props.darkMode,
30
+ () => darkMode,
39
31
  (val) => {
40
32
  runtime.darkMode.value = val
41
33
  }
@@ -28,7 +28,35 @@ import {
28
28
  voronoi2D,
29
29
  } from '../shaders/common/noise'
30
30
  import { cosinePalette } from '../shaders/common/palette'
31
- import type { TSLNode } from '../shaders/types'
31
+ import type { FloatUniform, TSLNode, Vec3Uniform } from '../shaders/types'
32
+
33
+ // ============================================
34
+ // Private helpers
35
+ // ============================================
36
+
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ function buildFlowWarpedUV(uvCoord: any, t: any, mouseOffset: any): {
39
+ warpedUV: TSLNode
40
+ n1: TSLNode
41
+ n2: TSLNode
42
+ } {
43
+ const warpCoarse1 = simplexNoise2D(add(mul(uvCoord, 1.5), t))
44
+ const warpCoarse2 = simplexNoise2D(add(mul(uvCoord, 1.5), mul(t, -0.5), 7.0))
45
+ const warpedUV1 = add(uvCoord, mul(vec2(warpCoarse1, warpCoarse2), 0.25), mouseOffset)
46
+
47
+ const warpMed1 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, 0.7)))
48
+ const warpMed2 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, -0.3), 15.0))
49
+ const warpedUV2 = add(warpedUV1, mul(vec2(warpMed1, warpMed2), 0.12))
50
+
51
+ const warpFine1 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, 1.2)))
52
+ const warpFine2 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, -0.8), 25.0))
53
+ const warpedUV = add(warpedUV2, mul(vec2(warpFine1, warpFine2), 0.05))
54
+
55
+ const n1 = fbm2D(warpedUV, { octaves: 5, frequency: 2.0 }).mul(0.5).add(0.5)
56
+ const n2 = ridgedFbm2d(warpedUV, { octaves: 4, frequency: 1.5 })
57
+
58
+ return { warpedUV, n1, n2 }
59
+ }
32
60
 
33
61
  // ============================================
34
62
  // Types
@@ -42,11 +70,11 @@ export type AmbientMaterialOptions = {
42
70
  }
43
71
 
44
72
  export type AmbientUniforms = {
45
- speed: any
46
- intensity: any
47
- mouseX: any
48
- mouseY: any
49
- mouseStrength: any
73
+ speed: FloatUniform
74
+ intensity: FloatUniform
75
+ mouseX: FloatUniform
76
+ mouseY: FloatUniform
77
+ mouseStrength: FloatUniform
50
78
  }
51
79
 
52
80
  export type AmbientMaterialResult = {
@@ -55,7 +83,7 @@ export type AmbientMaterialResult = {
55
83
  }
56
84
 
57
85
  export type AmbientNodeResult = {
58
- colorNode: any
86
+ colorNode: TSLNode
59
87
  uniforms: AmbientUniforms
60
88
  }
61
89
 
@@ -78,7 +106,7 @@ export function createAmbientUniforms(options: AmbientMaterialOptions = {}): Amb
78
106
  // Color Node Creators (TSL node, no material)
79
107
  // ============================================
80
108
 
81
- export function createAuroraColorNode(uniforms: AmbientUniforms): any {
109
+ export function createAuroraColorNode(uniforms: AmbientUniforms): TSLNode {
82
110
  const {
83
111
  speed: uSpeed,
84
112
  intensity: uIntensity,
@@ -137,7 +165,7 @@ export function createAuroraColorNode(uniforms: AmbientUniforms): any {
137
165
  })()
138
166
  }
139
167
 
140
- export function createNebulaColorNode(uniforms: AmbientUniforms): any {
168
+ export function createNebulaColorNode(uniforms: AmbientUniforms): TSLNode {
141
169
  const {
142
170
  speed: uSpeed,
143
171
  intensity: uIntensity,
@@ -205,7 +233,7 @@ export function createNebulaColorNode(uniforms: AmbientUniforms): any {
205
233
  })()
206
234
  }
207
235
 
208
- export function createFlowColorNode(uniforms: AmbientUniforms): any {
236
+ export function createFlowColorNode(uniforms: AmbientUniforms): TSLNode {
209
237
  const {
210
238
  speed: uSpeed,
211
239
  intensity: uIntensity,
@@ -223,20 +251,7 @@ export function createFlowColorNode(uniforms: AmbientUniforms): any {
223
251
  mul(sub(uMouseY, 0.5), uMouseStrength, 0.3)
224
252
  )
225
253
 
226
- const warpCoarse1 = simplexNoise2D(add(mul(uvCoord, 1.5), t))
227
- const warpCoarse2 = simplexNoise2D(add(mul(uvCoord, 1.5), mul(t, -0.5), 7.0))
228
- const warpedUV1 = add(uvCoord, mul(vec2(warpCoarse1, warpCoarse2), 0.25), mouseOffset)
229
-
230
- const warpMed1 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, 0.7)))
231
- const warpMed2 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, -0.3), 15.0))
232
- const warpedUV2 = add(warpedUV1, mul(vec2(warpMed1, warpMed2), 0.12))
233
-
234
- const warpFine1 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, 1.2)))
235
- const warpFine2 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, -0.8), 25.0))
236
- const warpedUV = add(warpedUV2, mul(vec2(warpFine1, warpFine2), 0.05))
237
-
238
- const n1 = fbm2D(warpedUV, { octaves: 5, frequency: 2.0 }).mul(0.5).add(0.5)
239
- const n2 = ridgedFbm2d(warpedUV, { octaves: 4, frequency: 1.5 })
254
+ const { n1, n2 } = buildFlowWarpedUV(uvCoord, t, mouseOffset)
240
255
 
241
256
  const color1 = vec3(0.075, 0.306, 0.369)
242
257
  const color2 = vec3(0.443, 0.698, 0.502)
@@ -266,7 +281,7 @@ export function createFlowColorNode(uniforms: AmbientUniforms): any {
266
281
  })()
267
282
  }
268
283
 
269
- export function createGradientMeshColorNode(uniforms: AmbientUniforms): any {
284
+ export function createGradientMeshColorNode(uniforms: AmbientUniforms): TSLNode {
270
285
  const {
271
286
  speed: uSpeed,
272
287
  intensity: uIntensity,
@@ -353,16 +368,16 @@ export function createGradientMeshColorNode(uniforms: AmbientUniforms): any {
353
368
  }
354
369
 
355
370
  export type ThemeColorUniforms = {
356
- color1: any // TSL uniform node wrapping a THREE.Color
357
- color2: any
358
- color3: any
359
- color4: any
371
+ color1: Vec3Uniform
372
+ color2: Vec3Uniform
373
+ color3: Vec3Uniform
374
+ color4: Vec3Uniform
360
375
  }
361
376
 
362
377
  export function createThemeGradientColorNode(
363
378
  uniforms: AmbientUniforms,
364
379
  colors: ThemeColorUniforms
365
- ): any {
380
+ ): TSLNode {
366
381
  const {
367
382
  speed: uSpeed,
368
383
  intensity: uIntensity,
@@ -453,7 +468,7 @@ export function createThemeGradientColorNode(
453
468
  export function createThemeFlowColorNode(
454
469
  uniforms: AmbientUniforms,
455
470
  colors: ThemeColorUniforms
456
- ): any {
471
+ ): TSLNode {
457
472
  const {
458
473
  speed: uSpeed,
459
474
  intensity: uIntensity,
@@ -471,20 +486,7 @@ export function createThemeFlowColorNode(
471
486
  mul(sub(uMouseY, 0.5), uMouseStrength, 0.3)
472
487
  )
473
488
 
474
- const warpCoarse1 = simplexNoise2D(add(mul(uvCoord, 1.5), t))
475
- const warpCoarse2 = simplexNoise2D(add(mul(uvCoord, 1.5), mul(t, -0.5), 7.0))
476
- const warpedUV1 = add(uvCoord, mul(vec2(warpCoarse1, warpCoarse2), 0.25), mouseOffset)
477
-
478
- const warpMed1 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, 0.7)))
479
- const warpMed2 = simplexNoise2D(add(mul(warpedUV1, 3.0), mul(t, -0.3), 15.0))
480
- const warpedUV2 = add(warpedUV1, mul(vec2(warpMed1, warpMed2), 0.12))
481
-
482
- const warpFine1 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, 1.2)))
483
- const warpFine2 = simplexNoise2D(add(mul(warpedUV2, 5.0), mul(t, -0.8), 25.0))
484
- const warpedUV = add(warpedUV2, mul(vec2(warpFine1, warpFine2), 0.05))
485
-
486
- const n1 = fbm2D(warpedUV, { octaves: 5, frequency: 2.0 }).mul(0.5).add(0.5)
487
- const n2 = ridgedFbm2d(warpedUV, { octaves: 4, frequency: 1.5 })
489
+ const { n1, n2 } = buildFlowWarpedUV(uvCoord, t, mouseOffset)
488
490
 
489
491
  let colorNode = mix(colors.color1, colors.color2, n1)
490
492
  colorNode = mix(colorNode, colors.color3, mul(n2, 0.5))
@@ -506,7 +508,7 @@ export function createThemeFlowColorNode(
506
508
  export function createThemeAuroraColorNode(
507
509
  uniforms: AmbientUniforms,
508
510
  colors: ThemeColorUniforms
509
- ): any {
511
+ ): TSLNode {
510
512
  const {
511
513
  speed: uSpeed,
512
514
  intensity: uIntensity,
@@ -563,7 +565,7 @@ export function createThemeAuroraColorNode(
563
565
  export function createThemeWaveColorNode(
564
566
  uniforms: AmbientUniforms,
565
567
  colors: ThemeColorUniforms
566
- ): any {
568
+ ): TSLNode {
567
569
  const {
568
570
  speed: uSpeed,
569
571
  intensity: uIntensity,
@@ -613,7 +615,7 @@ export function createThemeWaveColorNode(
613
615
  export function createThemeLavaLampColorNode(
614
616
  uniforms: AmbientUniforms,
615
617
  colors: ThemeColorUniforms
616
- ): any {
618
+ ): TSLNode {
617
619
  const {
618
620
  speed: uSpeed,
619
621
  intensity: uIntensity,
@@ -681,7 +683,7 @@ export function createThemeLavaLampColorNode(
681
683
  export function createThemeBubbleColorNode(
682
684
  uniforms: AmbientUniforms,
683
685
  colors: ThemeColorUniforms
684
- ): any {
686
+ ): TSLNode {
685
687
  const {
686
688
  speed: uSpeed,
687
689
  intensity: uIntensity,
@@ -716,7 +718,7 @@ export function createThemeBubbleColorNode(
716
718
  export function createThemePlasmaColorNode(
717
719
  uniforms: AmbientUniforms,
718
720
  colors: ThemeColorUniforms
719
- ): any {
721
+ ): TSLNode {
720
722
  const {
721
723
  speed: uSpeed,
722
724
  intensity: uIntensity,
@@ -770,7 +772,7 @@ export function createThemePlasmaColorNode(
770
772
  })()
771
773
  }
772
774
 
773
- export function createOceanColorNode(uniforms: AmbientUniforms): any {
775
+ export function createOceanColorNode(uniforms: AmbientUniforms): TSLNode {
774
776
  const {
775
777
  speed: uSpeed,
776
778
  intensity: uIntensity,
@@ -0,0 +1,26 @@
1
+ import { Color } from 'three'
2
+ import { mix, uniform, vec4 } from 'three/tsl'
3
+
4
+ import type { TSLNode } from '../types/tsl'
5
+
6
+ export function useShaderMixBlend(
7
+ blendFn: (base: TSLNode, blend: TSLNode) => TSLNode,
8
+ colorGetter: () => string,
9
+ opacityGetter: () => number,
10
+ order: number = 0
11
+ ) {
12
+ const colorNode = uniform(new Color(colorGetter()))
13
+ const opacityNode = uniform(opacityGetter())
14
+
15
+ watch(colorGetter, (v) => {
16
+ colorNode.value.set(v)
17
+ })
18
+ watch(opacityGetter, (v) => {
19
+ opacityNode.value = v
20
+ })
21
+
22
+ useShaderStage(
23
+ (prev) => vec4(mix(prev.xyz, blendFn(prev.xyz, colorNode as unknown as TSLNode), opacityNode), prev.w),
24
+ order
25
+ )
26
+ }
@@ -0,0 +1,75 @@
1
+ import {
2
+ createAmbientUniforms,
3
+ type AmbientUniforms,
4
+ type ThemeColorUniforms,
5
+ } from '#layers/shader/app/composables/useAmbientMaterials'
6
+ import type { TSLNode } from '#layers/shader/app/types/tsl'
7
+
8
+ export type ThemePresetProps = {
9
+ speed?: number
10
+ intensity?: number
11
+ mouseInteraction?: boolean
12
+ mouseStrength?: number
13
+ color1?: string
14
+ color2?: string
15
+ color3?: string
16
+ color4?: string
17
+ }
18
+
19
+ export function useThemePreset(
20
+ colorNodeFactory: (uniforms: AmbientUniforms, colors: ThemeColorUniforms) => TSLNode,
21
+ props: Readonly<Required<ThemePresetProps>>
22
+ ) {
23
+ const uniforms = createAmbientUniforms({
24
+ speed: props.speed,
25
+ intensity: props.intensity,
26
+ mouseInteraction: props.mouseInteraction,
27
+ })
28
+ if (props.mouseInteraction) {
29
+ uniforms.mouseStrength.value = props.mouseStrength
30
+ }
31
+
32
+ const c1 = useShaderColor(props.color1)
33
+ const c2 = useShaderColor(props.color2)
34
+ const c3 = useShaderColor(props.color3)
35
+ const c4 = useShaderColor(props.color4)
36
+
37
+ const colorNode = colorNodeFactory(uniforms, {
38
+ color1: c1.node,
39
+ color2: c2.node,
40
+ color3: c3.node,
41
+ color4: c4.node,
42
+ })
43
+
44
+ watch(() => props.color1, (hex) => c1.tweenTo(hex, 0.8))
45
+ watch(() => props.color2, (hex) => c2.tweenTo(hex, 0.8))
46
+ watch(() => props.color3, (hex) => c3.tweenTo(hex, 0.8))
47
+ watch(() => props.color4, (hex) => c4.tweenTo(hex, 0.8))
48
+
49
+ try {
50
+ const runtime = useShaderRuntimeContext()
51
+ watch(
52
+ () => [runtime.mouse.mouseX.value, runtime.mouse.mouseY.value],
53
+ ([mx, my]) => {
54
+ uniforms.mouseX.value = mx
55
+ uniforms.mouseY.value = my
56
+ },
57
+ { immediate: true }
58
+ )
59
+ } catch {
60
+ // No runtime context
61
+ }
62
+
63
+ watch(() => props.speed, (v) => { uniforms.speed.value = v })
64
+ watch(() => props.intensity, (v) => { uniforms.intensity.value = v })
65
+ watch(
66
+ () => props.mouseInteraction,
67
+ (v) => { uniforms.mouseStrength.value = v ? props.mouseStrength : 0 }
68
+ )
69
+ watch(
70
+ () => props.mouseStrength,
71
+ (v) => { if (props.mouseInteraction) uniforms.mouseStrength.value = v }
72
+ )
73
+
74
+ return { uniforms, colorNode }
75
+ }
@@ -26,6 +26,7 @@ import {
26
26
  vec4,
27
27
  } from 'three/tsl'
28
28
 
29
+ import type { FBMOptions } from '../../types/tsl'
29
30
  import type { TSLNode } from '../types'
30
31
  import {
31
32
  fade,
@@ -204,13 +205,7 @@ export function gradientNoise3D(p: TSLNode): TSLNode {
204
205
  // FBM (Fractal Brownian Motion)
205
206
  // ============================================
206
207
 
207
- export type FBMOptions = {
208
- octaves?: number
209
- lacunarity?: number
210
- gain?: number
211
- amplitude?: number
212
- frequency?: number
213
- }
208
+ export type { FBMOptions }
214
209
 
215
210
  /**
216
211
  * 2D Fractal Brownian Motion
@@ -7,15 +7,15 @@
7
7
  // This provides flexibility while maintaining code readability
8
8
 
9
9
  import type { UniformNode } from 'three/webgpu'
10
+ import type { Vector3 } from 'three'
10
11
 
11
- export type TSLNode = any
12
+ export type { TSLNode } from '../types/tsl'
12
13
 
13
- /**
14
- * Float uniform with full TSL operator support.
15
- * `ReturnType<typeof uniform>` collapses to `UniformNode<unknown, unknown>`,
16
- * which has no operator methods — use this concrete type instead.
17
- */
14
+ /** Float uniform: `uniform(someNumber)` */
18
15
  export type FloatUniform = UniformNode<'float', number>
19
16
 
17
+ /** Vec3 uniform: `uniform(new Vector3(...))` */
18
+ export type Vec3Uniform = UniformNode<'vec3', Vector3>
19
+
20
20
  // Re-export common Three types
21
21
  export type { Color, Texture, Vector2, Vector3, Vector4 } from 'three'
@@ -1,23 +1,11 @@
1
- /**
2
- * TSL Node types
3
- * Using generic types for flexibility across Three.js versions
4
- */
1
+ import type { Node } from 'three/webgpu'
5
2
 
6
- export type TSLNode = any
7
-
8
- export type TSLFloat = any
9
-
10
- export type TSLVec2 = any
11
-
12
- export type TSLVec3 = any
13
-
14
- export type TSLVec4 = any
15
-
16
- export type TSLColor = any
17
-
18
- export type TSLMat3 = any
19
-
20
- export type TSLMat4 = any
3
+ export type TSLNode = Node
4
+ export type TSLVec3 = Node<'vec3'>
5
+ export type TSLVec4 = Node<'vec4'>
6
+ export type TSLColor = Node<'color'>
7
+ export type TSLMat3 = Node<'mat3'>
8
+ export type TSLMat4 = Node<'mat4'>
21
9
 
22
10
  export type GradientStop = {
23
11
  position: number
@@ -31,9 +19,3 @@ export type FBMOptions = {
31
19
  amplitude?: number
32
20
  frequency?: number
33
21
  }
34
-
35
- export type VoronoiResult = {
36
- distance: TSLFloat
37
- cellCenter: TSLVec2
38
- edgeDistance: TSLFloat
39
- }
@@ -1,4 +1,5 @@
1
1
  import type { Color, Matrix3, Matrix4, Texture, Vector2, Vector3, Vector4 } from 'three'
2
+ import type { TSLNode } from './tsl'
2
3
 
3
4
  export type UniformPrimitive = number | boolean | string
4
5
  export type UniformVector = Vector2 | Vector3 | Vector4
@@ -17,5 +18,5 @@ export type UniformValues = Record<string, UniformValue>
17
18
 
18
19
  export type UniformsState<T extends UniformValues> = {
19
20
  values: T
20
- nodes: Record<keyof T, import('./tsl').TSLNode>
21
+ nodes: Record<keyof T, TSLNode>
21
22
  }
@@ -1,8 +1,14 @@
1
- import { abs, clamp, float, Fn, max, min, mix, mod, vec3 } from 'three/tsl'
1
+ import { Color, Vector3 } from 'three'
2
+ import { abs, clamp, float, Fn, max, min, mix, mod, uniform, vec3 } from 'three/tsl'
2
3
 
3
4
  import type { GradientStop, TSLNode } from '../../types'
4
5
  import { circularDistance } from './math'
5
6
 
7
+ export function hexToVec3Uniform(hex: string) {
8
+ const c = new Color(hex)
9
+ return uniform(new Vector3(c.r, c.g, c.b))
10
+ }
11
+
6
12
  /**
7
13
  * Linear gradient with multiple color stops
8
14
  */
@@ -6,7 +6,8 @@
6
6
  "scripts": {
7
7
  "dev": "nuxi dev",
8
8
  "dev:playground": "PLAYGROUND_LAYERS=core,canvas,shader pnpm -F playground dev",
9
- "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json"
9
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json",
10
+ "lint": "eslint ."
10
11
  },
11
12
  "dependencies": {
12
13
  "@vueuse/core": "catalog:"
@@ -1,10 +1,8 @@
1
1
  <script setup lang="ts">
2
- import type { AccentColor } from '#layers/theme/app/types/theme'
3
-
4
2
  const appConfig = useAppConfig()
5
3
  const { activeAccent, setAccent } = useAccentColor()
6
4
 
7
- const accents = computed(() => ((appConfig as any).themeLayer?.accents as AccentColor[]) ?? [])
5
+ const accents = computed(() => appConfig.themeLayer?.accents ?? [])
8
6
  </script>
9
7
 
10
8
  <template>
@@ -1,8 +1,10 @@
1
+ import type { AccentColor } from './theme'
2
+
1
3
  declare module '@nuxt/schema' {
2
4
  interface AppConfigInput {
3
5
  themeLayer?: {
4
- accents?: Array<import('./theme').AccentColor>
5
- defaultAccent?: import('./theme').AccentColor
6
+ accents?: AccentColor[]
7
+ defaultAccent?: AccentColor
6
8
  }
7
9
  }
8
10
  }
@@ -0,0 +1 @@
1
+ export type * from './theme'
@@ -5,24 +5,9 @@
5
5
  * and the theme preferences interface.
6
6
  */
7
7
 
8
- export type AccentColor =
9
- | 'red'
10
- | 'orange'
11
- | 'amber'
12
- | 'yellow'
13
- | 'lime'
14
- | 'green'
15
- | 'emerald'
16
- | 'teal'
17
- | 'cyan'
18
- | 'sky'
19
- | 'blue'
20
- | 'indigo'
21
- | 'violet'
22
- | 'purple'
23
- | 'fuchsia'
24
- | 'pink'
25
- | 'rose'
8
+ import type { AccentColor } from '#types'
9
+
10
+ export type { AccentColor }
26
11
 
27
12
  export type PreferenceOverride = 'system' | 'on' | 'off'
28
13
 
@@ -9,6 +9,7 @@
9
9
  "dev:prepare": "nuxt prepare .playground",
10
10
  "build": "nuxt build .playground",
11
11
  "generate": "nuxt generate .playground",
12
- "preview": "nuxt preview .playground"
12
+ "preview": "nuxt preview .playground",
13
+ "lint": "eslint ."
13
14
  }
14
15
  }
@@ -150,7 +150,7 @@ const initScript = `(function(){
150
150
  export default defineNitroPlugin((nitroApp) => {
151
151
  nitroApp.hooks.hook('render:html', (html) => {
152
152
  html.head.unshift(
153
- `<style id="theme-accent-css">${accentCSS}</style>` + `<script>${initScript}</script>`
153
+ `<style id="theme-accent-css">${accentCSS}</style><script>${initScript}</script>`
154
154
  )
155
155
  })
156
156
  })
@@ -2,5 +2,8 @@
2
2
  "name": "kmcom-layer-transitions",
3
3
  "version": "0.0.1",
4
4
  "type": "module",
5
- "main": "./nuxt.config.ts"
5
+ "main": "./nuxt.config.ts",
6
+ "scripts": {
7
+ "lint": "eslint ."
8
+ }
6
9
  }
@@ -6,9 +6,9 @@
6
6
  defineOptions({ inheritAttrs: false })
7
7
 
8
8
  const {
9
- language,
9
+ language = undefined,
10
10
  color = 'default',
11
- size,
11
+ size = undefined,
12
12
  class: classProp = '',
13
13
  } = defineProps<{
14
14
  language?: string
@@ -24,8 +24,8 @@
24
24
  tracking = 'tracking-tight',
25
25
  align = 'left',
26
26
  transform = 'none',
27
- color,
28
- size,
27
+ color = undefined,
28
+ size = undefined,
29
29
  class: classProp = '',
30
30
  } = defineProps<{
31
31
  level?: 1 | 2 | 3 | 4 | 5 | 6
@@ -25,7 +25,7 @@
25
25
  tracking = 'tracking-tight',
26
26
  align = 'left',
27
27
  transform = 'none',
28
- color,
28
+ color = undefined,
29
29
  class: classProp = '',
30
30
  } = defineProps<{
31
31
  level?: 1 | 2 | 3 | 4 | 5 | 6
@@ -5,7 +5,10 @@
5
5
 
6
6
  defineOptions({ inheritAttrs: false })
7
7
 
8
- const { color, size } = defineProps<{ color?: UiColors; size?: FontSize }>()
8
+ const { color = undefined, size = undefined } = defineProps<{
9
+ color?: UiColors
10
+ size?: FontSize
11
+ }>()
9
12
  const colorClass = useColor(color, 'text')
10
13
  </script>
11
14
 
@@ -1,4 +1,6 @@
1
1
  <script lang="ts" setup>
2
+ defineOptions({ inheritAttrs: false })
3
+
2
4
  const {
3
5
  strokeWidth = 1.5,
4
6
  strokeColor = 'currentColor',