bsmnt 0.0.2 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/release.yml +2 -0
- package/CHANGELOG.md +31 -0
- package/CLAUDE.md +42 -24
- package/README.md +33 -12
- package/biome.json +1 -0
- package/bun.lock +2 -1
- package/docs/architecture.drawio +250 -0
- package/docs/architecture.mermaid +85 -0
- package/package.json +42 -42
- package/{bin → packages/cli/bin}/index.js +28 -31
- package/packages/cli/package.json +16 -0
- package/{src → packages/cli/src}/commands/add-integration.js +22 -37
- package/{src → packages/cli/src}/commands/create.js +125 -131
- package/packages/create-basement-app/integrations/sanity/config.js +46 -0
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/check-integration-merger.js +1 -1
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/layout-merger.js +1 -1
- package/{src → packages/create-basement-app/integrations/sanity}/mergers/sitemap-merger.js +1 -1
- package/packages/create-basement-app/package.json +10 -0
- package/packages/create-basement-app/src/configs/animations.js +28 -0
- package/packages/create-basement-app/src/index.js +15 -0
- package/packages/create-basement-app/src/mergers/check-integration-merger.js +105 -0
- package/{src → packages/create-basement-app/src}/mergers/config.js +5 -33
- package/{src → packages/create-basement-app/src}/mergers/index.js +89 -98
- package/packages/create-basement-app/src/mergers/layout-merger.js +223 -0
- package/packages/create-basement-app/src/mergers/sitemap-merger.js +121 -0
- package/packages/create-basement-app/template-hooks/config.js +38 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/default/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/default/.editorconfig +40 -0
- package/packages/create-basement-app/templates/default/.env.example +81 -0
- package/packages/create-basement-app/templates/default/.gitattributes +19 -0
- package/packages/create-basement-app/templates/default/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/default/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/default/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/default/README.md +221 -0
- package/packages/create-basement-app/templates/default/_gitignore +67 -0
- package/packages/create-basement-app/templates/default/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/default/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/default/app/page.tsx +275 -0
- package/packages/create-basement-app/templates/default/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/default/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/default/biome.json +250 -0
- package/packages/create-basement-app/templates/default/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/default/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/default/components/layout/header/index.tsx +11 -0
- package/packages/create-basement-app/templates/default/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/default/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/default/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/default/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/default/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/default/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/default/lib/README.md +33 -0
- package/packages/create-basement-app/templates/default/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/default/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/default/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/default/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/default/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/default/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/default/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/default/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/default/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/default/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/default/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/default/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/default/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/default/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/default/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/default/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/default/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/default/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/default/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/default/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/default/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/default/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/default/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/default/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/default/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/default/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/default/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/default/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/default/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/default/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/default/next.config.ts +142 -0
- package/packages/create-basement-app/templates/default/package.json +62 -0
- package/packages/create-basement-app/templates/default/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/default/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/default/tsconfig.json +43 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/experiment/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/experiment/.editorconfig +40 -0
- package/packages/create-basement-app/templates/experiment/.env.example +81 -0
- package/packages/create-basement-app/templates/experiment/.gitattributes +19 -0
- package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/experiment/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/experiment/README.md +221 -0
- package/packages/create-basement-app/templates/experiment/_gitignore +67 -0
- package/packages/create-basement-app/templates/experiment/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/experiment/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/experiment/app/page.tsx +275 -0
- package/packages/create-basement-app/templates/experiment/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/experiment/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/experiment/biome.json +250 -0
- package/packages/create-basement-app/templates/experiment/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/experiment/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/experiment/components/layout/header/index.tsx +58 -0
- package/packages/create-basement-app/templates/experiment/components/layout/navigation-menu.tsx +127 -0
- package/packages/create-basement-app/templates/experiment/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/experiment/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/experiment/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/experiment/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/experiment/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/experiment/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/experiment/lib/README.md +33 -0
- package/packages/create-basement-app/templates/experiment/lib/constants.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/experiment/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/experiment/lib/integrations/.gitkeep +0 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/experiment/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/experiment/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/experiment/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/experiment/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/experiment/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/experiment/next.config.ts +142 -0
- package/packages/create-basement-app/templates/experiment/package.json +69 -0
- package/packages/create-basement-app/templates/experiment/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/experiment/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/experiment/tsconfig.json +43 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/webgl/.editorconfig +40 -0
- package/packages/create-basement-app/templates/webgl/.env.example +81 -0
- package/packages/create-basement-app/templates/webgl/.gitattributes +19 -0
- package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/webgl/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/webgl/README.md +221 -0
- package/packages/create-basement-app/templates/webgl/_gitignore +67 -0
- package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/webgl/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/webgl/app/page.tsx +10 -0
- package/packages/create-basement-app/templates/webgl/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/webgl/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/webgl/biome.json +250 -0
- package/packages/create-basement-app/templates/webgl/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +11 -0
- package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/webgl/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/canvas/dynamic.tsx +34 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +38 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +29 -0
- package/packages/create-basement-app/templates/webgl/lib/README.md +33 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/webgl/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
- package/packages/create-basement-app/templates/webgl/lib/renderer.ts +7 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/webgl/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/webgl/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/webgl/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/webgl/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/webgl/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/webgl/next.config.ts +142 -0
- package/packages/create-basement-app/templates/webgl/package.json +68 -0
- package/packages/create-basement-app/templates/webgl/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/webgl/tsconfig.json +43 -0
- package/tasks/.last-branch +1 -0
- package/tasks/CLAUDE.md +104 -0
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +153 -0
- package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +115 -0
- package/tasks/prd-project-restructure.md +375 -0
- package/tasks/prd.json +227 -91
- package/tasks/progress.txt +281 -87
- package/tasks/ralph.sh +113 -0
- package/integrations/basehub/README.md +0 -3
- package/layers/experiment/components/layout/header/index.tsx +0 -58
- package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
- package/layers/experiment/lib/constants.ts +0 -12
- package/layers/webgl/app/page.tsx +0 -10
- package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
- package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
- package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
- package/src/mergers/next-config-merger.js +0 -63
- /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
- /package/{src → packages/cli/src}/commands/worktree.js +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
- /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
- /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
- /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
- /package/{layers/webgpu → packages/create-basement-app/templates/default/lib/integrations}/.gitkeep +0 -0
|
@@ -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
|
+
|
|
@@ -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=""
|
|
@@ -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
|
package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# Lighthouse Performance Reports
|
|
2
|
+
#
|
|
3
|
+
# Runs Lighthouse on Vercel deployments and posts results as commit comments.
|
|
4
|
+
# Our GitHub → Slack integration forwards these to Slack automatically.
|
|
5
|
+
#
|
|
6
|
+
# Required GitHub Secrets:
|
|
7
|
+
# VERCEL_TOKEN - Vercel API token (Settings → Tokens)
|
|
8
|
+
|
|
9
|
+
name: Lighthouse
|
|
10
|
+
|
|
11
|
+
on:
|
|
12
|
+
push:
|
|
13
|
+
branches: [main]
|
|
14
|
+
pull_request:
|
|
15
|
+
types: [opened, synchronize]
|
|
16
|
+
branches: [main]
|
|
17
|
+
paths:
|
|
18
|
+
# Only runs when relevant files change
|
|
19
|
+
- 'app/**'
|
|
20
|
+
- 'components/**'
|
|
21
|
+
- 'lib/**'
|
|
22
|
+
- 'public/**'
|
|
23
|
+
- 'package.json'
|
|
24
|
+
- 'package-lock.json'
|
|
25
|
+
- 'next.config.**'
|
|
26
|
+
|
|
27
|
+
permissions:
|
|
28
|
+
contents: write
|
|
29
|
+
pull-requests: write
|
|
30
|
+
actions: read
|
|
31
|
+
|
|
32
|
+
jobs:
|
|
33
|
+
lighthouse:
|
|
34
|
+
runs-on: ubuntu-latest
|
|
35
|
+
timeout-minutes: 10
|
|
36
|
+
|
|
37
|
+
steps:
|
|
38
|
+
- name: Discover Vercel Project
|
|
39
|
+
id: vercel_info
|
|
40
|
+
env:
|
|
41
|
+
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
42
|
+
run: |
|
|
43
|
+
project_name="${GITHUB_REPOSITORY##*/}"
|
|
44
|
+
echo "Looking for Vercel project: $project_name"
|
|
45
|
+
|
|
46
|
+
# Get team ID for basement.studio
|
|
47
|
+
teams=$(curl -s -H "Authorization: Bearer $VERCEL_TOKEN" "https://api.vercel.com/v2/teams")
|
|
48
|
+
team_id=$(echo "$teams" | jq -r '.teams[] | select(.slug=="basement") | .id')
|
|
49
|
+
echo "Team ID: $team_id"
|
|
50
|
+
|
|
51
|
+
# Get project ID by matching repo name
|
|
52
|
+
projects=$(curl -s -H "Authorization: Bearer $VERCEL_TOKEN" "https://api.vercel.com/v9/projects?teamId=$team_id")
|
|
53
|
+
project_id=$(echo "$projects" | jq -r ".projects[] | select(.name==\"$project_name\") | .id")
|
|
54
|
+
echo "Project ID: $project_id"
|
|
55
|
+
|
|
56
|
+
echo "team_id=$team_id" >> $GITHUB_OUTPUT
|
|
57
|
+
echo "project_id=$project_id" >> $GITHUB_OUTPUT
|
|
58
|
+
|
|
59
|
+
- name: Get Vercel Preview URL
|
|
60
|
+
id: vercel_url
|
|
61
|
+
uses: zentered/vercel-preview-url@v1.4.0
|
|
62
|
+
env:
|
|
63
|
+
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
64
|
+
with:
|
|
65
|
+
vercel_team_id: ${{ steps.vercel_info.outputs.team_id }}
|
|
66
|
+
vercel_project_id: ${{ steps.vercel_info.outputs.project_id }}
|
|
67
|
+
|
|
68
|
+
- name: Wait for Deployment
|
|
69
|
+
id: await
|
|
70
|
+
uses: UnlyEd/github-action-await-vercel@v2.0.0
|
|
71
|
+
env:
|
|
72
|
+
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
|
|
73
|
+
with:
|
|
74
|
+
deployment-url: ${{ steps.vercel_url.outputs.preview_url }}
|
|
75
|
+
timeout: 300
|
|
76
|
+
poll-interval: 10
|
|
77
|
+
continue-on-error: true
|
|
78
|
+
|
|
79
|
+
- name: Run Lighthouse
|
|
80
|
+
if: steps.await.outcome == 'success'
|
|
81
|
+
id: lighthouse
|
|
82
|
+
uses: treosh/lighthouse-ci-action@v12
|
|
83
|
+
env:
|
|
84
|
+
LHCI_BUILD_CONTEXT__CURRENT_HASH: ${{ github.sha }}
|
|
85
|
+
with:
|
|
86
|
+
urls: https://${{ steps.vercel_url.outputs.preview_url }}
|
|
87
|
+
uploadArtifacts: true
|
|
88
|
+
temporaryPublicStorage: true
|
|
89
|
+
|
|
90
|
+
- name: Format Results
|
|
91
|
+
id: format
|
|
92
|
+
uses: actions/github-script@v8
|
|
93
|
+
env:
|
|
94
|
+
DEPLOYMENT_FAILED: ${{ steps.await.outcome != 'success' }}
|
|
95
|
+
PREVIEW_URL: ${{ steps.vercel_url.outputs.preview_url }}
|
|
96
|
+
MANIFEST: ${{ steps.lighthouse.outputs.manifest }}
|
|
97
|
+
LINKS: ${{ steps.lighthouse.outputs.links }}
|
|
98
|
+
with:
|
|
99
|
+
script: |
|
|
100
|
+
if (process.env.DEPLOYMENT_FAILED === 'true') {
|
|
101
|
+
core.setOutput('comment', '⚠️ Vercel deployment failed or timed out. Lighthouse audit skipped.');
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
try {
|
|
106
|
+
const manifest = JSON.parse(process.env.MANIFEST);
|
|
107
|
+
const links = JSON.parse(process.env.LINKS);
|
|
108
|
+
const previewUrl = process.env.PREVIEW_URL;
|
|
109
|
+
|
|
110
|
+
const scores = manifest[0].summary;
|
|
111
|
+
const reportUrl = Object.values(links)[0];
|
|
112
|
+
|
|
113
|
+
const emoji = (score) => score >= 0.9 ? '🟢' : score >= 0.5 ? '🟠' : '🔴';
|
|
114
|
+
const format = (score) => Math.round(score * 100);
|
|
115
|
+
|
|
116
|
+
const comment = [
|
|
117
|
+
`⚡️ [Lighthouse report](${reportUrl}) for this commit:`,
|
|
118
|
+
'',
|
|
119
|
+
`${emoji(scores.performance)} Performance: ${format(scores.performance)}`,
|
|
120
|
+
`${emoji(scores.accessibility)} Accessibility: ${format(scores.accessibility)}`,
|
|
121
|
+
`${emoji(scores['best-practices'])} Best Practices: ${format(scores['best-practices'])}`,
|
|
122
|
+
`${emoji(scores.seo)} SEO: ${format(scores.seo)}`,
|
|
123
|
+
'',
|
|
124
|
+
`*Tested on [${previewUrl}](https://${previewUrl})*`
|
|
125
|
+
].join('\n');
|
|
126
|
+
|
|
127
|
+
core.setOutput('comment', comment);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
console.error('Error:', error);
|
|
130
|
+
core.setOutput('comment', '⚠️ Failed to generate Lighthouse report. Check workflow logs.');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
- name: Post Commit Comment
|
|
134
|
+
uses: peter-evans/commit-comment@v4
|
|
135
|
+
with:
|
|
136
|
+
body: ${{ steps.format.outputs.comment }}
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# Basement Next Starter
|
|
2
|
+
|
|
3
|
+
A production-ready Next.js starter with React 19, Tailwind CSS v4, TypeScript strict mode, and everything you need to build modern web applications.
|
|
4
|
+
|
|
5
|
+
## Tech Stack
|
|
6
|
+
|
|
7
|
+
| Technology | Version | Description |
|
|
8
|
+
|------------|---------|-------------|
|
|
9
|
+
| Next.js | 16.1 | App Router, Turbopack |
|
|
10
|
+
| React | 19 | React Compiler enabled |
|
|
11
|
+
| TypeScript | 5.9 | Strict mode, `noUncheckedIndexedAccess` |
|
|
12
|
+
| Tailwind CSS | 4 | CSS-first configuration |
|
|
13
|
+
| Biome | 2.3 | Linting and formatting |
|
|
14
|
+
| Bun | 1.3 | Package manager and runtime |
|
|
15
|
+
| Zustand | 5.0 | State management |
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
# Clone the template
|
|
21
|
+
bunx degit basementstudio/next-starter my-project
|
|
22
|
+
|
|
23
|
+
# Install dependencies
|
|
24
|
+
cd my-project && bun install
|
|
25
|
+
|
|
26
|
+
# Start development
|
|
27
|
+
bun dev
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Open [http://localhost:3000](http://localhost:3000) to see the result.
|
|
31
|
+
|
|
32
|
+
## Scripts
|
|
33
|
+
|
|
34
|
+
| Command | Description |
|
|
35
|
+
|---------|-------------|
|
|
36
|
+
| `bun dev` | Start development server with Turbopack |
|
|
37
|
+
| `bun dev:https` | Start with HTTPS (for secure contexts) |
|
|
38
|
+
| `bun build` | Build for production |
|
|
39
|
+
| `bun start` | Start production server |
|
|
40
|
+
| `bun generate` | Scaffold new components/hooks |
|
|
41
|
+
| `bun lint` | Run Biome linter |
|
|
42
|
+
| `bun lint:fix` | Fix lint issues |
|
|
43
|
+
| `bun format` | Format code with Biome |
|
|
44
|
+
| `bun typecheck` | Type check with tsgo |
|
|
45
|
+
| `bun test` | Run tests with Bun |
|
|
46
|
+
| `bun analyze` | Analyze bundle size |
|
|
47
|
+
|
|
48
|
+
## Project Structure
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
app/ # Next.js App Router pages and routes
|
|
52
|
+
├── api/ # API routes (draft-mode, revalidate)
|
|
53
|
+
├── layout.tsx # Root layout with metadata, fonts
|
|
54
|
+
├── page.tsx # Homepage
|
|
55
|
+
├── sitemap.ts # Dynamic sitemap generation
|
|
56
|
+
└── robots.ts # SEO robots.txt
|
|
57
|
+
|
|
58
|
+
components/
|
|
59
|
+
├── layout/
|
|
60
|
+
│ ├── header/ # Navigation header
|
|
61
|
+
│ ├── footer/ # Page footer
|
|
62
|
+
│ ├── wrapper/ # Page wrapper with theme
|
|
63
|
+
│ └── theme/ # Theme context provider
|
|
64
|
+
└── ui/
|
|
65
|
+
├── image/ # Enhanced Next.js Image wrapper
|
|
66
|
+
└── link/ # Smart Link component
|
|
67
|
+
|
|
68
|
+
lib/
|
|
69
|
+
├── hooks/ # Custom React hooks
|
|
70
|
+
│ ├── use-device-detection/ # Device/capability detection
|
|
71
|
+
│ ├── use-media-breakpoint/ # Responsive breakpoint hook
|
|
72
|
+
│ └── use-prefetch/ # Prefetch utilities
|
|
73
|
+
├── integrations/ # Third-party integrations
|
|
74
|
+
├── scripts/ # Build and dev scripts
|
|
75
|
+
├── store/ # Zustand global state
|
|
76
|
+
├── styles/ # Design tokens, CSS config
|
|
77
|
+
│ ├── colors.ts # Theme colors
|
|
78
|
+
│ ├── layout.mjs # Breakpoints, grid, spacing
|
|
79
|
+
│ ├── easings.ts # CSS easing variables
|
|
80
|
+
│ └── fonts.ts # Font loading (Geist Mono)
|
|
81
|
+
└── utils/ # Utility functions
|
|
82
|
+
├── easings.ts # 30+ animation easing functions
|
|
83
|
+
├── math.ts # Math utilities
|
|
84
|
+
├── strings.ts # String utilities
|
|
85
|
+
└── fetch.ts # Fetch utilities
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
## Features
|
|
89
|
+
|
|
90
|
+
### Design System
|
|
91
|
+
|
|
92
|
+
Pre-configured design tokens ready to use:
|
|
93
|
+
|
|
94
|
+
**Breakpoints:**
|
|
95
|
+
- `mobile`: 375px
|
|
96
|
+
- `tablet`: 620px
|
|
97
|
+
- `tablet-lg`: 1024px
|
|
98
|
+
- `desktop`: 1440px
|
|
99
|
+
- `desktop-large`: 1920px
|
|
100
|
+
|
|
101
|
+
**Grid:**
|
|
102
|
+
- Mobile: 4 columns
|
|
103
|
+
- Desktop: 12 columns
|
|
104
|
+
- Gap: 16px
|
|
105
|
+
|
|
106
|
+
**Colors:**
|
|
107
|
+
- Theme colors: `primary`, `secondary`, `contrast`
|
|
108
|
+
- Accent colors: `red`, `blue`, `green`, `violet`, `pink`
|
|
109
|
+
- Light/dark mode support
|
|
110
|
+
|
|
111
|
+
**Easings:**
|
|
112
|
+
30+ easing functions (quad, cubic, quart, quint, sine, expo, circ, back, elastic, bounce)
|
|
113
|
+
|
|
114
|
+
### Smart Components
|
|
115
|
+
|
|
116
|
+
**`<Image>`** - Enhanced Next.js Image wrapper:
|
|
117
|
+
- Automatic responsive sizes based on breakpoints
|
|
118
|
+
- Blur placeholder with shimmer effect
|
|
119
|
+
- Preload support for LCP images
|
|
120
|
+
- SVG handling
|
|
121
|
+
|
|
122
|
+
**`<Link>`** - Intelligent link component:
|
|
123
|
+
- Auto-detects external links (opens in new tab)
|
|
124
|
+
- Connection-aware prefetching (4G only, respects data saver)
|
|
125
|
+
- Falls back to button/div when no href
|
|
126
|
+
- Active state detection
|
|
127
|
+
|
|
128
|
+
**`<Wrapper>`** - Page layout component:
|
|
129
|
+
- Includes Header and Footer
|
|
130
|
+
- Theme provider integration
|
|
131
|
+
- Flexible content area
|
|
132
|
+
|
|
133
|
+
### Theme Support
|
|
134
|
+
|
|
135
|
+
Light/dark theme with CSS custom properties:
|
|
136
|
+
|
|
137
|
+
```tsx
|
|
138
|
+
import { Wrapper } from "@/components/layout/wrapper"
|
|
139
|
+
|
|
140
|
+
export default function Page() {
|
|
141
|
+
return (
|
|
142
|
+
<Wrapper theme="dark">
|
|
143
|
+
<section>Your content</section>
|
|
144
|
+
</Wrapper>
|
|
145
|
+
)
|
|
146
|
+
}
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Access theme in components:
|
|
150
|
+
|
|
151
|
+
```tsx
|
|
152
|
+
import { useTheme } from "@/components/layout/theme"
|
|
153
|
+
|
|
154
|
+
function Component() {
|
|
155
|
+
const { name, setThemeName } = useTheme()
|
|
156
|
+
// ...
|
|
157
|
+
}
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Performance Optimizations
|
|
161
|
+
|
|
162
|
+
- **React Compiler** - Automatic memoization (no manual `useMemo`/`useCallback`)
|
|
163
|
+
- **Turbopack** - Fast development builds
|
|
164
|
+
- **Bundle Analyzer** - `bun analyze` to inspect bundle size
|
|
165
|
+
- **Optimized Imports** - Auto-optimization for GSAP, Three.js, Lenis, Zustand
|
|
166
|
+
- **Security Headers** - CSP, HSTS, XSS protection pre-configured
|
|
167
|
+
- **Image Optimization** - AVIF, WebP with custom quality settings
|
|
168
|
+
|
|
169
|
+
### Developer Experience
|
|
170
|
+
|
|
171
|
+
- **Component Scaffolding** - `bun generate` to create components/hooks
|
|
172
|
+
- **HTTPS Dev Server** - `bun dev:https` for secure contexts
|
|
173
|
+
- **Strict TypeScript** - `noUncheckedIndexedAccess`, `exactOptionalPropertyTypes`
|
|
174
|
+
- **Biome** - Fast linting and formatting with custom rules
|
|
175
|
+
- **Tests** - Bun test runner with utilities
|
|
176
|
+
|
|
177
|
+
## Configuration
|
|
178
|
+
|
|
179
|
+
### Styles
|
|
180
|
+
|
|
181
|
+
Edit design tokens in `lib/styles/`:
|
|
182
|
+
|
|
183
|
+
- `colors.ts` - Theme and accent colors
|
|
184
|
+
- `layout.mjs` - Breakpoints, grid, spacing
|
|
185
|
+
- `typography.ts` - Font definitions
|
|
186
|
+
- `easings.ts` - CSS easing variables
|
|
187
|
+
|
|
188
|
+
After editing, regenerate CSS:
|
|
189
|
+
|
|
190
|
+
```bash
|
|
191
|
+
bun setup:styles
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Next.js
|
|
195
|
+
|
|
196
|
+
Configuration in `next.config.ts`:
|
|
197
|
+
|
|
198
|
+
- React Compiler enabled
|
|
199
|
+
- Typed routes
|
|
200
|
+
- SVG loader (@svgr/webpack)
|
|
201
|
+
- Security headers
|
|
202
|
+
- Image optimization settings
|
|
203
|
+
|
|
204
|
+
## Deployment
|
|
205
|
+
|
|
206
|
+
### Vercel (Recommended)
|
|
207
|
+
|
|
208
|
+
[](https://vercel.com/new/clone?repository-url=https://github.com/basementstudio/next-starter)
|
|
209
|
+
|
|
210
|
+
### Other Platforms
|
|
211
|
+
|
|
212
|
+
```bash
|
|
213
|
+
bun build
|
|
214
|
+
bun start
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
The app runs on port 3000 by default.
|
|
218
|
+
|
|
219
|
+
## License
|
|
220
|
+
|
|
221
|
+
MIT
|