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,185 @@
1
+ <script setup lang="ts">
2
+ import { Color, DoubleSide } from 'three'
3
+ import { mix, sin, time as tslTime, uniform, uv, vec3 } from 'three/tsl'
4
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
5
+ import type { UniformNode } from 'three/webgpu'
6
+ import type { TSLNode } from '../../types'
7
+
8
+ const props = withDefaults(
9
+ defineProps<{
10
+ colors?: string[]
11
+ angle?: number
12
+ type?: 'linear' | 'radial'
13
+ animated?: boolean
14
+ speed?: number
15
+ transparent?: boolean
16
+ /** Mouse X position (0-1) for interaction */
17
+ mouseX?: number
18
+ /** Mouse Y position (0-1) for interaction */
19
+ mouseY?: number
20
+ /** Enable mouse interaction */
21
+ mouseInteraction?: boolean
22
+ /** Mouse interaction strength */
23
+ mouseStrength?: number
24
+ }>(),
25
+ {
26
+ colors: () => ['#4f46e5', '#7c3aed', '#ec4899'],
27
+ angle: 0,
28
+ type: 'linear',
29
+ animated: false,
30
+ speed: 1,
31
+ transparent: false,
32
+ mouseX: 0.5,
33
+ mouseY: 0.5,
34
+ mouseInteraction: false,
35
+ mouseStrength: 0.3,
36
+ }
37
+ )
38
+
39
+ // Create reactive uniforms for all animatable properties
40
+ const angleUniform = uniform(props.angle)
41
+ const speedUniform = uniform(props.speed)
42
+ const mouseXUniform = uniform(props.mouseX)
43
+ const mouseYUniform = uniform(props.mouseY)
44
+ const mouseStrengthUniform = uniform(props.mouseStrength)
45
+
46
+ // Create color uniforms (up to 5 colors supported) - stored as typed array
47
+ const colorUniforms: UniformNode<Color>[] = [
48
+ uniform(new Color(props.colors[0] || '#4f46e5')),
49
+ uniform(new Color(props.colors[1] || '#7c3aed')),
50
+ uniform(new Color(props.colors[2] || '#ec4899')),
51
+ uniform(new Color(props.colors[3] || '#ec4899')),
52
+ uniform(new Color(props.colors[4] || '#ec4899')),
53
+ ]
54
+
55
+ // Watch prop changes and update uniforms
56
+ watch(
57
+ () => props.angle,
58
+ (val) => {
59
+ angleUniform.value = val
60
+ }
61
+ )
62
+ watch(
63
+ () => props.speed,
64
+ (val) => {
65
+ speedUniform.value = val
66
+ }
67
+ )
68
+ watch(
69
+ () => props.mouseX,
70
+ (val) => {
71
+ mouseXUniform.value = val
72
+ }
73
+ )
74
+ watch(
75
+ () => props.mouseY,
76
+ (val) => {
77
+ mouseYUniform.value = val
78
+ }
79
+ )
80
+ watch(
81
+ () => props.mouseStrength,
82
+ (val) => {
83
+ mouseStrengthUniform.value = val
84
+ }
85
+ )
86
+
87
+ watch(
88
+ () => props.colors,
89
+ (colors) => {
90
+ colors.forEach((c, i) => {
91
+ if (i < colorUniforms.length) {
92
+ colorUniforms[i]!.value = new Color(c)
93
+ }
94
+ })
95
+ },
96
+ { deep: true }
97
+ )
98
+
99
+ const material = computed(() => {
100
+ const mat = new MeshBasicNodeMaterial()
101
+ const colorCount = props.colors.length
102
+
103
+ // Get UV coordinates
104
+ let t: TSLNode = uv().y
105
+
106
+ // Apply angle rotation for linear gradient (using uniform for reactivity)
107
+ if (props.type === 'linear') {
108
+ const rad = angleUniform.mul(Math.PI / 180)
109
+ const cosVal = rad.cos()
110
+ const sinVal = rad.sin()
111
+ t = uv().x.mul(sinVal).add(uv().y.mul(cosVal))
112
+ }
113
+
114
+ // Radial gradient uses distance from center
115
+ if (props.type === 'radial') {
116
+ let center = uv().sub(0.5)
117
+ // Add mouse interaction offset
118
+ if (props.mouseInteraction) {
119
+ const mouseOffset = vec3(
120
+ mouseXUniform.sub(0.5).mul(mouseStrengthUniform),
121
+ mouseYUniform.sub(0.5).mul(mouseStrengthUniform),
122
+ 0
123
+ )
124
+ center = center.sub(mouseOffset.xy)
125
+ }
126
+ t = center.length().mul(2)
127
+ }
128
+
129
+ // Add mouse interaction for linear gradients
130
+ if (props.type === 'linear' && props.mouseInteraction) {
131
+ t = t.add(mouseXUniform.sub(0.5).mul(mouseStrengthUniform))
132
+ }
133
+
134
+ // Add animation
135
+ if (props.animated) {
136
+ t = t.add(sin(tslTime.mul(speedUniform)).mul(0.2))
137
+ }
138
+
139
+ // Build gradient from colors using uniforms
140
+ // Use type assertion since we know the array is initialized
141
+ const c0 = colorUniforms[0] as UniformNode<Color>
142
+ const c1 = colorUniforms[1] as UniformNode<Color>
143
+ const c2 = colorUniforms[2] as UniformNode<Color>
144
+ const c3 = colorUniforms[3] as UniformNode<Color>
145
+ const c4 = colorUniforms[4] as UniformNode<Color>
146
+
147
+ let colorNode: TSLNode = vec3(c0 as unknown as TSLNode)
148
+
149
+ if (colorCount === 2) {
150
+ colorNode = mix(vec3(c0 as unknown as TSLNode), vec3(c1 as unknown as TSLNode), t)
151
+ } else if (colorCount >= 3) {
152
+ // Multi-stop gradient using pre-extracted uniforms
153
+ const uniforms = [c0, c1, c2, c3, c4]
154
+ const segments = colorCount - 1
155
+
156
+ for (let i = 0; i < segments && i < 4; i++) {
157
+ const localT = t.mul(segments).sub(i).clamp(0, 1)
158
+ const currColor = uniforms[i] as unknown as TSLNode
159
+ const nextColor = uniforms[i + 1] as unknown as TSLNode
160
+
161
+ if (i === 0) {
162
+ colorNode = mix(vec3(currColor), vec3(nextColor), localT)
163
+ } else {
164
+ const prevT = t
165
+ .mul(segments)
166
+ .sub(i - 1)
167
+ .clamp(0, 1)
168
+ colorNode = mix(colorNode, mix(vec3(currColor), vec3(nextColor), localT), prevT.step(1))
169
+ }
170
+ }
171
+ }
172
+
173
+ mat.colorNode = colorNode
174
+ mat.transparent = props.transparent
175
+ mat.side = DoubleSide
176
+
177
+ return mat
178
+ })
179
+
180
+ defineExpose({ material })
181
+ </script>
182
+
183
+ <template>
184
+ <primitive :object="material" attach="material" />
185
+ </template>
@@ -0,0 +1,232 @@
1
+ <!-- eslint-disable no-console -->
2
+ <script setup lang="ts">
3
+ import { DoubleSide, type Texture } from 'three'
4
+ import {
5
+ float,
6
+ mix,
7
+ sin,
8
+ smoothstep,
9
+ texture,
10
+ time as tslTime,
11
+ uniform,
12
+ uv,
13
+ vec2,
14
+ vec3,
15
+ vec4,
16
+ } from 'three/tsl'
17
+ import { MeshBasicNodeMaterial, TextureLoader } from 'three/webgpu'
18
+ import type { TSLNode } from '../../types'
19
+ import { simplexNoise2D } from '../../utils/tsl/noise'
20
+
21
+ const props = withDefaults(
22
+ defineProps<{
23
+ /** Image source URL or path */
24
+ src: string
25
+ /** Distortion effect strength (0 = none) */
26
+ distortion?: number
27
+ /** Distortion speed */
28
+ distortionSpeed?: number
29
+ /** Enable mouse-reactive ripple effect */
30
+ mouseRipple?: boolean
31
+ /** Ripple strength */
32
+ rippleStrength?: number
33
+ /** Zoom level (1 = normal) */
34
+ zoom?: number
35
+ /** Grayscale amount (0-1) */
36
+ grayscale?: number
37
+ /** RGB shift/chromatic aberration amount */
38
+ rgbShift?: number
39
+ /** Enable vignette effect */
40
+ vignette?: boolean
41
+ /** Vignette intensity */
42
+ vignetteIntensity?: number
43
+ /** Transparent background */
44
+ transparent?: boolean
45
+ /** Mouse X position (0-1) for external control */
46
+ mouseX?: number
47
+ /** Mouse Y position (0-1) for external control */
48
+ mouseY?: number
49
+ }>(),
50
+ {
51
+ distortion: 0,
52
+ distortionSpeed: 1,
53
+ mouseRipple: false,
54
+ rippleStrength: 0.02,
55
+ zoom: 1,
56
+ grayscale: 0,
57
+ rgbShift: 0,
58
+ vignette: false,
59
+ vignetteIntensity: 0.5,
60
+ transparent: false,
61
+ mouseX: 0.5,
62
+ mouseY: 0.5,
63
+ }
64
+ )
65
+
66
+ const loadedTexture = ref<Texture | null>(null)
67
+ const isLoading = ref(true)
68
+ const error = ref<Error | null>(null)
69
+
70
+ // Reactive uniforms
71
+ const mouseXUniform = uniform(props.mouseX)
72
+ const mouseYUniform = uniform(props.mouseY)
73
+ const distortionUniform = uniform(props.distortion)
74
+ const distortionSpeedUniform = uniform(props.distortionSpeed)
75
+ const rippleStrengthUniform = uniform(props.rippleStrength)
76
+ const zoomUniform = uniform(props.zoom)
77
+ const grayscaleUniform = uniform(props.grayscale)
78
+ const rgbShiftUniform = uniform(props.rgbShift)
79
+ const vignetteIntensityUniform = uniform(props.vignetteIntensity)
80
+
81
+ // Watch all prop changes for reactivity
82
+ watch(
83
+ () => props.mouseX,
84
+ (val) => {
85
+ mouseXUniform.value = val
86
+ }
87
+ )
88
+ watch(
89
+ () => props.mouseY,
90
+ (val) => {
91
+ mouseYUniform.value = val
92
+ }
93
+ )
94
+ watch(
95
+ () => props.distortion,
96
+ (val) => {
97
+ distortionUniform.value = val
98
+ }
99
+ )
100
+ watch(
101
+ () => props.distortionSpeed,
102
+ (val) => {
103
+ distortionSpeedUniform.value = val
104
+ }
105
+ )
106
+ watch(
107
+ () => props.rippleStrength,
108
+ (val) => {
109
+ rippleStrengthUniform.value = val
110
+ }
111
+ )
112
+ watch(
113
+ () => props.zoom,
114
+ (val) => {
115
+ zoomUniform.value = val
116
+ }
117
+ )
118
+ watch(
119
+ () => props.grayscale,
120
+ (val) => {
121
+ grayscaleUniform.value = val
122
+ }
123
+ )
124
+ watch(
125
+ () => props.rgbShift,
126
+ (val) => {
127
+ rgbShiftUniform.value = val
128
+ }
129
+ )
130
+ watch(
131
+ () => props.vignetteIntensity,
132
+ (val) => {
133
+ vignetteIntensityUniform.value = val
134
+ }
135
+ )
136
+
137
+ // Load texture
138
+ watch(
139
+ () => props.src,
140
+ async (src) => {
141
+ if (!src) return
142
+
143
+ isLoading.value = true
144
+ error.value = null
145
+
146
+ try {
147
+ const loader = new TextureLoader()
148
+ loadedTexture.value = await loader.loadAsync(src)
149
+ } catch (e) {
150
+ error.value = e as Error
151
+ console.error('Failed to load texture:', e)
152
+ } finally {
153
+ isLoading.value = false
154
+ }
155
+ },
156
+ { immediate: true }
157
+ )
158
+
159
+ const material = computed(() => {
160
+ if (!loadedTexture.value) return null
161
+
162
+ const mat = new MeshBasicNodeMaterial()
163
+ const tex = loadedTexture.value
164
+
165
+ // Start with base UV
166
+ let uvCoord: TSLNode = uv()
167
+
168
+ // Apply zoom (centered) - using uniform for reactivity
169
+ const zoomFactor = float(1).div(zoomUniform)
170
+ const zoomOffset = float(1).sub(float(1).div(zoomUniform)).mul(0.5)
171
+ uvCoord = uvCoord.mul(zoomFactor).add(zoomOffset)
172
+
173
+ // Apply distortion using uniforms
174
+ const animatedUV = uvCoord.add(tslTime.mul(distortionSpeedUniform))
175
+ const noiseVal = simplexNoise2D(animatedUV.mul(3))
176
+ const distortedUV = uvCoord.add(noiseVal.mul(distortionUniform).mul(0.1))
177
+ // Use step to conditionally apply distortion
178
+ const hasDistortion = distortionUniform.greaterThan(0.001)
179
+ uvCoord = mix(uvCoord, distortedUV, hasDistortion) as TSLNode
180
+
181
+ // Apply mouse ripple effect
182
+ if (props.mouseRipple) {
183
+ const mousePos = vec2(mouseXUniform, mouseYUniform)
184
+ const diff = uvCoord.sub(mousePos)
185
+ const dist = diff.length()
186
+ const ripple = sin(dist.mul(30).sub(tslTime.mul(3))).mul(rippleStrengthUniform)
187
+ const falloff = smoothstep(0.5, 0, dist)
188
+ uvCoord = uvCoord.add(diff.normalize().mul(ripple).mul(falloff))
189
+ }
190
+
191
+ // Sample the texture with RGB shift for chromatic aberration
192
+ const shift = rgbShiftUniform.mul(0.01)
193
+ const rChannel = texture(tex, uvCoord.add(vec2(shift, 0))).r
194
+ const gChannel = texture(tex, uvCoord).g
195
+ const bChannel = texture(tex, uvCoord.sub(vec2(shift, 0))).b
196
+ const aChannel = texture(tex, uvCoord).a
197
+
198
+ let colorNode: TSLNode = vec4(rChannel, gChannel, bChannel, aChannel)
199
+
200
+ // Apply grayscale using uniform
201
+ const rgb = vec3(colorNode.x, colorNode.y, colorNode.z)
202
+ const gray = rgb.dot(vec3(0.299, 0.587, 0.114))
203
+ const grayColor = vec3(gray, gray, gray)
204
+ const blendedRgb = mix(rgb, grayColor, grayscaleUniform)
205
+ colorNode = vec4(blendedRgb.x, blendedRgb.y, blendedRgb.z, colorNode.w)
206
+
207
+ // Apply vignette
208
+ if (props.vignette) {
209
+ const center = vec2(0.5, 0.5)
210
+ const dist = uv().sub(center).length()
211
+ const vignetteAmount = smoothstep(0.2, 0.8, dist).mul(vignetteIntensityUniform)
212
+ colorNode = colorNode.mul(float(1).sub(vignetteAmount))
213
+ }
214
+
215
+ mat.colorNode = colorNode
216
+ mat.transparent = props.transparent
217
+ mat.side = DoubleSide
218
+
219
+ return mat
220
+ })
221
+
222
+ defineExpose({
223
+ material,
224
+ isLoading,
225
+ error,
226
+ loadedTexture,
227
+ })
228
+ </script>
229
+
230
+ <template>
231
+ <primitive v-if="material" :object="material" attach="material" />
232
+ </template>
@@ -0,0 +1,79 @@
1
+ <!-- eslint-disable vue/require-default-prop -->
2
+ <script setup lang="ts">
3
+ import { BackSide, DoubleSide, FrontSide } from 'three'
4
+ import { MeshBasicNodeMaterial, MeshStandardNodeMaterial } from 'three/webgpu'
5
+ import type { TSLNode } from '../../types'
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ type?: 'basic' | 'standard'
10
+ colorNode?: TSLNode
11
+ opacityNode?: TSLNode
12
+ normalNode?: TSLNode
13
+ emissiveNode?: TSLNode
14
+ metalnessNode?: TSLNode
15
+ roughnessNode?: TSLNode
16
+ positionNode?: TSLNode
17
+ transparent?: boolean
18
+ side?: 'front' | 'back' | 'double'
19
+ wireframe?: boolean
20
+ flatShading?: boolean
21
+ depthTest?: boolean
22
+ depthWrite?: boolean
23
+ }>(),
24
+ {
25
+ type: 'basic',
26
+ transparent: false,
27
+ side: 'front',
28
+ wireframe: false,
29
+ flatShading: false,
30
+ depthTest: true,
31
+ depthWrite: true,
32
+ }
33
+ )
34
+
35
+ const sideMap = {
36
+ front: FrontSide,
37
+ back: BackSide,
38
+ double: DoubleSide,
39
+ }
40
+
41
+ const material = computed(() => {
42
+ const mat =
43
+ props.type === 'standard' ? new MeshStandardNodeMaterial() : new MeshBasicNodeMaterial()
44
+
45
+ // Apply node properties
46
+ if (props.colorNode) mat.colorNode = props.colorNode
47
+ if (props.opacityNode) {
48
+ mat.opacityNode = props.opacityNode
49
+ mat.transparent = true
50
+ }
51
+ if (props.normalNode) mat.normalNode = props.normalNode
52
+ if (props.positionNode) mat.positionNode = props.positionNode
53
+
54
+ // Standard material specific
55
+ if (mat instanceof MeshStandardNodeMaterial) {
56
+ if (props.emissiveNode) mat.emissiveNode = props.emissiveNode
57
+ if (props.metalnessNode) mat.metalnessNode = props.metalnessNode
58
+ if (props.roughnessNode) mat.roughnessNode = props.roughnessNode
59
+ mat.flatShading = props.flatShading
60
+ }
61
+
62
+ // Standard properties
63
+ mat.transparent = props.transparent || !!props.opacityNode
64
+ mat.side = sideMap[props.side]
65
+ mat.wireframe = props.wireframe
66
+ mat.depthTest = props.depthTest
67
+ mat.depthWrite = props.depthWrite
68
+
69
+ return mat
70
+ })
71
+
72
+ // Expose material for parent access
73
+ defineExpose({ material })
74
+ </script>
75
+
76
+ <template>
77
+ <TresMeshBasicMaterial v-if="type === 'basic'" v-bind="material" />
78
+ <TresMeshStandardMaterial v-else v-bind="material" />
79
+ </template>
@@ -0,0 +1,141 @@
1
+ <script setup lang="ts">
2
+ import { Color, DoubleSide } from 'three'
3
+ import { mix, time as tslTime, uniform, uv, vec3 } from 'three/tsl'
4
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
5
+ import { fbm, simplexNoise2D } from '../../utils/tsl/noise'
6
+
7
+ const props = withDefaults(
8
+ defineProps<{
9
+ scale?: number
10
+ speed?: number
11
+ octaves?: number
12
+ baseColor?: string
13
+ peakColor?: string
14
+ type?: 'simplex' | 'fbm'
15
+ transparent?: boolean
16
+ /** Mouse X position (0-1) for interaction */
17
+ mouseX?: number
18
+ /** Mouse Y position (0-1) for interaction */
19
+ mouseY?: number
20
+ /** Enable mouse interaction */
21
+ mouseInteraction?: boolean
22
+ /** Mouse interaction strength */
23
+ mouseStrength?: number
24
+ }>(),
25
+ {
26
+ scale: 3,
27
+ speed: 0.5,
28
+ octaves: 4,
29
+ baseColor: '#1e1b4b',
30
+ peakColor: '#c084fc',
31
+ type: 'simplex',
32
+ transparent: false,
33
+ mouseX: 0.5,
34
+ mouseY: 0.5,
35
+ mouseInteraction: false,
36
+ mouseStrength: 0.5,
37
+ }
38
+ )
39
+
40
+ // Create reactive uniforms
41
+ const scaleUniform = uniform(props.scale)
42
+ const speedUniform = uniform(props.speed)
43
+ const mouseXUniform = uniform(props.mouseX)
44
+ const mouseYUniform = uniform(props.mouseY)
45
+ const mouseStrengthUniform = uniform(props.mouseStrength)
46
+ const baseColorUniform = uniform(new Color(props.baseColor))
47
+ const peakColorUniform = uniform(new Color(props.peakColor))
48
+
49
+ // Watch prop changes
50
+ watch(
51
+ () => props.scale,
52
+ (val) => {
53
+ scaleUniform.value = val
54
+ }
55
+ )
56
+ watch(
57
+ () => props.speed,
58
+ (val) => {
59
+ speedUniform.value = val
60
+ }
61
+ )
62
+ watch(
63
+ () => props.mouseX,
64
+ (val) => {
65
+ mouseXUniform.value = val
66
+ }
67
+ )
68
+ watch(
69
+ () => props.mouseY,
70
+ (val) => {
71
+ mouseYUniform.value = val
72
+ }
73
+ )
74
+ watch(
75
+ () => props.mouseStrength,
76
+ (val) => {
77
+ mouseStrengthUniform.value = val
78
+ }
79
+ )
80
+ watch(
81
+ () => props.baseColor,
82
+ (val) => {
83
+ baseColorUniform.value = new Color(val)
84
+ }
85
+ )
86
+ watch(
87
+ () => props.peakColor,
88
+ (val) => {
89
+ peakColorUniform.value = new Color(val)
90
+ }
91
+ )
92
+
93
+ const material = computed(() => {
94
+ const mat = new MeshBasicNodeMaterial()
95
+
96
+ // Animated UV with reactive uniforms
97
+ let animatedUV = uv().mul(scaleUniform).add(tslTime.mul(speedUniform))
98
+
99
+ // Add mouse interaction
100
+ if (props.mouseInteraction) {
101
+ const mouseOffset = vec3(
102
+ mouseXUniform.sub(0.5).mul(mouseStrengthUniform),
103
+ mouseYUniform.sub(0.5).mul(mouseStrengthUniform),
104
+ 0
105
+ )
106
+ animatedUV = animatedUV.add(mouseOffset.xy)
107
+ }
108
+
109
+ // Generate noise based on type
110
+ let noiseValue
111
+ if (props.type === 'fbm') {
112
+ noiseValue = fbm(vec3(animatedUV.x, animatedUV.y, tslTime.mul(speedUniform.mul(0.1))), {
113
+ octaves: props.octaves,
114
+ lacunarity: 2.0,
115
+ gain: 0.5,
116
+ amplitude: 0.5,
117
+ frequency: 1.0,
118
+ })
119
+ } else {
120
+ noiseValue = simplexNoise2D(animatedUV)
121
+ }
122
+
123
+ // Remap noise from [-1, 1] to [0, 1]
124
+ const normalizedNoise = noiseValue.mul(0.5).add(0.5)
125
+
126
+ // Mix colors based on noise using reactive uniforms
127
+ const colorNode = mix(vec3(baseColorUniform), vec3(peakColorUniform), normalizedNoise)
128
+
129
+ mat.colorNode = colorNode as any
130
+ mat.transparent = props.transparent
131
+ mat.side = DoubleSide
132
+
133
+ return mat
134
+ })
135
+
136
+ defineExpose({ material })
137
+ </script>
138
+
139
+ <template>
140
+ <primitive :object="material" attach="material" />
141
+ </template>
@@ -0,0 +1,27 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ width?: number
5
+ height?: number
6
+ widthSegments?: number
7
+ heightSegments?: number
8
+ position?: [number, number, number]
9
+ rotation?: [number, number, number]
10
+ }>(),
11
+ {
12
+ width: 2,
13
+ height: 2,
14
+ widthSegments: 1,
15
+ heightSegments: 1,
16
+ position: () => [0, 0, 0],
17
+ rotation: () => [0, 0, 0],
18
+ }
19
+ )
20
+ </script>
21
+
22
+ <template>
23
+ <TresMesh :position :rotation>
24
+ <TresPlaneGeometry :args="[width, height, widthSegments, heightSegments]" />
25
+ <slot />
26
+ </TresMesh>
27
+ </template>