kmcom-nuxt-layers 1.0.1

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 (380) hide show
  1. package/.claude/rules/nuxt-layers.md +23 -0
  2. package/.claude/rules/typescript.md +16 -0
  3. package/.claude/rules/vue-components.md +34 -0
  4. package/.claude/settings.local.json +81 -0
  5. package/.editorconfig +27 -0
  6. package/.github/workflows/npm-publish.yml +33 -0
  7. package/.oxlintrc.json +10 -0
  8. package/.prettierignore +87 -0
  9. package/CLAUDE.md +71 -0
  10. package/apps/playground/README.md +75 -0
  11. package/apps/playground/app/app.config.ts +10 -0
  12. package/apps/playground/app/app.vue +12 -0
  13. package/apps/playground/app/components/AmbientBackground.client.vue +795 -0
  14. package/apps/playground/app/components/ShaderDemoCanvas.client.vue +636 -0
  15. package/apps/playground/app/components/ShaderImageDemo.client.vue +211 -0
  16. package/apps/playground/app/pages/ambient.vue +387 -0
  17. package/apps/playground/app/pages/content.vue +200 -0
  18. package/apps/playground/app/pages/core.vue +560 -0
  19. package/apps/playground/app/pages/forms.vue +645 -0
  20. package/apps/playground/app/pages/index.vue +257 -0
  21. package/apps/playground/app/pages/layout.vue +591 -0
  22. package/apps/playground/app/pages/locomotive-scroll.vue +738 -0
  23. package/apps/playground/app/pages/motion.vue +848 -0
  24. package/apps/playground/app/pages/shader.vue +1701 -0
  25. package/apps/playground/app/pages/theme.vue +115 -0
  26. package/apps/playground/app/pages/ui.vue +656 -0
  27. package/apps/playground/content/blog/hello-world.md +127 -0
  28. package/apps/playground/content/blog/second-post.md +99 -0
  29. package/apps/playground/content/blog/third-post.md +33 -0
  30. package/apps/playground/content/gallery/autumn-collection.md +57 -0
  31. package/apps/playground/content/gallery/summer-collection.md +52 -0
  32. package/apps/playground/content/pages/index.md +132 -0
  33. package/apps/playground/content/portfolio/project-one.md +90 -0
  34. package/apps/playground/content/portfolio/project-two.md +96 -0
  35. package/apps/playground/content.config.ts +93 -0
  36. package/apps/playground/nuxt.config.ts +99 -0
  37. package/apps/playground/package.json +17 -0
  38. package/apps/playground/public/favicon.ico +0 -0
  39. package/apps/playground/public/robots.txt +2 -0
  40. package/apps/playground/tsconfig.json +25 -0
  41. package/eslint.config.mjs +223 -0
  42. package/eslint.configCOPY.mjs +216 -0
  43. package/eslintconfigCURRENT.mjs +244 -0
  44. package/eslintconfigOLD.mjs +178 -0
  45. package/files for claude/Scroller.vue +31 -0
  46. package/files for claude/TextMarquee.vue +255 -0
  47. package/files for claude/gsap.client.ts +18 -0
  48. package/files for claude/gsap.ts +10 -0
  49. package/files for claude/scroll.ts +28 -0
  50. package/layers/content/app/assets/css/main.css +1 -0
  51. package/layers/content/app/components/Blog/Article.vue +29 -0
  52. package/layers/content/app/components/Blog/Card.vue +40 -0
  53. package/layers/content/app/components/Blog/List.vue +35 -0
  54. package/layers/content/app/components/Gallery/AmbientImage.vue +52 -0
  55. package/layers/content/app/components/Gallery/Card.vue +39 -0
  56. package/layers/content/app/components/Gallery/Detail.vue +76 -0
  57. package/layers/content/app/components/Gallery/Grid.vue +48 -0
  58. package/layers/content/app/components/Gallery/ImageDetail.vue +92 -0
  59. package/layers/content/app/components/Gallery/Lightbox.vue +102 -0
  60. package/layers/content/app/components/NuxtContent/Detail.vue +53 -0
  61. package/layers/content/app/components/NuxtContent/List.vue +21 -0
  62. package/layers/content/app/components/NuxtContent/Renderer.vue +14 -0
  63. package/layers/content/app/components/NuxtContent/Surround.vue +15 -0
  64. package/layers/content/app/components/NuxtContent/Toc.vue +18 -0
  65. package/layers/content/app/components/Portfolio/Card.vue +39 -0
  66. package/layers/content/app/components/Portfolio/ColorPalette.vue +39 -0
  67. package/layers/content/app/components/Portfolio/Detail.vue +49 -0
  68. package/layers/content/app/components/Portfolio/List.vue +44 -0
  69. package/layers/content/app/components/Portfolio/Typography.vue +37 -0
  70. package/layers/content/app/components/content/Figure.vue +31 -0
  71. package/layers/content/app/composables/useBlogPost.ts +3 -0
  72. package/layers/content/app/composables/useBlogPosts.ts +23 -0
  73. package/layers/content/app/composables/useCollectionItem.ts +5 -0
  74. package/layers/content/app/composables/useCollectionSurround.ts +9 -0
  75. package/layers/content/app/composables/useContentPage.ts +3 -0
  76. package/layers/content/app/composables/useGalleryItem.ts +3 -0
  77. package/layers/content/app/composables/useGalleryItems.ts +19 -0
  78. package/layers/content/app/composables/usePortfolioItem.ts +3 -0
  79. package/layers/content/app/composables/usePortfolioItems.ts +23 -0
  80. package/layers/content/app/pages/blog/[slug].vue +10 -0
  81. package/layers/content/app/pages/blog/index.vue +15 -0
  82. package/layers/content/app/pages/gallery/[slug]/[imageId].vue +11 -0
  83. package/layers/content/app/pages/gallery/[slug]/index.vue +10 -0
  84. package/layers/content/app/pages/gallery/index.vue +15 -0
  85. package/layers/content/app/pages/portfolio/[slug].vue +10 -0
  86. package/layers/content/app/pages/portfolio/index.vue +15 -0
  87. package/layers/content/app/types/content.ts +84 -0
  88. package/layers/content/app.config.ts +12 -0
  89. package/layers/content/content.config.ts +93 -0
  90. package/layers/content/nuxt.config.ts +31 -0
  91. package/layers/content/package.json +31 -0
  92. package/layers/content/tsconfig.json +6 -0
  93. package/layers/core/app/assets/css/base.css +88 -0
  94. package/layers/core/app/assets/css/layout.css +36 -0
  95. package/layers/core/app/assets/css/main.css +7 -0
  96. package/layers/core/app/assets/css-backup.zip +0 -0
  97. package/layers/core/app/components/ErrorBoundary.vue +102 -0
  98. package/layers/core/app/components/LoadingScreen.vue +137 -0
  99. package/layers/core/app/composables/useBrowser.ts +161 -0
  100. package/layers/core/app/composables/useCache.ts +138 -0
  101. package/layers/core/app/composables/useDevice.ts +36 -0
  102. package/layers/core/app/composables/useEnv.ts +23 -0
  103. package/layers/core/app/composables/useErrorLog.ts +158 -0
  104. package/layers/core/app/composables/useFeatures.ts +269 -0
  105. package/layers/core/app/composables/useLoading.ts +109 -0
  106. package/layers/core/app/composables/useNetworkInfo.ts +83 -0
  107. package/layers/core/app/composables/usePWAInfo.ts +104 -0
  108. package/layers/core/app/composables/useRendering.ts +97 -0
  109. package/layers/core/app/composables/useScreen.ts +95 -0
  110. package/layers/core/app/composables/useScrollGuard.ts +266 -0
  111. package/layers/core/app/error.vue +103 -0
  112. package/layers/core/app/layouts/default.vue +4 -0
  113. package/layers/core/app/pages/[...slug].vue +168 -0
  114. package/layers/core/app/pages/diagnostics.vue +228 -0
  115. package/layers/core/app/plugins/error-handler.ts +47 -0
  116. package/layers/core/app/plugins/feature-detection.client.ts +32 -0
  117. package/layers/core/app/plugins/init.ts +188 -0
  118. package/layers/core/app/plugins/loading.client.ts +54 -0
  119. package/layers/core/app/plugins/scroll-guard.client.ts +53 -0
  120. package/layers/core/app/types/detection.ts +117 -0
  121. package/layers/core/app/types/index.ts +10 -0
  122. package/layers/core/app/types/loading.ts +47 -0
  123. package/layers/core/app/types/runtime-config.ts +31 -0
  124. package/layers/core/app/types/scroll-guard.ts +25 -0
  125. package/layers/core/app/utils/helpers.ts +246 -0
  126. package/layers/core/app/utils/index.ts +8 -0
  127. package/layers/core/app/utils/regex.ts +6 -0
  128. package/layers/core/app.config.ts +193 -0
  129. package/layers/core/nuxt.config.ts +84 -0
  130. package/layers/core/package.json +25 -0
  131. package/layers/core/tailwind.config.js +28 -0
  132. package/layers/core/tsconfig.json +6 -0
  133. package/layers/forms/app/components/Form/Contact.vue +78 -0
  134. package/layers/forms/app/components/Form/Field.vue +85 -0
  135. package/layers/forms/app/composables/useFormSchema.ts +35 -0
  136. package/layers/forms/app/config/fields.ts +104 -0
  137. package/layers/forms/app/types/fields.ts +60 -0
  138. package/layers/forms/app.config.ts +12 -0
  139. package/layers/forms/nuxt.config.ts +17 -0
  140. package/layers/forms/package.json +17 -0
  141. package/layers/forms/tsconfig.json +6 -0
  142. package/layers/layout/.nuxtrc +1 -0
  143. package/layers/layout/CLAUDE.MD +186 -0
  144. package/layers/layout/GRID_SYSTEM.md +993 -0
  145. package/layers/layout/README.md +73 -0
  146. package/layers/layout/app/assets/css/layout/grids.css +180 -0
  147. package/layers/layout/app/assets/css/main.css +1 -0
  148. package/layers/layout/app/components/Layout/Grid/Debug.vue +79 -0
  149. package/layers/layout/app/components/Layout/Grid/Item.vue +180 -0
  150. package/layers/layout/app/components/Layout/Page/Container.vue +100 -0
  151. package/layers/layout/app/components/Layout/Page/Header.vue +33 -0
  152. package/layers/layout/app/components/Layout/Section/Gallery.vue +68 -0
  153. package/layers/layout/app/components/Layout/Section/Hero.vue +71 -0
  154. package/layers/layout/app/components/Layout/Section/Split.vue +56 -0
  155. package/layers/layout/app/components/Layout/Section/index.vue +39 -0
  156. package/layers/layout/app/composables/GridPlacement.ts +31 -0
  157. package/layers/layout/app/composables/useGridConfig.ts +27 -0
  158. package/layers/layout/app/types/layouts.ts +37 -0
  159. package/layers/layout/app.config.ts +97 -0
  160. package/layers/layout/nuxt.config.ts +14 -0
  161. package/layers/layout/package.json +14 -0
  162. package/layers/layout/tailwind.config.js +28 -0
  163. package/layers/layout/tsconfig.json +6 -0
  164. package/layers/motion/README.md +107 -0
  165. package/layers/motion/TASKS.MD +16 -0
  166. package/layers/motion/app/assets/css/main.css +111 -0
  167. package/layers/motion/app/components/Motion/Marquee.vue +171 -0
  168. package/layers/motion/app/components/Motion/Parallax.vue +75 -0
  169. package/layers/motion/app/components/Motion/ScrollLink.vue +49 -0
  170. package/layers/motion/app/components/Motion/ScrollProgress.vue +127 -0
  171. package/layers/motion/app/components/Motion/ScrollStats.vue +102 -0
  172. package/layers/motion/app/components/Motion/Staggered.vue +73 -0
  173. package/layers/motion/app/components/Motion/TextReveal.vue +101 -0
  174. package/layers/motion/app/components/Motion/Transition.vue +89 -0
  175. package/layers/motion/app/components/Motion/VelocityEffect.vue +139 -0
  176. package/layers/motion/app/components/Motion/index.vue +16 -0
  177. package/layers/motion/app/composables/useGsap.ts +21 -0
  178. package/layers/motion/app/composables/useMotion.ts +137 -0
  179. package/layers/motion/app/composables/useSmoothScroll.ts +154 -0
  180. package/layers/motion/app/plugins/gsap.client.ts +15 -0
  181. package/layers/motion/app/plugins/locomotive-scroll.client.ts +49 -0
  182. package/layers/motion/app/utils/gsapAnimations.ts +122 -0
  183. package/layers/motion/app.config.ts +30 -0
  184. package/layers/motion/nuxt.config.ts +19 -0
  185. package/layers/motion/package.json +17 -0
  186. package/layers/motion/tsconfig.json +6 -0
  187. package/layers/shader/AGENTS.MD +195 -0
  188. package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierignore +6 -0
  189. package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierrc +18 -0
  190. package/layers/shader/additional-modular-tsl-shaders-for-claude/LICENSE +21 -0
  191. package/layers/shader/additional-modular-tsl-shaders-for-claude/README.md +100 -0
  192. package/layers/shader/additional-modular-tsl-shaders-for-claude/index.html +13 -0
  193. package/layers/shader/additional-modular-tsl-shaders-for-claude/jsconfig.json +30 -0
  194. package/layers/shader/additional-modular-tsl-shaders-for-claude/package.json +18 -0
  195. package/layers/shader/additional-modular-tsl-shaders-for-claude/pnpm-lock.yaml +633 -0
  196. package/layers/shader/additional-modular-tsl-shaders-for-claude/public/vite.svg +1 -0
  197. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketch/webgpu_sketch.js +128 -0
  198. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/index.css +87 -0
  199. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/sketches_dropdown.js +169 -0
  200. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/index.css +25 -0
  201. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/main.js +93 -0
  202. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/router.js +43 -0
  203. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/flare-1.js +68 -0
  204. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/noise/dawn-1.js +56 -0
  205. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/bulge_distortion.js +35 -0
  206. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/swirl_distortion.js +35 -0
  207. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/wave_distortion.js +43 -0
  208. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/common.js +145 -0
  209. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_3d.js +53 -0
  210. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_4d.js +55 -0
  211. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/fbm.js +163 -0
  212. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/perlin_noise_3d.js +70 -0
  213. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_3d.js +59 -0
  214. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_4d.js +72 -0
  215. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/turbulence.js +41 -0
  216. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/canvas_weave_pattern.js +26 -0
  217. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/grain_texture_pattern.js +10 -0
  218. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/led_pattern.js +45 -0
  219. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/pixellation_pattern.js +15 -0
  220. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/speckled_noise_pattern.js +34 -0
  221. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/vignette_pattern.js +21 -0
  222. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/bulge_distortion_effect.js +27 -0
  223. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/chromatic_aberration_effect.js +45 -0
  224. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/crt_scanline_effect.js +45 -0
  225. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/dither_effect.js +126 -0
  226. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/grain_texture_effect.js +21 -0
  227. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/halftone_effect.js +44 -0
  228. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/led_effect.js +31 -0
  229. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/pixellation_effect.js +29 -0
  230. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/swirl_distortion_effect.js +25 -0
  231. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/vignette_effect.js +22 -0
  232. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/wave_distortion_effect.js +27 -0
  233. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/cosine_palette.js +15 -0
  234. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/tonemapping.js +151 -0
  235. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom.js +13 -0
  236. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom_edge_pattern.js +20 -0
  237. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/domain_index.js +11 -0
  238. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/median3.js +22 -0
  239. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/repeating_pattern.js +13 -0
  240. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/screen_aspect_uv.js +14 -0
  241. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/lighting.js +60 -0
  242. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/complex.js +86 -0
  243. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/coordinates.js +119 -0
  244. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/operations.js +24 -0
  245. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/shapes.js +182 -0
  246. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/utils/math.js +33 -0
  247. package/layers/shader/additional-modular-tsl-shaders-for-claude/vite.config.js +23 -0
  248. package/layers/shader/app/assets/css/main.css +41 -0
  249. package/layers/shader/app/components/Effect/Bloom.vue +8 -0
  250. package/layers/shader/app/components/Effect/ChromaticAberration.vue +8 -0
  251. package/layers/shader/app/components/Effect/PostProcessing.vue +20 -0
  252. package/layers/shader/app/components/Material/AmbientAurora.vue +172 -0
  253. package/layers/shader/app/components/Material/AmbientFlow.vue +175 -0
  254. package/layers/shader/app/components/Material/AmbientGradientMesh.vue +173 -0
  255. package/layers/shader/app/components/Material/AmbientNebula.vue +181 -0
  256. package/layers/shader/app/components/Material/AmbientOcean.vue +161 -0
  257. package/layers/shader/app/components/Material/Fresnel.vue +89 -0
  258. package/layers/shader/app/components/Material/Gradient.vue +185 -0
  259. package/layers/shader/app/components/Material/Image.vue +232 -0
  260. package/layers/shader/app/components/Material/Node.vue +79 -0
  261. package/layers/shader/app/components/Material/Noise.vue +141 -0
  262. package/layers/shader/app/components/Mesh/Plane.vue +27 -0
  263. package/layers/shader/app/components/Shader/Background.vue +159 -0
  264. package/layers/shader/app/components/Shader/Canvas.vue +97 -0
  265. package/layers/shader/app/components/Shader/Debug.vue +66 -0
  266. package/layers/shader/app/components/WebGPUCanvas.client.vue +245 -0
  267. package/layers/shader/app/composables/useAmbientMaterials.ts +452 -0
  268. package/layers/shader/app/composables/useMousePosition.ts +94 -0
  269. package/layers/shader/app/composables/useRendererCapabilities.ts +111 -0
  270. package/layers/shader/app/composables/useShader.ts +148 -0
  271. package/layers/shader/app/composables/useShaderTime.ts +146 -0
  272. package/layers/shader/app/composables/useTSLNodes.ts +112 -0
  273. package/layers/shader/app/composables/useUniforms.ts +188 -0
  274. package/layers/shader/app/plugins/shader.client.ts +30 -0
  275. package/layers/shader/app/shaders/common/blend.ts +255 -0
  276. package/layers/shader/app/shaders/common/effects.ts +299 -0
  277. package/layers/shader/app/shaders/common/grain.ts +453 -0
  278. package/layers/shader/app/shaders/common/index.ts +22 -0
  279. package/layers/shader/app/shaders/common/lighting.ts +146 -0
  280. package/layers/shader/app/shaders/common/math.ts +250 -0
  281. package/layers/shader/app/shaders/common/noise.ts +823 -0
  282. package/layers/shader/app/shaders/common/noiseHelpers.ts +114 -0
  283. package/layers/shader/app/shaders/common/palette.ts +319 -0
  284. package/layers/shader/app/shaders/common/patterns.ts +216 -0
  285. package/layers/shader/app/shaders/common/sdf.ts +224 -0
  286. package/layers/shader/app/shaders/common/shapes.ts +366 -0
  287. package/layers/shader/app/shaders/common/tonemapping.ts +172 -0
  288. package/layers/shader/app/shaders/common/uv.ts +396 -0
  289. package/layers/shader/app/shaders/createMaterial.ts +314 -0
  290. package/layers/shader/app/shaders/index.ts +282 -0
  291. package/layers/shader/app/shaders/layers/aurora.ts +146 -0
  292. package/layers/shader/app/shaders/layers/index.ts +19 -0
  293. package/layers/shader/app/shaders/layers/meshGradient.ts +152 -0
  294. package/layers/shader/app/shaders/layers/paperShading.ts +148 -0
  295. package/layers/shader/app/shaders/layers/shaderGradient.ts +152 -0
  296. package/layers/shader/app/shaders/layers/stripe.ts +137 -0
  297. package/layers/shader/app/shaders/types.ts +12 -0
  298. package/layers/shader/app/types/index.ts +4 -0
  299. package/layers/shader/app/types/materials.ts +45 -0
  300. package/layers/shader/app/types/renderer.ts +50 -0
  301. package/layers/shader/app/types/tsl.ts +39 -0
  302. package/layers/shader/app/types/uniforms.ts +21 -0
  303. package/layers/shader/app/utils/tsl/animation.ts +251 -0
  304. package/layers/shader/app/utils/tsl/color.ts +189 -0
  305. package/layers/shader/app/utils/tsl/index.ts +84 -0
  306. package/layers/shader/app/utils/tsl/math.ts +111 -0
  307. package/layers/shader/app/utils/tsl/noise.ts +195 -0
  308. package/layers/shader/app/utils/tsl/patterns.ts +183 -0
  309. package/layers/shader/app/utils/tsl/uv.ts +145 -0
  310. package/layers/shader/app.config.ts +18 -0
  311. package/layers/shader/modular-tsl-shaders-for-claude/common/blend.tsl +1 -0
  312. package/layers/shader/modular-tsl-shaders-for-claude/common/noise.tsl +1 -0
  313. package/layers/shader/modular-tsl-shaders-for-claude/common/shapes.tsl +1 -0
  314. package/layers/shader/modular-tsl-shaders-for-claude/common/vertexFresnel.tsl +9 -0
  315. package/layers/shader/modular-tsl-shaders-for-claude/common/vertexPlane.tsl +6 -0
  316. package/layers/shader/modular-tsl-shaders-for-claude/effects/background.tsl +1 -0
  317. package/layers/shader/modular-tsl-shaders-for-claude/effects/gradient.tsl +1 -0
  318. package/layers/shader/modular-tsl-shaders-for-claude/effects/gradientLegend.tsl +1 -0
  319. package/layers/shader/modular-tsl-shaders-for-claude/effects/simpleGradient.tsl +1 -0
  320. package/layers/shader/modular-tsl-shaders-for-claude/layers/aurora.ts +1 -0
  321. package/layers/shader/modular-tsl-shaders-for-claude/layers/fragmentsTech.ts +1 -0
  322. package/layers/shader/modular-tsl-shaders-for-claude/layers/fresnel.ts +1 -0
  323. package/layers/shader/modular-tsl-shaders-for-claude/layers/linearGradient.ts +1 -0
  324. package/layers/shader/modular-tsl-shaders-for-claude/layers/meshGradient.ts +1 -0
  325. package/layers/shader/modular-tsl-shaders-for-claude/layers/noise.ts +1 -0
  326. package/layers/shader/modular-tsl-shaders-for-claude/layers/paperShading.ts +1 -0
  327. package/layers/shader/modular-tsl-shaders-for-claude/layers/radial.ts +1 -0
  328. package/layers/shader/modular-tsl-shaders-for-claude/layers/shaderGradient.ts +1 -0
  329. package/layers/shader/modular-tsl-shaders-for-claude/layers/stripe.ts +1 -0
  330. package/layers/shader/modular-tsl-shaders-for-claude/materials/createMaterial.ts +1 -0
  331. package/layers/shader/modular-tsl-shaders-for-claude/utils/glslUtils.ts +1 -0
  332. package/layers/shader/modular-tsl-shaders-for-claude/utils/palette.ts +1 -0
  333. package/layers/shader/nuxt.config.ts +48 -0
  334. package/layers/shader/package.json +17 -0
  335. package/layers/shader/tsconfig.json +6 -0
  336. package/layers/theme/app/assets/css/theme.css +47 -0
  337. package/layers/theme/app/components/ThemePicker/AccentButton.vue +51 -0
  338. package/layers/theme/app/components/ThemePicker/Colors.vue +22 -0
  339. package/layers/theme/app/components/ThemePicker/Menu.vue +108 -0
  340. package/layers/theme/app/components/ThemePicker/MenuButton.vue +9 -0
  341. package/layers/theme/app/composables/useThemePreferences.ts +158 -0
  342. package/layers/theme/app/plugins/theme.client.ts +5 -0
  343. package/layers/theme/app/types/theme.ts +34 -0
  344. package/layers/theme/app.config.ts +14 -0
  345. package/layers/theme/nuxt.config.ts +46 -0
  346. package/layers/theme/package.json +14 -0
  347. package/layers/theme/server/plugins/theme-fouc.ts +51 -0
  348. package/layers/theme/tsconfig.json +7 -0
  349. package/layers/ui/CLAUDE.MD +325 -0
  350. package/layers/ui/app/assets/css/main.css +4 -0
  351. package/layers/ui/app/components/Links/Group.vue +38 -0
  352. package/layers/ui/app/components/Links/Named.vue +32 -0
  353. package/layers/ui/app/components/Media/Picture.vue +41 -0
  354. package/layers/ui/app/components/Site/Title.vue +15 -0
  355. package/layers/ui/app/components/Typography/CodeBlock.vue +37 -0
  356. package/layers/ui/app/components/Typography/Headline.vue +73 -0
  357. package/layers/ui/app/components/Typography/QuoteBlock.vue +13 -0
  358. package/layers/ui/app/components/Typography/TextStroke.vue +109 -0
  359. package/layers/ui/app/components/Typography/index.vue +49 -0
  360. package/layers/ui/app/composables/color.ts +36 -0
  361. package/layers/ui/app/composables/picture.ts +145 -0
  362. package/layers/ui/app/composables/typography.ts +77 -0
  363. package/layers/ui/app/layouts/default.vue +4 -0
  364. package/layers/ui/app/pages/index.vue +236 -0
  365. package/layers/ui/app/types/breakpoints.ts +179 -0
  366. package/layers/ui/app/types/colors.ts +29 -0
  367. package/layers/ui/app/types/media.ts +185 -0
  368. package/layers/ui/app/types/typography.ts +108 -0
  369. package/layers/ui/app/utils/regex.ts +6 -0
  370. package/layers/ui/app.config.ts +12 -0
  371. package/layers/ui/nuxt.config.ts +38 -0
  372. package/layers/ui/package.json +14 -0
  373. package/layers/ui/tsconfig.json +6 -0
  374. package/package.json +128 -0
  375. package/playgroundOLD/app.config.ts +5 -0
  376. package/playgroundOLD/nuxt.config.ts +12 -0
  377. package/pnpm-workspace.yaml +6 -0
  378. package/prettier.config.cjs +19 -0
  379. package/stylelint.config.mjs +111 -0
  380. package/turbo.json +16 -0
@@ -0,0 +1,173 @@
1
+ <script setup lang="ts">
2
+ // @ts-nocheck - TSL types are complex
3
+ import { Color, DoubleSide } from 'three'
4
+ import {
5
+ add,
6
+ cos,
7
+ length,
8
+ mix,
9
+ mul,
10
+ sin,
11
+ smoothstep,
12
+ sub,
13
+ time as tslTime,
14
+ uniform,
15
+ uv,
16
+ vec2,
17
+ vec3,
18
+ } from 'three/tsl'
19
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
20
+ import { fbm2D, simplexNoise2D } from '../../shaders/common/noise'
21
+
22
+ const props = withDefaults(
23
+ defineProps<{
24
+ speed?: number
25
+ intensity?: number
26
+ color1?: string
27
+ color2?: string
28
+ color3?: string
29
+ color4?: string
30
+ mouseX?: number
31
+ mouseY?: number
32
+ mouseInteraction?: boolean
33
+ mouseStrength?: number
34
+ }>(),
35
+ {
36
+ speed: 1.0,
37
+ intensity: 1.0,
38
+ color1: '#667eea',
39
+ color2: '#764ba2',
40
+ color3: '#f093fb',
41
+ color4: '#f5576c',
42
+ mouseX: 0.5,
43
+ mouseY: 0.5,
44
+ mouseInteraction: true,
45
+ mouseStrength: 0.3,
46
+ }
47
+ )
48
+
49
+ // Create reactive uniforms
50
+ const speedUniform = uniform(props.speed)
51
+ const intensityUniform = uniform(props.intensity)
52
+ const mouseXUniform = uniform(props.mouseX)
53
+ const mouseYUniform = uniform(props.mouseY)
54
+ const mouseStrengthUniform = uniform(props.mouseStrength)
55
+ const color1Uniform = uniform(new Color(props.color1))
56
+ const color2Uniform = uniform(new Color(props.color2))
57
+ const color3Uniform = uniform(new Color(props.color3))
58
+ const color4Uniform = uniform(new Color(props.color4))
59
+
60
+ // Watch prop changes
61
+ watch(
62
+ () => props.speed,
63
+ (val) => (speedUniform.value = val)
64
+ )
65
+ watch(
66
+ () => props.intensity,
67
+ (val) => (intensityUniform.value = val)
68
+ )
69
+ watch(
70
+ () => props.mouseX,
71
+ (val) => (mouseXUniform.value = val)
72
+ )
73
+ watch(
74
+ () => props.mouseY,
75
+ (val) => (mouseYUniform.value = val)
76
+ )
77
+ watch(
78
+ () => props.mouseStrength,
79
+ (val) => (mouseStrengthUniform.value = val)
80
+ )
81
+ watch(
82
+ () => props.color1,
83
+ (val) => (color1Uniform.value = new Color(val))
84
+ )
85
+ watch(
86
+ () => props.color2,
87
+ (val) => (color2Uniform.value = new Color(val))
88
+ )
89
+ watch(
90
+ () => props.color3,
91
+ (val) => (color3Uniform.value = new Color(val))
92
+ )
93
+ watch(
94
+ () => props.color4,
95
+ (val) => (color4Uniform.value = new Color(val))
96
+ )
97
+
98
+ const material = computed(() => {
99
+ const mat = new MeshBasicNodeMaterial()
100
+
101
+ // Time animation
102
+ const time = tslTime.mul(speedUniform).mul(0.2)
103
+
104
+ // UV coordinates
105
+ const uvCoord = uv()
106
+
107
+ // Mouse offset
108
+ const mouseOffset = vec2(
109
+ sub(mouseXUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0),
110
+ sub(mouseYUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0)
111
+ )
112
+ const adjustedUV = add(uvCoord, mul(mouseOffset, 0.1))
113
+
114
+ // Create smooth flowing noise
115
+ const n1UV = add(mul(adjustedUV, 1.5), vec2(time, mul(time, 0.5)))
116
+ const n1 = add(mul(simplexNoise2D(n1UV), 0.5), 0.5)
117
+
118
+ const n2UV = add(mul(adjustedUV, 2.0), vec2(mul(time, -0.7), mul(time, 0.3)))
119
+ const n2 = add(mul(simplexNoise2D(n2UV), 0.5), 0.5)
120
+
121
+ const n3UV = add(mul(adjustedUV, 1.2), vec2(mul(time, 0.4), mul(time, -0.6)))
122
+ const n3 = add(mul(simplexNoise2D(n3UV), 0.5), 0.5)
123
+
124
+ const n4 = add(
125
+ mul(
126
+ fbm2D(add(mul(adjustedUV, 0.8), mul(time, 0.2)), { octaves: 3, lacunarity: 2.0, gain: 0.5 }),
127
+ 0.5
128
+ ),
129
+ 0.5
130
+ )
131
+
132
+ // Animated gradient positions (mesh control points)
133
+ const p1 = vec2(add(0.2, mul(sin(mul(time, 0.5)), 0.2)), add(0.3, mul(cos(mul(time, 0.4)), 0.2)))
134
+ const p2 = vec2(
135
+ add(0.8, mul(cos(mul(time, 0.6)), 0.15)),
136
+ add(0.2, mul(sin(mul(time, 0.5)), 0.15))
137
+ )
138
+ const p3 = vec2(add(0.3, mul(sin(mul(time, 0.7)), 0.2)), add(0.8, mul(cos(mul(time, 0.3)), 0.15)))
139
+ const p4 = vec2(add(0.7, mul(cos(mul(time, 0.4)), 0.2)), add(0.7, mul(sin(mul(time, 0.6)), 0.2)))
140
+
141
+ // Distance-based blending from each control point
142
+ const d1 = sub(1.0, smoothstep(0.0, 0.8, length(sub(adjustedUV, p1))))
143
+ const d2 = sub(1.0, smoothstep(0.0, 0.8, length(sub(adjustedUV, p2))))
144
+ const d3 = sub(1.0, smoothstep(0.0, 0.8, length(sub(adjustedUV, p3))))
145
+ const d4 = sub(1.0, smoothstep(0.0, 0.8, length(sub(adjustedUV, p4))))
146
+
147
+ // Color mixing based on distance and noise
148
+ let colorNode = mul(vec3(color1Uniform), d1)
149
+ colorNode = mix(colorNode, vec3(color2Uniform), mul(d2, n1))
150
+ colorNode = mix(colorNode, vec3(color3Uniform), mul(d3, n2))
151
+ colorNode = mix(colorNode, vec3(color4Uniform), mul(d4, n3))
152
+
153
+ // Add subtle brightness variation
154
+ const brightness = add(0.9, mul(0.1, n4))
155
+ colorNode = mul(colorNode, brightness, intensityUniform)
156
+
157
+ // Soft vignette
158
+ const dist = length(sub(uvCoord, 0.5))
159
+ const vig = sub(1.0, mul(dist, 0.3))
160
+ colorNode = mul(colorNode, vig)
161
+
162
+ mat.colorNode = colorNode
163
+ mat.side = DoubleSide
164
+
165
+ return mat
166
+ })
167
+
168
+ defineExpose({ material })
169
+ </script>
170
+
171
+ <template>
172
+ <primitive :object="material" attach="material" />
173
+ </template>
@@ -0,0 +1,181 @@
1
+ <script setup lang="ts">
2
+ // @ts-nocheck - TSL types are complex
3
+ import { Color, DoubleSide } from 'three'
4
+ import {
5
+ add,
6
+ exp,
7
+ length,
8
+ mix,
9
+ mul,
10
+ smoothstep,
11
+ sub,
12
+ time as tslTime,
13
+ uniform,
14
+ uv,
15
+ vec2,
16
+ vec3,
17
+ } from 'three/tsl'
18
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
19
+ import { fbm3D, ridgedFbm2d, voronoi2D } from '../../shaders/common/noise'
20
+ import { cosinePalette } from '../../shaders/common/palette'
21
+
22
+ const props = withDefaults(
23
+ defineProps<{
24
+ speed?: number
25
+ intensity?: number
26
+ color1?: string
27
+ color2?: string
28
+ color3?: string
29
+ color4?: string
30
+ mouseX?: number
31
+ mouseY?: number
32
+ mouseInteraction?: boolean
33
+ mouseStrength?: number
34
+ }>(),
35
+ {
36
+ speed: 1.0,
37
+ intensity: 1.0,
38
+ color1: '#1a0a2e',
39
+ color2: '#ff6b6b',
40
+ color3: '#4ecdc4',
41
+ color4: '#ffe66d',
42
+ mouseX: 0.5,
43
+ mouseY: 0.5,
44
+ mouseInteraction: true,
45
+ mouseStrength: 0.3,
46
+ }
47
+ )
48
+
49
+ // Create reactive uniforms
50
+ const speedUniform = uniform(props.speed)
51
+ const intensityUniform = uniform(props.intensity)
52
+ const mouseXUniform = uniform(props.mouseX)
53
+ const mouseYUniform = uniform(props.mouseY)
54
+ const mouseStrengthUniform = uniform(props.mouseStrength)
55
+ const color1Uniform = uniform(new Color(props.color1))
56
+ const color2Uniform = uniform(new Color(props.color2))
57
+ const color3Uniform = uniform(new Color(props.color3))
58
+ const color4Uniform = uniform(new Color(props.color4))
59
+
60
+ // Watch prop changes
61
+ watch(
62
+ () => props.speed,
63
+ (val) => (speedUniform.value = val)
64
+ )
65
+ watch(
66
+ () => props.intensity,
67
+ (val) => (intensityUniform.value = val)
68
+ )
69
+ watch(
70
+ () => props.mouseX,
71
+ (val) => (mouseXUniform.value = val)
72
+ )
73
+ watch(
74
+ () => props.mouseY,
75
+ (val) => (mouseYUniform.value = val)
76
+ )
77
+ watch(
78
+ () => props.mouseStrength,
79
+ (val) => (mouseStrengthUniform.value = val)
80
+ )
81
+ watch(
82
+ () => props.color1,
83
+ (val) => (color1Uniform.value = new Color(val))
84
+ )
85
+ watch(
86
+ () => props.color2,
87
+ (val) => (color2Uniform.value = new Color(val))
88
+ )
89
+ watch(
90
+ () => props.color3,
91
+ (val) => (color3Uniform.value = new Color(val))
92
+ )
93
+ watch(
94
+ () => props.color4,
95
+ (val) => (color4Uniform.value = new Color(val))
96
+ )
97
+
98
+ const material = computed(() => {
99
+ const mat = new MeshBasicNodeMaterial()
100
+
101
+ // Time animation
102
+ const time = tslTime.mul(speedUniform).mul(0.15)
103
+
104
+ // UV centered at origin
105
+ const uvCoord = sub(uv(), 0.5)
106
+
107
+ // Mouse offset
108
+ const mouseOffset = vec2(
109
+ sub(mouseXUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0),
110
+ sub(mouseYUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0)
111
+ )
112
+ const adjustedUV = add(uvCoord, mouseOffset)
113
+
114
+ // Multiple noise layers for depth
115
+ const n1Pos = vec3(mul(adjustedUV.x, 2.0), mul(adjustedUV.y, 2.0), mul(time, 0.5))
116
+ const n1 = add(mul(fbm3D(n1Pos, { octaves: 5, lacunarity: 2.0, gain: 0.5 }), 0.5), 0.5)
117
+
118
+ const n2Pos = vec3(
119
+ add(mul(adjustedUV.x, 3.0), 10.0),
120
+ add(mul(adjustedUV.y, 3.0), 10.0),
121
+ mul(time, 0.3)
122
+ )
123
+ const n2 = add(mul(fbm3D(n2Pos, { octaves: 4, lacunarity: 2.0, gain: 0.5 }), 0.5), 0.5)
124
+
125
+ const n3 = add(
126
+ mul(
127
+ ridgedFbm2d(add(mul(adjustedUV, 4.0), mul(time, 0.2)), {
128
+ octaves: 4,
129
+ lacunarity: 2.0,
130
+ gain: 0.5,
131
+ }),
132
+ 0.5
133
+ ),
134
+ 0.5
135
+ )
136
+
137
+ // Voronoi for stars/clusters
138
+ const vor = voronoi2D(add(mul(adjustedUV, 8.0), mul(time, 0.1)), 1.0)
139
+ const stars = mul(smoothstep(0.1, 0.0, vor.x), vor.y)
140
+
141
+ // Color layers
142
+ const layer1 = mix(vec3(color1Uniform), vec3(color2Uniform), n1)
143
+ const layer2 = mix(vec3(color3Uniform), vec3(color4Uniform), n2)
144
+
145
+ // Cosine palette for extra color variation
146
+ const palette = cosinePalette(
147
+ n3,
148
+ vec3(0.5, 0.5, 0.5),
149
+ vec3(0.5, 0.5, 0.5),
150
+ vec3(1.0, 0.7, 0.4),
151
+ vec3(0.0, 0.15, 0.2)
152
+ )
153
+
154
+ // Combine layers
155
+ let colorNode = mix(layer1, layer2, mul(n2, 0.7))
156
+ colorNode = mix(colorNode, palette, mul(n3, 0.4))
157
+
158
+ // Add central glow
159
+ const dist = length(uvCoord)
160
+ const glow = mul(exp(mul(dist, -2.0)), 0.5)
161
+ colorNode = add(colorNode, mul(vec3(color2Uniform), glow))
162
+
163
+ // Add stars
164
+ colorNode = add(colorNode, mul(vec3(1.0, 0.95, 0.9), stars, 2.0))
165
+
166
+ // Vignette
167
+ const vig = sub(1.0, mul(dist, 0.8))
168
+ colorNode = mul(colorNode, vig, intensityUniform)
169
+
170
+ mat.colorNode = colorNode
171
+ mat.side = DoubleSide
172
+
173
+ return mat
174
+ })
175
+
176
+ defineExpose({ material })
177
+ </script>
178
+
179
+ <template>
180
+ <primitive :object="material" attach="material" />
181
+ </template>
@@ -0,0 +1,161 @@
1
+ <script setup lang="ts">
2
+ // @ts-nocheck - TSL types are complex
3
+ import { Color, DoubleSide } from 'three'
4
+ import {
5
+ add,
6
+ exp,
7
+ length,
8
+ mix,
9
+ mul,
10
+ pow,
11
+ sin,
12
+ smoothstep,
13
+ sub,
14
+ time as tslTime,
15
+ uniform,
16
+ uv,
17
+ vec2,
18
+ vec3,
19
+ } from 'three/tsl'
20
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
21
+ import { simplexNoise2D } from '../../shaders/common/noise'
22
+
23
+ const props = withDefaults(
24
+ defineProps<{
25
+ speed?: number
26
+ intensity?: number
27
+ color1?: string
28
+ color2?: string
29
+ color3?: string
30
+ mouseX?: number
31
+ mouseY?: number
32
+ mouseInteraction?: boolean
33
+ mouseStrength?: number
34
+ }>(),
35
+ {
36
+ speed: 1.0,
37
+ intensity: 1.0,
38
+ color1: '#0a1628',
39
+ color2: '#1e3a5f',
40
+ color3: '#7ec8e3',
41
+ mouseX: 0.5,
42
+ mouseY: 0.5,
43
+ mouseInteraction: true,
44
+ mouseStrength: 0.5,
45
+ }
46
+ )
47
+
48
+ // Create reactive uniforms
49
+ const speedUniform = uniform(props.speed)
50
+ const intensityUniform = uniform(props.intensity)
51
+ const mouseXUniform = uniform(props.mouseX)
52
+ const mouseYUniform = uniform(props.mouseY)
53
+ const mouseStrengthUniform = uniform(props.mouseStrength)
54
+ const color1Uniform = uniform(new Color(props.color1))
55
+ const color2Uniform = uniform(new Color(props.color2))
56
+ const color3Uniform = uniform(new Color(props.color3))
57
+
58
+ // Watch prop changes
59
+ watch(
60
+ () => props.speed,
61
+ (val) => (speedUniform.value = val)
62
+ )
63
+ watch(
64
+ () => props.intensity,
65
+ (val) => (intensityUniform.value = val)
66
+ )
67
+ watch(
68
+ () => props.mouseX,
69
+ (val) => (mouseXUniform.value = val)
70
+ )
71
+ watch(
72
+ () => props.mouseY,
73
+ (val) => (mouseYUniform.value = val)
74
+ )
75
+ watch(
76
+ () => props.mouseStrength,
77
+ (val) => (mouseStrengthUniform.value = val)
78
+ )
79
+ watch(
80
+ () => props.color1,
81
+ (val) => (color1Uniform.value = new Color(val))
82
+ )
83
+ watch(
84
+ () => props.color2,
85
+ (val) => (color2Uniform.value = new Color(val))
86
+ )
87
+ watch(
88
+ () => props.color3,
89
+ (val) => (color3Uniform.value = new Color(val))
90
+ )
91
+
92
+ const material = computed(() => {
93
+ const mat = new MeshBasicNodeMaterial()
94
+
95
+ // Time animation
96
+ const time = tslTime.mul(speedUniform).mul(0.3)
97
+
98
+ // UV coordinates
99
+ const uvCoord = uv()
100
+
101
+ // Mouse position for ripples
102
+ const mousePos = vec2(mouseXUniform, mouseYUniform)
103
+ const mouseDist = length(sub(uvCoord, mousePos))
104
+
105
+ // Mouse ripple effect
106
+ const ripple = mul(
107
+ sin(sub(mul(mouseDist, 30.0), mul(time, 5.0))),
108
+ exp(mul(mouseDist, -5.0)),
109
+ props.mouseInteraction ? mouseStrengthUniform : 0
110
+ )
111
+
112
+ // Wave layers
113
+ const wave1 = add(mul(sin(add(mul(uvCoord.x, 8.0), time, mul(ripple, 2.0))), 0.5), 0.5)
114
+ const wave2 = add(
115
+ mul(sin(add(sub(mul(uvCoord.x, 12.0), mul(time, 0.7)), mul(uvCoord.y, 3.0))), 0.5),
116
+ 0.5
117
+ )
118
+ const wave3 = simplexNoise2D(
119
+ vec2(add(mul(uvCoord.x, 4.0), mul(time, 0.5)), add(mul(uvCoord.y, 2.0), mul(time, 0.3)))
120
+ )
121
+
122
+ // Caustics-like pattern
123
+ const caustic1UV = add(mul(uvCoord, 10.0), mul(time, 0.5))
124
+ const caustic1 = add(mul(simplexNoise2D(caustic1UV), 0.5), 0.5)
125
+ const caustic2UV = add(sub(mul(uvCoord, 15.0), mul(time, 0.3)), 5.0)
126
+ const caustic2 = add(mul(simplexNoise2D(caustic2UV), 0.5), 0.5)
127
+ const caustics = pow(mul(caustic1, caustic2), 2.0)
128
+
129
+ // Foam on wave peaks
130
+ const foam = smoothstep(0.7, 0.9, mul(wave1, wave2))
131
+
132
+ // Depth gradient
133
+ const depth = add(mul(uvCoord.y, 0.5), 0.3)
134
+
135
+ // Color mixing
136
+ let colorNode = mix(vec3(color1Uniform), vec3(color2Uniform), add(depth, mul(wave3, 0.2)))
137
+ colorNode = mix(colorNode, vec3(color3Uniform), mul(caustics, 0.3, intensityUniform))
138
+ colorNode = add(colorNode, mul(vec3(1.0, 1.0, 1.0), foam, 0.3))
139
+
140
+ // Add shimmer
141
+ const shimmerUV = add(mul(uvCoord, 30.0), mul(time, 2.0))
142
+ const shimmer = mul(simplexNoise2D(shimmerUV), 0.05, intensityUniform)
143
+ colorNode = add(colorNode, shimmer)
144
+
145
+ // Subtle vignette
146
+ const dist = length(sub(uvCoord, 0.5))
147
+ const vig = sub(1.0, mul(dist, 0.5))
148
+ colorNode = mul(colorNode, vig)
149
+
150
+ mat.colorNode = colorNode
151
+ mat.side = DoubleSide
152
+
153
+ return mat
154
+ })
155
+
156
+ defineExpose({ material })
157
+ </script>
158
+
159
+ <template>
160
+ <primitive :object="material" attach="material" />
161
+ </template>
@@ -0,0 +1,89 @@
1
+ <script setup lang="ts">
2
+ import { Color, DoubleSide } from 'three'
3
+ import {
4
+ dot,
5
+ float,
6
+ mix,
7
+ normalize,
8
+ normalView,
9
+ positionViewDirection,
10
+ pow,
11
+ uniform,
12
+ vec3,
13
+ } from 'three/tsl'
14
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
15
+
16
+ const props = withDefaults(
17
+ defineProps<{
18
+ baseColor?: string
19
+ fresnelColor?: string
20
+ power?: number
21
+ intensity?: number
22
+ transparent?: boolean
23
+ }>(),
24
+ {
25
+ baseColor: '#1e1b4b',
26
+ fresnelColor: '#22d3ee',
27
+ power: 2,
28
+ intensity: 1,
29
+ transparent: false,
30
+ }
31
+ )
32
+
33
+ // Create reactive uniforms
34
+ const baseColorUniform = uniform(new Color(props.baseColor))
35
+ const fresnelColorUniform = uniform(new Color(props.fresnelColor))
36
+ const powerUniform = uniform(props.power)
37
+ const intensityUniform = uniform(props.intensity)
38
+
39
+ // Watch prop changes
40
+ watch(
41
+ () => props.baseColor,
42
+ (val) => {
43
+ baseColorUniform.value = new Color(val)
44
+ }
45
+ )
46
+ watch(
47
+ () => props.fresnelColor,
48
+ (val) => {
49
+ fresnelColorUniform.value = new Color(val)
50
+ }
51
+ )
52
+ watch(
53
+ () => props.power,
54
+ (val) => {
55
+ powerUniform.value = val
56
+ }
57
+ )
58
+ watch(
59
+ () => props.intensity,
60
+ (val) => {
61
+ intensityUniform.value = val
62
+ }
63
+ )
64
+
65
+ const material = computed(() => {
66
+ const mat = new MeshBasicNodeMaterial()
67
+
68
+ // Calculate fresnel with reactive uniforms
69
+ const viewDir = normalize(positionViewDirection.negate())
70
+ const normal = normalize(normalView)
71
+ const nDotV = dot(normal, viewDir).clamp(0, 1)
72
+ const fresnelFactor = pow(float(1).sub(nDotV), powerUniform).mul(intensityUniform)
73
+
74
+ // Mix colors based on fresnel using reactive uniforms
75
+ const colorNode = mix(vec3(baseColorUniform), vec3(fresnelColorUniform), fresnelFactor)
76
+
77
+ mat.colorNode = colorNode as any
78
+ mat.transparent = props.transparent
79
+ mat.side = DoubleSide
80
+
81
+ return mat
82
+ })
83
+
84
+ defineExpose({ material })
85
+ </script>
86
+
87
+ <template>
88
+ <primitive :object="material" attach="material" />
89
+ </template>