@basementstudio/shader-lab 0.1.0

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 (261) hide show
  1. package/.biome/plugins/README.md +21 -0
  2. package/.biome/plugins/no-anchor-element.grit +12 -0
  3. package/.biome/plugins/no-relative-parent-imports.grit +10 -0
  4. package/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  5. package/.changeset/README.md +17 -0
  6. package/.changeset/config.json +11 -0
  7. package/.editorconfig +40 -0
  8. package/.env.example +81 -0
  9. package/.gitattributes +19 -0
  10. package/.github/workflows/canary.yml +80 -0
  11. package/.github/workflows/ci.yml +37 -0
  12. package/.github/workflows/release.yml +56 -0
  13. package/.tldrignore +84 -0
  14. package/.vscode/extensions.json +20 -0
  15. package/.vscode/settings.json +105 -0
  16. package/README.md +119 -0
  17. package/biome.json +249 -0
  18. package/bun.lock +1224 -0
  19. package/next.config.ts +131 -0
  20. package/package.json +73 -0
  21. package/packages/shader-lab-react/CHANGELOG.md +9 -0
  22. package/packages/shader-lab-react/README.md +119 -0
  23. package/packages/shader-lab-react/assets/patterns/bars/1.svg +3 -0
  24. package/packages/shader-lab-react/assets/patterns/bars/2.svg +3 -0
  25. package/packages/shader-lab-react/assets/patterns/bars/3.svg +3 -0
  26. package/packages/shader-lab-react/assets/patterns/bars/4.svg +3 -0
  27. package/packages/shader-lab-react/assets/patterns/bars/5.svg +3 -0
  28. package/packages/shader-lab-react/assets/patterns/bars/6.svg +3 -0
  29. package/packages/shader-lab-react/assets/patterns/candles/1.svg +3 -0
  30. package/packages/shader-lab-react/assets/patterns/candles/2.svg +3 -0
  31. package/packages/shader-lab-react/assets/patterns/candles/3.svg +3 -0
  32. package/packages/shader-lab-react/assets/patterns/candles/4.svg +3 -0
  33. package/packages/shader-lab-react/assets/patterns/shapes/1.svg +3 -0
  34. package/packages/shader-lab-react/assets/patterns/shapes/2.svg +3 -0
  35. package/packages/shader-lab-react/assets/patterns/shapes/3.svg +3 -0
  36. package/packages/shader-lab-react/assets/patterns/shapes/4.svg +4 -0
  37. package/packages/shader-lab-react/assets/patterns/shapes/5.svg +3 -0
  38. package/packages/shader-lab-react/assets/patterns/shapes/6.svg +4 -0
  39. package/packages/shader-lab-react/assets/textures/blue-noise.png +0 -0
  40. package/packages/shader-lab-react/package.json +36 -0
  41. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +57 -0
  42. package/packages/shader-lab-react/scripts/prepare-dist.mjs +4 -0
  43. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +146 -0
  44. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +51 -0
  45. package/packages/shader-lab-react/src/easings.ts +4 -0
  46. package/packages/shader-lab-react/src/index.ts +35 -0
  47. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +2 -0
  48. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +83 -0
  49. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +416 -0
  50. package/packages/shader-lab-react/src/renderer/asset-url.ts +3 -0
  51. package/packages/shader-lab-react/src/renderer/blend-modes.ts +229 -0
  52. package/packages/shader-lab-react/src/renderer/contracts.ts +54 -0
  53. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +48 -0
  54. package/packages/shader-lab-react/src/renderer/crt-pass.ts +1040 -0
  55. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +108 -0
  56. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +309 -0
  57. package/packages/shader-lab-react/src/renderer/dither-textures.ts +99 -0
  58. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +322 -0
  59. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +521 -0
  60. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +932 -0
  61. package/packages/shader-lab-react/src/renderer/ink-pass.ts +802 -0
  62. package/packages/shader-lab-react/src/renderer/live-pass.ts +194 -0
  63. package/packages/shader-lab-react/src/renderer/media-pass.ts +187 -0
  64. package/packages/shader-lab-react/src/renderer/media-texture.ts +66 -0
  65. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +389 -0
  66. package/packages/shader-lab-react/src/renderer/pass-node.ts +209 -0
  67. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +133 -0
  68. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +552 -0
  69. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +369 -0
  70. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +277 -0
  71. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +87 -0
  72. package/packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts +9 -0
  73. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +31 -0
  74. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +36 -0
  75. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +36 -0
  76. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +13 -0
  77. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +96 -0
  78. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +24 -0
  79. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +79 -0
  80. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +89 -0
  81. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +56 -0
  82. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +32 -0
  83. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +60 -0
  84. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +15 -0
  85. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts +11 -0
  86. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +24 -0
  87. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +9 -0
  88. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +11 -0
  89. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +9 -0
  90. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts +9 -0
  91. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +10 -0
  92. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +11 -0
  93. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +7 -0
  94. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +12 -0
  95. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts +9 -0
  96. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +16 -0
  97. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +10 -0
  98. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +18 -0
  99. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +12 -0
  100. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +10 -0
  101. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts +20 -0
  102. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +48 -0
  103. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +15 -0
  104. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +15 -0
  105. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +6 -0
  106. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +6 -0
  107. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +27 -0
  108. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +6 -0
  109. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +7 -0
  110. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +7 -0
  111. package/packages/shader-lab-react/src/renderer/text-pass.ts +176 -0
  112. package/packages/shader-lab-react/src/runtime-clock.ts +42 -0
  113. package/packages/shader-lab-react/src/runtime-frame.ts +29 -0
  114. package/packages/shader-lab-react/src/shader-lab-composition.tsx +163 -0
  115. package/packages/shader-lab-react/src/timeline.ts +283 -0
  116. package/packages/shader-lab-react/src/types/editor.ts +5 -0
  117. package/packages/shader-lab-react/src/types.ts +141 -0
  118. package/packages/shader-lab-react/tsconfig.build.json +8 -0
  119. package/packages/shader-lab-react/tsconfig.json +21 -0
  120. package/postcss.config.mjs +5 -0
  121. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  122. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +1412 -0
  123. package/public/assets/patterns/bars/1.svg +3 -0
  124. package/public/assets/patterns/bars/2.svg +3 -0
  125. package/public/assets/patterns/bars/3.svg +3 -0
  126. package/public/assets/patterns/bars/4.svg +3 -0
  127. package/public/assets/patterns/bars/5.svg +3 -0
  128. package/public/assets/patterns/bars/6.svg +3 -0
  129. package/public/assets/patterns/candles/1.svg +3 -0
  130. package/public/assets/patterns/candles/2.svg +3 -0
  131. package/public/assets/patterns/candles/3.svg +3 -0
  132. package/public/assets/patterns/candles/4.svg +3 -0
  133. package/public/assets/patterns/shapes/1.svg +3 -0
  134. package/public/assets/patterns/shapes/2.svg +3 -0
  135. package/public/assets/patterns/shapes/3.svg +3 -0
  136. package/public/assets/patterns/shapes/4.svg +4 -0
  137. package/public/assets/patterns/shapes/5.svg +3 -0
  138. package/public/assets/patterns/shapes/6.svg +4 -0
  139. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  140. package/public/textures/blue-noise.png +0 -0
  141. package/public/textures/crt-mask.png +0 -0
  142. package/src/app/design/page.tsx +398 -0
  143. package/src/app/favicon.ico +0 -0
  144. package/src/app/globals.css +280 -0
  145. package/src/app/layout.tsx +89 -0
  146. package/src/app/page.tsx +20 -0
  147. package/src/app/robots.ts +13 -0
  148. package/src/app/sitemap.ts +13 -0
  149. package/src/components/editor/editor-canvas-viewport.tsx +116 -0
  150. package/src/components/editor/editor-export-dialog.tsx +1177 -0
  151. package/src/components/editor/editor-timeline-overlay.tsx +983 -0
  152. package/src/components/editor/editor-topbar.tsx +287 -0
  153. package/src/components/editor/layer-sidebar.tsx +738 -0
  154. package/src/components/editor/properties-sidebar-content.tsx +574 -0
  155. package/src/components/editor/properties-sidebar-fields.tsx +389 -0
  156. package/src/components/editor/properties-sidebar-utils.ts +178 -0
  157. package/src/components/editor/properties-sidebar.tsx +421 -0
  158. package/src/components/ui/button/index.tsx +57 -0
  159. package/src/components/ui/color-picker/index.tsx +358 -0
  160. package/src/components/ui/glass-panel/index.tsx +45 -0
  161. package/src/components/ui/icon-button/index.tsx +46 -0
  162. package/src/components/ui/select/index.tsx +136 -0
  163. package/src/components/ui/slider/index.tsx +192 -0
  164. package/src/components/ui/toggle/index.tsx +34 -0
  165. package/src/components/ui/typography/index.tsx +61 -0
  166. package/src/components/ui/xy-pad/index.tsx +160 -0
  167. package/src/features/editor/components/editor-export-dialog.module.css +271 -0
  168. package/src/hooks/use-editor-renderer.ts +182 -0
  169. package/src/lib/app.ts +6 -0
  170. package/src/lib/cn.ts +7 -0
  171. package/src/lib/easings.ts +240 -0
  172. package/src/lib/editor/config/layer-registry.ts +2434 -0
  173. package/src/lib/editor/custom-shader/shared.ts +28 -0
  174. package/src/lib/editor/export.ts +420 -0
  175. package/src/lib/editor/history.ts +71 -0
  176. package/src/lib/editor/layers.ts +76 -0
  177. package/src/lib/editor/parameter-schema.ts +75 -0
  178. package/src/lib/editor/project-file.ts +145 -0
  179. package/src/lib/editor/shader-export-snippet.ts +37 -0
  180. package/src/lib/editor/shader-export.ts +315 -0
  181. package/src/lib/editor/timeline/evaluate.ts +252 -0
  182. package/src/lib/editor/view-transform.ts +58 -0
  183. package/src/lib/fonts.ts +28 -0
  184. package/src/renderer/ascii-atlas.ts +83 -0
  185. package/src/renderer/ascii-pass.ts +416 -0
  186. package/src/renderer/blend-modes.ts +229 -0
  187. package/src/renderer/contracts.ts +161 -0
  188. package/src/renderer/create-webgpu-renderer.ts +48 -0
  189. package/src/renderer/crt-pass.ts +1040 -0
  190. package/src/renderer/custom-shader-pass.ts +117 -0
  191. package/src/renderer/custom-shader-runtime.ts +309 -0
  192. package/src/renderer/dither-textures.ts +99 -0
  193. package/src/renderer/dithering-pass.ts +322 -0
  194. package/src/renderer/gradient-pass.ts +520 -0
  195. package/src/renderer/halftone-pass.ts +932 -0
  196. package/src/renderer/ink-pass.ts +683 -0
  197. package/src/renderer/live-pass.ts +194 -0
  198. package/src/renderer/media-pass.ts +187 -0
  199. package/src/renderer/media-texture.ts +66 -0
  200. package/src/renderer/particle-grid-pass.ts +389 -0
  201. package/src/renderer/pass-node-factory.ts +33 -0
  202. package/src/renderer/pass-node.ts +209 -0
  203. package/src/renderer/pattern-atlas.ts +97 -0
  204. package/src/renderer/pattern-pass.ts +552 -0
  205. package/src/renderer/pipeline-manager.ts +343 -0
  206. package/src/renderer/pixel-sorting-pass.ts +277 -0
  207. package/src/renderer/project-clock.ts +57 -0
  208. package/src/renderer/shaders/tsl/color/tonemapping.ts +86 -0
  209. package/src/renderer/shaders/tsl/cosine-palette.ts +8 -0
  210. package/src/renderer/shaders/tsl/noise/common.ts +30 -0
  211. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +35 -0
  212. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +35 -0
  213. package/src/renderer/shaders/tsl/noise/fbm.ts +12 -0
  214. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +97 -0
  215. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +23 -0
  216. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +78 -0
  217. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +88 -0
  218. package/src/renderer/shaders/tsl/noise/turbulence.ts +55 -0
  219. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +31 -0
  220. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +59 -0
  221. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +14 -0
  222. package/src/renderer/shaders/tsl/patterns/bloom.ts +10 -0
  223. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +23 -0
  224. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +8 -0
  225. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +10 -0
  226. package/src/renderer/shaders/tsl/utils/atan2.ts +8 -0
  227. package/src/renderer/shaders/tsl/utils/complex-conj.ts +8 -0
  228. package/src/renderer/shaders/tsl/utils/complex-cos.ts +9 -0
  229. package/src/renderer/shaders/tsl/utils/complex-div.ts +10 -0
  230. package/src/renderer/shaders/tsl/utils/complex-log.ts +6 -0
  231. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +11 -0
  232. package/src/renderer/shaders/tsl/utils/complex-mul.ts +8 -0
  233. package/src/renderer/shaders/tsl/utils/complex-pow.ts +15 -0
  234. package/src/renderer/shaders/tsl/utils/complex-sin.ts +9 -0
  235. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +17 -0
  236. package/src/renderer/shaders/tsl/utils/complex-tan.ts +11 -0
  237. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +9 -0
  238. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +19 -0
  239. package/src/renderer/shaders/tsl/utils/index.ts +47 -0
  240. package/src/renderer/shaders/tsl/utils/rotate.ts +14 -0
  241. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +14 -0
  242. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +5 -0
  243. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +5 -0
  244. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +26 -0
  245. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +5 -0
  246. package/src/renderer/shaders/tsl/utils/smax.ts +7 -0
  247. package/src/renderer/shaders/tsl/utils/smin.ts +6 -0
  248. package/src/renderer/text-pass.ts +176 -0
  249. package/src/store/asset-store.ts +193 -0
  250. package/src/store/editor-store.ts +223 -0
  251. package/src/store/history-store.ts +172 -0
  252. package/src/store/index.ts +31 -0
  253. package/src/store/layer-store.ts +675 -0
  254. package/src/store/timeline-store.ts +572 -0
  255. package/src/types/assets.d.ts +6 -0
  256. package/src/types/css.d.ts +21 -0
  257. package/src/types/editor.ts +357 -0
  258. package/src/types/react.d.ts +15 -0
  259. package/src/types/three-tsl.d.ts +146 -0
  260. package/src/types/three-webgpu.d.ts +51 -0
  261. package/tsconfig.json +49 -0
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="28" width="8" height="64" transform="rotate(90 64 28)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="20" width="24" height="64" transform="rotate(90 64 20)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="12" width="40" height="64" transform="rotate(90 64 12)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="4" width="56" height="64" transform="rotate(90 64 4)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="12" width="40" height="64" transform="rotate(90 64 12)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="64" y="20" width="24" height="64" transform="rotate(90 64 20)" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="7" width="2" height="16" fill="#696969"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="5" width="6" height="16" fill="#696969"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="3" width="10" height="16" fill="#696969"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="1" width="14" height="16" fill="#696969"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="31.5" y="31.5" width="1" height="1" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="28" y="28" width="8" height="8" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="28" y="16" width="8" height="32" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="28" y="16" width="8" height="32" fill="#D9D9D9"/>
3
+ <rect x="48" y="28" width="8" height="32" transform="rotate(90 48 28)" fill="#D9D9D9"/>
4
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect x="16" y="16" width="32" height="32" fill="#D9D9D9"/>
3
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="32" height="32" fill="#D9D9D9"/>
3
+ <rect x="32.373" y="32.3726" width="32" height="32" fill="#D9D9D9"/>
4
+ </svg>
Binary file
Binary file
@@ -0,0 +1,398 @@
1
+ import type { CSSProperties } from "react"
2
+ import { Button } from "@/components/ui/button"
3
+ import { cn } from "@/lib/cn"
4
+ import { GlassPanel } from "@/components/ui/glass-panel"
5
+ import { IconButton } from "@/components/ui/icon-button"
6
+ import { Select } from "@/components/ui/select"
7
+ import { Slider } from "@/components/ui/slider"
8
+ import { Toggle } from "@/components/ui/toggle"
9
+ import { Typography } from "@/components/ui/typography"
10
+
11
+ const typeSamples = [
12
+ {
13
+ label: "Display / 48px / 700",
14
+ variant: "display",
15
+ text: "Shader Lab Aa",
16
+ },
17
+ {
18
+ label: "Heading / 24px / 600",
19
+ variant: "heading",
20
+ text: "Heading Aa Bb Cc",
21
+ },
22
+ {
23
+ label: "Title / 16px / 500",
24
+ variant: "title",
25
+ text: "Panel Title Aa Bb Cc Dd",
26
+ },
27
+ {
28
+ label: "Body / 13px / 500",
29
+ variant: "body",
30
+ text: "Project name, navigation items",
31
+ },
32
+ {
33
+ label: "Label / 12px / 400",
34
+ variant: "label",
35
+ text: "Layer names, property labels",
36
+ },
37
+ {
38
+ label: "Caption / 11px / 400",
39
+ variant: "caption",
40
+ text: "Secondary labels, control text",
41
+ },
42
+ {
43
+ label: "Overline / 10px / 500",
44
+ variant: "overline",
45
+ text: "Section headers, overlines",
46
+ },
47
+ {
48
+ label: "Mono / 13px / 400",
49
+ variant: "monoMd",
50
+ text: "vec3(0.5, 0.8, 1.0)",
51
+ },
52
+ {
53
+ label: "Mono / 11px / 400",
54
+ variant: "monoSm",
55
+ text: "Auto (Base) Normal 100% 0.00 1:1 80% 4.00s",
56
+ },
57
+ {
58
+ label: "Mono / 10px / 400",
59
+ variant: "monoXs",
60
+ text: "0.00s / 4.00s rgba(255,255,255,0.5)",
61
+ },
62
+ ] as const
63
+
64
+ const blendModeOptions = [
65
+ { label: "Normal", value: "normal" },
66
+ { label: "Multiply", value: "multiply" },
67
+ { label: "Screen", value: "screen" },
68
+ { label: "Overlay", value: "overlay" },
69
+ { label: "Soft Light", value: "soft-light" },
70
+ ] as const
71
+
72
+ function PlusIcon() {
73
+ return (
74
+ <svg aria-hidden="true" fill="none" viewBox="0 0 14 14">
75
+ <path
76
+ d="M7 3V11M3 7H11"
77
+ stroke="currentColor"
78
+ strokeLinecap="round"
79
+ strokeWidth="1.3"
80
+ />
81
+ </svg>
82
+ )
83
+ }
84
+
85
+ function MinusIcon() {
86
+ return (
87
+ <svg aria-hidden="true" fill="none" viewBox="0 0 14 14">
88
+ <path
89
+ d="M3 7H11"
90
+ stroke="currentColor"
91
+ strokeLinecap="round"
92
+ strokeWidth="1.3"
93
+ />
94
+ </svg>
95
+ )
96
+ }
97
+
98
+ function FocusIcon() {
99
+ return (
100
+ <svg aria-hidden="true" fill="none" viewBox="0 0 14 14">
101
+ <path
102
+ d="M2.5 5V2.5H5M9 2.5H11.5V5M11.5 9V11.5H9M5 11.5H2.5V9"
103
+ stroke="currentColor"
104
+ strokeLinecap="round"
105
+ strokeLinejoin="round"
106
+ strokeWidth="1.3"
107
+ />
108
+ </svg>
109
+ )
110
+ }
111
+
112
+ function GlassPreview({
113
+ caption,
114
+ className,
115
+ light,
116
+ style,
117
+ }: {
118
+ caption: string
119
+ className: string
120
+ light?: boolean
121
+ style?: CSSProperties
122
+ }) {
123
+ return (
124
+ <div
125
+ className={cn(
126
+ "relative flex min-h-[260px] flex-col gap-[var(--ds-space-3)] overflow-hidden rounded-[var(--ds-radius-panel)] p-[20px]",
127
+ className
128
+ )}
129
+ style={style}
130
+ >
131
+ <Typography
132
+ className="relative z-1"
133
+ tone={light ? "onLight" : "muted"}
134
+ variant="monoXs"
135
+ >
136
+ {caption}
137
+ </Typography>
138
+
139
+ <GlassPanel
140
+ className={cn(
141
+ "relative z-1",
142
+ light ? "shadow-[var(--ds-shadow-panel-light)]" : undefined
143
+ )}
144
+ variant="panel"
145
+ >
146
+ <div className="border-white/6 border-b px-[12px] py-[10px]">
147
+ <Typography tone="secondary" variant="overline">
148
+ Layers
149
+ </Typography>
150
+ </div>
151
+
152
+ <div className="mx-[4px] mt-[4px] flex items-center gap-[var(--ds-space-2)] rounded-[var(--ds-radius-icon)] bg-[var(--ds-color-surface-active)] px-[8px] py-[6px]">
153
+ <div className="h-[24px] w-[24px] flex-shrink-0 rounded-[var(--ds-radius-thumb)] bg-white/6" />
154
+ <Typography variant="label">Image</Typography>
155
+ </div>
156
+
157
+ <div className="mx-[4px] flex items-center gap-[var(--ds-space-2)] px-[8px] py-[6px]">
158
+ <div className="h-[24px] w-[24px] flex-shrink-0 rounded-[var(--ds-radius-thumb)] bg-white/4" />
159
+ <Typography tone="secondary" variant="label">
160
+ Exposure
161
+ </Typography>
162
+ </div>
163
+ </GlassPanel>
164
+
165
+ <GlassPanel
166
+ className={cn(
167
+ "relative z-1",
168
+ light ? "shadow-[var(--ds-shadow-pill-light)]" : undefined
169
+ )}
170
+ variant="pill"
171
+ >
172
+ <Typography variant="body">shader lab</Typography>
173
+ <div className="h-[14px] w-px bg-white/8" />
174
+ <Typography tone="secondary" variant="monoSm">
175
+ 80%
176
+ </Typography>
177
+ </GlassPanel>
178
+ </div>
179
+ )
180
+ }
181
+
182
+ export default function DesignPage() {
183
+ return (
184
+ <main className="relative mx-auto flex min-h-screen max-w-[1280px] flex-col gap-[var(--ds-space-8)] px-[clamp(24px,4vw,48px)] py-[clamp(24px,4vw,48px)]">
185
+ <div className="pointer-events-none absolute inset-0" />
186
+
187
+ <section className="relative z-1 grid gap-[var(--ds-space-6)] pt-[clamp(24px,7vh,72px)] lg:grid-cols-[minmax(0,1.4fr)_minmax(320px,0.9fr)]">
188
+ <div className="flex max-w-[720px] flex-col gap-[var(--ds-space-4)]">
189
+ <Typography tone="muted" variant="overline">
190
+ Shader Lab UI Foundation
191
+ </Typography>
192
+ <Typography as="h1" variant="display">
193
+ Design System
194
+ </Typography>
195
+ <Typography className="max-w-[46ch]" tone="secondary" variant="body">
196
+ Typography, glass surfaces, and core controls aligned to the Paper
197
+ system. This page is the implementation specimen, not a marketing
198
+ page.
199
+ </Typography>
200
+ </div>
201
+
202
+ <GlassPanel
203
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
204
+ variant="panel"
205
+ >
206
+ <Typography tone="secondary" variant="overline">
207
+ Primitives
208
+ </Typography>
209
+ <div className="grid gap-[var(--ds-space-4)] sm:grid-cols-2 lg:grid-cols-2">
210
+ <div>
211
+ <Typography variant="title">4 Shared Components</Typography>
212
+ <Typography tone="secondary" variant="caption">
213
+ Typography, button, icon button, glass panel
214
+ </Typography>
215
+ </div>
216
+ <div>
217
+ <Typography variant="title">Dark Editor Base</Typography>
218
+ <Typography tone="secondary" variant="caption">
219
+ Monochrome, alpha-led, glass-first
220
+ </Typography>
221
+ </div>
222
+ </div>
223
+ </GlassPanel>
224
+ </section>
225
+
226
+ <section className="relative z-1 flex flex-col gap-[var(--ds-space-5)]">
227
+ <div className="flex max-w-[720px] flex-col gap-[var(--ds-space-2)]">
228
+ <Typography tone="muted" variant="overline">
229
+ Typography
230
+ </Typography>
231
+ <Typography as="h2" variant="heading">
232
+ Type scale from the design system
233
+ </Typography>
234
+ </div>
235
+
236
+ <GlassPanel
237
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
238
+ variant="panel"
239
+ >
240
+ {typeSamples.map((sample) => (
241
+ <div
242
+ className="grid gap-[var(--ds-space-2)] border-white/4 border-b py-[12px] first:pt-0 last:border-b-0 last:pb-0 sm:grid-cols-[minmax(140px,180px)_minmax(0,1fr)] sm:gap-[var(--ds-space-4)]"
243
+ key={sample.label}
244
+ >
245
+ <Typography tone="muted" variant="monoXs">
246
+ {sample.label}
247
+ </Typography>
248
+ <Typography variant={sample.variant}>{sample.text}</Typography>
249
+ </div>
250
+ ))}
251
+ </GlassPanel>
252
+ </section>
253
+
254
+ <section className="relative z-1 flex flex-col gap-[var(--ds-space-5)]">
255
+ <div className="flex max-w-[720px] flex-col gap-[var(--ds-space-2)]">
256
+ <Typography tone="muted" variant="overline">
257
+ Components
258
+ </Typography>
259
+ <Typography as="h2" variant="heading">
260
+ Core custom controls
261
+ </Typography>
262
+ </div>
263
+
264
+ <div className="grid gap-[var(--ds-space-4)] lg:grid-cols-2">
265
+ <GlassPanel
266
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
267
+ variant="panel"
268
+ >
269
+ <Typography tone="muted" variant="overline">
270
+ Buttons
271
+ </Typography>
272
+ <div className="flex flex-wrap items-center gap-[var(--ds-space-3)]">
273
+ <Button variant="primary">Primary</Button>
274
+ <Button variant="secondary">Secondary</Button>
275
+ <Button variant="ghost">Ghost</Button>
276
+ <Button disabled variant="neutral">
277
+ Disabled
278
+ </Button>
279
+ </div>
280
+ </GlassPanel>
281
+
282
+ <GlassPanel
283
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
284
+ variant="panel"
285
+ >
286
+ <Typography tone="muted" variant="overline">
287
+ Slider
288
+ </Typography>
289
+ <div className="flex max-w-[320px] flex-col gap-[var(--ds-space-4)]">
290
+ <Slider
291
+ defaultValue={75}
292
+ label="Opacity"
293
+ valueFormatOptions={{ maximumFractionDigits: 0 }}
294
+ valueSuffix="%"
295
+ />
296
+ <Slider
297
+ defaultValue={50}
298
+ label="Exposure"
299
+ max={2}
300
+ min={-2}
301
+ step={0.01}
302
+ valueFormatOptions={{
303
+ maximumFractionDigits: 2,
304
+ minimumFractionDigits: 2,
305
+ }}
306
+ />
307
+ </div>
308
+ </GlassPanel>
309
+
310
+ <GlassPanel
311
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
312
+ variant="panel"
313
+ >
314
+ <Typography tone="muted" variant="overline">
315
+ Icon Buttons
316
+ </Typography>
317
+ <div className="flex flex-wrap items-center gap-[var(--ds-space-3)]">
318
+ <IconButton aria-label="Add" variant="default">
319
+ <PlusIcon />
320
+ </IconButton>
321
+ <IconButton aria-label="Hover state" variant="hover">
322
+ <MinusIcon />
323
+ </IconButton>
324
+ <IconButton aria-label="Active state" variant="active">
325
+ <FocusIcon />
326
+ </IconButton>
327
+ </div>
328
+ </GlassPanel>
329
+
330
+ <GlassPanel
331
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
332
+ variant="panel"
333
+ >
334
+ <Typography tone="muted" variant="overline">
335
+ Toggle
336
+ </Typography>
337
+ <div className="flex flex-wrap items-center gap-[24px]">
338
+ <Toggle defaultChecked label="On" />
339
+ <Toggle label="Off" />
340
+ </div>
341
+ </GlassPanel>
342
+
343
+ <GlassPanel
344
+ className="flex flex-col gap-[var(--ds-space-4)] p-[20px]"
345
+ variant="panel"
346
+ >
347
+ <Typography tone="muted" variant="overline">
348
+ Select
349
+ </Typography>
350
+ <Select
351
+ defaultValue="normal"
352
+ label="Blend mode"
353
+ options={blendModeOptions}
354
+ placeholder="Select mode"
355
+ />
356
+ </GlassPanel>
357
+ </div>
358
+ </section>
359
+
360
+ <section className="relative z-1 flex flex-col gap-[var(--ds-space-5)]">
361
+ <div className="flex max-w-[720px] flex-col gap-[var(--ds-space-2)]">
362
+ <Typography tone="muted" variant="overline">
363
+ Glass
364
+ </Typography>
365
+ <Typography as="h2" variant="heading">
366
+ Same glass language over three backgrounds
367
+ </Typography>
368
+ <Typography tone="secondary" variant="body">
369
+ White, black, and a flower image from the local asset set. The
370
+ surface stays translucent, bordered, and readable in all three
371
+ contexts.
372
+ </Typography>
373
+ </div>
374
+
375
+ <div className="grid gap-[var(--ds-space-4)] lg:grid-cols-3">
376
+ <GlassPreview
377
+ caption="On black #080808"
378
+ className="bg-[var(--ds-color-canvas)]"
379
+ />
380
+ <GlassPreview
381
+ caption="On white #F5F5F5"
382
+ className="bg-[linear-gradient(135deg,rgba(255,255,255,0.8),rgba(245,245,245,1))]"
383
+ light
384
+ />
385
+ <GlassPreview
386
+ caption="On flower image"
387
+ className="before:absolute before:inset-0 before:bg-[linear-gradient(180deg,rgba(8,8,8,0.08),rgba(8,8,8,0.32))] before:content-['']"
388
+ style={{
389
+ backgroundImage: "url('/assets/flowers-01.jpeg')",
390
+ backgroundPosition: "center",
391
+ backgroundSize: "cover",
392
+ }}
393
+ />
394
+ </div>
395
+ </section>
396
+ </main>
397
+ )
398
+ }
Binary file