@basementstudio/shader-lab 0.1.0 → 1.0.2

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 (399) hide show
  1. package/dist/src/easings.d.ts +3 -0
  2. package/dist/src/easings.js +3 -0
  3. package/dist/src/index.d.ts +5 -0
  4. package/dist/src/index.js +4 -0
  5. package/dist/src/lib/editor/custom-shader/shared.d.ts +1 -0
  6. package/dist/src/lib/editor/custom-shader/shared.js +1 -0
  7. package/dist/src/renderer/ascii-atlas.d.ts +5 -0
  8. package/dist/src/renderer/ascii-atlas.js +61 -0
  9. package/dist/src/renderer/ascii-pass.d.ts +50 -0
  10. package/dist/src/renderer/ascii-pass.js +271 -0
  11. package/dist/src/renderer/asset-url.d.ts +1 -0
  12. package/dist/src/renderer/asset-url.js +3 -0
  13. package/dist/src/renderer/blend-modes.d.ts +4 -0
  14. package/dist/src/renderer/blend-modes.js +157 -0
  15. package/dist/src/renderer/contracts.d.ts +26 -0
  16. package/dist/src/renderer/contracts.js +13 -0
  17. package/dist/src/renderer/create-webgpu-renderer.d.ts +3 -0
  18. package/dist/src/renderer/create-webgpu-renderer.js +37 -0
  19. package/dist/src/renderer/crt-pass.d.ts +72 -0
  20. package/dist/src/renderer/crt-pass.js +536 -0
  21. package/dist/src/renderer/custom-shader-pass.d.ts +17 -0
  22. package/dist/src/renderer/custom-shader-pass.js +79 -0
  23. package/dist/src/renderer/custom-shader-runtime.d.ts +16 -0
  24. package/dist/src/renderer/custom-shader-runtime.js +169 -0
  25. package/dist/src/renderer/dither-textures.d.ts +8 -0
  26. package/dist/src/renderer/dither-textures.js +66 -0
  27. package/dist/src/renderer/dithering-pass.d.ts +45 -0
  28. package/dist/src/renderer/dithering-pass.js +229 -0
  29. package/dist/src/renderer/gradient-pass.d.ts +39 -0
  30. package/dist/src/renderer/gradient-pass.js +358 -0
  31. package/dist/src/renderer/halftone-pass.d.ts +65 -0
  32. package/dist/src/renderer/halftone-pass.js +530 -0
  33. package/dist/src/renderer/ink-pass.d.ts +84 -0
  34. package/dist/src/renderer/ink-pass.js +526 -0
  35. package/dist/src/renderer/live-pass.d.ts +31 -0
  36. package/dist/src/renderer/live-pass.js +136 -0
  37. package/dist/src/renderer/media-pass.d.ts +32 -0
  38. package/dist/src/renderer/media-pass.js +130 -0
  39. package/dist/src/renderer/media-texture.d.ts +8 -0
  40. package/dist/src/renderer/media-texture.js +41 -0
  41. package/dist/src/renderer/particle-grid-pass.d.ts +48 -0
  42. package/dist/src/renderer/particle-grid-pass.js +269 -0
  43. package/dist/src/renderer/pass-node.d.ts +36 -0
  44. package/dist/src/renderer/pass-node.js +120 -0
  45. package/dist/src/renderer/pattern-atlas.d.ts +8 -0
  46. package/dist/src/renderer/pattern-atlas.js +79 -0
  47. package/dist/src/renderer/pattern-pass.d.ts +58 -0
  48. package/dist/src/renderer/pattern-pass.js +316 -0
  49. package/dist/src/renderer/pipeline-manager.d.ts +39 -0
  50. package/dist/src/renderer/pipeline-manager.js +287 -0
  51. package/dist/src/renderer/pixel-sorting-pass.d.ts +33 -0
  52. package/dist/src/renderer/pixel-sorting-pass.js +179 -0
  53. package/dist/src/renderer/shaders/tsl/color/tonemapping.d.ts +9 -0
  54. package/dist/src/renderer/shaders/tsl/color/tonemapping.js +59 -0
  55. package/dist/src/renderer/shaders/tsl/cosine-palette.d.ts +4 -0
  56. package/{packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts → dist/src/renderer/shaders/tsl/cosine-palette.js} +3 -4
  57. package/dist/src/renderer/shaders/tsl/noise/common.d.ts +5 -0
  58. package/dist/src/renderer/shaders/tsl/noise/common.js +24 -0
  59. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.d.ts +1 -0
  60. package/dist/src/renderer/shaders/tsl/noise/curl-noise-3d.js +27 -0
  61. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.d.ts +1 -0
  62. package/dist/src/renderer/shaders/tsl/noise/curl-noise-4d.js +27 -0
  63. package/dist/src/renderer/shaders/tsl/noise/fbm.d.ts +1 -0
  64. package/dist/src/renderer/shaders/tsl/noise/fbm.js +11 -0
  65. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.d.ts +5 -0
  66. package/dist/src/renderer/shaders/tsl/noise/perlin-noise-3d.js +66 -0
  67. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.d.ts +1 -0
  68. package/dist/src/renderer/shaders/tsl/noise/ridge-noise.js +19 -0
  69. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.d.ts +1 -0
  70. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-3d.js +44 -0
  71. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.d.ts +1 -0
  72. package/dist/src/renderer/shaders/tsl/noise/simplex-noise-4d.js +51 -0
  73. package/dist/src/renderer/shaders/tsl/noise/turbulence.d.ts +7 -0
  74. package/dist/src/renderer/shaders/tsl/noise/turbulence.js +34 -0
  75. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.d.ts +1 -0
  76. package/dist/src/renderer/shaders/tsl/noise/value-noise-3d.js +27 -0
  77. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.d.ts +1 -0
  78. package/dist/src/renderer/shaders/tsl/noise/voronoi-noise-3d.js +45 -0
  79. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.d.ts +4 -0
  80. package/dist/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.js +13 -0
  81. package/dist/src/renderer/shaders/tsl/patterns/bloom.d.ts +4 -0
  82. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts → dist/src/renderer/shaders/tsl/patterns/bloom.js} +4 -6
  83. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.d.ts +4 -0
  84. package/dist/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.js +16 -0
  85. package/dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.d.ts +4 -0
  86. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts → dist/src/renderer/shaders/tsl/patterns/grain-texture-pattern.js} +3 -4
  87. package/dist/src/renderer/shaders/tsl/patterns/repeating-pattern.d.ts +4 -0
  88. package/{packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts → dist/src/renderer/shaders/tsl/patterns/repeating-pattern.js} +4 -6
  89. package/dist/src/renderer/shaders/tsl/utils/atan2.d.ts +1 -0
  90. package/dist/src/renderer/shaders/tsl/utils/atan2.js +7 -0
  91. package/dist/src/renderer/shaders/tsl/utils/complex-conj.d.ts +4 -0
  92. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts → dist/src/renderer/shaders/tsl/utils/complex-conj.js} +3 -4
  93. package/dist/src/renderer/shaders/tsl/utils/complex-cos.d.ts +4 -0
  94. package/dist/src/renderer/shaders/tsl/utils/complex-cos.js +9 -0
  95. package/dist/src/renderer/shaders/tsl/utils/complex-div.d.ts +1 -0
  96. package/dist/src/renderer/shaders/tsl/utils/complex-div.js +6 -0
  97. package/dist/src/renderer/shaders/tsl/utils/complex-log.d.ts +1 -0
  98. package/dist/src/renderer/shaders/tsl/utils/complex-log.js +6 -0
  99. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.d.ts +4 -0
  100. package/dist/src/renderer/shaders/tsl/utils/complex-mobius.js +10 -0
  101. package/dist/src/renderer/shaders/tsl/utils/complex-mul.d.ts +4 -0
  102. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts → dist/src/renderer/shaders/tsl/utils/complex-mul.js} +3 -4
  103. package/dist/src/renderer/shaders/tsl/utils/complex-pow.d.ts +5 -0
  104. package/dist/src/renderer/shaders/tsl/utils/complex-pow.js +14 -0
  105. package/dist/src/renderer/shaders/tsl/utils/complex-sin.d.ts +4 -0
  106. package/dist/src/renderer/shaders/tsl/utils/complex-sin.js +9 -0
  107. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.d.ts +5 -0
  108. package/dist/src/renderer/shaders/tsl/utils/complex-sqrt.js +12 -0
  109. package/dist/src/renderer/shaders/tsl/utils/complex-tan.d.ts +4 -0
  110. package/dist/src/renderer/shaders/tsl/utils/complex-tan.js +11 -0
  111. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.d.ts +4 -0
  112. package/dist/src/renderer/shaders/tsl/utils/complex-to-polar.js +9 -0
  113. package/dist/src/renderer/shaders/tsl/utils/hyperbolic.d.ts +8 -0
  114. package/{packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts → dist/src/renderer/shaders/tsl/utils/hyperbolic.js} +7 -11
  115. package/dist/src/renderer/shaders/tsl/utils/index.d.ts +38 -0
  116. package/dist/src/renderer/shaders/tsl/utils/index.js +39 -0
  117. package/dist/src/renderer/shaders/tsl/utils/rotate.d.ts +2 -0
  118. package/dist/src/renderer/shaders/tsl/utils/rotate.js +7 -0
  119. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.d.ts +2 -0
  120. package/dist/src/renderer/shaders/tsl/utils/screen-aspect-uv.js +6 -0
  121. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.d.ts +1 -0
  122. package/dist/src/renderer/shaders/tsl/utils/sd-box-2d.js +5 -0
  123. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.d.ts +1 -0
  124. package/dist/src/renderer/shaders/tsl/utils/sd-diamond.js +5 -0
  125. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.d.ts +1 -0
  126. package/dist/src/renderer/shaders/tsl/utils/sd-rhombus.js +14 -0
  127. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.d.ts +1 -0
  128. package/dist/src/renderer/shaders/tsl/utils/sd-sphere.js +5 -0
  129. package/dist/src/renderer/shaders/tsl/utils/smax.d.ts +1 -0
  130. package/dist/src/renderer/shaders/tsl/utils/smax.js +6 -0
  131. package/dist/src/renderer/shaders/tsl/utils/smin.d.ts +1 -0
  132. package/dist/src/renderer/shaders/tsl/utils/smin.js +6 -0
  133. package/dist/src/renderer/text-pass.d.ts +23 -0
  134. package/dist/src/renderer/text-pass.js +129 -0
  135. package/dist/src/runtime-clock.d.ts +9 -0
  136. package/dist/src/runtime-clock.js +20 -0
  137. package/dist/src/runtime-frame.d.ts +11 -0
  138. package/dist/src/runtime-frame.js +12 -0
  139. package/dist/src/shader-lab-composition.d.ts +9 -0
  140. package/dist/src/shader-lab-composition.js +96 -0
  141. package/dist/src/timeline.d.ts +8 -0
  142. package/dist/src/timeline.js +179 -0
  143. package/dist/src/types/editor.d.ts +3 -0
  144. package/dist/src/types/editor.js +1 -0
  145. package/dist/src/types.d.ts +81 -0
  146. package/dist/src/types.js +1 -0
  147. package/package.json +28 -65
  148. package/.biome/plugins/README.md +0 -21
  149. package/.biome/plugins/no-anchor-element.grit +0 -12
  150. package/.biome/plugins/no-relative-parent-imports.grit +0 -10
  151. package/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  152. package/.changeset/README.md +0 -17
  153. package/.changeset/config.json +0 -11
  154. package/.editorconfig +0 -40
  155. package/.env.example +0 -81
  156. package/.gitattributes +0 -19
  157. package/.github/workflows/canary.yml +0 -80
  158. package/.github/workflows/ci.yml +0 -37
  159. package/.github/workflows/release.yml +0 -56
  160. package/.tldrignore +0 -84
  161. package/.vscode/extensions.json +0 -20
  162. package/.vscode/settings.json +0 -105
  163. package/biome.json +0 -249
  164. package/bun.lock +0 -1224
  165. package/next.config.ts +0 -131
  166. package/packages/shader-lab-react/CHANGELOG.md +0 -9
  167. package/packages/shader-lab-react/README.md +0 -119
  168. package/packages/shader-lab-react/package.json +0 -36
  169. package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +0 -57
  170. package/packages/shader-lab-react/scripts/prepare-dist.mjs +0 -4
  171. package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +0 -146
  172. package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +0 -51
  173. package/packages/shader-lab-react/src/easings.ts +0 -4
  174. package/packages/shader-lab-react/src/index.ts +0 -35
  175. package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +0 -2
  176. package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +0 -83
  177. package/packages/shader-lab-react/src/renderer/ascii-pass.ts +0 -416
  178. package/packages/shader-lab-react/src/renderer/asset-url.ts +0 -3
  179. package/packages/shader-lab-react/src/renderer/blend-modes.ts +0 -229
  180. package/packages/shader-lab-react/src/renderer/contracts.ts +0 -54
  181. package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +0 -48
  182. package/packages/shader-lab-react/src/renderer/crt-pass.ts +0 -1040
  183. package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +0 -108
  184. package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +0 -309
  185. package/packages/shader-lab-react/src/renderer/dither-textures.ts +0 -99
  186. package/packages/shader-lab-react/src/renderer/dithering-pass.ts +0 -322
  187. package/packages/shader-lab-react/src/renderer/gradient-pass.ts +0 -521
  188. package/packages/shader-lab-react/src/renderer/halftone-pass.ts +0 -932
  189. package/packages/shader-lab-react/src/renderer/ink-pass.ts +0 -802
  190. package/packages/shader-lab-react/src/renderer/live-pass.ts +0 -194
  191. package/packages/shader-lab-react/src/renderer/media-pass.ts +0 -187
  192. package/packages/shader-lab-react/src/renderer/media-texture.ts +0 -66
  193. package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +0 -389
  194. package/packages/shader-lab-react/src/renderer/pass-node.ts +0 -209
  195. package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +0 -133
  196. package/packages/shader-lab-react/src/renderer/pattern-pass.ts +0 -552
  197. package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +0 -369
  198. package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +0 -277
  199. package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +0 -87
  200. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +0 -31
  201. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -36
  202. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -36
  203. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +0 -13
  204. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -96
  205. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -24
  206. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -79
  207. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -89
  208. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +0 -56
  209. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -32
  210. package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -60
  211. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -15
  212. package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -24
  213. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +0 -9
  214. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -10
  215. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +0 -11
  216. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +0 -7
  217. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -12
  218. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -16
  219. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -10
  220. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -18
  221. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -12
  222. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -10
  223. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +0 -48
  224. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +0 -15
  225. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -15
  226. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -6
  227. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -6
  228. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -27
  229. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -6
  230. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  231. package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +0 -7
  232. package/packages/shader-lab-react/src/renderer/text-pass.ts +0 -176
  233. package/packages/shader-lab-react/src/runtime-clock.ts +0 -42
  234. package/packages/shader-lab-react/src/runtime-frame.ts +0 -29
  235. package/packages/shader-lab-react/src/shader-lab-composition.tsx +0 -163
  236. package/packages/shader-lab-react/src/timeline.ts +0 -283
  237. package/packages/shader-lab-react/src/types/editor.ts +0 -5
  238. package/packages/shader-lab-react/src/types.ts +0 -141
  239. package/packages/shader-lab-react/tsconfig.build.json +0 -8
  240. package/packages/shader-lab-react/tsconfig.json +0 -21
  241. package/postcss.config.mjs +0 -5
  242. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
  243. package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +0 -1412
  244. package/public/assets/patterns/bars/1.svg +0 -3
  245. package/public/assets/patterns/bars/2.svg +0 -3
  246. package/public/assets/patterns/bars/3.svg +0 -3
  247. package/public/assets/patterns/bars/4.svg +0 -3
  248. package/public/assets/patterns/bars/5.svg +0 -3
  249. package/public/assets/patterns/bars/6.svg +0 -3
  250. package/public/assets/patterns/candles/1.svg +0 -3
  251. package/public/assets/patterns/candles/2.svg +0 -3
  252. package/public/assets/patterns/candles/3.svg +0 -3
  253. package/public/assets/patterns/candles/4.svg +0 -3
  254. package/public/assets/patterns/shapes/1.svg +0 -3
  255. package/public/assets/patterns/shapes/2.svg +0 -3
  256. package/public/assets/patterns/shapes/3.svg +0 -3
  257. package/public/assets/patterns/shapes/4.svg +0 -4
  258. package/public/assets/patterns/shapes/5.svg +0 -3
  259. package/public/assets/patterns/shapes/6.svg +0 -4
  260. package/public/fonts/geist/Geist-Mono.woff2 +0 -0
  261. package/public/textures/blue-noise.png +0 -0
  262. package/public/textures/crt-mask.png +0 -0
  263. package/src/app/design/page.tsx +0 -398
  264. package/src/app/favicon.ico +0 -0
  265. package/src/app/globals.css +0 -280
  266. package/src/app/layout.tsx +0 -89
  267. package/src/app/page.tsx +0 -20
  268. package/src/app/robots.ts +0 -13
  269. package/src/app/sitemap.ts +0 -13
  270. package/src/components/editor/editor-canvas-viewport.tsx +0 -116
  271. package/src/components/editor/editor-export-dialog.tsx +0 -1177
  272. package/src/components/editor/editor-timeline-overlay.tsx +0 -983
  273. package/src/components/editor/editor-topbar.tsx +0 -287
  274. package/src/components/editor/layer-sidebar.tsx +0 -738
  275. package/src/components/editor/properties-sidebar-content.tsx +0 -574
  276. package/src/components/editor/properties-sidebar-fields.tsx +0 -389
  277. package/src/components/editor/properties-sidebar-utils.ts +0 -178
  278. package/src/components/editor/properties-sidebar.tsx +0 -421
  279. package/src/components/ui/button/index.tsx +0 -57
  280. package/src/components/ui/color-picker/index.tsx +0 -358
  281. package/src/components/ui/glass-panel/index.tsx +0 -45
  282. package/src/components/ui/icon-button/index.tsx +0 -46
  283. package/src/components/ui/select/index.tsx +0 -136
  284. package/src/components/ui/slider/index.tsx +0 -192
  285. package/src/components/ui/toggle/index.tsx +0 -34
  286. package/src/components/ui/typography/index.tsx +0 -61
  287. package/src/components/ui/xy-pad/index.tsx +0 -160
  288. package/src/features/editor/components/editor-export-dialog.module.css +0 -271
  289. package/src/hooks/use-editor-renderer.ts +0 -182
  290. package/src/lib/app.ts +0 -6
  291. package/src/lib/cn.ts +0 -7
  292. package/src/lib/easings.ts +0 -240
  293. package/src/lib/editor/config/layer-registry.ts +0 -2434
  294. package/src/lib/editor/custom-shader/shared.ts +0 -28
  295. package/src/lib/editor/export.ts +0 -420
  296. package/src/lib/editor/history.ts +0 -71
  297. package/src/lib/editor/layers.ts +0 -76
  298. package/src/lib/editor/parameter-schema.ts +0 -75
  299. package/src/lib/editor/project-file.ts +0 -145
  300. package/src/lib/editor/shader-export-snippet.ts +0 -37
  301. package/src/lib/editor/shader-export.ts +0 -315
  302. package/src/lib/editor/timeline/evaluate.ts +0 -252
  303. package/src/lib/editor/view-transform.ts +0 -58
  304. package/src/lib/fonts.ts +0 -28
  305. package/src/renderer/ascii-atlas.ts +0 -83
  306. package/src/renderer/ascii-pass.ts +0 -416
  307. package/src/renderer/blend-modes.ts +0 -229
  308. package/src/renderer/contracts.ts +0 -161
  309. package/src/renderer/create-webgpu-renderer.ts +0 -48
  310. package/src/renderer/crt-pass.ts +0 -1040
  311. package/src/renderer/custom-shader-pass.ts +0 -117
  312. package/src/renderer/custom-shader-runtime.ts +0 -309
  313. package/src/renderer/dither-textures.ts +0 -99
  314. package/src/renderer/dithering-pass.ts +0 -322
  315. package/src/renderer/gradient-pass.ts +0 -520
  316. package/src/renderer/halftone-pass.ts +0 -932
  317. package/src/renderer/ink-pass.ts +0 -683
  318. package/src/renderer/live-pass.ts +0 -194
  319. package/src/renderer/media-pass.ts +0 -187
  320. package/src/renderer/media-texture.ts +0 -66
  321. package/src/renderer/particle-grid-pass.ts +0 -389
  322. package/src/renderer/pass-node-factory.ts +0 -33
  323. package/src/renderer/pass-node.ts +0 -209
  324. package/src/renderer/pattern-atlas.ts +0 -97
  325. package/src/renderer/pattern-pass.ts +0 -552
  326. package/src/renderer/pipeline-manager.ts +0 -343
  327. package/src/renderer/pixel-sorting-pass.ts +0 -277
  328. package/src/renderer/project-clock.ts +0 -57
  329. package/src/renderer/shaders/tsl/color/tonemapping.ts +0 -86
  330. package/src/renderer/shaders/tsl/cosine-palette.ts +0 -8
  331. package/src/renderer/shaders/tsl/noise/common.ts +0 -30
  332. package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +0 -35
  333. package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +0 -35
  334. package/src/renderer/shaders/tsl/noise/fbm.ts +0 -12
  335. package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +0 -97
  336. package/src/renderer/shaders/tsl/noise/ridge-noise.ts +0 -23
  337. package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +0 -78
  338. package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +0 -88
  339. package/src/renderer/shaders/tsl/noise/turbulence.ts +0 -55
  340. package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +0 -31
  341. package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +0 -59
  342. package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +0 -14
  343. package/src/renderer/shaders/tsl/patterns/bloom.ts +0 -10
  344. package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +0 -23
  345. package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +0 -8
  346. package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +0 -10
  347. package/src/renderer/shaders/tsl/utils/atan2.ts +0 -8
  348. package/src/renderer/shaders/tsl/utils/complex-conj.ts +0 -8
  349. package/src/renderer/shaders/tsl/utils/complex-cos.ts +0 -9
  350. package/src/renderer/shaders/tsl/utils/complex-div.ts +0 -10
  351. package/src/renderer/shaders/tsl/utils/complex-log.ts +0 -6
  352. package/src/renderer/shaders/tsl/utils/complex-mobius.ts +0 -11
  353. package/src/renderer/shaders/tsl/utils/complex-mul.ts +0 -8
  354. package/src/renderer/shaders/tsl/utils/complex-pow.ts +0 -15
  355. package/src/renderer/shaders/tsl/utils/complex-sin.ts +0 -9
  356. package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +0 -17
  357. package/src/renderer/shaders/tsl/utils/complex-tan.ts +0 -11
  358. package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +0 -9
  359. package/src/renderer/shaders/tsl/utils/hyperbolic.ts +0 -19
  360. package/src/renderer/shaders/tsl/utils/index.ts +0 -47
  361. package/src/renderer/shaders/tsl/utils/rotate.ts +0 -14
  362. package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +0 -14
  363. package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +0 -5
  364. package/src/renderer/shaders/tsl/utils/sd-diamond.ts +0 -5
  365. package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +0 -26
  366. package/src/renderer/shaders/tsl/utils/sd-sphere.ts +0 -5
  367. package/src/renderer/shaders/tsl/utils/smax.ts +0 -7
  368. package/src/renderer/shaders/tsl/utils/smin.ts +0 -6
  369. package/src/renderer/text-pass.ts +0 -176
  370. package/src/store/asset-store.ts +0 -193
  371. package/src/store/editor-store.ts +0 -223
  372. package/src/store/history-store.ts +0 -172
  373. package/src/store/index.ts +0 -31
  374. package/src/store/layer-store.ts +0 -675
  375. package/src/store/timeline-store.ts +0 -572
  376. package/src/types/assets.d.ts +0 -6
  377. package/src/types/css.d.ts +0 -21
  378. package/src/types/editor.ts +0 -357
  379. package/src/types/react.d.ts +0 -15
  380. package/src/types/three-tsl.d.ts +0 -146
  381. package/src/types/three-webgpu.d.ts +0 -51
  382. package/tsconfig.json +0 -49
  383. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/1.svg +0 -0
  384. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/2.svg +0 -0
  385. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/3.svg +0 -0
  386. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/4.svg +0 -0
  387. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/5.svg +0 -0
  388. /package/{packages/shader-lab-react/assets → assets}/patterns/bars/6.svg +0 -0
  389. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/1.svg +0 -0
  390. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/2.svg +0 -0
  391. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/3.svg +0 -0
  392. /package/{packages/shader-lab-react/assets → assets}/patterns/candles/4.svg +0 -0
  393. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/1.svg +0 -0
  394. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/2.svg +0 -0
  395. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/3.svg +0 -0
  396. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/4.svg +0 -0
  397. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/5.svg +0 -0
  398. /package/{packages/shader-lab-react/assets → assets}/patterns/shapes/6.svg +0 -0
  399. /package/{packages/shader-lab-react/assets → assets}/textures/blue-noise.png +0 -0
@@ -1,358 +0,0 @@
1
- "use client"
2
-
3
- import { useEffect, useMemo, useRef, useState, type CSSProperties } from "react"
4
- import { createPortal } from "react-dom"
5
- import { cn } from "@/lib/cn"
6
- import { GlassPanel } from "@/components/ui/glass-panel"
7
-
8
- type HsvColor = {
9
- h: number
10
- s: number
11
- v: number
12
- }
13
-
14
- type PopupPosition = {
15
- left: number
16
- top: number
17
- }
18
-
19
- type ColorPickerProps = {
20
- className?: string
21
- onValueChange: (value: string) => void
22
- value: string
23
- }
24
-
25
- function clamp(value: number, min: number, max: number): number {
26
- return Math.min(max, Math.max(min, value))
27
- }
28
-
29
- function normalizeHex(value: string): string | null {
30
- const normalized = value.trim().replace(/^#/, "")
31
-
32
- if (/^[\da-fA-F]{3}$/.test(normalized)) {
33
- const expanded = normalized
34
- .split("")
35
- .map((entry) => `${entry}${entry}`)
36
- .join("")
37
-
38
- return `#${expanded.toUpperCase()}`
39
- }
40
-
41
- if (/^[\da-fA-F]{6}$/.test(normalized)) {
42
- return `#${normalized.toUpperCase()}`
43
- }
44
-
45
- return null
46
- }
47
-
48
- function hexToRgb(value: string): { b: number; g: number; r: number } {
49
- const hex = normalizeHex(value) ?? "#FFFFFF"
50
- return {
51
- b: Number.parseInt(hex.slice(5, 7), 16),
52
- g: Number.parseInt(hex.slice(3, 5), 16),
53
- r: Number.parseInt(hex.slice(1, 3), 16),
54
- }
55
- }
56
-
57
- function rgbToHex(red: number, green: number, blue: number): string {
58
- return `#${[red, green, blue]
59
- .map((value) => clamp(Math.round(value), 0, 255).toString(16).padStart(2, "0"))
60
- .join("")
61
- .toUpperCase()}`
62
- }
63
-
64
- function rgbToHsv(red: number, green: number, blue: number): HsvColor {
65
- const r = red / 255
66
- const g = green / 255
67
- const b = blue / 255
68
- const max = Math.max(r, g, b)
69
- const min = Math.min(r, g, b)
70
- const delta = max - min
71
- let h = 0
72
-
73
- if (delta !== 0) {
74
- if (max === r) {
75
- h = ((g - b) / delta) % 6
76
- } else if (max === g) {
77
- h = (b - r) / delta + 2
78
- } else {
79
- h = (r - g) / delta + 4
80
- }
81
- }
82
-
83
- return {
84
- h: ((h * 60) + 360) % 360,
85
- s: max === 0 ? 0 : delta / max,
86
- v: max,
87
- }
88
- }
89
-
90
- function hsvToRgb(hue: number, saturation: number, value: number) {
91
- const chroma = value * saturation
92
- const huePrime = (((hue % 360) + 360) % 360) / 60
93
- const x = chroma * (1 - Math.abs((huePrime % 2) - 1))
94
- let red = 0
95
- let green = 0
96
- let blue = 0
97
-
98
- if (huePrime >= 0 && huePrime < 1) {
99
- red = chroma
100
- green = x
101
- } else if (huePrime < 2) {
102
- red = x
103
- green = chroma
104
- } else if (huePrime < 3) {
105
- green = chroma
106
- blue = x
107
- } else if (huePrime < 4) {
108
- green = x
109
- blue = chroma
110
- } else if (huePrime < 5) {
111
- red = x
112
- blue = chroma
113
- } else {
114
- red = chroma
115
- blue = x
116
- }
117
-
118
- const match = value - chroma
119
-
120
- return {
121
- b: (blue + match) * 255,
122
- g: (green + match) * 255,
123
- r: (red + match) * 255,
124
- }
125
- }
126
-
127
- function colorFromHsv(color: HsvColor): string {
128
- const rgb = hsvToRgb(color.h, color.s, color.v)
129
- return rgbToHex(rgb.r, rgb.g, rgb.b)
130
- }
131
-
132
- function hueToHex(hue: number): string {
133
- const rgb = hsvToRgb(hue, 1, 1)
134
- return rgbToHex(rgb.r, rgb.g, rgb.b)
135
- }
136
-
137
- export function ColorPicker({ className, onValueChange, value }: ColorPickerProps) {
138
- const triggerRef = useRef<HTMLButtonElement | null>(null)
139
- const surfaceRef = useRef<HTMLDivElement | null>(null)
140
- const hueRef = useRef<HTMLDivElement | null>(null)
141
- const [isOpen, setIsOpen] = useState(false)
142
- const [inputValue, setInputValue] = useState(normalizeHex(value) ?? "#FFFFFF")
143
- const [popupPosition, setPopupPosition] = useState<PopupPosition>({ left: 0, top: 0 })
144
- const [color, setColor] = useState(() => {
145
- const rgb = hexToRgb(value)
146
- return rgbToHsv(rgb.r, rgb.g, rgb.b)
147
- })
148
-
149
- useEffect(() => {
150
- const hex = normalizeHex(value) ?? "#FFFFFF"
151
- const rgb = hexToRgb(hex)
152
- setInputValue(hex)
153
- setColor(rgbToHsv(rgb.r, rgb.g, rgb.b))
154
- }, [value])
155
-
156
- useEffect(() => {
157
- if (!isOpen) {
158
- return
159
- }
160
-
161
- const updatePosition = () => {
162
- const trigger = triggerRef.current
163
- if (!trigger) {
164
- return
165
- }
166
-
167
- const rect = trigger.getBoundingClientRect()
168
- setPopupPosition({
169
- left: rect.right - 208,
170
- top: rect.bottom + 8,
171
- })
172
- }
173
-
174
- const handlePointerDown = (event: PointerEvent) => {
175
- const trigger = triggerRef.current
176
- const surface = surfaceRef.current
177
- const hue = hueRef.current
178
- const target = event.target as Node | null
179
-
180
- if (
181
- trigger?.contains(target) ||
182
- surface?.contains(target) ||
183
- hue?.contains(target) ||
184
- (target instanceof HTMLElement && target.closest("[data-color-picker-popup]"))
185
- ) {
186
- return
187
- }
188
-
189
- setIsOpen(false)
190
- }
191
-
192
- const handleKeyDown = (event: KeyboardEvent) => {
193
- if (event.key === "Escape") {
194
- setIsOpen(false)
195
- }
196
- }
197
-
198
- updatePosition()
199
- window.addEventListener("resize", updatePosition)
200
- window.addEventListener("scroll", updatePosition, true)
201
- window.addEventListener("pointerdown", handlePointerDown)
202
- window.addEventListener("keydown", handleKeyDown)
203
-
204
- return () => {
205
- window.removeEventListener("resize", updatePosition)
206
- window.removeEventListener("scroll", updatePosition, true)
207
- window.removeEventListener("pointerdown", handlePointerDown)
208
- window.removeEventListener("keydown", handleKeyDown)
209
- }
210
- }, [isOpen])
211
-
212
- const hueColor = useMemo(() => hueToHex(color.h), [color.h])
213
-
214
- const commitColor = (nextColor: HsvColor) => {
215
- const nextHex = colorFromHsv(nextColor)
216
- setColor(nextColor)
217
- setInputValue(nextHex)
218
- onValueChange(nextHex)
219
- }
220
-
221
- const updateSurface = (clientX: number, clientY: number) => {
222
- const surface = surfaceRef.current
223
- if (!surface) {
224
- return
225
- }
226
-
227
- const rect = surface.getBoundingClientRect()
228
- const saturation = clamp((clientX - rect.left) / rect.width, 0, 1)
229
- const valueLevel = 1 - clamp((clientY - rect.top) / rect.height, 0, 1)
230
- commitColor({ h: color.h, s: saturation, v: valueLevel })
231
- }
232
-
233
- const updateHue = (clientX: number) => {
234
- const hueElement = hueRef.current
235
- if (!hueElement) {
236
- return
237
- }
238
-
239
- const rect = hueElement.getBoundingClientRect()
240
- const hue = clamp((clientX - rect.left) / rect.width, 0, 1) * 360
241
- commitColor({ h: hue, s: color.s, v: color.v })
242
- }
243
-
244
- const handleSurfacePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {
245
- event.currentTarget.setPointerCapture(event.pointerId)
246
- updateSurface(event.clientX, event.clientY)
247
- }
248
-
249
- const handleSurfacePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {
250
- if (event.buttons !== 1) {
251
- return
252
- }
253
-
254
- updateSurface(event.clientX, event.clientY)
255
- }
256
-
257
- const handleHuePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {
258
- event.currentTarget.setPointerCapture(event.pointerId)
259
- updateHue(event.clientX)
260
- }
261
-
262
- const handleHuePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {
263
- if (event.buttons !== 1) {
264
- return
265
- }
266
-
267
- updateHue(event.clientX)
268
- }
269
-
270
- const popupStyle = {
271
- left: `${popupPosition.left}px`,
272
- position: "fixed",
273
- top: `${popupPosition.top}px`,
274
- zIndex: 80,
275
- } as CSSProperties
276
-
277
- return (
278
- <div className={cn("w-[132px]", className)}>
279
- <button
280
- className="grid min-h-8 w-full grid-cols-[24px_minmax(0,1fr)] items-center gap-2 rounded-[var(--ds-radius-control)] border border-[var(--ds-border-divider)] bg-[var(--ds-color-surface-control)] px-2 pt-1 pr-2 pb-1 pl-1 text-[var(--ds-color-text-secondary)] transition-[background-color,border-color,transform] duration-160 ease-[var(--ease-out-cubic)] hover:bg-white/8 hover:border-[var(--ds-border-hover)] focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-[var(--ds-border-active)] data-[open]:bg-white/8 data-[open]:border-[var(--ds-border-active)]"
281
- data-open={isOpen ? "" : undefined}
282
- onClick={() => setIsOpen((current) => !current)}
283
- ref={triggerRef}
284
- type="button"
285
- >
286
- <span
287
- className="h-6 w-6 rounded-[var(--ds-radius-thumb)] border border-white/8 shadow-[inset_0_0_0_1px_rgb(0_0_0_/_0.12)]"
288
- style={{ backgroundColor: inputValue }}
289
- />
290
- <span className="overflow-hidden text-ellipsis whitespace-nowrap text-left font-[var(--ds-font-mono)] text-[11px] leading-[14px] uppercase">
291
- {inputValue}
292
- </span>
293
- </button>
294
-
295
- {isOpen
296
- ? createPortal(
297
- <div data-color-picker-popup="" style={popupStyle}>
298
- <GlassPanel className="flex w-[208px] flex-col gap-3 p-3" variant="panel">
299
- <div
300
- className="relative h-[132px] w-full cursor-crosshair overflow-hidden rounded-[10px] select-none"
301
- onPointerDown={handleSurfacePointerDown}
302
- onPointerMove={handleSurfacePointerMove}
303
- ref={surfaceRef}
304
- style={{ backgroundColor: hueColor }}
305
- >
306
- <div className="absolute inset-0 bg-[linear-gradient(90deg,#fff,rgb(255_255_255_/_0%))]" />
307
- <div className="absolute inset-0 bg-[linear-gradient(0deg,#000,rgb(0_0_0_/_0%))]" />
308
- <div
309
- className="absolute h-3 w-3 -translate-x-1/2 -translate-y-1/2 rounded-full border-2 border-white/95 shadow-[0_0_0_1px_rgb(0_0_0_/_0.35),0_2px_6px_rgb(0_0_0_/_0.3)]"
310
- style={{
311
- left: `${color.s * 100}%`,
312
- top: `${(1 - color.v) * 100}%`,
313
- }}
314
- />
315
- </div>
316
-
317
- <div
318
- className="relative h-3 w-full cursor-ew-resize rounded-full select-none bg-[linear-gradient(90deg,#ff0000_0%,#ffff00_16.66%,#00ff00_33.33%,#00ffff_50%,#0000ff_66.66%,#ff00ff_83.33%,#ff0000_100%)]"
319
- onPointerDown={handleHuePointerDown}
320
- onPointerMove={handleHuePointerMove}
321
- ref={hueRef}
322
- >
323
- <div
324
- className="absolute top-1/2 h-4 w-[10px] -translate-x-1/2 -translate-y-1/2 rounded-full bg-white/96 shadow-[0_0_0_1px_rgb(0_0_0_/_0.28),0_1px_4px_rgb(0_0_0_/_0.3)]"
325
- style={{ left: `${(color.h / 360) * 100}%` }}
326
- />
327
- </div>
328
-
329
- <div className="grid grid-cols-[1fr_auto] items-center gap-2">
330
- <input
331
- className="min-h-[30px] w-full rounded-[var(--ds-radius-control)] border border-[var(--ds-border-divider)] bg-white/4 px-[10px] font-[var(--ds-font-mono)] text-[11px] leading-[14px] text-[var(--ds-color-text-secondary)] uppercase outline-none focus:border-[var(--ds-border-active)]"
332
- onChange={(event) => {
333
- const nextValue = event.target.value.toUpperCase()
334
- setInputValue(nextValue)
335
- const nextHex = normalizeHex(nextValue)
336
- if (!nextHex) {
337
- return
338
- }
339
- const rgb = hexToRgb(nextHex)
340
- setColor(rgbToHsv(rgb.r, rgb.g, rgb.b))
341
- onValueChange(nextHex)
342
- }}
343
- spellCheck={false}
344
- type="text"
345
- value={inputValue}
346
- />
347
- <span className="text-right font-[var(--ds-font-mono)] text-[10px] leading-3 text-[var(--ds-color-text-muted)] uppercase">
348
- HEX
349
- </span>
350
- </div>
351
- </GlassPanel>
352
- </div>,
353
- document.body,
354
- )
355
- : null}
356
- </div>
357
- )
358
- }
@@ -1,45 +0,0 @@
1
- import { cva, type VariantProps } from "class-variance-authority"
2
- import type { HTMLAttributes, ReactNode } from "react"
3
- import { cn } from "@/lib/cn"
4
-
5
- const glassPanelVariants = cva(
6
- "border border-[var(--ds-border-panel)] text-[var(--ds-color-text-primary)] backdrop-blur-[24px] transition-[border-color,background-color,box-shadow] duration-160 ease-[var(--ease-out-cubic)]",
7
- {
8
- variants: {
9
- variant: {
10
- panel:
11
- "overflow-clip rounded-[var(--ds-radius-panel)] bg-[var(--ds-color-glass-panel)] shadow-[var(--ds-shadow-panel-dark)]",
12
- pill:
13
- "inline-flex min-h-9 items-center gap-[var(--ds-space-2)] rounded-[var(--ds-radius-bar)] bg-[var(--ds-color-glass-pill)] px-[var(--ds-space-3)] shadow-[var(--ds-shadow-pill-dark)]",
14
- },
15
- interactive: {
16
- true: "hover:border-[var(--ds-border-hover)]",
17
- },
18
- },
19
- defaultVariants: {
20
- variant: "panel",
21
- },
22
- })
23
-
24
- interface GlassPanelProps
25
- extends HTMLAttributes<HTMLDivElement>,
26
- VariantProps<typeof glassPanelVariants> {
27
- children?: ReactNode
28
- }
29
-
30
- export function GlassPanel({
31
- children,
32
- className,
33
- interactive,
34
- variant,
35
- ...props
36
- }: GlassPanelProps) {
37
- return (
38
- <div
39
- className={cn(glassPanelVariants({ variant, interactive }), className)}
40
- {...props}
41
- >
42
- {children}
43
- </div>
44
- )
45
- }
@@ -1,46 +0,0 @@
1
- import { cva, type VariantProps } from "class-variance-authority"
2
- import type { ButtonHTMLAttributes, ReactNode } from "react"
3
- import { cn } from "@/lib/cn"
4
-
5
- const iconButtonVariants = cva(
6
- "inline-flex h-7 w-7 shrink-0 origin-center items-center justify-center rounded-[var(--ds-radius-icon)] border-0 bg-transparent text-[var(--ds-color-text-tertiary)] transition-[background-color,box-shadow,color,transform] duration-160 ease-[var(--ease-out-cubic)] will-change-transform [&_svg]:h-3.5 [&_svg]:w-3.5 hover:not-disabled:shadow-[inset_0_0_0_1px_rgb(255_255_255_/_0.04)] active:not-disabled:scale-[0.96]",
7
- {
8
- variants: {
9
- variant: {
10
- ghost:
11
- "bg-transparent text-[var(--ds-color-text-tertiary)] hover:bg-transparent hover:text-[var(--ds-color-text-primary)] hover:shadow-none",
12
- default:
13
- "bg-[var(--ds-color-surface-subtle)] text-[var(--ds-color-text-tertiary)] hover:bg-white/8 hover:text-[var(--ds-color-text-secondary)]",
14
- hover:
15
- "bg-[var(--ds-color-surface-active)] text-[var(--ds-color-text-secondary)]",
16
- active: "bg-white/12 text-white/70",
17
- },
18
- },
19
- defaultVariants: {
20
- variant: "default",
21
- },
22
- })
23
-
24
- type CommonIconButtonProps = {
25
- children?: ReactNode
26
- } & VariantProps<typeof iconButtonVariants>
27
-
28
- type IconButtonProps = CommonIconButtonProps &
29
- Omit<ButtonHTMLAttributes<HTMLButtonElement>, "children">
30
-
31
- export function IconButton({
32
- children,
33
- className,
34
- variant,
35
- ...props
36
- }: IconButtonProps) {
37
- return (
38
- <button
39
- className={cn(iconButtonVariants({ variant }), className)}
40
- type="button"
41
- {...props}
42
- >
43
- {children}
44
- </button>
45
- )
46
- }
@@ -1,136 +0,0 @@
1
- "use client"
2
-
3
- import { Select as BaseSelect } from "@base-ui/react/select"
4
- import type { ReactNode } from "react"
5
- import { cn } from "@/lib/cn"
6
-
7
- export interface SelectOption {
8
- disabled?: boolean
9
- label: ReactNode
10
- value: string
11
- }
12
-
13
- type SelectProps = Omit<
14
- BaseSelect.Root.Props<string>,
15
- "children" | "className" | "items"
16
- > & {
17
- className?: string
18
- iconClassName?: string
19
- label?: ReactNode
20
- options: readonly SelectOption[]
21
- placeholder?: ReactNode
22
- popupClassName?: string
23
- triggerAriaLabel?: string
24
- triggerClassName?: string
25
- triggerVariant?: "default" | "icon"
26
- valueClassName?: string
27
- }
28
-
29
- function ChevronIcon() {
30
- return (
31
- <svg aria-hidden="true" fill="none" viewBox="0 0 10 10">
32
- <path
33
- d="M3 4L5 6L7 4"
34
- stroke="currentColor"
35
- strokeLinecap="round"
36
- strokeLinejoin="round"
37
- strokeWidth="1.2"
38
- />
39
- </svg>
40
- )
41
- }
42
-
43
- export function Select({
44
- className,
45
- iconClassName,
46
- label,
47
- options,
48
- placeholder = "Select",
49
- popupClassName,
50
- triggerAriaLabel,
51
- triggerClassName,
52
- triggerVariant = "default",
53
- valueClassName,
54
- ...props
55
- }: SelectProps) {
56
- const isIconTrigger = triggerVariant === "icon"
57
-
58
- return (
59
- <BaseSelect.Root
60
- items={options.map(({ label: itemLabel, value }) => ({
61
- label: itemLabel,
62
- value,
63
- }))}
64
- modal={false}
65
- {...props}
66
- >
67
- <div className={cn("flex w-fit flex-col gap-1", className)}>
68
- {label ? (
69
- <BaseSelect.Label className="font-[var(--ds-font-mono)] text-[10px] leading-3 text-[var(--ds-color-text-muted)]">
70
- {label}
71
- </BaseSelect.Label>
72
- ) : null}
73
-
74
- <BaseSelect.Trigger
75
- aria-label={triggerAriaLabel}
76
- className={cn(
77
- isIconTrigger
78
- ? "group inline-flex h-7 w-7 min-w-0 shrink-0 items-center justify-center rounded-[var(--ds-radius-icon)] border-0 bg-transparent p-0 text-[var(--ds-color-text-tertiary)] transition-[background-color,box-shadow,color,transform] duration-160 ease-[var(--ease-out-cubic)] will-change-transform hover:not-data-disabled:shadow-[inset_0_0_0_1px_rgb(255_255_255_/_0.04)] active:not-data-disabled:scale-[0.96] data-[popup-open]:bg-white/12 data-[popup-open]:text-white/70 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45 focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-[var(--ds-border-active)]"
79
- : "group inline-flex min-h-8 w-fit min-w-0 items-center justify-between gap-[10px] rounded-[var(--ds-radius-icon)] border border-[var(--ds-border-divider)] bg-[var(--ds-color-surface-control)] px-[10px] py-[6px] text-[var(--ds-color-text-secondary)] transition-[background-color,border-color,transform] duration-160 ease-[var(--ease-out-cubic)] hover:not-data-disabled:bg-white/8 hover:not-data-disabled:border-[var(--ds-border-hover)] active:not-data-disabled:scale-[0.98] data-[popup-open]:bg-white/8 data-[popup-open]:border-[var(--ds-border-hover)] data-[disabled]:cursor-not-allowed data-[disabled]:opacity-45 focus-visible:outline focus-visible:outline-1 focus-visible:outline-offset-2 focus-visible:outline-[var(--ds-border-active)]",
80
- triggerClassName
81
- )}
82
- >
83
- <BaseSelect.Value
84
- className={cn(
85
- isIconTrigger
86
- ? "inline-flex items-center justify-center leading-none text-inherit"
87
- : "min-w-0 flex-1 font-[var(--ds-font-mono)] text-[11px] leading-[14px] text-inherit data-[placeholder]:text-[var(--ds-color-text-secondary)]",
88
- valueClassName
89
- )}
90
- placeholder={placeholder}
91
- />
92
- <BaseSelect.Icon
93
- className={cn(
94
- isIconTrigger
95
- ? "hidden"
96
- : "inline-flex shrink-0 text-[var(--ds-color-text-tertiary)] transition-[color,transform] duration-160 ease-[var(--ease-out-cubic)] group-data-[popup-open]:rotate-180 group-data-[popup-open]:text-[var(--ds-color-text-secondary)] [&_svg]:h-[10px] [&_svg]:w-[10px]",
97
- iconClassName
98
- )}
99
- >
100
- <ChevronIcon />
101
- </BaseSelect.Icon>
102
- </BaseSelect.Trigger>
103
- </div>
104
-
105
- <BaseSelect.Portal>
106
- <BaseSelect.Positioner
107
- alignItemWithTrigger={false}
108
- className="z-50 outline-none"
109
- sideOffset={8}
110
- >
111
- <BaseSelect.Popup
112
- className={cn(
113
- "min-w-[var(--anchor-width)] overflow-hidden rounded-[var(--ds-radius-control)] border border-[var(--ds-border-panel)] bg-[rgb(18_18_22_/_0.72)] shadow-[var(--ds-shadow-panel-dark)] backdrop-blur-[24px]",
114
- popupClassName
115
- )}
116
- >
117
- <BaseSelect.List className="flex flex-col gap-0.5 p-1">
118
- {options.map((option) => (
119
- <BaseSelect.Item
120
- className="cursor-pointer rounded-[var(--ds-radius-icon)] px-[10px] py-[6px] text-[var(--ds-color-text-secondary)] outline-none transition-[background-color,color] duration-140 ease-[var(--ease-out-cubic)] data-[highlighted]:bg-[var(--ds-color-surface-active)] data-[selected]:bg-[var(--ds-color-surface-active)] data-[highlighted]:text-[var(--ds-color-text-primary)] data-[selected]:text-[var(--ds-color-text-primary)] data-[disabled]:cursor-not-allowed data-[disabled]:text-[var(--ds-color-text-disabled)]"
121
- disabled={option.disabled}
122
- key={option.value}
123
- value={option.value}
124
- >
125
- <BaseSelect.ItemText className="block font-[var(--ds-font-mono)] text-[11px] leading-[14px]">
126
- {option.label}
127
- </BaseSelect.ItemText>
128
- </BaseSelect.Item>
129
- ))}
130
- </BaseSelect.List>
131
- </BaseSelect.Popup>
132
- </BaseSelect.Positioner>
133
- </BaseSelect.Portal>
134
- </BaseSelect.Root>
135
- )
136
- }