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,182 @@
1
+ import {
2
+ Fn,
3
+ length,
4
+ min,
5
+ max,
6
+ abs,
7
+ vec2,
8
+ sqrt,
9
+ sign,
10
+ float,
11
+ dot,
12
+ vec3,
13
+ If,
14
+ clamp,
15
+ select,
16
+ mul,
17
+ sub,
18
+ add,
19
+ } from 'three/tsl'
20
+
21
+ /**
22
+ * Returns a sphere SDF based on a given uv and radius.
23
+ * @param {Array} _uv - The UV coordinates (vec2).
24
+ * @param {number} [r=0.0] - The radius of the sphere.
25
+ * @returns {number} The signed distance from the sphere surface.
26
+ */
27
+ export const sdSphere = Fn(([_uv, r = float(0.0)]) => {
28
+ const _r = float(r)
29
+ return length(_uv).sub(_r)
30
+ })
31
+
32
+ /**
33
+ * Returns a 2d box SDF based on a given uv and size.
34
+ * @param {vec2} _uv - The UV coordinates (vec2).
35
+ * @param {number} [_size=0.0] - The half-size (extent) of the box along each axis.
36
+ * @returns {number} The signed distance from the box surface.
37
+ */
38
+ export const sdBox2d = Fn(([_uv, _size = float(0.0)]) => {
39
+ return max(abs(_uv.x), abs(_uv.y)).sub(_size)
40
+ })
41
+
42
+ /**
43
+ * Returns a 2d box SDF based on a given uv and size.
44
+ * @param {vec2} _uv - The UV coordinates (vec2).
45
+ * @param {vec3} [_size=0.0] - The half-size (extent) of the box along each axis.
46
+ * @returns {number} The signed distance from the box surface.
47
+ */
48
+ export const sdBox3d = Fn(([p, b = vec3(0)]) => {
49
+ const q = abs(p).sub(b)
50
+ return length(max(q, 0.0)).add(min(max(q.x, max(q.y, q.z)), 0.0))
51
+ })
52
+
53
+ /**
54
+ * Returns a diamond SDF based on a given uv and radius.
55
+ * @param {Array} _uv - The UV coordinates (vec2).
56
+ * @param {number} [r=0.0] - The radius of the diamond.
57
+ * @returns {number} The signed distance from the diamond surface.
58
+ */
59
+ export const sdDiamond = Fn(([_uv, r = 0.0]) => {
60
+ return abs(_uv.x).add(abs(_uv.y)).sub(r)
61
+ })
62
+
63
+ /**
64
+ * Returns a hexagon SDF based on a given point and radius.
65
+ * @param {Array} p - The point coordinates (vec2).
66
+ * @param {number} [_r=0.5] - The radius of the hexagon.
67
+ * @returns {number} The signed distance from the hexagon surface.
68
+ */
69
+ export const sdHexagon = Fn(([p, _r = 0.5]) => {
70
+ const r = float(_r)
71
+ const k = vec3(-0.866025404, 0.5, 0.577350269)
72
+
73
+ const _p = abs(p).toVar()
74
+ _p.subAssign(float(2.0).mul(min(dot(k.xy, _p), 0.0).mul(k.xy)))
75
+ _p.subAssign(vec2(clamp(_p.x, k.z.negate().mul(r), k.z.mul(r)), r))
76
+
77
+ return length(_p).mul(sign(_p.y))
78
+ })
79
+
80
+ /**
81
+ * Returns an equilateral triangle SDF based on a given point and radius.
82
+ * @param {Array} p - The point coordinates (vec2).
83
+ * @param {number} [_r=0.1] - The radius of the triangle (float).
84
+ * @returns {number} The signed distance from the triangle surface.
85
+ */
86
+ export const sdEquilateralTriangle = Fn(([p, _r = float(0.1)]) => {
87
+ const r = float(_r)
88
+
89
+ const k = sqrt(3.0)
90
+ const _p = (p ?? vec2(0)).toVar()
91
+
92
+ _p.x = abs(_p.x).sub(r).toVar()
93
+ _p.y = _p.y.add(r.div(k)).toVar()
94
+
95
+ If(_p.x.add(k.mul(_p.y)).greaterThan(0), () => {
96
+ _p.assign(vec2(_p.x.sub(k.mul(_p.y)), k.negate().mul(_p.x).sub(_p.y)).div(2))
97
+ })
98
+
99
+ _p.x.subAssign(clamp(_p.x, r.mul(-2), 0.0))
100
+ return length(_p).negate().mul(sign(_p.y))
101
+ })
102
+
103
+ /**
104
+ * Returns a line SDF for a given coordinate.
105
+ * @param {number} p - The coordinate (float).
106
+ * @returns {number} The signed distance from the line.
107
+ */
108
+ export const sdLine = Fn(([p]) => {
109
+ return abs(p)
110
+ })
111
+
112
+ /**
113
+ * Returns a ring SDF based on a given uv and radius.
114
+ * @param {Array} _uv - The UV coordinates (vec2).
115
+ * @param {number} [s=0.4] - The radius of the ring.
116
+ * @returns {number} The signed distance from the ring surface.
117
+ */
118
+ export const sdRing = Fn(([_uv, s = float(0.4)]) => {
119
+ return abs(length(_uv).sub(s)).toVar()
120
+ })
121
+
122
+ /**
123
+ * Returns a parallelogram SDF based on a given uv and size.
124
+ * @param {Array} _uv - The UV coordinates (vec2).
125
+ * @param {Object} [options] - Optional configuration values.
126
+ * @param {number} [options.wi=0.4] - The width of the parallelogram.
127
+ * @param {number} [options.he=0.1] - The height of the parallelogram.
128
+ * @param {number} [options.sk=0.1] - The skew of the parallelogram.
129
+ * @returns {number} The signed distance from the parallelogram surface.
130
+ */
131
+ export const sdParallelogram = Fn(([_p, options = {}]) => {
132
+ const { wi = float(0.4), he = float(0.1), sk = float(0.1) } = options
133
+ const p = _p.toVar()
134
+ const e = vec2(sk, he)
135
+
136
+ p.assign(select(p.y.lessThan(0.0), p.negate(), p))
137
+
138
+ const w = p.sub(e)
139
+ w.x.subAssign(clamp(w.x, wi.negate(), wi))
140
+
141
+ const d = vec2(dot(w, w), w.y.negate()).toVar()
142
+ const s = p.x.mul(e.y).sub(p.y.mul(e.x))
143
+
144
+ p.assign(select(s.lessThan(0.0), p.negate(), p))
145
+
146
+ const v = p.sub(vec2(wi, 0)).toVar()
147
+
148
+ v.subAssign(e.mul(clamp(dot(v, e).div(dot(e, e)), -1.0, 1.0)))
149
+ d.assign(min(d, vec2(dot(v, v), wi.mul(he).sub(abs(s)))))
150
+
151
+ return sqrt(d.x).mul(sign(d.y.negate()))
152
+ })
153
+
154
+ const ndot = Fn(([a, b]) => {
155
+ return a.x.mul(b.x).sub(a.y.mul(b.y))
156
+ })
157
+
158
+ /**
159
+ * Returns a rhombus SDF based on a given uv and size.
160
+ * @param {Array} _uv - The UV coordinates (vec2).
161
+ * @param {number} [b=0.4] - The size of the rhombus.
162
+ * @returns {number} The signed distance from the rhombus surface.
163
+ */
164
+ export const sdRhombus = Fn(([_p, b = vec2(0.4)]) => {
165
+ const p = _p.toVar()
166
+ p.assign(abs(p))
167
+ const h = clamp(ndot(b.sub(mul(2.0, p)), b).div(dot(b, b)), -1.0, 1.0)
168
+ const d = length(p.sub(mul(0.5, b).mul(vec2(sub(1.0, h), add(1.0, h)))))
169
+
170
+ return d.mul(sign(p.x.mul(b.y).add(p.y.mul(b.x).sub(b.x.mul(b.y)))))
171
+ })
172
+
173
+ /**
174
+ * Returns a triangle SDF based on a given uv and size.
175
+ * @param {Array} _uv - The UV coordinates (vec2).
176
+ * @param {number} [size=0.4] - The size of the triangle.
177
+ * @returns {number} The signed distance from the triangle surface.
178
+ */
179
+ export const sdTriangle = Fn(([_p, size = float(0.4)]) => {
180
+ const t = max(abs(_p.x.mul(size)).add(_p.y), abs(_p.y.mul(size).sub(0.5)).sub(0.5))
181
+ return t
182
+ })
@@ -0,0 +1,33 @@
1
+ export const clamp = (min, input, max) => {
2
+ return Math.max(min, Math.min(input, max))
3
+ }
4
+
5
+ export const mapRange = (in_min, in_max, input, out_min, out_max) => {
6
+ return ((input - in_min) * (out_max - out_min)) / (in_max - in_min) + out_min
7
+ }
8
+
9
+ export const lerp = (start, end, amt) => {
10
+ return (1 - amt) * start + amt * end
11
+ }
12
+
13
+ export const truncate = (value, decimals) => {
14
+ return parseFloat(value.toFixed(decimals))
15
+ }
16
+
17
+ export const randomFromRange = (min, max) => {
18
+ return Math.random() * (max - min) + min
19
+ }
20
+
21
+ export const randomFromArray = (array) => {
22
+ return array[Math.floor(Math.random() * array.length)]
23
+ }
24
+
25
+ export const normalize = (val, min, max) => Math.max(0, Math.min(1, (val - min) / (max - min)))
26
+
27
+ // Simple ratio function given a width and height
28
+ export const ratio = (width, height) => {
29
+ const ratioX = width > height ? width / height : 1
30
+ const ratioY = width > height ? 1 : height / width
31
+
32
+ return [ratioX, ratioY]
33
+ }
@@ -0,0 +1,23 @@
1
+ import { defineConfig } from 'vite'
2
+ import path from 'path'
3
+
4
+ // https://vitejs.dev/config/
5
+ export default defineConfig({
6
+ optimizeDeps: {
7
+ esbuildOptions: {
8
+ target: 'esnext',
9
+ },
10
+ },
11
+ build: {
12
+ target: 'esnext',
13
+ },
14
+ plugins: [],
15
+ resolve: {
16
+ alias: {
17
+ '@/sketches': path.resolve(__dirname, 'src/sketches'),
18
+ '@/tsl': path.resolve(__dirname, 'src/tsl'),
19
+ '@/components': path.resolve(__dirname, 'src/components'),
20
+ '@/utils': path.resolve(__dirname, 'src/utils'),
21
+ },
22
+ },
23
+ })
@@ -0,0 +1,41 @@
1
+ /* Shader Layer Styles */
2
+
3
+ .shader-canvas {
4
+ width: 100%;
5
+ height: 100%;
6
+ }
7
+
8
+ .shader-debug {
9
+ position: fixed;
10
+ right: 1rem;
11
+ bottom: 1rem;
12
+ z-index: 9999;
13
+ backdrop-filter: blur(8px);
14
+ border-radius: 0.5rem;
15
+ background: rgba(0, 0, 0, 0.8);
16
+ padding: 0.75rem 1rem;
17
+ min-width: 200px;
18
+ color: #fff;
19
+ font-size: 0.75rem;
20
+ font-family: ui-monospace, monospace;
21
+ }
22
+
23
+ .shader-debug-title {
24
+ margin-bottom: 0.5rem;
25
+ color: #a78bfa;
26
+ font-weight: 600;
27
+ }
28
+
29
+ .shader-debug-row {
30
+ display: flex;
31
+ justify-content: space-between;
32
+ padding: 0.125rem 0;
33
+ }
34
+
35
+ .shader-debug-label {
36
+ color: #94a3b8;
37
+ }
38
+
39
+ .shader-debug-value {
40
+ color: #22c55e;
41
+ }
@@ -0,0 +1,8 @@
1
+ <script setup lang="ts">
2
+ // @tresjs/post-processing v3 exports components differently
3
+ // Import from the package root and use the correct component name
4
+ </script>
5
+
6
+ <template>
7
+ <slot />
8
+ </template>
@@ -0,0 +1,8 @@
1
+ <script setup lang="ts">
2
+ // @tresjs/post-processing v3 exports components differently
3
+ // These will need to be used directly from the package in templates
4
+ </script>
5
+
6
+ <template>
7
+ <slot />
8
+ </template>
@@ -0,0 +1,20 @@
1
+ <script setup lang="ts">
2
+ import { EffectComposer } from '@tresjs/post-processing'
3
+
4
+ const props = withDefaults(
5
+ defineProps<{
6
+ enabled?: boolean
7
+ }>(),
8
+ {
9
+ enabled: true,
10
+ }
11
+ )
12
+ </script>
13
+
14
+ <template>
15
+ <Suspense>
16
+ <EffectComposer v-if="enabled">
17
+ <slot />
18
+ </EffectComposer>
19
+ </Suspense>
20
+ </template>
@@ -0,0 +1,172 @@
1
+ <script setup lang="ts">
2
+ // @ts-nocheck - TSL types are complex
3
+ import { Color, DoubleSide } from 'three'
4
+ import {
5
+ add,
6
+ mix,
7
+ mul,
8
+ pow,
9
+ smoothstep,
10
+ sub,
11
+ time as tslTime,
12
+ uniform,
13
+ uv,
14
+ vec2,
15
+ vec3,
16
+ } from 'three/tsl'
17
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
18
+ import { fbm2D, simplexNoise2D } from '../../shaders/common/noise'
19
+ import { cosinePalette } from '../../shaders/common/palette'
20
+
21
+ const props = withDefaults(
22
+ defineProps<{
23
+ speed?: number
24
+ intensity?: number
25
+ color1?: string
26
+ color2?: string
27
+ color3?: string
28
+ mouseX?: number
29
+ mouseY?: number
30
+ mouseInteraction?: boolean
31
+ mouseStrength?: number
32
+ }>(),
33
+ {
34
+ speed: 1.0,
35
+ intensity: 1.0,
36
+ color1: '#0a0a20',
37
+ color2: '#00ff87',
38
+ color3: '#60efff',
39
+ mouseX: 0.5,
40
+ mouseY: 0.5,
41
+ mouseInteraction: true,
42
+ mouseStrength: 0.5,
43
+ }
44
+ )
45
+
46
+ // Create reactive uniforms
47
+ const speedUniform = uniform(props.speed)
48
+ const intensityUniform = uniform(props.intensity)
49
+ const mouseXUniform = uniform(props.mouseX)
50
+ const mouseYUniform = uniform(props.mouseY)
51
+ const mouseStrengthUniform = uniform(props.mouseStrength)
52
+ const color1Uniform = uniform(new Color(props.color1))
53
+ const color2Uniform = uniform(new Color(props.color2))
54
+ const color3Uniform = uniform(new Color(props.color3))
55
+
56
+ // Watch prop changes
57
+ watch(
58
+ () => props.speed,
59
+ (val) => (speedUniform.value = val)
60
+ )
61
+ watch(
62
+ () => props.intensity,
63
+ (val) => (intensityUniform.value = val)
64
+ )
65
+ watch(
66
+ () => props.mouseX,
67
+ (val) => (mouseXUniform.value = val)
68
+ )
69
+ watch(
70
+ () => props.mouseY,
71
+ (val) => (mouseYUniform.value = val)
72
+ )
73
+ watch(
74
+ () => props.mouseStrength,
75
+ (val) => (mouseStrengthUniform.value = val)
76
+ )
77
+ watch(
78
+ () => props.color1,
79
+ (val) => (color1Uniform.value = new Color(val))
80
+ )
81
+ watch(
82
+ () => props.color2,
83
+ (val) => (color2Uniform.value = new Color(val))
84
+ )
85
+ watch(
86
+ () => props.color3,
87
+ (val) => (color3Uniform.value = new Color(val))
88
+ )
89
+
90
+ const material = computed(() => {
91
+ const mat = new MeshBasicNodeMaterial()
92
+
93
+ // Time animation
94
+ const time = tslTime.mul(speedUniform).mul(0.2)
95
+
96
+ // Mouse offset
97
+ const mouseOffset = vec2(
98
+ sub(mouseXUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0),
99
+ sub(mouseYUniform, 0.5).mul(props.mouseInteraction ? mouseStrengthUniform : 0)
100
+ )
101
+
102
+ // UV coordinates
103
+ const uvCoord = uv()
104
+
105
+ // Create curtain-like aurora layers using noise
106
+ const curtain1UV = vec2(
107
+ add(mul(uvCoord.x, 3.0), time, mouseOffset.x),
108
+ add(mul(uvCoord.y, 0.5), mul(time, 0.3))
109
+ )
110
+ const curtain1 = simplexNoise2D(curtain1UV)
111
+
112
+ const curtain2UV = vec2(
113
+ sub(mul(uvCoord.x, 4.0), mul(time, 0.7), mul(mouseOffset.x, 0.5)),
114
+ add(mul(uvCoord.y, 0.3), mul(time, 0.2))
115
+ )
116
+ const curtain2 = simplexNoise2D(curtain2UV)
117
+
118
+ const curtain3UV = vec2(
119
+ add(mul(uvCoord.x, 2.5), mul(time, 0.5)),
120
+ sub(mul(uvCoord.y, 0.4), mul(time, 0.1))
121
+ )
122
+ const curtain3 = simplexNoise2D(curtain3UV)
123
+
124
+ // FBM for additional detail
125
+ const fbmUV = add(vec2(mul(uvCoord.x, 2.0), mul(uvCoord.y, 0.6)), mouseOffset, mul(time, 0.3))
126
+ const curtain4 = fbm2D(fbmUV, { octaves: 4, lacunarity: 2.0, gain: 0.5 })
127
+
128
+ // Vertical fade - aurora appears from bottom
129
+ const fade = mul(pow(sub(1.0, uvCoord.y), 1.2), smoothstep(0.0, 0.3, uvCoord.y))
130
+
131
+ // Combine curtains
132
+ const combined = mul(
133
+ add(mul(curtain1, 0.4), mul(curtain2, 0.3), mul(curtain3, 0.2), mul(curtain4, 0.3)),
134
+ fade
135
+ )
136
+ const aurora = mul(smoothstep(-0.3, 0.8, combined), intensityUniform)
137
+
138
+ // Cosine palette for iridescent colors
139
+ const palette = cosinePalette(
140
+ add(aurora, mul(time, 0.1)),
141
+ vec3(0.2, 0.5, 0.4),
142
+ vec3(0.2, 0.4, 0.2),
143
+ vec3(1.0, 1.0, 0.5),
144
+ vec3(0.0, 0.2, 0.5)
145
+ )
146
+
147
+ // Mix colors
148
+ let colorNode = mix(vec3(color1Uniform), vec3(color2Uniform), aurora)
149
+ colorNode = mix(colorNode, vec3(color3Uniform), mul(curtain2, fade, 0.5))
150
+ colorNode = mix(colorNode, palette, mul(aurora, 0.5))
151
+
152
+ // Add shimmer
153
+ const shimmerUV = vec2(add(mul(uvCoord.x, 20.0), mul(time, 10.0)), mul(uvCoord.y, 5.0))
154
+ const shimmer = mul(simplexNoise2D(shimmerUV), 0.1, aurora)
155
+ colorNode = add(colorNode, shimmer)
156
+
157
+ // Dark sky background
158
+ const sky = vec3(0.02, 0.02, 0.06)
159
+ colorNode = mix(sky, colorNode, add(aurora, 0.05))
160
+
161
+ mat.colorNode = colorNode
162
+ mat.side = DoubleSide
163
+
164
+ return mat
165
+ })
166
+
167
+ defineExpose({ material })
168
+ </script>
169
+
170
+ <template>
171
+ <primitive :object="material" attach="material" />
172
+ </template>
@@ -0,0 +1,175 @@
1
+ <script setup lang="ts">
2
+ // @ts-nocheck - TSL types are complex
3
+ import { Color, DoubleSide } from 'three'
4
+ import {
5
+ add,
6
+ length,
7
+ mix,
8
+ mul,
9
+ sin,
10
+ sub,
11
+ time as tslTime,
12
+ uniform,
13
+ uv,
14
+ vec2,
15
+ vec3,
16
+ } from 'three/tsl'
17
+ import { MeshBasicNodeMaterial } from 'three/webgpu'
18
+ import { fbm2D, ridgedFbm2d, warpedFbmCoords } from '../../shaders/common/noise'
19
+ import { cosinePalette } from '../../shaders/common/palette'
20
+
21
+ const props = withDefaults(
22
+ defineProps<{
23
+ speed?: number
24
+ intensity?: number
25
+ color1?: string
26
+ color2?: string
27
+ color3?: string
28
+ color4?: string
29
+ mouseX?: number
30
+ mouseY?: number
31
+ mouseInteraction?: boolean
32
+ mouseStrength?: number
33
+ }>(),
34
+ {
35
+ speed: 1.0,
36
+ intensity: 1.0,
37
+ color1: '#134e5e',
38
+ color2: '#71b280',
39
+ color3: '#e8d5b7',
40
+ color4: '#fc5c7d',
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
+ const color4Uniform = uniform(new Color(props.color4))
58
+
59
+ // Watch prop changes
60
+ watch(
61
+ () => props.speed,
62
+ (val) => (speedUniform.value = val)
63
+ )
64
+ watch(
65
+ () => props.intensity,
66
+ (val) => (intensityUniform.value = val)
67
+ )
68
+ watch(
69
+ () => props.mouseX,
70
+ (val) => (mouseXUniform.value = val)
71
+ )
72
+ watch(
73
+ () => props.mouseY,
74
+ (val) => (mouseYUniform.value = val)
75
+ )
76
+ watch(
77
+ () => props.mouseStrength,
78
+ (val) => (mouseStrengthUniform.value = val)
79
+ )
80
+ watch(
81
+ () => props.color1,
82
+ (val) => (color1Uniform.value = new Color(val))
83
+ )
84
+ watch(
85
+ () => props.color2,
86
+ (val) => (color2Uniform.value = new Color(val))
87
+ )
88
+ watch(
89
+ () => props.color3,
90
+ (val) => (color3Uniform.value = new Color(val))
91
+ )
92
+ watch(
93
+ () => props.color4,
94
+ (val) => (color4Uniform.value = new Color(val))
95
+ )
96
+
97
+ const material = computed(() => {
98
+ const mat = new MeshBasicNodeMaterial()
99
+
100
+ // Time animation
101
+ const time = tslTime.mul(speedUniform).mul(0.15)
102
+
103
+ // UV coordinates
104
+ const uvCoord = uv()
105
+
106
+ // Mouse offset
107
+ const mouseOffset = vec2(
108
+ sub(mouseXUniform, 0.5)
109
+ .mul(props.mouseInteraction ? mouseStrengthUniform : 0)
110
+ .mul(0.5),
111
+ sub(mouseYUniform, 0.5)
112
+ .mul(props.mouseInteraction ? mouseStrengthUniform : 0)
113
+ .mul(0.5)
114
+ )
115
+
116
+ // Domain warping - create flowing organic patterns
117
+ const warpedUV = warpedFbmCoords(uvCoord, time, {
118
+ warpStrength: 0.4,
119
+ warpScale: 2.0,
120
+ octaves: 3,
121
+ })
122
+
123
+ // Add mouse influence to warped coordinates
124
+ const finalUV = add(warpedUV, mouseOffset)
125
+
126
+ // Layered noise on warped coordinates
127
+ const n1 = add(
128
+ mul(fbm2D(mul(finalUV, 2.0), { octaves: 4, lacunarity: 2.0, gain: 0.5 }), 0.5),
129
+ 0.5
130
+ )
131
+ const n2 = add(
132
+ mul(fbm2D(add(mul(finalUV, 3.0), 5.0), { octaves: 3, lacunarity: 2.0, gain: 0.5 }), 0.5),
133
+ 0.5
134
+ )
135
+ const n3 = add(
136
+ mul(ridgedFbm2d(mul(finalUV, 1.5), { octaves: 4, lacunarity: 2.0, gain: 0.5 }), 0.5),
137
+ 0.5
138
+ )
139
+
140
+ // Color palette based on noise
141
+ let colorNode = mix(vec3(color1Uniform), vec3(color2Uniform), n1)
142
+ colorNode = mix(colorNode, vec3(color3Uniform), mul(n2, 0.6))
143
+ colorNode = mix(colorNode, vec3(color4Uniform), mul(n3, 0.4))
144
+
145
+ // Add iridescent effect using cosine palette
146
+ const iridescence = cosinePalette(
147
+ add(n1, mul(time, 0.1)),
148
+ vec3(0.5, 0.5, 0.5),
149
+ vec3(0.5, 0.5, 0.5),
150
+ vec3(1.0, 1.0, 0.5),
151
+ vec3(0.8, 0.9, 0.3)
152
+ )
153
+ colorNode = mix(colorNode, iridescence, 0.2)
154
+
155
+ // Brightness variation
156
+ const brightness = add(0.8, mul(0.2, sin(add(mul(n1, 6.28), time))))
157
+ colorNode = mul(colorNode, brightness, intensityUniform)
158
+
159
+ // Soft vignette
160
+ const dist = length(sub(uvCoord, 0.5))
161
+ const vig = sub(1.0, mul(dist, 0.4))
162
+ colorNode = mul(colorNode, vig)
163
+
164
+ mat.colorNode = colorNode
165
+ mat.side = DoubleSide
166
+
167
+ return mat
168
+ })
169
+
170
+ defineExpose({ material })
171
+ </script>
172
+
173
+ <template>
174
+ <primitive :object="material" attach="material" />
175
+ </template>