@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.
- package/.biome/plugins/README.md +21 -0
- package/.biome/plugins/no-anchor-element.grit +12 -0
- package/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/.changeset/README.md +17 -0
- package/.changeset/config.json +11 -0
- package/.editorconfig +40 -0
- package/.env.example +81 -0
- package/.gitattributes +19 -0
- package/.github/workflows/canary.yml +80 -0
- package/.github/workflows/ci.yml +37 -0
- package/.github/workflows/release.yml +56 -0
- package/.tldrignore +84 -0
- package/.vscode/extensions.json +20 -0
- package/.vscode/settings.json +105 -0
- package/README.md +119 -0
- package/biome.json +249 -0
- package/bun.lock +1224 -0
- package/next.config.ts +131 -0
- package/package.json +73 -0
- package/packages/shader-lab-react/CHANGELOG.md +9 -0
- package/packages/shader-lab-react/README.md +119 -0
- package/packages/shader-lab-react/assets/patterns/bars/1.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/bars/2.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/bars/3.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/bars/4.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/bars/5.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/bars/6.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/candles/1.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/candles/2.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/candles/3.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/candles/4.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/shapes/1.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/shapes/2.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/shapes/3.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/shapes/4.svg +4 -0
- package/packages/shader-lab-react/assets/patterns/shapes/5.svg +3 -0
- package/packages/shader-lab-react/assets/patterns/shapes/6.svg +4 -0
- package/packages/shader-lab-react/assets/textures/blue-noise.png +0 -0
- package/packages/shader-lab-react/package.json +36 -0
- package/packages/shader-lab-react/scripts/fix-esm-specifiers.mjs +57 -0
- package/packages/shader-lab-react/scripts/prepare-dist.mjs +4 -0
- package/packages/shader-lab-react/src/ambient/three-tsl.d.ts +146 -0
- package/packages/shader-lab-react/src/ambient/three-webgpu.d.ts +51 -0
- package/packages/shader-lab-react/src/easings.ts +4 -0
- package/packages/shader-lab-react/src/index.ts +35 -0
- package/packages/shader-lab-react/src/lib/editor/custom-shader/shared.ts +2 -0
- package/packages/shader-lab-react/src/renderer/ascii-atlas.ts +83 -0
- package/packages/shader-lab-react/src/renderer/ascii-pass.ts +416 -0
- package/packages/shader-lab-react/src/renderer/asset-url.ts +3 -0
- package/packages/shader-lab-react/src/renderer/blend-modes.ts +229 -0
- package/packages/shader-lab-react/src/renderer/contracts.ts +54 -0
- package/packages/shader-lab-react/src/renderer/create-webgpu-renderer.ts +48 -0
- package/packages/shader-lab-react/src/renderer/crt-pass.ts +1040 -0
- package/packages/shader-lab-react/src/renderer/custom-shader-pass.ts +108 -0
- package/packages/shader-lab-react/src/renderer/custom-shader-runtime.ts +309 -0
- package/packages/shader-lab-react/src/renderer/dither-textures.ts +99 -0
- package/packages/shader-lab-react/src/renderer/dithering-pass.ts +322 -0
- package/packages/shader-lab-react/src/renderer/gradient-pass.ts +521 -0
- package/packages/shader-lab-react/src/renderer/halftone-pass.ts +932 -0
- package/packages/shader-lab-react/src/renderer/ink-pass.ts +802 -0
- package/packages/shader-lab-react/src/renderer/live-pass.ts +194 -0
- package/packages/shader-lab-react/src/renderer/media-pass.ts +187 -0
- package/packages/shader-lab-react/src/renderer/media-texture.ts +66 -0
- package/packages/shader-lab-react/src/renderer/particle-grid-pass.ts +389 -0
- package/packages/shader-lab-react/src/renderer/pass-node.ts +209 -0
- package/packages/shader-lab-react/src/renderer/pattern-atlas.ts +133 -0
- package/packages/shader-lab-react/src/renderer/pattern-pass.ts +552 -0
- package/packages/shader-lab-react/src/renderer/pipeline-manager.ts +369 -0
- package/packages/shader-lab-react/src/renderer/pixel-sorting-pass.ts +277 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/color/tonemapping.ts +87 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/cosine-palette.ts +9 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/common.ts +31 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +36 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +36 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/fbm.ts +13 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +96 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/ridge-noise.ts +24 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +79 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +89 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/turbulence.ts +56 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/value-noise-3d.ts +32 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +60 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +15 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/bloom.ts +11 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +24 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +9 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +11 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/atan2.ts +9 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-conj.ts +9 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-cos.ts +10 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-div.ts +11 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-log.ts +7 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mobius.ts +12 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-mul.ts +9 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-pow.ts +16 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sin.ts +10 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-sqrt.ts +18 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-tan.ts +12 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/complex-to-polar.ts +10 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/hyperbolic.ts +20 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/index.ts +48 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/rotate.ts +15 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +15 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-box-2d.ts +6 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-diamond.ts +6 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-rhombus.ts +27 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/sd-sphere.ts +6 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smax.ts +7 -0
- package/packages/shader-lab-react/src/renderer/shaders/tsl/utils/smin.ts +7 -0
- package/packages/shader-lab-react/src/renderer/text-pass.ts +176 -0
- package/packages/shader-lab-react/src/runtime-clock.ts +42 -0
- package/packages/shader-lab-react/src/runtime-frame.ts +29 -0
- package/packages/shader-lab-react/src/shader-lab-composition.tsx +163 -0
- package/packages/shader-lab-react/src/timeline.ts +283 -0
- package/packages/shader-lab-react/src/types/editor.ts +5 -0
- package/packages/shader-lab-react/src/types.ts +141 -0
- package/packages/shader-lab-react/tsconfig.build.json +8 -0
- package/packages/shader-lab-react/tsconfig.json +21 -0
- package/postcss.config.mjs +5 -0
- package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf-atlas.png +0 -0
- package/public/assets/fonts/msdf/geist-mono/GeistMono-Regular-msdf.json +1412 -0
- package/public/assets/patterns/bars/1.svg +3 -0
- package/public/assets/patterns/bars/2.svg +3 -0
- package/public/assets/patterns/bars/3.svg +3 -0
- package/public/assets/patterns/bars/4.svg +3 -0
- package/public/assets/patterns/bars/5.svg +3 -0
- package/public/assets/patterns/bars/6.svg +3 -0
- package/public/assets/patterns/candles/1.svg +3 -0
- package/public/assets/patterns/candles/2.svg +3 -0
- package/public/assets/patterns/candles/3.svg +3 -0
- package/public/assets/patterns/candles/4.svg +3 -0
- package/public/assets/patterns/shapes/1.svg +3 -0
- package/public/assets/patterns/shapes/2.svg +3 -0
- package/public/assets/patterns/shapes/3.svg +3 -0
- package/public/assets/patterns/shapes/4.svg +4 -0
- package/public/assets/patterns/shapes/5.svg +3 -0
- package/public/assets/patterns/shapes/6.svg +4 -0
- package/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/public/textures/blue-noise.png +0 -0
- package/public/textures/crt-mask.png +0 -0
- package/src/app/design/page.tsx +398 -0
- package/src/app/favicon.ico +0 -0
- package/src/app/globals.css +280 -0
- package/src/app/layout.tsx +89 -0
- package/src/app/page.tsx +20 -0
- package/src/app/robots.ts +13 -0
- package/src/app/sitemap.ts +13 -0
- package/src/components/editor/editor-canvas-viewport.tsx +116 -0
- package/src/components/editor/editor-export-dialog.tsx +1177 -0
- package/src/components/editor/editor-timeline-overlay.tsx +983 -0
- package/src/components/editor/editor-topbar.tsx +287 -0
- package/src/components/editor/layer-sidebar.tsx +738 -0
- package/src/components/editor/properties-sidebar-content.tsx +574 -0
- package/src/components/editor/properties-sidebar-fields.tsx +389 -0
- package/src/components/editor/properties-sidebar-utils.ts +178 -0
- package/src/components/editor/properties-sidebar.tsx +421 -0
- package/src/components/ui/button/index.tsx +57 -0
- package/src/components/ui/color-picker/index.tsx +358 -0
- package/src/components/ui/glass-panel/index.tsx +45 -0
- package/src/components/ui/icon-button/index.tsx +46 -0
- package/src/components/ui/select/index.tsx +136 -0
- package/src/components/ui/slider/index.tsx +192 -0
- package/src/components/ui/toggle/index.tsx +34 -0
- package/src/components/ui/typography/index.tsx +61 -0
- package/src/components/ui/xy-pad/index.tsx +160 -0
- package/src/features/editor/components/editor-export-dialog.module.css +271 -0
- package/src/hooks/use-editor-renderer.ts +182 -0
- package/src/lib/app.ts +6 -0
- package/src/lib/cn.ts +7 -0
- package/src/lib/easings.ts +240 -0
- package/src/lib/editor/config/layer-registry.ts +2434 -0
- package/src/lib/editor/custom-shader/shared.ts +28 -0
- package/src/lib/editor/export.ts +420 -0
- package/src/lib/editor/history.ts +71 -0
- package/src/lib/editor/layers.ts +76 -0
- package/src/lib/editor/parameter-schema.ts +75 -0
- package/src/lib/editor/project-file.ts +145 -0
- package/src/lib/editor/shader-export-snippet.ts +37 -0
- package/src/lib/editor/shader-export.ts +315 -0
- package/src/lib/editor/timeline/evaluate.ts +252 -0
- package/src/lib/editor/view-transform.ts +58 -0
- package/src/lib/fonts.ts +28 -0
- package/src/renderer/ascii-atlas.ts +83 -0
- package/src/renderer/ascii-pass.ts +416 -0
- package/src/renderer/blend-modes.ts +229 -0
- package/src/renderer/contracts.ts +161 -0
- package/src/renderer/create-webgpu-renderer.ts +48 -0
- package/src/renderer/crt-pass.ts +1040 -0
- package/src/renderer/custom-shader-pass.ts +117 -0
- package/src/renderer/custom-shader-runtime.ts +309 -0
- package/src/renderer/dither-textures.ts +99 -0
- package/src/renderer/dithering-pass.ts +322 -0
- package/src/renderer/gradient-pass.ts +520 -0
- package/src/renderer/halftone-pass.ts +932 -0
- package/src/renderer/ink-pass.ts +683 -0
- package/src/renderer/live-pass.ts +194 -0
- package/src/renderer/media-pass.ts +187 -0
- package/src/renderer/media-texture.ts +66 -0
- package/src/renderer/particle-grid-pass.ts +389 -0
- package/src/renderer/pass-node-factory.ts +33 -0
- package/src/renderer/pass-node.ts +209 -0
- package/src/renderer/pattern-atlas.ts +97 -0
- package/src/renderer/pattern-pass.ts +552 -0
- package/src/renderer/pipeline-manager.ts +343 -0
- package/src/renderer/pixel-sorting-pass.ts +277 -0
- package/src/renderer/project-clock.ts +57 -0
- package/src/renderer/shaders/tsl/color/tonemapping.ts +86 -0
- package/src/renderer/shaders/tsl/cosine-palette.ts +8 -0
- package/src/renderer/shaders/tsl/noise/common.ts +30 -0
- package/src/renderer/shaders/tsl/noise/curl-noise-3d.ts +35 -0
- package/src/renderer/shaders/tsl/noise/curl-noise-4d.ts +35 -0
- package/src/renderer/shaders/tsl/noise/fbm.ts +12 -0
- package/src/renderer/shaders/tsl/noise/perlin-noise-3d.ts +97 -0
- package/src/renderer/shaders/tsl/noise/ridge-noise.ts +23 -0
- package/src/renderer/shaders/tsl/noise/simplex-noise-3d.ts +78 -0
- package/src/renderer/shaders/tsl/noise/simplex-noise-4d.ts +88 -0
- package/src/renderer/shaders/tsl/noise/turbulence.ts +55 -0
- package/src/renderer/shaders/tsl/noise/value-noise-3d.ts +31 -0
- package/src/renderer/shaders/tsl/noise/voronoi-noise-3d.ts +59 -0
- package/src/renderer/shaders/tsl/patterns/bloom-edge-pattern.ts +14 -0
- package/src/renderer/shaders/tsl/patterns/bloom.ts +10 -0
- package/src/renderer/shaders/tsl/patterns/canvas-weave-pattern.ts +23 -0
- package/src/renderer/shaders/tsl/patterns/grain-texture-pattern.ts +8 -0
- package/src/renderer/shaders/tsl/patterns/repeating-pattern.ts +10 -0
- package/src/renderer/shaders/tsl/utils/atan2.ts +8 -0
- package/src/renderer/shaders/tsl/utils/complex-conj.ts +8 -0
- package/src/renderer/shaders/tsl/utils/complex-cos.ts +9 -0
- package/src/renderer/shaders/tsl/utils/complex-div.ts +10 -0
- package/src/renderer/shaders/tsl/utils/complex-log.ts +6 -0
- package/src/renderer/shaders/tsl/utils/complex-mobius.ts +11 -0
- package/src/renderer/shaders/tsl/utils/complex-mul.ts +8 -0
- package/src/renderer/shaders/tsl/utils/complex-pow.ts +15 -0
- package/src/renderer/shaders/tsl/utils/complex-sin.ts +9 -0
- package/src/renderer/shaders/tsl/utils/complex-sqrt.ts +17 -0
- package/src/renderer/shaders/tsl/utils/complex-tan.ts +11 -0
- package/src/renderer/shaders/tsl/utils/complex-to-polar.ts +9 -0
- package/src/renderer/shaders/tsl/utils/hyperbolic.ts +19 -0
- package/src/renderer/shaders/tsl/utils/index.ts +47 -0
- package/src/renderer/shaders/tsl/utils/rotate.ts +14 -0
- package/src/renderer/shaders/tsl/utils/screen-aspect-uv.ts +14 -0
- package/src/renderer/shaders/tsl/utils/sd-box-2d.ts +5 -0
- package/src/renderer/shaders/tsl/utils/sd-diamond.ts +5 -0
- package/src/renderer/shaders/tsl/utils/sd-rhombus.ts +26 -0
- package/src/renderer/shaders/tsl/utils/sd-sphere.ts +5 -0
- package/src/renderer/shaders/tsl/utils/smax.ts +7 -0
- package/src/renderer/shaders/tsl/utils/smin.ts +6 -0
- package/src/renderer/text-pass.ts +176 -0
- package/src/store/asset-store.ts +193 -0
- package/src/store/editor-store.ts +223 -0
- package/src/store/history-store.ts +172 -0
- package/src/store/index.ts +31 -0
- package/src/store/layer-store.ts +675 -0
- package/src/store/timeline-store.ts +572 -0
- package/src/types/assets.d.ts +6 -0
- package/src/types/css.d.ts +21 -0
- package/src/types/editor.ts +357 -0
- package/src/types/react.d.ts +15 -0
- package/src/types/three-tsl.d.ts +146 -0
- package/src/types/three-webgpu.d.ts +51 -0
- 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,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
|
+
}
|