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
@@ -0,0 +1,32 @@
1
+ import type { ComputedRef, Ref } from 'vue'
2
+
3
+ export type ScrollToOptions = {
4
+ offset?: number
5
+ duration?: number
6
+ immediate?: boolean
7
+ lock?: boolean
8
+ onComplete?: () => void
9
+ }
10
+
11
+ export type SectionProgressOptions = {
12
+ start?: string
13
+ end?: string
14
+ markers?: boolean
15
+ }
16
+
17
+ export type ScrollSceneContext = {
18
+ progress: Ref<number>
19
+ active: Ref<boolean>
20
+ name: string
21
+ stepCount: ComputedRef<number>
22
+ registerStep: (index: number) => void
23
+ unregisterStep: (index: number) => void
24
+ }
25
+
26
+ export type ScrollState = {
27
+ scroll: number
28
+ limit: number
29
+ velocity: number
30
+ direction: number
31
+ progress: number
32
+ }
@@ -7,5 +7,8 @@
7
7
  "gsap": "catalog:",
8
8
  "locomotive-scroll": "catalog:",
9
9
  "v-gsap-nuxt": "catalog:"
10
+ },
11
+ "scripts": {
12
+ "lint": "eslint ."
10
13
  }
11
14
  }
@@ -6,7 +6,8 @@
6
6
  "scripts": {
7
7
  "dev": "nuxi dev",
8
8
  "dev:playground": "PLAYGROUND_LAYERS=core,seo 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
  "@nuxtjs/seo": "catalog:"
@@ -73,7 +73,7 @@
73
73
  // Mix colors based on fresnel using reactive uniforms
74
74
  const colorNode = mix(vec3(baseColorUniform), vec3(fresnelColorUniform), fresnelFactor)
75
75
 
76
- mat.colorNode = colorNode as any
76
+ mat.colorNode = colorNode as TSLNode
77
77
  mat.transparent = transparent
78
78
  mat.side = DoubleSide
79
79
 
@@ -146,7 +146,7 @@
146
146
  loadedTexture.value = await loader.loadAsync(src)
147
147
  } catch (e) {
148
148
  error.value = e as Error
149
- console.error('Failed to load texture:', e)
149
+ void e
150
150
  } finally {
151
151
  isLoading.value = false
152
152
  }
@@ -6,13 +6,13 @@
6
6
 
7
7
  const {
8
8
  type = 'basic',
9
- colorNode,
10
- opacityNode,
11
- normalNode,
12
- emissiveNode,
13
- metalnessNode,
14
- roughnessNode,
15
- positionNode,
9
+ colorNode = undefined,
10
+ opacityNode = undefined,
11
+ normalNode = undefined,
12
+ emissiveNode = undefined,
13
+ metalnessNode = undefined,
14
+ roughnessNode = undefined,
15
+ positionNode = undefined,
16
16
  transparent = false,
17
17
  side = 'front',
18
18
  wireframe = false,
@@ -125,7 +125,7 @@
125
125
  // Mix colors based on noise using reactive uniforms
126
126
  const colorNode = mix(vec3(baseColorUniform), vec3(peakColorUniform), normalizedNoise)
127
127
 
128
- mat.colorNode = colorNode as any
128
+ mat.colorNode = colorNode as TSLNode
129
129
  mat.transparent = transparent
130
130
  mat.side = DoubleSide
131
131
 
@@ -4,38 +4,35 @@
4
4
 
5
5
  import type { TSLNode } from '../../shaders/types'
6
6
 
7
- const props = withDefaults(
8
- defineProps<{
9
- id?: string
10
- color?: string
11
- order?: number
12
- blend?: 'normal' | 'add' | 'multiply' | 'screen' | 'overlay' | 'mix'
13
- opacity?: number
14
- }>(),
15
- {
16
- id: 'color',
17
- color: '#ffffff',
18
- order: 0,
19
- blend: 'normal',
20
- opacity: 1.0,
21
- }
22
- )
7
+ const {
8
+ id = 'color',
9
+ color = '#ffffff',
10
+ order = 0,
11
+ blend = 'normal',
12
+ opacity = 1.0,
13
+ } = defineProps<{
14
+ id?: string
15
+ color?: string
16
+ order?: number
17
+ blend?: 'normal' | 'add' | 'multiply' | 'screen' | 'overlay' | 'mix'
18
+ opacity?: number
19
+ }>()
23
20
 
24
21
  const graph = useShaderGraphContext()
25
22
 
26
23
  // Create uniform once
27
- const colorValue = new Color(props.color)
24
+ const colorValue = new Color(color)
28
25
  const colorNode: TSLNode = uniform(colorValue)
29
26
 
30
27
  // Build TSL node once (references uniform by pointer)
31
28
  const node = vec3(colorNode)
32
29
 
33
30
  // Register in graph
34
- graph.register(props.id, node, props.order, props.blend, props.opacity)
31
+ graph.register(id, node, order, blend, opacity)
35
32
 
36
33
  // Watch props to update uniform value (no recompilation)
37
34
  watch(
38
- () => props.color,
35
+ () => color,
39
36
  (hex) => {
40
37
  colorValue.set(hex)
41
38
  colorNode.value = colorValue
@@ -43,7 +40,7 @@
43
40
  )
44
41
 
45
42
  onUnmounted(() => {
46
- graph.unregister(props.id)
43
+ graph.unregister(id)
47
44
  })
48
45
  </script>
49
46
 
@@ -8,34 +8,31 @@
8
8
  } from '#layers/shader/app/shaders/common/noise'
9
9
  import { add, mul, time, uniform, uv, vec2, vec3 } from 'three/tsl'
10
10
 
11
- const props = withDefaults(
12
- defineProps<{
13
- id?: string
14
- type?: 'simplex' | 'fbm' | 'voronoi' | 'ridged' | 'fbm3d'
15
- scale?: number
16
- speed?: number
17
- octaves?: number
18
- order?: number
19
- blend?: 'normal' | 'add' | 'multiply' | 'screen' | 'overlay' | 'mix'
20
- opacity?: number
21
- }>(),
22
- {
23
- id: 'noise',
24
- type: 'simplex',
25
- scale: 3.0,
26
- speed: 0.2,
27
- octaves: 4,
28
- order: 0,
29
- blend: 'normal',
30
- opacity: 1.0,
31
- }
32
- )
11
+ const {
12
+ id = 'noise',
13
+ type = 'simplex',
14
+ scale = 3.0,
15
+ speed = 0.2,
16
+ octaves = 4,
17
+ order = 0,
18
+ blend = 'normal',
19
+ opacity = 1.0,
20
+ } = defineProps<{
21
+ id?: string
22
+ type?: 'simplex' | 'fbm' | 'voronoi' | 'ridged' | 'fbm3d'
23
+ scale?: number
24
+ speed?: number
25
+ octaves?: number
26
+ order?: number
27
+ blend?: 'normal' | 'add' | 'multiply' | 'screen' | 'overlay' | 'mix'
28
+ opacity?: number
29
+ }>()
33
30
 
34
31
  const graph = useShaderGraphContext()
35
32
 
36
33
  // Create uniforms once
37
- const uScale = uniform(props.scale)
38
- const uSpeed = uniform(props.speed)
34
+ const uScale = uniform(scale)
35
+ const uSpeed = uniform(speed)
39
36
 
40
37
  // Build TSL node
41
38
  function buildNode() {
@@ -46,9 +43,9 @@
46
43
 
47
44
  let noiseValue
48
45
 
49
- switch (props.type) {
46
+ switch (type) {
50
47
  case 'fbm':
51
- noiseValue = fbm2D(animatedUV, { octaves: props.octaves, frequency: 1.0 }).mul(0.5).add(0.5)
48
+ noiseValue = fbm2D(animatedUV, { octaves, frequency: 1.0 }).mul(0.5).add(0.5)
52
49
  break
53
50
  case 'voronoi': {
54
51
  const { distance } = voronoi2D(animatedUV, 1.0)
@@ -56,10 +53,10 @@
56
53
  break
57
54
  }
58
55
  case 'ridged':
59
- noiseValue = ridgedFbm2d(animatedUV, { octaves: props.octaves, frequency: 1.0 })
56
+ noiseValue = ridgedFbm2d(animatedUV, { octaves, frequency: 1.0 })
60
57
  break
61
58
  case 'fbm3d':
62
- noiseValue = fbm3dSimplex(vec3(scaledUV, t), { octaves: props.octaves }).mul(0.5).add(0.5)
59
+ noiseValue = fbm3dSimplex(vec3(scaledUV, t), { octaves }).mul(0.5).add(0.5)
63
60
  break
64
61
  case 'simplex':
65
62
  default:
@@ -71,17 +68,17 @@
71
68
  }
72
69
 
73
70
  const node = buildNode()
74
- graph.register(props.id, node, props.order, props.blend, props.opacity)
71
+ graph.register(id, node, order, blend, opacity)
75
72
 
76
73
  // Watch uniform-driven props (no recompilation)
77
74
  watch(
78
- () => props.scale,
75
+ () => scale,
79
76
  (v) => {
80
77
  uScale.value = v
81
78
  }
82
79
  )
83
80
  watch(
84
- () => props.speed,
81
+ () => speed,
85
82
  (v) => {
86
83
  uSpeed.value = v
87
84
  }
@@ -89,15 +86,15 @@
89
86
 
90
87
  // Watch topology-changing props (requires graph update)
91
88
  watch(
92
- () => [props.type, props.octaves] as const,
89
+ () => [type, octaves] as const,
93
90
  () => {
94
91
  const newNode = buildNode()
95
- graph.update(props.id, newNode)
92
+ graph.update(id, newNode)
96
93
  }
97
94
  )
98
95
 
99
96
  onUnmounted(() => {
100
- graph.unregister(props.id)
97
+ graph.unregister(id)
101
98
  })
102
99
  </script>
103
100
 
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { clamp, float, mix, time, uniform, vec2, vec4 } from 'three/tsl'
4
4
 
5
5
  import { fbm2D } from '../../shaders/common/noise'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  /**
8
9
  * Aurora borealis — layered animated colour bands across the upper screen.
@@ -32,13 +33,8 @@
32
33
  order?: number
33
34
  }>()
34
35
 
35
- function toVec3Node(hex: string) {
36
- const c = new Color(hex)
37
- return uniform(new Vector3(c.r, c.g, c.b))
38
- }
39
-
40
- const colorANode = toVec3Node(colorA)
41
- const colorBNode = toVec3Node(colorB)
36
+ const colorANode = hexToVec3Uniform(colorA)
37
+ const colorBNode = hexToVec3Uniform(colorB)
42
38
  const bandYNode = uniform(bandY)
43
39
  const bandHNode = uniform(bandHeight)
44
40
  const speedNode = uniform(speed)
@@ -1,6 +1,8 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
3
- import { mix, uniform, vec4 } from 'three/tsl'
2
+ import { Color } from 'three'
3
+ import { mix, vec4 } from 'three/tsl'
4
+
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
4
6
 
5
7
  const {
6
8
  bottomLeft = '#000000',
@@ -20,15 +22,10 @@
20
22
  order?: number
21
23
  }>()
22
24
 
23
- function toVec3Node(hex: string) {
24
- const c = new Color(hex)
25
- return uniform(new Vector3(c.r, c.g, c.b))
26
- }
27
-
28
- const blNode = toVec3Node(bottomLeft)
29
- const brNode = toVec3Node(bottomRight)
30
- const tlNode = toVec3Node(topLeft)
31
- const trNode = toVec3Node(topRight)
25
+ const blNode = hexToVec3Uniform(bottomLeft)
26
+ const brNode = hexToVec3Uniform(bottomRight)
27
+ const tlNode = hexToVec3Uniform(topLeft)
28
+ const trNode = hexToVec3Uniform(topRight)
32
29
  watch(
33
30
  () => bottomLeft,
34
31
  (v) => {
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, time, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { turbulence2D } from '../../shaders/common/noise'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  /** Billow/turbulence noise — folded abs() of FBM, producing cloud-like forms. */
8
9
  const {
@@ -19,13 +20,8 @@
19
20
  order?: number
20
21
  }>()
21
22
 
22
- function toVec3Node(hex: string) {
23
- const c = new Color(hex)
24
- return uniform(new Vector3(c.r, c.g, c.b))
25
- }
26
-
27
- const colorANode = toVec3Node(colorA)
28
- const colorBNode = toVec3Node(colorB)
23
+ const colorANode = hexToVec3Uniform(colorA)
24
+ const colorBNode = hexToVec3Uniform(colorB)
29
25
  const scaleNode = uniform(scale)
30
26
  const speedNode = uniform(speed)
31
27
  watch(
@@ -1,7 +1,10 @@
1
1
  <script setup lang="ts">
2
2
  import { uniform, vec4 } from 'three/tsl'
3
3
 
4
- import { brightness, contrast } from '../../shaders/common/blend'
4
+ import {
5
+ brightness as brightnessEffect,
6
+ contrast as contrastEffect,
7
+ } from '../../shaders/common/blend'
5
8
 
6
9
  const {
7
10
  brightness: brightnessProp = 0,
@@ -31,7 +34,8 @@
31
34
  )
32
35
 
33
36
  useShaderStage(
34
- (prev) => vec4(brightness(contrast(prev.xyz, contrastNode), brightnessNode), prev.w),
37
+ (prev) =>
38
+ vec4(brightnessEffect(contrastEffect(prev.xyz, contrastNode), brightnessNode), prev.w),
35
39
  order
36
40
  )
37
41
  </script>
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, time, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { voronoi2D } from '../../shaders/common/noise'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  colorA = '#000033',
@@ -18,13 +19,8 @@
18
19
  order?: number
19
20
  }>()
20
21
 
21
- function toVec3Node(hex: string) {
22
- const c = new Color(hex)
23
- return uniform(new Vector3(c.r, c.g, c.b))
24
- }
25
-
26
- const colorANode = toVec3Node(colorA)
27
- const colorBNode = toVec3Node(colorB)
22
+ const colorANode = hexToVec3Uniform(colorA)
23
+ const colorBNode = hexToVec3Uniform(colorB)
28
24
  const scaleNode = uniform(scale)
29
25
  const speedNode = uniform(speed)
30
26
  watch(
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { mix, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { checker } from '../../shaders/common/shapes'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  colorA = '#ffffff',
@@ -19,13 +20,8 @@
19
20
  order?: number
20
21
  }>()
21
22
 
22
- function toVec3Node(hex: string) {
23
- const c = new Color(hex)
24
- return uniform(new Vector3(c.r, c.g, c.b))
25
- }
26
-
27
- const colorANode = toVec3Node(colorA)
28
- const colorBNode = toVec3Node(colorB)
23
+ const colorANode = hexToVec3Uniform(colorA)
24
+ const colorBNode = hexToVec3Uniform(colorB)
29
25
  const scaleNode = uniform(scale)
30
26
  watch(
31
27
  () => colorA,
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, smoothstep, uniform, vec4 } from 'three/tsl'
4
4
 
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  const {
6
8
  colorA = '#000000',
7
9
  colorB = '#ffffff',
@@ -16,13 +18,8 @@
16
18
  order?: number
17
19
  }>()
18
20
 
19
- function toVec3Node(hex: string) {
20
- const c = new Color(hex)
21
- return uniform(new Vector3(c.r, c.g, c.b))
22
- }
23
-
24
- const colorANode = toVec3Node(colorA)
25
- const colorBNode = toVec3Node(colorB)
21
+ const colorANode = hexToVec3Uniform(colorA)
22
+ const colorBNode = hexToVec3Uniform(colorB)
26
23
  const radiusNode = uniform(radius)
27
24
  const softnessNode = uniform(softness)
28
25
  watch(
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, smoothstep, time, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { fbm2D } from '../../shaders/common/noise'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  colorSky = '#5588cc',
@@ -28,13 +29,8 @@
28
29
  order?: number
29
30
  }>()
30
31
 
31
- function toVec3Node(hex: string) {
32
- const c = new Color(hex)
33
- return uniform(new Vector3(c.r, c.g, c.b))
34
- }
35
-
36
- const colorSkyNode = toVec3Node(colorSky)
37
- const colorCloudNode = toVec3Node(colorCloud)
32
+ const colorSkyNode = hexToVec3Uniform(colorSky)
33
+ const colorCloudNode = hexToVec3Uniform(colorCloud)
38
34
  const scaleNode = uniform(scale)
39
35
  const coverageNode = uniform(coverage)
40
36
  const softnessNode = uniform(softness)
@@ -1,9 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { Color } from 'three'
3
- import { mix, uniform, vec4 } from 'three/tsl'
4
-
5
2
  import { blendColorBurn } from '../../shaders/common/blend'
6
- import type { TSLNode } from '../../shaders/types'
7
3
 
8
4
  const {
9
5
  color = '#808080',
@@ -15,23 +11,10 @@
15
11
  order?: number
16
12
  }>()
17
13
 
18
- const colorNode: TSLNode = uniform(new Color(color))
19
- const opacityNode = uniform(opacity)
20
- watch(
14
+ useShaderMixBlend(
15
+ blendColorBurn,
21
16
  () => color,
22
- (v) => {
23
- colorNode.value.set(v)
24
- }
25
- )
26
- watch(
27
17
  () => opacity,
28
- (v) => {
29
- opacityNode.value = v
30
- }
31
- )
32
-
33
- useShaderStage(
34
- (prev) => vec4(mix(prev.xyz, blendColorBurn(prev.xyz, colorNode), opacityNode), prev.w),
35
18
  order
36
19
  )
37
20
  </script>
@@ -1,9 +1,5 @@
1
1
  <script setup lang="ts">
2
- import { Color } from 'three'
3
- import { mix, uniform, vec4 } from 'three/tsl'
4
-
5
2
  import { blendColorDodge } from '../../shaders/common/blend'
6
- import type { TSLNode } from '../../shaders/types'
7
3
 
8
4
  const {
9
5
  color = '#808080',
@@ -15,23 +11,10 @@
15
11
  order?: number
16
12
  }>()
17
13
 
18
- const colorNode: TSLNode = uniform(new Color(color))
19
- const opacityNode = uniform(opacity)
20
- watch(
14
+ useShaderMixBlend(
15
+ blendColorDodge,
21
16
  () => color,
22
- (v) => {
23
- colorNode.value.set(v)
24
- }
25
- )
26
- watch(
27
17
  () => opacity,
28
- (v) => {
29
- opacityNode.value = v
30
- }
31
- )
32
-
33
- useShaderStage(
34
- (prev) => vec4(mix(prev.xyz, blendColorDodge(prev.xyz, colorNode), opacityNode), prev.w),
35
18
  order
36
19
  )
37
20
  </script>
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, smoothstep, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { luminance } from '../../shaders/common/blend'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  /**
8
9
  * Maps input luminance to a three-stop colour ramp: shadow → midtone → highlight.
@@ -26,14 +27,9 @@
26
27
  order?: number
27
28
  }>()
28
29
 
29
- function toVec3Node(hex: string) {
30
- const c = new Color(hex)
31
- return uniform(new Vector3(c.r, c.g, c.b))
32
- }
33
-
34
- const shadowNode = toVec3Node(shadowColor)
35
- const midNode = toVec3Node(midtoneColor)
36
- const highlightNode = toVec3Node(highlightColor)
30
+ const shadowNode = hexToVec3Uniform(shadowColor)
31
+ const midNode = hexToVec3Uniform(midtoneColor)
32
+ const highlightNode = hexToVec3Uniform(highlightColor)
37
33
  const shadowPtNode = uniform(shadowPoint)
38
34
  const highlightPtNode = uniform(highlightPoint)
39
35
  watch(
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, uniform, vec4 } from 'three/tsl'
4
4
 
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  const {
6
8
  colorA = '#000000',
7
9
  colorB = '#ffffff',
@@ -15,13 +17,8 @@
15
17
  order?: number
16
18
  }>()
17
19
 
18
- function toVec3Node(hex: string) {
19
- const c = new Color(hex)
20
- return uniform(new Vector3(c.r, c.g, c.b))
21
- }
22
-
23
- const colorANode = toVec3Node(colorA)
24
- const colorBNode = toVec3Node(colorB)
20
+ const colorANode = hexToVec3Uniform(colorA)
21
+ const colorBNode = hexToVec3Uniform(colorB)
25
22
  const rotationNode = uniform((rotation * Math.PI) / 180)
26
23
  watch(
27
24
  () => colorA,
@@ -1,8 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { float, mix, smoothstep, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { sdBox2d } from '../../shaders/common/sdf'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  colorA = '#000000',
@@ -22,13 +23,8 @@
22
23
  order?: number
23
24
  }>()
24
25
 
25
- function toVec3Node(hex: string) {
26
- const c = new Color(hex)
27
- return uniform(new Vector3(c.r, c.g, c.b))
28
- }
29
-
30
- const colorANode = toVec3Node(colorA)
31
- const colorBNode = toVec3Node(colorB)
26
+ const colorANode = hexToVec3Uniform(colorA)
27
+ const colorBNode = hexToVec3Uniform(colorB)
32
28
  const sizeNode = uniform(size)
33
29
  const thickNode = uniform(thickness)
34
30
  const softnessNode = uniform(softness)