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,224 @@
1
+ // @ts-nocheck - TSL types are complex and not fully exported from three/tsl
2
+ /**
3
+ * Modular TSL SDF (Signed Distance Field) Utilities
4
+ * Provides 2D/3D SDF shapes and operations for procedural geometry
5
+ */
6
+ import {
7
+ abs,
8
+ add,
9
+ clamp,
10
+ length,
11
+ max,
12
+ min,
13
+ mul,
14
+ select,
15
+ sign,
16
+ sqrt,
17
+ sub,
18
+ vec2,
19
+ vec3,
20
+ } from 'three/tsl'
21
+ import type { TSLNode } from '../types'
22
+
23
+ // ============================================
24
+ // SDF Operations
25
+ // ============================================
26
+
27
+ /**
28
+ * Smooth minimum of two SDF values
29
+ * Creates smooth blending between shapes
30
+ * @param a - First SDF value
31
+ * @param b - Second SDF value
32
+ * @param factor - Smoothing factor (higher = smoother blend)
33
+ */
34
+ export function smin(a: TSLNode, b: TSLNode, factor: TSLNode | number): TSLNode {
35
+ const k = typeof factor === 'number' ? float(factor) : factor
36
+ const h = max(k.sub(abs(a.sub(b))), 0).div(k)
37
+ return min(a, b).sub(h.mul(h).mul(k).mul(0.25))
38
+ }
39
+
40
+ /**
41
+ * Smooth maximum of two SDF values
42
+ * @param a - First SDF value
43
+ * @param b - Second SDF value
44
+ * @param factor - Smoothing factor
45
+ */
46
+ export function smax(a: TSLNode, b: TSLNode, factor: TSLNode | number = 0): TSLNode {
47
+ const k = typeof factor === 'number' ? float(factor) : factor
48
+ return smin(a, b, k.negate())
49
+ }
50
+
51
+ // ============================================
52
+ // 2D SDF Shapes
53
+ // ============================================
54
+
55
+ /**
56
+ * Sphere/Circle SDF
57
+ * @param uv - UV coordinates (centered)
58
+ * @param r - Radius
59
+ */
60
+ export function sdSphere(uv: TSLNode, r: TSLNode | number = 0): TSLNode {
61
+ const radius = typeof r === 'number' ? float(r) : r
62
+ return length(uv).sub(radius)
63
+ }
64
+
65
+ /**
66
+ * 2D Box SDF
67
+ * @param uv - UV coordinates (centered)
68
+ * @param size - Half-size (extent) of the box
69
+ */
70
+ export function sdBox2d(uv: TSLNode, size: TSLNode | number = 0): TSLNode {
71
+ const s = typeof size === 'number' ? float(size) : size
72
+ return max(abs(uv.x), abs(uv.y)).sub(s)
73
+ }
74
+
75
+ /**
76
+ * Diamond SDF (rotated square)
77
+ * @param uv - UV coordinates (centered)
78
+ * @param r - Radius
79
+ */
80
+ export function sdDiamond(uv: TSLNode, r: TSLNode | number = 0): TSLNode {
81
+ const radius = typeof r === 'number' ? float(r) : r
82
+ return abs(uv.x).add(abs(uv.y)).sub(radius)
83
+ }
84
+
85
+ /**
86
+ * Hexagon SDF
87
+ * @param p - Point coordinates
88
+ * @param r - Radius
89
+ */
90
+ export function sdHexagon(p: TSLNode, r: TSLNode | number = 0.5): TSLNode {
91
+ const radius = typeof r === 'number' ? float(r) : r
92
+ const k = vec3(-0.866025404, 0.5, 0.577350269)
93
+
94
+ const _p = abs(p).toVar()
95
+ _p.subAssign(float(2.0).mul(min(dot(k.xy, _p), 0.0).mul(k.xy)))
96
+ _p.subAssign(vec2(clamp(_p.x, k.z.negate().mul(radius), k.z.mul(radius)), radius))
97
+
98
+ return length(_p).mul(sign(_p.y))
99
+ }
100
+
101
+ /**
102
+ * Equilateral Triangle SDF
103
+ * @param p - Point coordinates
104
+ * @param r - Radius (distance from center to vertex)
105
+ */
106
+ export function sdEquilateralTriangle(p: TSLNode, r: TSLNode | number = 0.1): TSLNode {
107
+ const radius = typeof r === 'number' ? float(r) : r
108
+ const k = sqrt(3.0)
109
+ const _p = (p ?? vec2(0)).toVar()
110
+
111
+ _p.x = abs(_p.x).sub(radius).toVar()
112
+ _p.y = _p.y.add(radius.div(k)).toVar()
113
+
114
+ If(_p.x.add(k.mul(_p.y)).greaterThan(0), () => {
115
+ _p.assign(vec2(_p.x.sub(k.mul(_p.y)), k.negate().mul(_p.x).sub(_p.y)).div(2))
116
+ })
117
+
118
+ _p.x.subAssign(clamp(_p.x, radius.mul(-2), 0.0))
119
+ return length(_p).negate().mul(sign(_p.y))
120
+ }
121
+
122
+ /**
123
+ * Line SDF (axis-aligned)
124
+ * @param p - Coordinate value
125
+ */
126
+ export function sdLine(p: TSLNode): TSLNode {
127
+ return abs(p)
128
+ }
129
+
130
+ /**
131
+ * Ring SDF
132
+ * @param uv - UV coordinates (centered)
133
+ * @param radius - Ring radius
134
+ */
135
+ export function sdRing(uv: TSLNode, radius: TSLNode | number = 0.4): TSLNode {
136
+ const r = typeof radius === 'number' ? float(radius) : radius
137
+ return abs(length(uv).sub(r))
138
+ }
139
+
140
+ export interface ParallelogramOptions {
141
+ width?: TSLNode | number
142
+ height?: TSLNode | number
143
+ skew?: TSLNode | number
144
+ }
145
+
146
+ /**
147
+ * Parallelogram SDF
148
+ * @param p - Point coordinates
149
+ * @param options - Width, height, and skew parameters
150
+ */
151
+ export function sdParallelogram(p: TSLNode, options: ParallelogramOptions = {}): TSLNode {
152
+ const { width = 0.4, height = 0.1, skew = 0.1 } = options
153
+
154
+ const wi = typeof width === 'number' ? float(width) : width
155
+ const he = typeof height === 'number' ? float(height) : height
156
+ const sk = typeof skew === 'number' ? float(skew) : skew
157
+
158
+ const _p = p.toVar()
159
+ const e = vec2(sk, he)
160
+
161
+ _p.assign(select(_p.y.lessThan(0.0), _p.negate(), _p))
162
+
163
+ const w = _p.sub(e)
164
+ w.x.subAssign(clamp(w.x, wi.negate(), wi))
165
+
166
+ const d = vec2(dot(w, w), w.y.negate()).toVar()
167
+ const s = _p.x.mul(e.y).sub(_p.y.mul(e.x))
168
+
169
+ _p.assign(select(s.lessThan(0.0), _p.negate(), _p))
170
+
171
+ const v = _p.sub(vec2(wi, 0)).toVar()
172
+ v.subAssign(e.mul(clamp(dot(v, e).div(dot(e, e)), -1.0, 1.0)))
173
+ d.assign(min(d, vec2(dot(v, v), wi.mul(he).sub(abs(s)))))
174
+
175
+ return sqrt(d.x).mul(sign(d.y.negate()))
176
+ }
177
+
178
+ /**
179
+ * Helper function for rhombus SDF
180
+ */
181
+ function ndot(a: TSLNode, b: TSLNode): TSLNode {
182
+ return a.x.mul(b.x).sub(a.y.mul(b.y))
183
+ }
184
+
185
+ /**
186
+ * Rhombus SDF
187
+ * @param p - Point coordinates
188
+ * @param b - Size as vec2
189
+ */
190
+ export function sdRhombus(p: TSLNode, b: TSLNode | [number, number] = [0.4, 0.4]): TSLNode {
191
+ const size = Array.isArray(b) ? vec2(b[0], b[1]) : b
192
+ const _p = p.toVar()
193
+ _p.assign(abs(_p))
194
+
195
+ const h = clamp(ndot(size.sub(mul(2.0, _p)), size).div(dot(size, size)), -1.0, 1.0)
196
+ const d = length(_p.sub(mul(0.5, size).mul(vec2(sub(1.0, h), add(1.0, h)))))
197
+
198
+ return d.mul(sign(_p.x.mul(size.y).add(_p.y.mul(size.x).sub(size.x.mul(size.y)))))
199
+ }
200
+
201
+ /**
202
+ * Simple Triangle SDF
203
+ * @param p - Point coordinates
204
+ * @param size - Size factor
205
+ */
206
+ export function sdTriangle(p: TSLNode, size: TSLNode | number = 0.4): TSLNode {
207
+ const s = typeof size === 'number' ? float(size) : size
208
+ return max(abs(p.x.mul(s)).add(p.y), abs(p.y.mul(s).sub(0.5)).sub(0.5))
209
+ }
210
+
211
+ // ============================================
212
+ // 3D SDF Shapes
213
+ // ============================================
214
+
215
+ /**
216
+ * 3D Box SDF
217
+ * @param p - Point coordinates
218
+ * @param b - Half-extents as vec3
219
+ */
220
+ export function sdBox3d(p: TSLNode, b: TSLNode | [number, number, number] = [0, 0, 0]): TSLNode {
221
+ const size = Array.isArray(b) ? vec3(b[0], b[1], b[2]) : b
222
+ const q = abs(p).sub(size)
223
+ return length(max(q, 0.0)).add(min(max(q.x, max(q.y, q.z)), 0.0))
224
+ }
@@ -0,0 +1,366 @@
1
+ // @ts-nocheck - TSL types are complex and not fully exported from three/tsl
2
+ /**
3
+ * Modular TSL Shape Utilities
4
+ * Provides composable shape functions for shader effects
5
+ */
6
+ import {
7
+ abs,
8
+ atan2,
9
+ cos,
10
+ float,
11
+ floor,
12
+ fract,
13
+ length,
14
+ max,
15
+ min,
16
+ mix,
17
+ sin,
18
+ smoothstep,
19
+ vec2,
20
+ } from 'three/tsl'
21
+ import type { TSLNode } from '../types'
22
+
23
+ // ============================================
24
+ // Basic Shapes
25
+ // ============================================
26
+
27
+ /**
28
+ * Soft circular blob
29
+ */
30
+ export function blob(
31
+ uv: TSLNode,
32
+ center: TSLNode | [number, number] = [0.5, 0.5],
33
+ radius: TSLNode | number = 0.3,
34
+ softness: TSLNode | number = 0.1
35
+ ): TSLNode {
36
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
37
+ const r = typeof radius === 'number' ? float(radius) : radius
38
+ const s = typeof softness === 'number' ? float(softness) : softness
39
+
40
+ const d = length(uv.sub(c))
41
+ return smoothstep(r.add(s), r.sub(s), d)
42
+ }
43
+
44
+ /**
45
+ * Hard-edged circle
46
+ */
47
+ export function circle(
48
+ uv: TSLNode,
49
+ center: TSLNode | [number, number] = [0.5, 0.5],
50
+ radius: TSLNode | number = 0.3
51
+ ): TSLNode {
52
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
53
+ const r = typeof radius === 'number' ? float(radius) : radius
54
+
55
+ const d = length(uv.sub(c))
56
+ return step(d, r)
57
+ }
58
+
59
+ /**
60
+ * Ring shape (donut)
61
+ */
62
+ export function ring(
63
+ uv: TSLNode,
64
+ center: TSLNode | [number, number] = [0.5, 0.5],
65
+ innerRadius: TSLNode | number = 0.2,
66
+ outerRadius: TSLNode | number = 0.3,
67
+ softness: TSLNode | number = 0.02
68
+ ): TSLNode {
69
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
70
+ const inner = typeof innerRadius === 'number' ? float(innerRadius) : innerRadius
71
+ const outer = typeof outerRadius === 'number' ? float(outerRadius) : outerRadius
72
+ const s = typeof softness === 'number' ? float(softness) : softness
73
+
74
+ const d = length(uv.sub(c))
75
+ const outerEdge = smoothstep(outer.add(s), outer.sub(s), d)
76
+ const innerEdge = smoothstep(inner.sub(s), inner.add(s), d)
77
+
78
+ return outerEdge.mul(innerEdge)
79
+ }
80
+
81
+ /**
82
+ * Radial gradient (1 at center, 0 at edges)
83
+ */
84
+ export function radialGradient(
85
+ uv: TSLNode,
86
+ center: TSLNode | [number, number] = [0.5, 0.5],
87
+ scale: TSLNode | number = 1
88
+ ): TSLNode {
89
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
90
+ const s = typeof scale === 'number' ? float(scale) : scale
91
+
92
+ return max(float(0), float(1).sub(length(uv.sub(c)).mul(s)))
93
+ }
94
+
95
+ /**
96
+ * Rounded rectangle / box
97
+ */
98
+ export function roundedRect(
99
+ uv: TSLNode,
100
+ center: TSLNode | [number, number] = [0.5, 0.5],
101
+ size: TSLNode | [number, number] = [0.4, 0.3],
102
+ cornerRadius: TSLNode | number = 0.05,
103
+ softness: TSLNode | number = 0.01
104
+ ): TSLNode {
105
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
106
+ const sz = Array.isArray(size) ? vec2(size[0], size[1]) : size
107
+ const r = typeof cornerRadius === 'number' ? float(cornerRadius) : cornerRadius
108
+ const s = typeof softness === 'number' ? float(softness) : softness
109
+
110
+ const p = abs(uv.sub(c)).sub(sz.div(2)).add(r)
111
+ const d = length(max(p, 0))
112
+ .add(min(max(p.x, p.y), 0))
113
+ .sub(r)
114
+
115
+ return smoothstep(s, s.negate(), d)
116
+ }
117
+
118
+ /**
119
+ * Rectangle / box (hard edges)
120
+ */
121
+ export function rect(
122
+ uv: TSLNode,
123
+ center: TSLNode | [number, number] = [0.5, 0.5],
124
+ size: TSLNode | [number, number] = [0.4, 0.3]
125
+ ): TSLNode {
126
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
127
+ const sz = Array.isArray(size) ? vec2(size[0], size[1]) : size
128
+
129
+ const p = abs(uv.sub(c))
130
+ const halfSize = sz.div(2)
131
+
132
+ return step(p.x, halfSize.x).mul(step(p.y, halfSize.y))
133
+ }
134
+
135
+ // ============================================
136
+ // Lines & Stripes
137
+ // ============================================
138
+
139
+ /**
140
+ * Horizontal line
141
+ */
142
+ export function horizontalLine(
143
+ uv: TSLNode,
144
+ y: TSLNode | number = 0.5,
145
+ thickness: TSLNode | number = 0.02,
146
+ softness: TSLNode | number = 0.005
147
+ ): TSLNode {
148
+ const yPos = typeof y === 'number' ? float(y) : y
149
+ const t = typeof thickness === 'number' ? float(thickness) : thickness
150
+ const s = typeof softness === 'number' ? float(softness) : softness
151
+
152
+ const d = abs(uv.y.sub(yPos))
153
+ return smoothstep(t.div(2).add(s), t.div(2).sub(s), d)
154
+ }
155
+
156
+ /**
157
+ * Vertical line
158
+ */
159
+ export function verticalLine(
160
+ uv: TSLNode,
161
+ x: TSLNode | number = 0.5,
162
+ thickness: TSLNode | number = 0.02,
163
+ softness: TSLNode | number = 0.005
164
+ ): TSLNode {
165
+ const xPos = typeof x === 'number' ? float(x) : x
166
+ const t = typeof thickness === 'number' ? float(thickness) : thickness
167
+ const s = typeof softness === 'number' ? float(softness) : softness
168
+
169
+ const d = abs(uv.x.sub(xPos))
170
+ return smoothstep(t.div(2).add(s), t.div(2).sub(s), d)
171
+ }
172
+
173
+ /**
174
+ * Repeating horizontal stripes
175
+ */
176
+ export function stripes(
177
+ uv: TSLNode,
178
+ frequency: TSLNode | number = 10,
179
+ thickness: TSLNode | number = 0.5,
180
+ angle: TSLNode | number = 0
181
+ ): TSLNode {
182
+ const freq = typeof frequency === 'number' ? float(frequency) : frequency
183
+ const t = typeof thickness === 'number' ? float(thickness) : thickness
184
+ const a = typeof angle === 'number' ? float(angle) : angle
185
+
186
+ // Rotate UV
187
+ const cosA = cos(a)
188
+ const sinA = sin(a)
189
+ const rotatedX = uv.x.mul(cosA).sub(uv.y.mul(sinA))
190
+
191
+ const pattern = fract(rotatedX.mul(freq))
192
+ return step(pattern, t)
193
+ }
194
+
195
+ /**
196
+ * Smooth repeating stripes
197
+ */
198
+ export function smoothStripes(
199
+ uv: TSLNode,
200
+ frequency: TSLNode | number = 10,
201
+ angle: TSLNode | number = 0
202
+ ): TSLNode {
203
+ const freq = typeof frequency === 'number' ? float(frequency) : frequency
204
+ const a = typeof angle === 'number' ? float(angle) : angle
205
+
206
+ const cosA = cos(a)
207
+ const sinA = sin(a)
208
+ const rotatedX = uv.x.mul(cosA).sub(uv.y.mul(sinA))
209
+
210
+ return sin(rotatedX.mul(freq).mul(Math.PI * 2))
211
+ .mul(0.5)
212
+ .add(0.5)
213
+ }
214
+
215
+ // ============================================
216
+ // Grids & Patterns
217
+ // ============================================
218
+
219
+ /**
220
+ * Grid pattern
221
+ */
222
+ export function grid(
223
+ uv: TSLNode,
224
+ cellSize: TSLNode | number = 0.1,
225
+ lineWidth: TSLNode | number = 0.02
226
+ ): TSLNode {
227
+ const size = typeof cellSize === 'number' ? float(cellSize) : cellSize
228
+ const width = typeof lineWidth === 'number' ? float(lineWidth) : lineWidth
229
+
230
+ const gridUV = fract(uv.div(size))
231
+ const halfWidth = width.div(size).div(2)
232
+
233
+ const xLine = step(gridUV.x, halfWidth).add(step(float(1).sub(halfWidth), gridUV.x))
234
+ const yLine = step(gridUV.y, halfWidth).add(step(float(1).sub(halfWidth), gridUV.y))
235
+
236
+ return max(xLine, yLine)
237
+ }
238
+
239
+ /**
240
+ * Dot pattern
241
+ */
242
+ export function dots(
243
+ uv: TSLNode,
244
+ cellSize: TSLNode | number = 0.1,
245
+ dotRadius: TSLNode | number = 0.03
246
+ ): TSLNode {
247
+ const size = typeof cellSize === 'number' ? float(cellSize) : cellSize
248
+ const radius = typeof dotRadius === 'number' ? float(dotRadius) : dotRadius
249
+
250
+ const gridUV = fract(uv.div(size)).sub(0.5)
251
+ const d = length(gridUV.mul(size))
252
+
253
+ return step(d, radius)
254
+ }
255
+
256
+ /**
257
+ * Checker pattern
258
+ */
259
+ export function checker(uv: TSLNode, scale: TSLNode | number = 10): TSLNode {
260
+ const s = typeof scale === 'number' ? float(scale) : scale
261
+ const scaledUV = floor(uv.mul(s))
262
+ return fract(scaledUV.x.add(scaledUV.y).mul(0.5)).mul(2)
263
+ }
264
+
265
+ // ============================================
266
+ // Polar / Radial Patterns
267
+ // ============================================
268
+
269
+ /**
270
+ * Star shape
271
+ */
272
+ export function star(
273
+ uv: TSLNode,
274
+ center: TSLNode | [number, number] = [0.5, 0.5],
275
+ points: number = 5,
276
+ innerRadius: TSLNode | number = 0.1,
277
+ outerRadius: TSLNode | number = 0.3
278
+ ): TSLNode {
279
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
280
+ const inner = typeof innerRadius === 'number' ? float(innerRadius) : innerRadius
281
+ const outer = typeof outerRadius === 'number' ? float(outerRadius) : outerRadius
282
+
283
+ const p = uv.sub(c)
284
+ const angle = atan2(p.y, p.x)
285
+ const dist = length(p)
286
+
287
+ const segmentAngle = float((Math.PI * 2) / points)
288
+ const halfSegment = segmentAngle.div(2)
289
+
290
+ // Fold angle into one segment
291
+ const foldedAngle = abs(fract(angle.div(segmentAngle).add(0.5)).sub(0.5)).mul(segmentAngle)
292
+
293
+ // Interpolate radius based on angle within segment
294
+ const t = foldedAngle.div(halfSegment)
295
+ const targetRadius = mix(outer, inner, t)
296
+
297
+ return step(dist, targetRadius)
298
+ }
299
+
300
+ /**
301
+ * Radial lines (sunburst pattern)
302
+ */
303
+ export function radialLines(
304
+ uv: TSLNode,
305
+ center: TSLNode | [number, number] = [0.5, 0.5],
306
+ numLines: number = 12,
307
+ thickness: TSLNode | number = 0.5
308
+ ): TSLNode {
309
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
310
+ const t = typeof thickness === 'number' ? float(thickness) : thickness
311
+
312
+ const p = uv.sub(c)
313
+ const angle = atan2(p.y, p.x).add(Math.PI)
314
+ const segment = float((Math.PI * 2) / numLines)
315
+
316
+ const foldedAngle = fract(angle.div(segment))
317
+ return step(foldedAngle, t)
318
+ }
319
+
320
+ /**
321
+ * Concentric circles
322
+ */
323
+ export function concentricCircles(
324
+ uv: TSLNode,
325
+ center: TSLNode | [number, number] = [0.5, 0.5],
326
+ frequency: TSLNode | number = 10,
327
+ thickness: TSLNode | number = 0.5
328
+ ): TSLNode {
329
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
330
+ const freq = typeof frequency === 'number' ? float(frequency) : frequency
331
+ const t = typeof thickness === 'number' ? float(thickness) : thickness
332
+
333
+ const d = length(uv.sub(c))
334
+ return step(fract(d.mul(freq)), t)
335
+ }
336
+
337
+ // ============================================
338
+ // Polygon
339
+ // ============================================
340
+
341
+ /**
342
+ * Regular polygon
343
+ */
344
+ export function polygon(
345
+ uv: TSLNode,
346
+ center: TSLNode | [number, number] = [0.5, 0.5],
347
+ sides: number = 6,
348
+ radius: TSLNode | number = 0.3,
349
+ rotation: TSLNode | number = 0
350
+ ): TSLNode {
351
+ const c = Array.isArray(center) ? vec2(center[0], center[1]) : center
352
+ const r = typeof radius === 'number' ? float(radius) : radius
353
+ const rot = typeof rotation === 'number' ? float(rotation) : rotation
354
+
355
+ const p = uv.sub(c)
356
+ const angle = atan2(p.y, p.x).add(rot)
357
+ const dist = length(p)
358
+
359
+ const segmentAngle = float((Math.PI * 2) / sides)
360
+
361
+ // Calculate distance to polygon edge
362
+ const foldedAngle = abs(fract(angle.div(segmentAngle).add(0.5)).sub(0.5)).mul(segmentAngle)
363
+ const edgeDist = r.mul(cos(segmentAngle.div(2))).div(cos(foldedAngle))
364
+
365
+ return step(dist, edgeDist)
366
+ }