@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,21 @@
1
+ ## Plugins
2
+
3
+ ### 1. `no-anchor-element.grit`
4
+ Enforces using Next.js `<Link>` component instead of HTML `<a>` elements.
5
+
6
+ ### 2. `no-unnecessary-forwardref.grit`
7
+ Checks for unnecessary `forwardRef` usage in React 19 with the compiler.
8
+
9
+ ### 3. `no-relative-parent-imports.grit`
10
+ Forbids relative parent imports (`../`) and encourages alias imports (`@/`).
11
+
12
+ ## Plugin Configuration
13
+
14
+ The plugins are configured in `biome.json`:
15
+ ```json
16
+ "plugins": [
17
+ "./biome-plugins/no-anchor-element.grit",
18
+ "./biome-plugins/no-unnecessary-forwardref.grit",
19
+ "./biome-plugins/no-relative-parent-imports.grit"
20
+ ]
21
+ ```
@@ -0,0 +1,12 @@
1
+ language js;
2
+
3
+ `<a $attrs>$content</a>` as $anchor where {
4
+ !$anchor <: within `if ($condition) { return ($jsx) }` where {
5
+ $condition <: contains or { `isExternal`, `isExternalSSR` }
6
+ },
7
+ register_diagnostic(
8
+ span = $anchor,
9
+ message = "Use custom Link component instead of <a> element. The Link component handles both internal and external links automatically.",
10
+ severity = "error"
11
+ )
12
+ }
@@ -0,0 +1,10 @@
1
+ language js;
2
+
3
+ `import $imports from $source` as $import where {
4
+ $source <: r"['\"]\.\.\/\.\.\/.*['\"]",
5
+ register_diagnostic(
6
+ span = $import,
7
+ message = "Use alias imports (~/dir/) instead of deep relative imports (../../). Single level imports (../) are allowed for colocated files.",
8
+ severity = "error"
9
+ )
10
+ }
@@ -0,0 +1,9 @@
1
+ language js;
2
+
3
+ `forwardRef($func)` as $ref where {
4
+ register_diagnostic(
5
+ span = $ref,
6
+ message = "forwardRef is unnecessary in React 19 with the compiler",
7
+ severity = "warning"
8
+ )
9
+ }
@@ -0,0 +1,17 @@
1
+ # Changesets
2
+
3
+ Run `bun run changeset` in a feature branch when a package change should ship.
4
+
5
+ This creates a markdown file in `.changeset` where you choose:
6
+
7
+ - `patch` for fixes
8
+ - `minor` for backward-compatible features
9
+ - `major` for breaking changes
10
+
11
+ Release flow:
12
+
13
+ 1. Add a changeset in the PR
14
+ 2. Merge the PR to `main`
15
+ 3. `release.yml` creates or updates the automated version PR
16
+ 4. Merge that generated PR
17
+ 5. The package is published to npm
@@ -0,0 +1,11 @@
1
+ {
2
+ "$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
3
+ "changelog": "@changesets/cli/changelog",
4
+ "commit": false,
5
+ "fixed": [],
6
+ "linked": [],
7
+ "access": "public",
8
+ "baseBranch": "main",
9
+ "updateInternalDependencies": "patch",
10
+ "ignore": []
11
+ }
package/.editorconfig ADDED
@@ -0,0 +1,40 @@
1
+ # EditorConfig helps maintain consistent coding styles across different editors
2
+ # https://editorconfig.org
3
+
4
+ root = true
5
+
6
+ [*]
7
+ charset = utf-8
8
+ end_of_line = lf
9
+ indent_style = space
10
+ indent_size = 2
11
+ insert_final_newline = true
12
+ trim_trailing_whitespace = true
13
+
14
+ [*.md]
15
+ trim_trailing_whitespace = false
16
+
17
+ [*.{yml,yaml}]
18
+ indent_size = 2
19
+
20
+ [Makefile]
21
+ indent_style = tab
22
+
23
+ [*.{json,jsonc}]
24
+ indent_size = 2
25
+
26
+ [*.{css,scss}]
27
+ indent_size = 2
28
+
29
+ [*.{ts,tsx,js,jsx,mjs}]
30
+ indent_size = 2
31
+
32
+ [*.svg]
33
+ insert_final_newline = false
34
+
35
+ [{package.json,package-lock.json,bun.lockb}]
36
+ indent_size = 2
37
+
38
+ [.env*]
39
+ insert_final_newline = true
40
+
package/.env.example ADDED
@@ -0,0 +1,81 @@
1
+ # ============================================
2
+ # Basement Next Starter - Environment Variables
3
+ # ============================================
4
+ # Copy this file to .env.local and fill in the values
5
+ # Run: cp .env.example .env.local
6
+ #
7
+ # Only configure the integrations you need.
8
+ # Remove unused sections to keep your env file clean.
9
+ # ============================================
10
+
11
+
12
+ # ============================================
13
+ # CORE (Recommended)
14
+ # ============================================
15
+
16
+ # Base URL for your site (used for SEO, canonical URLs, etc.)
17
+ # Development: http://localhost:3000
18
+ # Production: https://your-domain.com
19
+ NEXT_PUBLIC_BASE_URL="http://localhost:3000"
20
+
21
+ # Draft mode secret for preview functionality
22
+ # Generate a random string: openssl rand -base64 32
23
+ DRAFT_MODE_TOKEN=""
24
+
25
+
26
+ # ============================================
27
+ # SANITY CMS (Optional)
28
+ # Headless CMS with visual editing
29
+ # Get credentials: https://sanity.io/manage
30
+ # Docs: https://www.sanity.io/docs
31
+ # ============================================
32
+
33
+ # Required for Sanity
34
+ NEXT_PUBLIC_SANITY_PROJECT_ID=""
35
+ NEXT_PUBLIC_SANITY_DATASET="production"
36
+ NEXT_PUBLIC_SANITY_API_READ_TOKEN=""
37
+
38
+ # Optional - for server-side mutations and visual editing
39
+ # SANITY_PRIVATE_TOKEN=""
40
+
41
+ # Optional - API version (defaults to 2024-03-15)
42
+ # NEXT_PUBLIC_SANITY_API_VERSION="2024-03-15"
43
+
44
+
45
+ # ============================================
46
+ # SHOPIFY (Optional)
47
+ # E-commerce platform with cart and checkout
48
+ # Get credentials: https://shopify.dev/docs/storefronts/headless
49
+ # ============================================
50
+
51
+ # Required for Shopify
52
+ # SHOPIFY_STORE_DOMAIN="your-store.myshopify.com"
53
+ # SHOPIFY_STOREFRONT_ACCESS_TOKEN=""
54
+
55
+ # Optional - for revalidation webhooks
56
+ # SHOPIFY_REVALIDATION_SECRET=""
57
+
58
+ # Optional - for customer accounts
59
+ # SHOPIFY_CUSTOMER_ACCOUNT_API_CLIENT_ID=""
60
+ # SHOPIFY_CUSTOMER_ACCOUNT_API_URL=""
61
+
62
+ # ============================================
63
+ # ANALYTICS (Optional)
64
+ # ============================================
65
+
66
+ # Google Analytics
67
+ # NEXT_PUBLIC_GOOGLE_ANALYTICS=""
68
+
69
+ # Google Tag Manager
70
+ # NEXT_PUBLIC_GOOGLE_TAG_MANAGER_ID=""
71
+
72
+ # Facebook
73
+ # NEXT_PUBLIC_FACEBOOK_APP_ID=""
74
+
75
+
76
+ # ============================================
77
+ # VERCEL (Auto-populated by Vercel CLI)
78
+ # ============================================
79
+
80
+ # These are automatically set by Vercel
81
+ # VERCEL_OIDC_TOKEN=""
package/.gitattributes ADDED
@@ -0,0 +1,19 @@
1
+ # Git Attributes Configuration
2
+ # This file ensures consistent line endings across all platforms
3
+ #
4
+ # Configuration:
5
+ # * - Applies to all files in the repository
6
+ # text=auto - Git automatically detects text vs binary files
7
+ # eol=lf - Normalizes line endings to LF (Unix-style) for text files
8
+ #
9
+ # Why this matters:
10
+ # - Windows uses CRLF (\r\n) line endings
11
+ # - Unix/Linux/macOS use LF (\n) line endings
12
+ # - This prevents line-ending conflicts and ensures consistent diffs
13
+ #
14
+ # What it does:
15
+ # - On commit: Normalizes all text files to LF line endings
16
+ # - On checkout: Converts to platform-native format if needed
17
+ # - Prevents merge conflicts caused by line ending differences
18
+
19
+ * text=auto eol=lf
@@ -0,0 +1,80 @@
1
+ name: Canary Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+
6
+ permissions:
7
+ contents: read
8
+ id-token: write
9
+
10
+ concurrency:
11
+ group: canary-main
12
+ cancel-in-progress: true
13
+
14
+ jobs:
15
+ canary:
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Setup Bun
25
+ uses: oven-sh/setup-bun@v2
26
+ with:
27
+ bun-version: latest
28
+
29
+ - name: Setup Node for npm publishing
30
+ uses: actions/setup-node@v4
31
+ with:
32
+ node-version: 24
33
+
34
+ - name: Use npm 11.6.2
35
+ run: npm i -g npm@11.6.2
36
+
37
+ - name: Install dependencies
38
+ run: bun install --frozen-lockfile
39
+
40
+ - name: Type check
41
+ run: bun run check
42
+
43
+ - name: Build
44
+ run: bun run build
45
+
46
+ - name: Configure npm for publishing
47
+ run: |
48
+ cat > ~/.npmrc <<'EOF'
49
+ registry=https://registry.npmjs.org/
50
+ access=public
51
+ EOF
52
+
53
+ - name: Check pending changesets
54
+ id: changesets
55
+ run: |
56
+ bunx changeset status --output=changeset-status.json
57
+ node <<'NODE'
58
+ const fs = require('node:fs');
59
+ const status = JSON.parse(fs.readFileSync('changeset-status.json', 'utf8'));
60
+ const releaseCount = Array.isArray(status.releases) ? status.releases.length : 0;
61
+ const hasReleases = releaseCount > 0;
62
+
63
+ fs.appendFileSync(process.env.GITHUB_OUTPUT, `has_releases=${hasReleases}\n`);
64
+ console.log(`Found ${releaseCount} package(s) eligible for canary release.`);
65
+ NODE
66
+
67
+ - name: Version canary packages
68
+ if: steps.changesets.outputs.has_releases == 'true'
69
+ run: bun run version-canary
70
+
71
+ - name: Publish canary packages
72
+ if: steps.changesets.outputs.has_releases == 'true'
73
+ run: bun run release-canary
74
+ env:
75
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
76
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
77
+
78
+ - name: Skip publish (no pending changesets)
79
+ if: steps.changesets.outputs.has_releases != 'true'
80
+ run: echo "No pending changesets. Skipping canary publish."
@@ -0,0 +1,37 @@
1
+ name: CI
2
+
3
+ on:
4
+ pull_request:
5
+ branches:
6
+ - main
7
+ push:
8
+ branches:
9
+ - main
10
+
11
+ jobs:
12
+ validate:
13
+ runs-on: ubuntu-latest
14
+
15
+ steps:
16
+ - name: Checkout
17
+ uses: actions/checkout@v4
18
+ with:
19
+ fetch-depth: 0
20
+
21
+ - name: Setup Bun
22
+ uses: oven-sh/setup-bun@v2
23
+ with:
24
+ bun-version: latest
25
+
26
+ - name: Install dependencies
27
+ run: bun install --frozen-lockfile
28
+
29
+ - name: Type check
30
+ run: bun run check
31
+
32
+ - name: Build
33
+ run: bun run build
34
+
35
+ - name: Ensure changeset exists for PR changes
36
+ if: github.event_name == 'pull_request'
37
+ run: bunx changeset status --since=origin/${{ github.base_ref }}
@@ -0,0 +1,56 @@
1
+ name: Version and Release
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - main
7
+ workflow_dispatch:
8
+
9
+ permissions:
10
+ contents: write
11
+ pull-requests: write
12
+ id-token: write
13
+
14
+ jobs:
15
+ release:
16
+ runs-on: ubuntu-latest
17
+
18
+ steps:
19
+ - name: Checkout
20
+ uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Setup Bun
25
+ uses: oven-sh/setup-bun@v2
26
+ with:
27
+ bun-version: latest
28
+
29
+ - name: Setup Node for npm publishing
30
+ uses: actions/setup-node@v4
31
+ with:
32
+ node-version: 24
33
+
34
+ - name: Use npm 11.6.2
35
+ run: npm i -g npm@11.6.2
36
+
37
+ - name: Install dependencies
38
+ run: bun install --frozen-lockfile
39
+
40
+ - name: Configure npm for publishing
41
+ run: |
42
+ cat > ~/.npmrc <<'EOF'
43
+ registry=https://registry.npmjs.org/
44
+ access=public
45
+ EOF
46
+
47
+ - name: Version packages or publish
48
+ uses: changesets/action@v1
49
+ with:
50
+ version: bun run version-packages
51
+ publish: bun run release
52
+ createGithubReleases: true
53
+ env:
54
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
55
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
56
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/.tldrignore ADDED
@@ -0,0 +1,84 @@
1
+ # TLDR ignore patterns (gitignore syntax)
2
+ # Auto-generated - review and customize for your project
3
+ # Docs: https://git-scm.com/docs/gitignore
4
+
5
+ # ===================
6
+ # Dependencies
7
+ # ===================
8
+ node_modules/
9
+ .venv/
10
+ venv/
11
+ env/
12
+ __pycache__/
13
+ .tox/
14
+ .nox/
15
+ .pytest_cache/
16
+ .mypy_cache/
17
+ .ruff_cache/
18
+ vendor/
19
+ Pods/
20
+
21
+ # ===================
22
+ # Build outputs
23
+ # ===================
24
+ dist/
25
+ build/
26
+ out/
27
+ target/
28
+ *.egg-info/
29
+ *.whl
30
+ *.pyc
31
+ *.pyo
32
+
33
+ # ===================
34
+ # Binary/large files
35
+ # ===================
36
+ *.so
37
+ *.dylib
38
+ *.dll
39
+ *.exe
40
+ *.bin
41
+ *.o
42
+ *.a
43
+ *.lib
44
+
45
+ # ===================
46
+ # IDE/editors
47
+ # ===================
48
+ .idea/
49
+ .vscode/
50
+ *.swp
51
+ *.swo
52
+ *~
53
+
54
+ # ===================
55
+ # Security (always exclude)
56
+ # ===================
57
+ .env
58
+ .env.*
59
+ *.pem
60
+ *.key
61
+ *.p12
62
+ *.pfx
63
+ credentials.*
64
+ secrets.*
65
+
66
+ # ===================
67
+ # Version control
68
+ # ===================
69
+ .git/
70
+ .hg/
71
+ .svn/
72
+
73
+ # ===================
74
+ # OS files
75
+ # ===================
76
+ .DS_Store
77
+ Thumbs.db
78
+
79
+ # ===================
80
+ # Project-specific
81
+ # Add your custom patterns below
82
+ # ===================
83
+ # large_test_fixtures/
84
+ # data/
@@ -0,0 +1,20 @@
1
+ {
2
+ "recommendations": [
3
+ // Formatting & Linting
4
+ "biomejs.biome",
5
+
6
+ // CSS & Styling
7
+ "bradlc.vscode-tailwindcss",
8
+ "csstools.postcss",
9
+
10
+ // GraphQL (Shopify, etc.)
11
+ "graphql.vscode-graphql-syntax",
12
+
13
+ // Sanity CMS (GROQ syntax + validation)
14
+ "sanity-io.vscode-sanity",
15
+
16
+ // DX Enhancements
17
+ "yoavbls.pretty-ts-errors",
18
+ "waderyan.gitblame"
19
+ ]
20
+ }
@@ -0,0 +1,105 @@
1
+ {
2
+ // Language-specific formatters (explicit per-language ensures no fallback to other formatters)
3
+ "[css]": {
4
+ "editor.defaultFormatter": "biomejs.biome"
5
+ },
6
+ "[javascript]": {
7
+ "editor.defaultFormatter": "biomejs.biome"
8
+ },
9
+ "[javascriptreact]": {
10
+ "editor.defaultFormatter": "biomejs.biome"
11
+ },
12
+ "[json]": {
13
+ "editor.defaultFormatter": "biomejs.biome"
14
+ },
15
+ "[jsonc]": {
16
+ "editor.defaultFormatter": "biomejs.biome"
17
+ },
18
+ "[postcss]": {
19
+ "editor.defaultFormatter": "biomejs.biome"
20
+ },
21
+ "[typescript]": {
22
+ "editor.defaultFormatter": "biomejs.biome"
23
+ },
24
+ "[typescriptreact]": {
25
+ "editor.defaultFormatter": "biomejs.biome"
26
+ },
27
+ "colorize.languages": [
28
+ "javascript",
29
+ "typescript",
30
+ "css",
31
+ "scss",
32
+ "less",
33
+ "html",
34
+ "json",
35
+ "yaml",
36
+ "markdown",
37
+ "glsl"
38
+ ],
39
+ "css.lint.unknownAtRules": "ignore",
40
+
41
+ // CSS (Tailwind v4)
42
+ "css.lint.validProperties": ["user-drag"],
43
+ "editor.codeActionsOnSave": {
44
+ "source.fixAll.biome": "always",
45
+ "source.organizeImports.biome": "always"
46
+ },
47
+ "editor.defaultFormatter": "biomejs.biome",
48
+
49
+ // Formatting
50
+ "editor.formatOnSave": true,
51
+ "editor.formatOnSaveMode": "file",
52
+
53
+ // File associations
54
+ "files.associations": {
55
+ "*.css": "css",
56
+ "*.json": "jsonc"
57
+ },
58
+
59
+ // General
60
+ "files.eol": "\n",
61
+ // "typescript.experimental.useTsgo": true, // Disabled: tsgo doesn't support Next.js plugin
62
+ "javascript.suggest.autoImports": true,
63
+ // Disable Prettier to prevent silent formatter conflicts
64
+ "prettier.enable": false,
65
+
66
+ // Search exclusions (performance)
67
+ "search.exclude": {
68
+ "**/.next": true,
69
+ "**/.vercel": true,
70
+ "**/bun.lock": true,
71
+ "**/lib/integrations/sanity/sanity.types.ts": true,
72
+ "**/node_modules": true
73
+ },
74
+ "tailwindCSS.classAttributes": [
75
+ "class",
76
+ "className",
77
+ ".*ClassName",
78
+ ".*Styles"
79
+ ],
80
+ "tailwindCSS.classFunctions": ["cn", "cva", "twMerge", "cx"],
81
+ "tailwindCSS.experimental.classRegex": [
82
+ ["cn\\(([^)]*)\\)", "(?:'|\"|`)([^\"'`]*)(?:'|\"|`)"],
83
+ ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
84
+ ],
85
+ "tailwindCSS.experimental.configFile": "./lib/styles/css/tailwind.css",
86
+ "tailwindCSS.includeLanguages": {
87
+ "typescriptreact": "html"
88
+ },
89
+ "typescript.preferences.importModuleSpecifier": "non-relative",
90
+
91
+ // TypeScript
92
+ "typescript.suggest.autoImports": true,
93
+ "typescript.tsdk": "node_modules/typescript/lib",
94
+
95
+ // Editor labels (fixed for .tsx files)
96
+ "workbench.editor.customLabels.patterns": {
97
+ "**/app/**/layout.tsx": "${dirname(1)}/${dirname} <layout>",
98
+ "**/app/**/page.tsx": "${dirname(1)}/${dirname} <page>",
99
+ "**/app/api/**/route.ts": "${dirname(1)}/${dirname} <route>",
100
+ "**/components/**/index.tsx": "${dirname} <component>"
101
+ },
102
+ "workbench.editorAssociations": {
103
+ "*.svg": "default"
104
+ }
105
+ }