kmcom-nuxt-layers 2.2.5 → 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 (218) 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 -1
  9. package/layers/animations/app/components/Motion/Magnetic.vue +1 -1
  10. package/layers/animations/app/components/Motion/Marquee.vue +3 -2
  11. package/layers/animations/app/components/Motion/MarqueeText.vue +3 -2
  12. package/layers/animations/app/components/Motion/Tilt.vue +1 -1
  13. package/layers/animations/app/composables/useCountUp.ts +4 -1
  14. package/layers/animations/app/composables/useMagneticElement.ts +2 -4
  15. package/layers/animations/app/composables/useMarqueeCopies.ts +4 -4
  16. package/layers/animations/app/composables/useTiltEffect.ts +1 -1
  17. package/layers/animations/app/types/animations.ts +8 -0
  18. package/layers/animations/app/types/index.ts +1 -0
  19. package/layers/animations/package.json +4 -1
  20. package/layers/canvas/app/components/ShaderCanvas.vue +4 -4
  21. package/layers/canvas/app/composables/useRendererCapabilities.ts +19 -15
  22. package/layers/canvas/app/types/index.ts +1 -0
  23. package/layers/canvas/package.json +2 -1
  24. package/layers/canvas/tsconfig.json +2 -1
  25. package/layers/content/app/components/Blog/Card.vue +5 -5
  26. package/layers/content/app/components/Gallery/AmbientImage.vue +3 -3
  27. package/layers/content/app/components/Gallery/Card.vue +3 -3
  28. package/layers/content/app/components/Gallery/Lightbox.vue +5 -1
  29. package/layers/content/app/components/NuxtContent/Detail.vue +5 -1
  30. package/layers/content/app/components/NuxtContent/Surround.vue +5 -3
  31. package/layers/content/app/components/NuxtContent/Toc.vue +1 -1
  32. package/layers/content/app/components/Portfolio/Card.vue +5 -5
  33. package/layers/content/app/components/content/Figure.vue +3 -3
  34. package/layers/content/app/composables/useBlogPosts.ts +2 -2
  35. package/layers/content/app/composables/useCollectionItem.ts +1 -3
  36. package/layers/content/app/composables/useGalleryItems.ts +2 -2
  37. package/layers/content/app/types/index.ts +1 -0
  38. package/layers/content/package.json +2 -1
  39. package/layers/core/app/composables/useCache.ts +0 -1
  40. package/layers/core/app/composables/useErrorLog.ts +9 -11
  41. package/layers/core/app/plugins/error-handler.ts +36 -36
  42. package/layers/core/app/plugins/feature-detection.client.ts +15 -15
  43. package/layers/core/app/plugins/init.ts +121 -129
  44. package/layers/core/app/plugins/loading.client.ts +27 -27
  45. package/layers/core/app/plugins/scroll-guard.client.ts +26 -26
  46. package/layers/core/app/utils/helpers.ts +14 -12
  47. package/layers/core/nuxt.config.ts +1 -0
  48. package/layers/feeds/app/plugins/feed-head.ts +62 -63
  49. package/layers/feeds/package.json +2 -1
  50. package/layers/feeds/server/routes/feed/discovery.get.ts +1 -2
  51. package/layers/feeds/server/utils/content-adapter.ts +3 -2
  52. package/layers/forms/app/components/Form/Field.vue +4 -4
  53. package/layers/forms/app/types/index.ts +1 -0
  54. package/layers/forms/package.json +2 -1
  55. package/layers/forms/server/api/contact.post.ts +1 -1
  56. package/layers/layout/app/components/Layout/Grid/Item.vue +33 -19
  57. package/layers/layout/app/components/Layout/Page/Container.vue +11 -11
  58. package/layers/layout/app/components/Layout/Page/Header.vue +1 -1
  59. package/layers/layout/app/components/Layout/Page/index.vue +1 -1
  60. package/layers/layout/app/components/Layout/Section/Gallery.vue +6 -1
  61. package/layers/layout/app/components/Layout/Section/Title.vue +1 -1
  62. package/layers/layout/app/types/index.ts +1 -0
  63. package/layers/layout/package.json +2 -1
  64. package/layers/mailer/app/types/index.ts +1 -0
  65. package/layers/mailer/app/types/mailer.ts +25 -0
  66. package/layers/mailer/package.json +2 -1
  67. package/layers/motion/package.json +2 -1
  68. package/layers/navigation/app/components/Links/Group.vue +1 -0
  69. package/layers/navigation/app/components/Links/Named.vue +2 -0
  70. package/layers/navigation/app/types/index.ts +1 -0
  71. package/layers/navigation/package.json +4 -1
  72. package/layers/page-transitions/app/plugins/page-transitions.client.ts +9 -9
  73. package/layers/page-transitions/package.json +4 -1
  74. package/layers/routing/app/plugins/feature-flags.client.ts +9 -9
  75. package/layers/routing/app/types/app-config.d.ts +3 -1
  76. package/layers/routing/app/types/index.ts +1 -0
  77. package/layers/routing/package.json +2 -1
  78. package/layers/scripts/app/composables/useGtm.ts +1 -1
  79. package/layers/scripts/app/types/index.ts +1 -0
  80. package/layers/scripts/app/types/scripts.ts +14 -0
  81. package/layers/scripts/package.json +2 -1
  82. package/layers/scroll/app/components/Motion/ScrollScene.vue +3 -1
  83. package/layers/scroll/app/composables/useScrollSteps.ts +2 -9
  84. package/layers/scroll/app/composables/useSectionProgress.ts +2 -1
  85. package/layers/scroll/app/plugins/locomotive-scroll.client.ts +54 -61
  86. package/layers/scroll/app/types/index.ts +1 -0
  87. package/layers/scroll/app/types/scroll.ts +32 -0
  88. package/layers/scroll/package.json +3 -0
  89. package/layers/seo/package.json +2 -1
  90. package/layers/shader/app/components/Material/Fresnel.client.vue +1 -1
  91. package/layers/shader/app/components/Material/Image.client.vue +1 -1
  92. package/layers/shader/app/components/Material/Node.client.vue +7 -7
  93. package/layers/shader/app/components/Material/Noise.client.vue +1 -1
  94. package/layers/shader/app/components/Node/Color.client.vue +17 -20
  95. package/layers/shader/app/components/Node/Noise.client.vue +31 -34
  96. package/layers/shader/app/components/Pipeline/Aurora.client.vue +4 -8
  97. package/layers/shader/app/components/Pipeline/BilinearGradient.client.vue +8 -11
  98. package/layers/shader/app/components/Pipeline/BillowNoise.client.vue +4 -8
  99. package/layers/shader/app/components/Pipeline/BrightnessContrast.client.vue +6 -2
  100. package/layers/shader/app/components/Pipeline/CellularNoise.client.vue +4 -8
  101. package/layers/shader/app/components/Pipeline/Checkerboard.client.vue +4 -8
  102. package/layers/shader/app/components/Pipeline/Circle.client.vue +5 -8
  103. package/layers/shader/app/components/Pipeline/Clouds.client.vue +4 -8
  104. package/layers/shader/app/components/Pipeline/ColorBurnBlend.client.vue +2 -19
  105. package/layers/shader/app/components/Pipeline/ColorDodgeBlend.client.vue +2 -19
  106. package/layers/shader/app/components/Pipeline/ColourRamp.client.vue +5 -9
  107. package/layers/shader/app/components/Pipeline/ConicGradient.client.vue +5 -8
  108. package/layers/shader/app/components/Pipeline/Cross.client.vue +4 -8
  109. package/layers/shader/app/components/Pipeline/CurlNoise.client.vue +3 -7
  110. package/layers/shader/app/components/Pipeline/DarkenBlend.client.vue +2 -19
  111. package/layers/shader/app/components/Pipeline/DayNightCycle.client.vue +5 -8
  112. package/layers/shader/app/components/Pipeline/DiagonalGradient.client.vue +5 -8
  113. package/layers/shader/app/components/Pipeline/DiamondGradient.client.vue +5 -8
  114. package/layers/shader/app/components/Pipeline/DifferenceBlend.client.vue +2 -19
  115. package/layers/shader/app/components/Pipeline/DomainWarpedNoise.client.vue +4 -8
  116. package/layers/shader/app/components/Pipeline/Dots.client.vue +4 -8
  117. package/layers/shader/app/components/Pipeline/DuoTone.client.vue +5 -9
  118. package/layers/shader/app/components/Pipeline/ExclusionBlend.client.vue +3 -23
  119. package/layers/shader/app/components/Pipeline/ExponentialFog.client.vue +4 -7
  120. package/layers/shader/app/components/Pipeline/FilmBurn.client.vue +4 -7
  121. package/layers/shader/app/components/Pipeline/Flame.client.vue +4 -8
  122. package/layers/shader/app/components/Pipeline/FocalGradient.client.vue +5 -8
  123. package/layers/shader/app/components/Pipeline/GodRays.client.vue +4 -7
  124. package/layers/shader/app/components/Pipeline/GradientNoise.client.vue +4 -8
  125. package/layers/shader/app/components/Pipeline/Grid.client.vue +4 -8
  126. package/layers/shader/app/components/Pipeline/Halation.client.vue +3 -7
  127. package/layers/shader/app/components/Pipeline/HardLightBlend.client.vue +2 -19
  128. package/layers/shader/app/components/Pipeline/Haze.client.vue +4 -7
  129. package/layers/shader/app/components/Pipeline/Hexagon.client.vue +4 -8
  130. package/layers/shader/app/components/Pipeline/LensFlare.client.vue +4 -7
  131. package/layers/shader/app/components/Pipeline/LightenBlend.client.vue +2 -19
  132. package/layers/shader/app/components/Pipeline/LinearGradient4.client.vue +2 -2
  133. package/layers/shader/app/components/Pipeline/Marble.client.vue +4 -8
  134. package/layers/shader/app/components/Pipeline/MonochromeTint.client.vue +3 -7
  135. package/layers/shader/app/components/Pipeline/MultiplyBlend.client.vue +2 -19
  136. package/layers/shader/app/components/Pipeline/NoisyGradient.client.vue +4 -8
  137. package/layers/shader/app/components/Pipeline/NoisyGradientBlend.client.vue +4 -8
  138. package/layers/shader/app/components/Pipeline/OverlayBlend.client.vue +2 -19
  139. package/layers/shader/app/components/Pipeline/Polygon.client.vue +4 -8
  140. package/layers/shader/app/components/Pipeline/RaymarchTunnel.client.vue +4 -7
  141. package/layers/shader/app/components/Pipeline/Rectangle.client.vue +4 -8
  142. package/layers/shader/app/components/Pipeline/RidgedNoise.client.vue +4 -8
  143. package/layers/shader/app/components/Pipeline/Ring.client.vue +4 -8
  144. package/layers/shader/app/components/Pipeline/ScreenBlend.client.vue +2 -19
  145. package/layers/shader/app/components/Pipeline/SkyAtmosphere.client.vue +6 -9
  146. package/layers/shader/app/components/Pipeline/SoftLightBlend.client.vue +2 -19
  147. package/layers/shader/app/components/Pipeline/SplitTone.client.vue +4 -8
  148. package/layers/shader/app/components/Pipeline/Star.client.vue +4 -8
  149. package/layers/shader/app/components/Pipeline/Stripes.client.vue +4 -8
  150. package/layers/shader/app/components/Pipeline/Tint.client.vue +4 -7
  151. package/layers/shader/app/components/Pipeline/Triangle.client.vue +4 -8
  152. package/layers/shader/app/components/Pipeline/ValueNoise.client.vue +4 -8
  153. package/layers/shader/app/components/Pipeline/VoronoiEdges.client.vue +4 -8
  154. package/layers/shader/app/components/Pipeline/Water.client.vue +5 -8
  155. package/layers/shader/app/components/Pipeline/WaveBendLayer.client.vue +4 -7
  156. package/layers/shader/app/components/Pipeline/WaveColourLayer.client.vue +3 -7
  157. package/layers/shader/app/components/Pipeline/Wood.client.vue +4 -8
  158. package/layers/shader/app/components/Preset/Aurora.client.vue +15 -21
  159. package/layers/shader/app/components/Preset/Flow.client.vue +2 -1
  160. package/layers/shader/app/components/Preset/GradientMesh.client.vue +2 -1
  161. package/layers/shader/app/components/Preset/Nebula.client.vue +2 -1
  162. package/layers/shader/app/components/Preset/Ocean.client.vue +2 -1
  163. package/layers/shader/app/components/Preset/ThemeAurora.client.vue +30 -90
  164. package/layers/shader/app/components/Preset/ThemeBubble.client.vue +30 -91
  165. package/layers/shader/app/components/Preset/ThemeFlow.client.vue +30 -90
  166. package/layers/shader/app/components/Preset/ThemeGradient.client.vue +30 -91
  167. package/layers/shader/app/components/Preset/ThemeLavaLamp.client.vue +30 -90
  168. package/layers/shader/app/components/Preset/ThemePlasma.client.vue +30 -90
  169. package/layers/shader/app/components/Preset/ThemeWave.client.vue +30 -90
  170. package/layers/shader/app/components/Shader/Background.client.vue +4 -4
  171. package/layers/shader/app/components/Shader/Host.client.vue +31 -33
  172. package/layers/shader/app/components/Shader/Runtime.client.vue +15 -23
  173. package/layers/shader/app/composables/useAmbientMaterials.ts +53 -51
  174. package/layers/shader/app/composables/useShaderMixBlend.ts +26 -0
  175. package/layers/shader/app/composables/useThemePreset.ts +75 -0
  176. package/layers/shader/app/plugins/shader.client.ts +21 -21
  177. package/layers/shader/app/shaders/common/noise.ts +2 -7
  178. package/layers/shader/app/shaders/types.ts +6 -6
  179. package/layers/shader/app/types/tsl.ts +7 -25
  180. package/layers/shader/app/types/uniforms.ts +2 -1
  181. package/layers/shader/app/utils/tsl/color.ts +7 -1
  182. package/layers/shader/package.json +2 -1
  183. package/layers/theme/app/components/ThemePicker/Colors.vue +1 -3
  184. package/layers/theme/app/plugins/theme.client.ts +54 -51
  185. package/layers/theme/app/types/app-config.d.ts +4 -2
  186. package/layers/theme/app/types/index.ts +1 -0
  187. package/layers/theme/app/types/theme.ts +3 -18
  188. package/layers/theme/package.json +2 -1
  189. package/layers/theme/server/plugins/theme-fouc.ts +1 -1
  190. package/layers/transitions/package.json +4 -1
  191. package/layers/typography/app/components/Typography/CodeBlock.vue +2 -2
  192. package/layers/typography/app/components/Typography/Headline.vue +2 -2
  193. package/layers/typography/app/components/Typography/HeadlineScreen.vue +1 -1
  194. package/layers/typography/app/components/Typography/QuoteBlock.vue +4 -1
  195. package/layers/typography/app/components/Typography/TextStroke.vue +2 -0
  196. package/layers/typography/app/components/Typography/index.vue +36 -27
  197. package/layers/typography/app/composables/typography.ts +27 -21
  198. package/layers/typography/app/types/colors.ts +9 -29
  199. package/layers/typography/app/types/index.ts +2 -0
  200. package/layers/typography/package.json +4 -1
  201. package/layers/ui/package.json +2 -1
  202. package/layers/visual/app/app.config.ts +5 -2
  203. package/layers/visual/app/components/Accent/Blob.vue +20 -20
  204. package/layers/visual/app/components/Accent/Scene.vue +2 -2
  205. package/layers/visual/app/components/Base/Modal.vue +2 -2
  206. package/layers/visual/app/components/Gradient/Background.vue +2 -2
  207. package/layers/visual/app/components/Gradient/Text.vue +2 -2
  208. package/layers/visual/app/components/Media/Picture.vue +3 -1
  209. package/layers/visual/app/components/Progress/Bar.vue +6 -6
  210. package/layers/visual/app/components/Tint/Overlay.vue +14 -14
  211. package/layers/visual/app/composables/accent.ts +10 -8
  212. package/layers/visual/app/composables/gradient.ts +2 -3
  213. package/layers/visual/app/composables/tint.ts +7 -7
  214. package/layers/visual/app/types/index.ts +6 -0
  215. package/layers/visual/app/types/media.ts +4 -2
  216. package/layers/visual/app/types/tint.ts +2 -1
  217. package/layers/visual/package.json +4 -1
  218. package/package.json +5 -2
@@ -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)
@@ -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, time, uniform, vec3, vec4 } from 'three/tsl'
4
4
 
5
5
  import { curlNoise3d } from '../../shaders/common/noise'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  color = '#ffffff',
@@ -22,12 +23,7 @@
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 colorNode = toVec3Node(color)
26
+ const colorNode = hexToVec3Uniform(color)
31
27
  const opacityNode = uniform(opacity)
32
28
  const scaleNode = uniform(scale)
33
29
  const speedNode = uniform(speed)
@@ -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 { blendDarken } 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
+ blendDarken,
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, blendDarken(prev.xyz, colorNode), opacityNode), prev.w),
35
18
  order
36
19
  )
37
20
  </script>
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
2
+ import { Color } from 'three'
3
3
  import { abs, float, mix, pow, sign, time, uniform, vec4 } from 'three/tsl'
4
4
 
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  /**
6
8
  * Sinusoidal interpolation between a light and dark colour over time.
7
9
  * The phobon easing: t = (sign(cycle) * pow(abs(cycle), 0.6) + 1) / 2
@@ -25,13 +27,8 @@
25
27
  order?: number
26
28
  }>()
27
29
 
28
- function toVec3Node(hex: string) {
29
- const c = new Color(hex)
30
- return uniform(new Vector3(c.r, c.g, c.b))
31
- }
32
-
33
- const lightNode = toVec3Node(colorLight)
34
- const darkNode = toVec3Node(colorDark)
30
+ const lightNode = hexToVec3Uniform(colorLight)
31
+ const darkNode = hexToVec3Uniform(colorDark)
35
32
  const speedNode = uniform(speed)
36
33
  const opacityNode = uniform(opacity)
37
34
  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 { cos, float, mix, sin, 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 angleNode = uniform((angle * Math.PI) / 180)
26
23
  watch(
27
24
  () => 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, uniform, vec4 } from 'three/tsl'
4
4
 
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  /** Chebyshev-distance diamond gradient: max(|x|, |y|) from centre. */
6
8
  const {
7
9
  colorA = '#000000',
@@ -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 scaleNode = uniform(scale)
27
24
  watch(
28
25
  () => colorA,
@@ -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 { blendDifference } 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
+ blendDifference,
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, blendDifference(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, time, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { domainWarp2D } from '../../shaders/common/noise'
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 scaleNode = uniform(scale)
33
29
  const warpStrNode = uniform(warpStrength)
34
30
  const warpScaleNode = uniform(warpScale)
@@ -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, uniform, vec4 } from 'three/tsl'
4
4
 
5
5
  import { dots } from '../../shaders/common/shapes'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  colorA = '#000000',
@@ -20,13 +21,8 @@
20
21
  order?: number
21
22
  }>()
22
23
 
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 colorANode = toVec3Node(colorA)
29
- const colorBNode = toVec3Node(colorB)
24
+ const colorANode = hexToVec3Uniform(colorA)
25
+ const colorBNode = hexToVec3Uniform(colorB)
30
26
  const cellNode = uniform(cellSize)
31
27
  const dotNode = uniform(dotRadius)
32
28
  const softNode = uniform(softness)
@@ -1,8 +1,9 @@
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
4
 
5
5
  import { luminance } from '../../shaders/common/blend'
6
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
7
 
7
8
  const {
8
9
  shadowColor = '#1a0033',
@@ -16,13 +17,8 @@
16
17
  order?: number
17
18
  }>()
18
19
 
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 shadowNode = toVec3Node(shadowColor)
25
- const highlightNode = toVec3Node(highlightColor)
20
+ const shadowNode = hexToVec3Uniform(shadowColor)
21
+ const highlightNode = hexToVec3Uniform(highlightColor)
26
22
  watch(
27
23
  () => shadowColor,
28
24
  (v) => {
@@ -1,11 +1,8 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector3 } from 'three'
3
- import { mix, uniform, vec4 } from 'three/tsl'
4
-
5
2
  import { blendExclusion } from '../../shaders/common/blend'
6
3
 
7
4
  const {
8
- color = '#ffffff',
5
+ color = '#808080',
9
6
  opacity = 1,
10
7
  order = 0,
11
8
  } = defineProps<{
@@ -14,27 +11,10 @@
14
11
  order?: number
15
12
  }>()
16
13
 
17
- const colorNode = (() => {
18
- const c = new Color(color)
19
- return uniform(new Vector3(c.r, c.g, c.b))
20
- })()
21
- const opacityNode = uniform(opacity)
22
- watch(
14
+ useShaderMixBlend(
15
+ blendExclusion,
23
16
  () => color,
24
- (v) => {
25
- const c = new Color(v)
26
- colorNode.value.set(c.r, c.g, c.b)
27
- }
28
- )
29
- watch(
30
17
  () => opacity,
31
- (v) => {
32
- opacityNode.value = v
33
- }
34
- )
35
-
36
- useShaderStage(
37
- (prev) => vec4(mix(prev.xyz, blendExclusion(prev.xyz, colorNode), opacityNode), prev.w),
38
18
  order
39
19
  )
40
20
  </script>
@@ -1,7 +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
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  /**
6
8
  * Height-based exponential fog: exp2(-ray.y * density).
7
9
  * Blends prev colour toward fogColor as the ray approaches the horizon.
@@ -22,12 +24,7 @@
22
24
  order?: number
23
25
  }>()
24
26
 
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 fogColorNode = toVec3Node(fogColor)
27
+ const fogColorNode = hexToVec3Uniform(fogColor)
31
28
  const densityNode = uniform(density)
32
29
  const horizonBiasNode = uniform(horizonBias)
33
30
  watch(
@@ -1,7 +1,9 @@
1
1
  <script setup lang="ts">
2
- import { Color, Vector2, Vector3 } from 'three'
2
+ import { Color, Vector2 } from 'three'
3
3
  import { float, smoothstep, uniform, vec2, vec4 } from 'three/tsl'
4
4
 
5
+ import { hexToVec3Uniform } from '../../utils/tsl/color'
6
+
5
7
  /**
6
8
  * Orange/warm light leak emanating from a screen corner.
7
9
  * Additive over-exposure effect — common in analogue film.
@@ -24,12 +26,7 @@
24
26
  order?: number
25
27
  }>()
26
28
 
27
- function toVec3Node(hex: string) {
28
- const c = new Color(hex)
29
- return uniform(new Vector3(c.r, c.g, c.b))
30
- }
31
-
32
- const colorNode = toVec3Node(color)
29
+ const colorNode = hexToVec3Uniform(color)
33
30
  const originNode = uniform(new Vector2(...origin))
34
31
  const radiusNode = uniform(radius)
35
32
  const intensityNode = uniform(intensity)
@@ -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, vec3, 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
  colorBase = '#ffcc00',
@@ -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 colorBaseNode = toVec3Node(colorBase)
31
- const colorTipNode = toVec3Node(colorTip)
26
+ const colorBaseNode = hexToVec3Uniform(colorBase)
27
+ const colorTipNode = hexToVec3Uniform(colorTip)
32
28
  const scaleNode = uniform(scale)
33
29
  const speedNode = uniform(speed)
34
30
  watch(