bsmnt 0.0.2 → 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/.github/workflows/release.yml +2 -0
- package/CHANGELOG.md +21 -0
- package/CLAUDE.md +42 -23
- package/README.md +33 -11
- package/biome.json +1 -0
- package/bun.lock +1 -1
- package/docs/architecture.drawio +266 -0
- package/docs/architecture.mermaid +91 -0
- package/package.json +1 -1
- package/{bin → packages/cli/bin}/index.js +28 -27
- package/packages/cli/package.json +16 -0
- package/{src → packages/cli/src}/commands/add-integration.js +23 -25
- package/{src → packages/cli/src}/commands/create.js +104 -133
- package/packages/create-basement-app/integrations/basehub/config.js +21 -0
- 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 +1 -7
- package/{src → packages/create-basement-app/src}/mergers/index.js +87 -93
- 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 +43 -0
- package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +21 -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/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/packages/create-basement-app/templates/webgpu/.biome/plugins/README.md +21 -0
- package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-anchor-element.grit +12 -0
- package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-relative-parent-imports.grit +10 -0
- package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/README.md +184 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/architecture.mdc +437 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/components.mdc +436 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/integrations.mdc +447 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/main.mdc +278 -0
- package/packages/create-basement-app/templates/webgpu/.cursor/rules/styling.mdc +433 -0
- package/packages/create-basement-app/templates/webgpu/.editorconfig +40 -0
- package/packages/create-basement-app/templates/webgpu/.env.example +81 -0
- package/packages/create-basement-app/templates/webgpu/.gitattributes +19 -0
- package/packages/create-basement-app/templates/webgpu/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/packages/create-basement-app/templates/webgpu/.github/workflows/lighthouse-to-slack.yml +136 -0
- package/packages/create-basement-app/templates/webgpu/.vscode/extensions.json +20 -0
- package/packages/create-basement-app/templates/webgpu/.vscode/settings.json +105 -0
- package/packages/create-basement-app/templates/webgpu/README.md +221 -0
- package/packages/create-basement-app/templates/webgpu/_gitignore +67 -0
- package/packages/create-basement-app/templates/webgpu/app/favicon.ico +0 -0
- package/packages/create-basement-app/templates/webgpu/app/layout.tsx +104 -0
- package/packages/create-basement-app/templates/webgpu/app/page.tsx +275 -0
- package/packages/create-basement-app/templates/webgpu/app/robots.ts +15 -0
- package/packages/create-basement-app/templates/webgpu/app/sitemap.ts +16 -0
- package/packages/create-basement-app/templates/webgpu/biome.json +250 -0
- package/packages/create-basement-app/templates/webgpu/components/basement.svg +1 -0
- package/packages/create-basement-app/templates/webgpu/components/layout/footer/index.tsx +27 -0
- package/packages/create-basement-app/templates/webgpu/components/layout/header/index.tsx +11 -0
- package/packages/create-basement-app/templates/webgpu/components/layout/theme/index.tsx +66 -0
- package/packages/create-basement-app/templates/webgpu/components/layout/wrapper/index.tsx +65 -0
- package/packages/create-basement-app/templates/webgpu/components/ui/README.md +77 -0
- package/packages/create-basement-app/templates/webgpu/components/ui/image/README.md +37 -0
- package/packages/create-basement-app/templates/webgpu/components/ui/image/index.tsx +224 -0
- package/packages/create-basement-app/templates/webgpu/components/ui/link/index.tsx +146 -0
- package/packages/create-basement-app/templates/webgpu/lib/README.md +33 -0
- package/packages/create-basement-app/templates/webgpu/lib/hooks/index.ts +12 -0
- package/packages/create-basement-app/templates/webgpu/lib/hooks/use-device-detection.ts +81 -0
- package/packages/create-basement-app/templates/webgpu/lib/hooks/use-media-breakpoint.ts +15 -0
- package/packages/create-basement-app/templates/webgpu/lib/hooks/use-prefetch.ts +74 -0
- package/packages/create-basement-app/templates/webgpu/lib/integrations/.gitkeep +0 -0
- package/packages/create-basement-app/templates/webgpu/lib/scripts/dev.ts +52 -0
- package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-component.ts +322 -0
- package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-page.ts +193 -0
- package/packages/create-basement-app/templates/webgpu/lib/scripts/generate.ts +79 -0
- package/packages/create-basement-app/templates/webgpu/lib/scripts/utils.ts +246 -0
- package/packages/create-basement-app/templates/webgpu/lib/store/app.ts +11 -0
- package/packages/create-basement-app/templates/webgpu/lib/store/index.ts +11 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/README.md +64 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/cn.ts +7 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/colors.ts +63 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/config.ts +34 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/css/global.css +85 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/css/index.css +6 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/css/reset.css +166 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/css/root.css +68 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/css/tailwind.css +132 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/easings.ts +21 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/fonts.ts +28 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/index.ts +12 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/layout.mjs +27 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/README.md +29 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-root.ts +57 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-tailwind.ts +162 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/postcss-functions.mjs +168 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/setup-styles.ts +24 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/utils.ts +20 -0
- package/packages/create-basement-app/templates/webgpu/lib/styles/typography.ts +36 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/README.md +40 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/css.d.ts +21 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/easings.ts +240 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/fetch.ts +84 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/math.test.ts +221 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/math.ts +236 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/metadata.ts +126 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/strings.test.ts +166 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/strings.ts +246 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/types.d.ts +15 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.test.ts +256 -0
- package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.ts +193 -0
- package/packages/create-basement-app/templates/webgpu/next.config.ts +142 -0
- package/packages/create-basement-app/templates/webgpu/package.json +69 -0
- package/packages/create-basement-app/templates/webgpu/postcss.config.mjs +42 -0
- package/packages/create-basement-app/templates/webgpu/public/fonts/geist/Geist-Mono.woff2 +0 -0
- package/packages/create-basement-app/templates/webgpu/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/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/basehub → packages/create-basement-app/integrations/basehub/files}/README.md +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,193 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Viewport Utilities
|
|
3
|
+
*
|
|
4
|
+
* Convert pixel values to viewport-relative sizes and relative units.
|
|
5
|
+
* Mirrors the SASS functions for consistent responsive scaling.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* import { tovw, torem, toem } from '@/utils/viewport'
|
|
10
|
+
*
|
|
11
|
+
* // Convert to viewport width units
|
|
12
|
+
* const paddingX = tovw(16, 24) // "1.5625vw" with a minimum of 24px
|
|
13
|
+
* const fontSize = tovw(16, 'mobile') // "4.27vw" (no undefined needed!)
|
|
14
|
+
* const width = tovw(100, 50, 'desktop') // "max(50px, 6.94vw)"
|
|
15
|
+
*
|
|
16
|
+
* // Convert to rem/em
|
|
17
|
+
* const spacing = torem(24) // "1.5rem"
|
|
18
|
+
* const padding = toem(16, 14) // "1.14em"
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* ## When to Use
|
|
22
|
+
*
|
|
23
|
+
* - **CSS**: Prefer the PostCSS functions `tovw()`, `torem()`, and `toem()`
|
|
24
|
+
* - **JavaScript/TypeScript**: Use these for dynamic calculations or inline styles
|
|
25
|
+
* - **Runtime calculations**: Use for canvas, WebGL, or dynamic sizing
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { breakpoints } from "@/lib/styles/config"
|
|
29
|
+
|
|
30
|
+
type ContextSize = keyof typeof breakpoints | number
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Resolves a context size to a pixel value.
|
|
34
|
+
*
|
|
35
|
+
* @param context - Context identifier or pixel value
|
|
36
|
+
* @returns Pixel value
|
|
37
|
+
*/
|
|
38
|
+
function resolveContext(context: ContextSize): number {
|
|
39
|
+
if (typeof context === "number") {
|
|
40
|
+
return context
|
|
41
|
+
}
|
|
42
|
+
return breakpoints[context] ?? breakpoints.desktop
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Checks if a value is a context identifier (breakpoint key).
|
|
47
|
+
*
|
|
48
|
+
* @param value - Value to check
|
|
49
|
+
* @returns True if value is a breakpoint key
|
|
50
|
+
*/
|
|
51
|
+
function isContextIdentifier(
|
|
52
|
+
value: unknown
|
|
53
|
+
): value is keyof typeof breakpoints {
|
|
54
|
+
return typeof value === "string" && value in breakpoints
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Rounds a number to a maximum of 4 decimal places, removing trailing zeros.
|
|
59
|
+
*
|
|
60
|
+
* @param value - Number to round
|
|
61
|
+
* @returns Rounded number as string without trailing zeros
|
|
62
|
+
*/
|
|
63
|
+
function roundToMaxDecimals(value: number): string {
|
|
64
|
+
// Round to 4 decimal places
|
|
65
|
+
const rounded = Math.round(value * 10000) / 10000
|
|
66
|
+
// Convert to string and remove trailing zeros only after decimal point
|
|
67
|
+
return rounded
|
|
68
|
+
.toString()
|
|
69
|
+
.replace(/\.0+$/, "")
|
|
70
|
+
.replace(/(\.\d*?)0+$/, "$1")
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Function overloads for tovw
|
|
74
|
+
export function tovw(target: number): string
|
|
75
|
+
export function tovw(target: number, min: number): string
|
|
76
|
+
export function tovw(target: number, context: ContextSize): string
|
|
77
|
+
export function tovw(target: number, min: number, context: ContextSize): string
|
|
78
|
+
/**
|
|
79
|
+
* Converts a pixel value to viewport width units (vw).
|
|
80
|
+
* Optionally applies a minimum value using CSS max().
|
|
81
|
+
*
|
|
82
|
+
* Supports flexible parameter patterns:
|
|
83
|
+
* - `tovw(target)` - Uses default desktop context
|
|
84
|
+
* - `tovw(target, min)` - Sets minimum value
|
|
85
|
+
* - `tovw(target, context)` - Sets context (auto-detected if string identifier)
|
|
86
|
+
* - `tovw(target, min, context)` - Sets both min and context
|
|
87
|
+
*
|
|
88
|
+
* @param target - Target pixel value to convert
|
|
89
|
+
* @param minOrContext - Optional minimum pixel value OR context identifier
|
|
90
|
+
* @param context - Context size identifier (if min was provided)
|
|
91
|
+
* @returns CSS string with vw units (e.g., "6.94vw" or "max(50px, 6.94vw)")
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* // Basic conversion
|
|
96
|
+
* tovw(100) // "6.94vw"
|
|
97
|
+
* tovw(16, 'mobile') // "4.27vw" (no undefined needed!)
|
|
98
|
+
*
|
|
99
|
+
* // With minimum value
|
|
100
|
+
* tovw(100, 50) // "max(50px, 6.94vw)"
|
|
101
|
+
* tovw(100, 50, 'mobile') // "max(50px, 6.94vw)" with mobile context
|
|
102
|
+
*
|
|
103
|
+
* // Custom context
|
|
104
|
+
* tovw(100, 1920) // "5.21vw"
|
|
105
|
+
*
|
|
106
|
+
* // Handles zero
|
|
107
|
+
* tovw(0) // "0"
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
export function tovw(
|
|
111
|
+
target: number,
|
|
112
|
+
minOrContext?: number | ContextSize,
|
|
113
|
+
context?: ContextSize
|
|
114
|
+
): string {
|
|
115
|
+
if (target === 0) {
|
|
116
|
+
return "0"
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let min: number | undefined
|
|
120
|
+
let resolvedContext: ContextSize = "desktop"
|
|
121
|
+
|
|
122
|
+
if (minOrContext !== undefined) {
|
|
123
|
+
if (isContextIdentifier(minOrContext)) {
|
|
124
|
+
// Second param is context
|
|
125
|
+
resolvedContext = minOrContext
|
|
126
|
+
if (context !== undefined) {
|
|
127
|
+
resolvedContext = context
|
|
128
|
+
}
|
|
129
|
+
} else if (typeof minOrContext === "number") {
|
|
130
|
+
// Second param is min value
|
|
131
|
+
min = minOrContext
|
|
132
|
+
if (context !== undefined) {
|
|
133
|
+
resolvedContext = context
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
} else if (context !== undefined) {
|
|
137
|
+
// Only context provided as third param (legacy support)
|
|
138
|
+
resolvedContext = context
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
const contextSize = resolveContext(resolvedContext)
|
|
142
|
+
const vwValue = (target / contextSize) * 100
|
|
143
|
+
|
|
144
|
+
if (min !== undefined) {
|
|
145
|
+
return `max(${min}px, ${roundToMaxDecimals(vwValue)}vw)`
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
return `${roundToMaxDecimals(vwValue)}vw`
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Converts a pixel value to rem units.
|
|
153
|
+
*
|
|
154
|
+
* @param target - Target pixel value to convert
|
|
155
|
+
* @param context - Base font size in pixels (default: 16)
|
|
156
|
+
* @returns CSS string with rem units (e.g., "1.5rem")
|
|
157
|
+
*
|
|
158
|
+
* @example
|
|
159
|
+
* ```ts
|
|
160
|
+
* torem(24) // "1.5rem" (24 / 16)
|
|
161
|
+
* torem(18, 14) // "1.29rem" (18 / 14)
|
|
162
|
+
* torem(0) // "0"
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
export function torem(target: number, context = 16): string {
|
|
166
|
+
if (target === 0) {
|
|
167
|
+
return "0"
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
return `${roundToMaxDecimals(target / context)}rem`
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
/**
|
|
174
|
+
* Converts a pixel value to em units.
|
|
175
|
+
*
|
|
176
|
+
* @param target - Target pixel value to convert
|
|
177
|
+
* @param context - Context size in pixels (required)
|
|
178
|
+
* @returns CSS string with em units (e.g., "1.5em")
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* ```ts
|
|
182
|
+
* toem(24, 16) // "1.5em" (24 / 16)
|
|
183
|
+
* toem(18, 14) // "1.29em" (18 / 14)
|
|
184
|
+
* toem(0, 16) // "0"
|
|
185
|
+
* ```
|
|
186
|
+
*/
|
|
187
|
+
export function toem(target: number, context: number): string {
|
|
188
|
+
if (target === 0) {
|
|
189
|
+
return "0"
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
return `${roundToMaxDecimals(target / context)}em`
|
|
193
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import withBundleAnalyzer from "@next/bundle-analyzer"
|
|
2
|
+
import type { NextConfig } from "next"
|
|
3
|
+
|
|
4
|
+
const nextConfig: NextConfig = {
|
|
5
|
+
reactStrictMode: true,
|
|
6
|
+
reactCompiler: true,
|
|
7
|
+
typedRoutes: true,
|
|
8
|
+
turbopack: {
|
|
9
|
+
rules: {
|
|
10
|
+
"*.svg": {
|
|
11
|
+
loaders: [
|
|
12
|
+
{
|
|
13
|
+
loader: "@svgr/webpack",
|
|
14
|
+
options: {
|
|
15
|
+
memo: true,
|
|
16
|
+
dimensions: false,
|
|
17
|
+
svgoConfig: {
|
|
18
|
+
multipass: true,
|
|
19
|
+
plugins: [
|
|
20
|
+
"removeDimensions",
|
|
21
|
+
"removeOffCanvasPaths",
|
|
22
|
+
"reusePaths",
|
|
23
|
+
"removeElementsByAttr",
|
|
24
|
+
"removeStyleElement",
|
|
25
|
+
"removeScriptElement",
|
|
26
|
+
"prefixIds",
|
|
27
|
+
"cleanupIds",
|
|
28
|
+
{
|
|
29
|
+
name: "cleanupNumericValues",
|
|
30
|
+
params: {
|
|
31
|
+
floatPrecision: 1,
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "convertPathData",
|
|
36
|
+
params: {
|
|
37
|
+
floatPrecision: 1,
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
name: "convertTransform",
|
|
42
|
+
params: {
|
|
43
|
+
floatPrecision: 1,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
name: "cleanupListOfValues",
|
|
48
|
+
params: {
|
|
49
|
+
floatPrecision: 1,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
as: "*.js",
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
cacheComponents: true,
|
|
62
|
+
experimental: {
|
|
63
|
+
browserDebugInfoInTerminal: true,
|
|
64
|
+
optimizePackageImports: [
|
|
65
|
+
"@react-three/drei",
|
|
66
|
+
"@react-three/fiber",
|
|
67
|
+
"gsap",
|
|
68
|
+
"three",
|
|
69
|
+
"postprocessing",
|
|
70
|
+
"lenis",
|
|
71
|
+
"zustand",
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
images: {
|
|
75
|
+
dangerouslyAllowSVG: true,
|
|
76
|
+
remotePatterns: [],
|
|
77
|
+
minimumCacheTTL: 60 * 60 * 24 * 30, // 30 days
|
|
78
|
+
qualities: [90],
|
|
79
|
+
formats: ["image/avif", "image/webp"],
|
|
80
|
+
deviceSizes: [640, 750, 828, 1080, 1200, 1920, 2048, 3840],
|
|
81
|
+
imageSizes: [16, 32, 48, 64, 96, 128, 256, 384],
|
|
82
|
+
},
|
|
83
|
+
headers: async () => [
|
|
84
|
+
{
|
|
85
|
+
source: "/(.*)",
|
|
86
|
+
headers: [
|
|
87
|
+
{
|
|
88
|
+
key: "X-Content-Type-Options",
|
|
89
|
+
value: "nosniff",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
key: "Content-Security-Policy",
|
|
93
|
+
value: "frame-ancestors 'self';",
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
key: "X-Frame-Options",
|
|
97
|
+
value: "SAMEORIGIN",
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
key: "X-XSS-Protection",
|
|
101
|
+
value: "1; mode=block",
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
key: "X-DNS-Prefetch-Control",
|
|
105
|
+
value: "on",
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
key: "Strict-Transport-Security",
|
|
109
|
+
value: "max-age=63072000; includeSubDomains; preload",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
key: "Permissions-Policy",
|
|
113
|
+
value: "camera=(), microphone=(), geolocation=()",
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
],
|
|
118
|
+
redirects: async () => [
|
|
119
|
+
{
|
|
120
|
+
source: "/home",
|
|
121
|
+
destination: "/",
|
|
122
|
+
permanent: true,
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
rewrites: async () => [
|
|
126
|
+
{
|
|
127
|
+
source: "/",
|
|
128
|
+
destination: "/home",
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const bundleAnalyzerPlugin = withBundleAnalyzer({
|
|
134
|
+
enabled: process.env.ANALYZE === "true",
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
const NextApp = () => {
|
|
138
|
+
const plugins = [bundleAnalyzerPlugin]
|
|
139
|
+
return plugins.reduce((config, plugin) => plugin(config), nextConfig)
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export default NextApp
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "basement-next-starter",
|
|
3
|
+
"description": "Basement Next.js starter template",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"private": true,
|
|
6
|
+
"packageManager": "bun@1.3.5",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"analyze": "cross-env ANALYZE=true bun run build",
|
|
9
|
+
"analyze:experimental": "next experimental-analyze",
|
|
10
|
+
"build": "bun run setup:styles && next build",
|
|
11
|
+
"dev": "bun ./lib/scripts/dev.ts",
|
|
12
|
+
"dev:https": "bun ./lib/scripts/dev.ts --https",
|
|
13
|
+
"dev:inspect": "bun ./lib/scripts/dev.ts --inspect",
|
|
14
|
+
"format": "biome format --write .",
|
|
15
|
+
"generate": "bun ./lib/scripts/generate.ts",
|
|
16
|
+
"lighthouse": "bunx @unlighthouse/cli --site http://localhost:3000",
|
|
17
|
+
"lint": "biome lint --max-diagnostics=200",
|
|
18
|
+
"lint:fix": "biome lint --write --unsafe --max-diagnostics=200",
|
|
19
|
+
"setup:styles": "bun ./lib/styles/scripts/setup-styles.ts",
|
|
20
|
+
"start": "next start",
|
|
21
|
+
"test": "bun test",
|
|
22
|
+
"test:setup": "bun test lib/scripts/setup-project.test.ts",
|
|
23
|
+
"typecheck": "tsgo --noEmit",
|
|
24
|
+
"typecheck:compare": "bun run typecheck:tsc && bun run typecheck",
|
|
25
|
+
"typecheck:tsc": "tsc --noEmit --incremental false"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@radix-ui/react-navigation-menu": "^1.2.5",
|
|
29
|
+
"@react-three/drei": "^11.0.0-alpha.4",
|
|
30
|
+
"@react-three/fiber": "10.0.0-alpha.2",
|
|
31
|
+
"class-variance-authority": "^0.7.1",
|
|
32
|
+
"leva": "^0.9.35",
|
|
33
|
+
"lucide-react": "^0.474.0",
|
|
34
|
+
"next": "16.1.4",
|
|
35
|
+
"react": "19.2.4",
|
|
36
|
+
"react-dom": "19.2.4",
|
|
37
|
+
"react-use": "^17.6.0",
|
|
38
|
+
"tailwind-merge": "^3.4.0",
|
|
39
|
+
"three": "^0.182.0",
|
|
40
|
+
"zod": "^4.3.6",
|
|
41
|
+
"zustand": "^5.0.10"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@biomejs/biome": "2.3.11",
|
|
45
|
+
"@clack/prompts": "^0.11.0",
|
|
46
|
+
"@csstools/postcss-global-data": "^3.1.0",
|
|
47
|
+
"@next/bundle-analyzer": "16.1.1",
|
|
48
|
+
"@svgr/webpack": "^8.1.0",
|
|
49
|
+
"@tailwindcss/postcss": "^4.1.18",
|
|
50
|
+
"@types/bun": "^1.3.6",
|
|
51
|
+
"@types/node": "^20.19.30",
|
|
52
|
+
"@types/react": "^19.2.9",
|
|
53
|
+
"@types/react-dom": "^19.2.3",
|
|
54
|
+
"@types/three": "^0.182.0",
|
|
55
|
+
"@typescript/native-preview": "^7.0.0-dev.20260122.3",
|
|
56
|
+
"babel-plugin-react-compiler": "1.0.0",
|
|
57
|
+
"cross-env": "^10.1.0",
|
|
58
|
+
"postcss-functions": "^4.0.2",
|
|
59
|
+
"postcss-preset-env": "^10.6.1",
|
|
60
|
+
"tailwindcss": "^4.1.18",
|
|
61
|
+
"typescript": "^5.9.3"
|
|
62
|
+
},
|
|
63
|
+
"trustedDependencies": [
|
|
64
|
+
"@biomejs/biome",
|
|
65
|
+
"@tailwindcss/oxide",
|
|
66
|
+
"esbuild",
|
|
67
|
+
"sharp"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { functions } from "./lib/styles/scripts/postcss-functions.mjs"
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* PostCSS preset-env config
|
|
5
|
+
* @see Docs {@link https://github.com/csstools/postcss-plugins/blob/main/plugin-packs/postcss-preset-env/README.md#options}
|
|
6
|
+
* @see Features Flags {@link https://github.com/csstools/postcss-plugins/blob/main/plugin-packs/postcss-preset-env/FEATURES.md}
|
|
7
|
+
* @type {import('postcss-preset-env').pluginOptions}
|
|
8
|
+
*/
|
|
9
|
+
const presetEnvConfig = {
|
|
10
|
+
autoprefixer: {
|
|
11
|
+
flexbox: "no-2009",
|
|
12
|
+
},
|
|
13
|
+
stage: 3,
|
|
14
|
+
features: {
|
|
15
|
+
"custom-properties": false,
|
|
16
|
+
"custom-media-queries": true,
|
|
17
|
+
"nesting-rules": true,
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* PostCSS global data config
|
|
23
|
+
* Makes sure the css module files have access to these context files
|
|
24
|
+
* @see {@link https://github.com/csstools/postcss-global-data?tab=readme-ov-file#options}
|
|
25
|
+
* @type {import('@csstools/postcss-global-data').pluginOptions}
|
|
26
|
+
*/
|
|
27
|
+
const globalDataConfig = {
|
|
28
|
+
files: ["./lib/styles/css/root.css"],
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const postcssConfig = {
|
|
32
|
+
// NOTE: Order is important
|
|
33
|
+
plugins: {
|
|
34
|
+
"@tailwindcss/postcss": {},
|
|
35
|
+
"@csstools/postcss-global-data": globalDataConfig,
|
|
36
|
+
"postcss-functions": { functions },
|
|
37
|
+
// NOTE: This has to be last config
|
|
38
|
+
"postcss-preset-env": presetEnvConfig,
|
|
39
|
+
},
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default postcssConfig
|
|
Binary file
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2023",
|
|
4
|
+
"lib": ["ES2023", "DOM", "DOM.Iterable"],
|
|
5
|
+
"allowJs": true,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "react-jsx",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"noImplicitOverride": true,
|
|
17
|
+
"exactOptionalPropertyTypes": true,
|
|
18
|
+
"useUnknownInCatchVariables": true,
|
|
19
|
+
"noFallthroughCasesInSwitch": true,
|
|
20
|
+
"noImplicitReturns": true,
|
|
21
|
+
"noUncheckedSideEffectImports": true,
|
|
22
|
+
"noUnusedLocals": true,
|
|
23
|
+
"noUnusedParameters": true,
|
|
24
|
+
"noUncheckedIndexedAccess": true,
|
|
25
|
+
"plugins": [
|
|
26
|
+
{
|
|
27
|
+
"name": "next"
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"paths": {
|
|
31
|
+
"@/*": ["./*"]
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"include": [
|
|
35
|
+
"next-env.d.ts",
|
|
36
|
+
"**/*.ts",
|
|
37
|
+
"**/*.tsx",
|
|
38
|
+
".next/types/**/*.ts",
|
|
39
|
+
".next/dev/types/**/*.ts",
|
|
40
|
+
"**/*.mts"
|
|
41
|
+
],
|
|
42
|
+
"exclude": ["node_modules"]
|
|
43
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
BertovDev/project-restructure
|
package/tasks/CLAUDE.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# Ralph Agent Instructions
|
|
2
|
+
|
|
3
|
+
You are an autonomous coding agent working on a software project.
|
|
4
|
+
|
|
5
|
+
## Your Task
|
|
6
|
+
|
|
7
|
+
1. Read the PRD at `prd.json` (in the same directory as this file)
|
|
8
|
+
2. Read the progress log at `progress.txt` (check Codebase Patterns section first)
|
|
9
|
+
3. Check you're on the correct branch from PRD `branchName`. If not, check it out or create from main.
|
|
10
|
+
4. Pick the **highest priority** user story where `passes: false`
|
|
11
|
+
5. Implement that single user story
|
|
12
|
+
6. Run quality checks (e.g., typecheck, lint, test - use whatever your project requires)
|
|
13
|
+
7. Update CLAUDE.md files if you discover reusable patterns (see below)
|
|
14
|
+
8. If checks pass, commit ALL changes with message: `feat: [Story ID] - [Story Title]`
|
|
15
|
+
9. Update the PRD to set `passes: true` for the completed story
|
|
16
|
+
10. Append your progress to `progress.txt`
|
|
17
|
+
|
|
18
|
+
## Progress Report Format
|
|
19
|
+
|
|
20
|
+
APPEND to progress.txt (never replace, always append):
|
|
21
|
+
```
|
|
22
|
+
## [Date/Time] - [Story ID]
|
|
23
|
+
- What was implemented
|
|
24
|
+
- Files changed
|
|
25
|
+
- **Learnings for future iterations:**
|
|
26
|
+
- Patterns discovered (e.g., "this codebase uses X for Y")
|
|
27
|
+
- Gotchas encountered (e.g., "don't forget to update Z when changing W")
|
|
28
|
+
- Useful context (e.g., "the evaluation panel is in component X")
|
|
29
|
+
---
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
The learnings section is critical - it helps future iterations avoid repeating mistakes and understand the codebase better.
|
|
33
|
+
|
|
34
|
+
## Consolidate Patterns
|
|
35
|
+
|
|
36
|
+
If you discover a **reusable pattern** that future iterations should know, add it to the `## Codebase Patterns` section at the TOP of progress.txt (create it if it doesn't exist). This section should consolidate the most important learnings:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
## Codebase Patterns
|
|
40
|
+
- Example: Use `sql<number>` template for aggregations
|
|
41
|
+
- Example: Always use `IF NOT EXISTS` for migrations
|
|
42
|
+
- Example: Export types from actions.ts for UI components
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Only add patterns that are **general and reusable**, not story-specific details.
|
|
46
|
+
|
|
47
|
+
## Update CLAUDE.md Files
|
|
48
|
+
|
|
49
|
+
Before committing, check if any edited files have learnings worth preserving in nearby CLAUDE.md files:
|
|
50
|
+
|
|
51
|
+
1. **Identify directories with edited files** - Look at which directories you modified
|
|
52
|
+
2. **Check for existing CLAUDE.md** - Look for CLAUDE.md in those directories or parent directories
|
|
53
|
+
3. **Add valuable learnings** - If you discovered something future developers/agents should know:
|
|
54
|
+
- API patterns or conventions specific to that module
|
|
55
|
+
- Gotchas or non-obvious requirements
|
|
56
|
+
- Dependencies between files
|
|
57
|
+
- Testing approaches for that area
|
|
58
|
+
- Configuration or environment requirements
|
|
59
|
+
|
|
60
|
+
**Examples of good CLAUDE.md additions:**
|
|
61
|
+
- "When modifying X, also update Y to keep them in sync"
|
|
62
|
+
- "This module uses pattern Z for all API calls"
|
|
63
|
+
- "Tests require the dev server running on PORT 3000"
|
|
64
|
+
- "Field names must match the template exactly"
|
|
65
|
+
|
|
66
|
+
**Do NOT add:**
|
|
67
|
+
- Story-specific implementation details
|
|
68
|
+
- Temporary debugging notes
|
|
69
|
+
- Information already in progress.txt
|
|
70
|
+
|
|
71
|
+
Only update CLAUDE.md if you have **genuinely reusable knowledge** that would help future work in that directory.
|
|
72
|
+
|
|
73
|
+
## Quality Requirements
|
|
74
|
+
|
|
75
|
+
- ALL commits must pass your project's quality checks (typecheck, lint, test)
|
|
76
|
+
- Do NOT commit broken code
|
|
77
|
+
- Keep changes focused and minimal
|
|
78
|
+
- Follow existing code patterns
|
|
79
|
+
|
|
80
|
+
## Browser Testing (If Available)
|
|
81
|
+
|
|
82
|
+
For any story that changes UI, verify it works in the browser if you have browser testing tools configured (e.g., via MCP):
|
|
83
|
+
|
|
84
|
+
1. Navigate to the relevant page
|
|
85
|
+
2. Verify the UI changes work as expected
|
|
86
|
+
3. Take a screenshot if helpful for the progress log
|
|
87
|
+
|
|
88
|
+
If no browser tools are available, note in your progress report that manual browser verification is needed.
|
|
89
|
+
|
|
90
|
+
## Stop Condition
|
|
91
|
+
|
|
92
|
+
After completing a user story, check if ALL stories have `passes: true`.
|
|
93
|
+
|
|
94
|
+
If ALL stories are complete and passing, reply with:
|
|
95
|
+
<promise>COMPLETE</promise>
|
|
96
|
+
|
|
97
|
+
If there are still stories with `passes: false`, end your response normally (another iteration will pick up the next story).
|
|
98
|
+
|
|
99
|
+
## Important
|
|
100
|
+
|
|
101
|
+
- Work on ONE story per iteration
|
|
102
|
+
- Commit frequently
|
|
103
|
+
- Keep CI green
|
|
104
|
+
- Read the Codebase Patterns section in progress.txt before starting
|