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.
Files changed (430) hide show
  1. package/.github/workflows/release.yml +2 -0
  2. package/CHANGELOG.md +21 -0
  3. package/CLAUDE.md +42 -23
  4. package/README.md +33 -11
  5. package/biome.json +1 -0
  6. package/bun.lock +1 -1
  7. package/docs/architecture.drawio +266 -0
  8. package/docs/architecture.mermaid +91 -0
  9. package/package.json +1 -1
  10. package/{bin → packages/cli/bin}/index.js +28 -27
  11. package/packages/cli/package.json +16 -0
  12. package/{src → packages/cli/src}/commands/add-integration.js +23 -25
  13. package/{src → packages/cli/src}/commands/create.js +104 -133
  14. package/packages/create-basement-app/integrations/basehub/config.js +21 -0
  15. package/packages/create-basement-app/integrations/sanity/config.js +46 -0
  16. package/{src → packages/create-basement-app/integrations/sanity}/mergers/check-integration-merger.js +1 -1
  17. package/{src → packages/create-basement-app/integrations/sanity}/mergers/layout-merger.js +1 -1
  18. package/{src → packages/create-basement-app/integrations/sanity}/mergers/sitemap-merger.js +1 -1
  19. package/packages/create-basement-app/package.json +10 -0
  20. package/packages/create-basement-app/src/configs/animations.js +28 -0
  21. package/packages/create-basement-app/src/index.js +15 -0
  22. package/packages/create-basement-app/src/mergers/check-integration-merger.js +105 -0
  23. package/{src → packages/create-basement-app/src}/mergers/config.js +1 -7
  24. package/{src → packages/create-basement-app/src}/mergers/index.js +87 -93
  25. package/packages/create-basement-app/src/mergers/layout-merger.js +223 -0
  26. package/packages/create-basement-app/src/mergers/sitemap-merger.js +121 -0
  27. package/packages/create-basement-app/template-hooks/config.js +38 -0
  28. package/packages/create-basement-app/templates/default/.biome/plugins/README.md +21 -0
  29. package/packages/create-basement-app/templates/default/.biome/plugins/no-anchor-element.grit +12 -0
  30. package/packages/create-basement-app/templates/default/.biome/plugins/no-relative-parent-imports.grit +10 -0
  31. package/packages/create-basement-app/templates/default/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  32. package/packages/create-basement-app/templates/default/.cursor/rules/README.md +184 -0
  33. package/packages/create-basement-app/templates/default/.cursor/rules/architecture.mdc +437 -0
  34. package/packages/create-basement-app/templates/default/.cursor/rules/components.mdc +436 -0
  35. package/packages/create-basement-app/templates/default/.cursor/rules/integrations.mdc +447 -0
  36. package/packages/create-basement-app/templates/default/.cursor/rules/main.mdc +278 -0
  37. package/packages/create-basement-app/templates/default/.cursor/rules/styling.mdc +433 -0
  38. package/packages/create-basement-app/templates/default/.editorconfig +40 -0
  39. package/packages/create-basement-app/templates/default/.env.example +81 -0
  40. package/packages/create-basement-app/templates/default/.gitattributes +19 -0
  41. package/packages/create-basement-app/templates/default/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  42. package/packages/create-basement-app/templates/default/.github/workflows/lighthouse-to-slack.yml +136 -0
  43. package/packages/create-basement-app/templates/default/.vscode/extensions.json +20 -0
  44. package/packages/create-basement-app/templates/default/.vscode/settings.json +105 -0
  45. package/packages/create-basement-app/templates/default/README.md +221 -0
  46. package/packages/create-basement-app/templates/default/_gitignore +67 -0
  47. package/packages/create-basement-app/templates/default/app/favicon.ico +0 -0
  48. package/packages/create-basement-app/templates/default/app/layout.tsx +104 -0
  49. package/packages/create-basement-app/templates/default/app/page.tsx +275 -0
  50. package/packages/create-basement-app/templates/default/app/robots.ts +15 -0
  51. package/packages/create-basement-app/templates/default/app/sitemap.ts +16 -0
  52. package/packages/create-basement-app/templates/default/biome.json +250 -0
  53. package/packages/create-basement-app/templates/default/components/basement.svg +1 -0
  54. package/packages/create-basement-app/templates/default/components/layout/footer/index.tsx +27 -0
  55. package/packages/create-basement-app/templates/default/components/layout/header/index.tsx +11 -0
  56. package/packages/create-basement-app/templates/default/components/layout/theme/index.tsx +66 -0
  57. package/packages/create-basement-app/templates/default/components/layout/wrapper/index.tsx +65 -0
  58. package/packages/create-basement-app/templates/default/components/ui/README.md +77 -0
  59. package/packages/create-basement-app/templates/default/components/ui/image/README.md +37 -0
  60. package/packages/create-basement-app/templates/default/components/ui/image/index.tsx +224 -0
  61. package/packages/create-basement-app/templates/default/components/ui/link/index.tsx +146 -0
  62. package/packages/create-basement-app/templates/default/lib/README.md +33 -0
  63. package/packages/create-basement-app/templates/default/lib/hooks/index.ts +12 -0
  64. package/packages/create-basement-app/templates/default/lib/hooks/use-device-detection.ts +81 -0
  65. package/packages/create-basement-app/templates/default/lib/hooks/use-media-breakpoint.ts +15 -0
  66. package/packages/create-basement-app/templates/default/lib/hooks/use-prefetch.ts +74 -0
  67. package/packages/create-basement-app/templates/default/lib/scripts/dev.ts +52 -0
  68. package/packages/create-basement-app/templates/default/lib/scripts/generate-component.ts +322 -0
  69. package/packages/create-basement-app/templates/default/lib/scripts/generate-page.ts +193 -0
  70. package/packages/create-basement-app/templates/default/lib/scripts/generate.ts +79 -0
  71. package/packages/create-basement-app/templates/default/lib/scripts/utils.ts +246 -0
  72. package/packages/create-basement-app/templates/default/lib/store/app.ts +11 -0
  73. package/packages/create-basement-app/templates/default/lib/store/index.ts +11 -0
  74. package/packages/create-basement-app/templates/default/lib/styles/README.md +64 -0
  75. package/packages/create-basement-app/templates/default/lib/styles/cn.ts +7 -0
  76. package/packages/create-basement-app/templates/default/lib/styles/colors.ts +63 -0
  77. package/packages/create-basement-app/templates/default/lib/styles/config.ts +34 -0
  78. package/packages/create-basement-app/templates/default/lib/styles/css/global.css +85 -0
  79. package/packages/create-basement-app/templates/default/lib/styles/css/index.css +6 -0
  80. package/packages/create-basement-app/templates/default/lib/styles/css/reset.css +166 -0
  81. package/packages/create-basement-app/templates/default/lib/styles/css/root.css +68 -0
  82. package/packages/create-basement-app/templates/default/lib/styles/css/tailwind.css +132 -0
  83. package/packages/create-basement-app/templates/default/lib/styles/easings.ts +21 -0
  84. package/packages/create-basement-app/templates/default/lib/styles/fonts.ts +28 -0
  85. package/packages/create-basement-app/templates/default/lib/styles/index.ts +12 -0
  86. package/packages/create-basement-app/templates/default/lib/styles/layout.mjs +27 -0
  87. package/packages/create-basement-app/templates/default/lib/styles/scripts/README.md +29 -0
  88. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-root.ts +57 -0
  89. package/packages/create-basement-app/templates/default/lib/styles/scripts/generate-tailwind.ts +162 -0
  90. package/packages/create-basement-app/templates/default/lib/styles/scripts/postcss-functions.mjs +168 -0
  91. package/packages/create-basement-app/templates/default/lib/styles/scripts/setup-styles.ts +24 -0
  92. package/packages/create-basement-app/templates/default/lib/styles/scripts/utils.ts +20 -0
  93. package/packages/create-basement-app/templates/default/lib/styles/typography.ts +36 -0
  94. package/packages/create-basement-app/templates/default/lib/utils/README.md +40 -0
  95. package/packages/create-basement-app/templates/default/lib/utils/css.d.ts +21 -0
  96. package/packages/create-basement-app/templates/default/lib/utils/easings.ts +240 -0
  97. package/packages/create-basement-app/templates/default/lib/utils/fetch.ts +84 -0
  98. package/packages/create-basement-app/templates/default/lib/utils/math.test.ts +221 -0
  99. package/packages/create-basement-app/templates/default/lib/utils/math.ts +236 -0
  100. package/packages/create-basement-app/templates/default/lib/utils/metadata.ts +126 -0
  101. package/packages/create-basement-app/templates/default/lib/utils/strings.test.ts +166 -0
  102. package/packages/create-basement-app/templates/default/lib/utils/strings.ts +246 -0
  103. package/packages/create-basement-app/templates/default/lib/utils/types.d.ts +15 -0
  104. package/packages/create-basement-app/templates/default/lib/utils/viewport.test.ts +256 -0
  105. package/packages/create-basement-app/templates/default/lib/utils/viewport.ts +193 -0
  106. package/packages/create-basement-app/templates/default/next.config.ts +142 -0
  107. package/packages/create-basement-app/templates/default/package.json +62 -0
  108. package/packages/create-basement-app/templates/default/postcss.config.mjs +42 -0
  109. package/packages/create-basement-app/templates/default/public/fonts/geist/Geist-Mono.woff2 +0 -0
  110. package/packages/create-basement-app/templates/default/tsconfig.json +43 -0
  111. package/packages/create-basement-app/templates/experiment/.biome/plugins/README.md +21 -0
  112. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-anchor-element.grit +12 -0
  113. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-relative-parent-imports.grit +10 -0
  114. package/packages/create-basement-app/templates/experiment/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  115. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +184 -0
  116. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +437 -0
  117. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +436 -0
  118. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +447 -0
  119. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +278 -0
  120. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +433 -0
  121. package/packages/create-basement-app/templates/experiment/.editorconfig +40 -0
  122. package/packages/create-basement-app/templates/experiment/.env.example +81 -0
  123. package/packages/create-basement-app/templates/experiment/.gitattributes +19 -0
  124. package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  125. package/packages/create-basement-app/templates/experiment/.github/workflows/lighthouse-to-slack.yml +136 -0
  126. package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +20 -0
  127. package/packages/create-basement-app/templates/experiment/.vscode/settings.json +105 -0
  128. package/packages/create-basement-app/templates/experiment/README.md +221 -0
  129. package/packages/create-basement-app/templates/experiment/_gitignore +67 -0
  130. package/packages/create-basement-app/templates/experiment/app/favicon.ico +0 -0
  131. package/packages/create-basement-app/templates/experiment/app/layout.tsx +104 -0
  132. package/packages/create-basement-app/templates/experiment/app/page.tsx +275 -0
  133. package/packages/create-basement-app/templates/experiment/app/robots.ts +15 -0
  134. package/packages/create-basement-app/templates/experiment/app/sitemap.ts +16 -0
  135. package/packages/create-basement-app/templates/experiment/biome.json +250 -0
  136. package/packages/create-basement-app/templates/experiment/components/basement.svg +1 -0
  137. package/packages/create-basement-app/templates/experiment/components/layout/footer/index.tsx +27 -0
  138. package/packages/create-basement-app/templates/experiment/components/layout/header/index.tsx +58 -0
  139. package/packages/create-basement-app/templates/experiment/components/layout/navigation-menu.tsx +127 -0
  140. package/packages/create-basement-app/templates/experiment/components/layout/theme/index.tsx +66 -0
  141. package/packages/create-basement-app/templates/experiment/components/layout/wrapper/index.tsx +65 -0
  142. package/packages/create-basement-app/templates/experiment/components/ui/README.md +77 -0
  143. package/packages/create-basement-app/templates/experiment/components/ui/image/README.md +37 -0
  144. package/packages/create-basement-app/templates/experiment/components/ui/image/index.tsx +224 -0
  145. package/packages/create-basement-app/templates/experiment/components/ui/link/index.tsx +146 -0
  146. package/packages/create-basement-app/templates/experiment/lib/README.md +33 -0
  147. package/packages/create-basement-app/templates/experiment/lib/constants.ts +12 -0
  148. package/packages/create-basement-app/templates/experiment/lib/hooks/index.ts +12 -0
  149. package/packages/create-basement-app/templates/experiment/lib/hooks/use-device-detection.ts +81 -0
  150. package/packages/create-basement-app/templates/experiment/lib/hooks/use-media-breakpoint.ts +15 -0
  151. package/packages/create-basement-app/templates/experiment/lib/hooks/use-prefetch.ts +74 -0
  152. package/packages/create-basement-app/templates/experiment/lib/integrations/.gitkeep +0 -0
  153. package/packages/create-basement-app/templates/experiment/lib/scripts/dev.ts +52 -0
  154. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-component.ts +322 -0
  155. package/packages/create-basement-app/templates/experiment/lib/scripts/generate-page.ts +193 -0
  156. package/packages/create-basement-app/templates/experiment/lib/scripts/generate.ts +79 -0
  157. package/packages/create-basement-app/templates/experiment/lib/scripts/utils.ts +246 -0
  158. package/packages/create-basement-app/templates/experiment/lib/store/app.ts +11 -0
  159. package/packages/create-basement-app/templates/experiment/lib/store/index.ts +11 -0
  160. package/packages/create-basement-app/templates/experiment/lib/styles/README.md +64 -0
  161. package/packages/create-basement-app/templates/experiment/lib/styles/cn.ts +7 -0
  162. package/packages/create-basement-app/templates/experiment/lib/styles/colors.ts +63 -0
  163. package/packages/create-basement-app/templates/experiment/lib/styles/config.ts +34 -0
  164. package/packages/create-basement-app/templates/experiment/lib/styles/css/global.css +85 -0
  165. package/packages/create-basement-app/templates/experiment/lib/styles/css/index.css +6 -0
  166. package/packages/create-basement-app/templates/experiment/lib/styles/css/reset.css +166 -0
  167. package/packages/create-basement-app/templates/experiment/lib/styles/css/root.css +68 -0
  168. package/packages/create-basement-app/templates/experiment/lib/styles/css/tailwind.css +132 -0
  169. package/packages/create-basement-app/templates/experiment/lib/styles/easings.ts +21 -0
  170. package/packages/create-basement-app/templates/experiment/lib/styles/fonts.ts +28 -0
  171. package/packages/create-basement-app/templates/experiment/lib/styles/index.ts +12 -0
  172. package/packages/create-basement-app/templates/experiment/lib/styles/layout.mjs +27 -0
  173. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/README.md +29 -0
  174. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-root.ts +57 -0
  175. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/generate-tailwind.ts +162 -0
  176. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/postcss-functions.mjs +168 -0
  177. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/setup-styles.ts +24 -0
  178. package/packages/create-basement-app/templates/experiment/lib/styles/scripts/utils.ts +20 -0
  179. package/packages/create-basement-app/templates/experiment/lib/styles/typography.ts +36 -0
  180. package/packages/create-basement-app/templates/experiment/lib/utils/README.md +40 -0
  181. package/packages/create-basement-app/templates/experiment/lib/utils/css.d.ts +21 -0
  182. package/packages/create-basement-app/templates/experiment/lib/utils/easings.ts +240 -0
  183. package/packages/create-basement-app/templates/experiment/lib/utils/fetch.ts +84 -0
  184. package/packages/create-basement-app/templates/experiment/lib/utils/math.test.ts +221 -0
  185. package/packages/create-basement-app/templates/experiment/lib/utils/math.ts +236 -0
  186. package/packages/create-basement-app/templates/experiment/lib/utils/metadata.ts +126 -0
  187. package/packages/create-basement-app/templates/experiment/lib/utils/strings.test.ts +166 -0
  188. package/packages/create-basement-app/templates/experiment/lib/utils/strings.ts +246 -0
  189. package/packages/create-basement-app/templates/experiment/lib/utils/types.d.ts +15 -0
  190. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.test.ts +256 -0
  191. package/packages/create-basement-app/templates/experiment/lib/utils/viewport.ts +193 -0
  192. package/packages/create-basement-app/templates/experiment/next.config.ts +142 -0
  193. package/packages/create-basement-app/templates/experiment/package.json +69 -0
  194. package/packages/create-basement-app/templates/experiment/postcss.config.mjs +42 -0
  195. package/packages/create-basement-app/templates/experiment/public/fonts/geist/Geist-Mono.woff2 +0 -0
  196. package/packages/create-basement-app/templates/experiment/tsconfig.json +43 -0
  197. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +21 -0
  198. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +12 -0
  199. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +10 -0
  200. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  201. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +184 -0
  202. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +437 -0
  203. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +436 -0
  204. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +447 -0
  205. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +278 -0
  206. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +433 -0
  207. package/packages/create-basement-app/templates/webgl/.editorconfig +40 -0
  208. package/packages/create-basement-app/templates/webgl/.env.example +81 -0
  209. package/packages/create-basement-app/templates/webgl/.gitattributes +19 -0
  210. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  211. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +136 -0
  212. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +20 -0
  213. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +105 -0
  214. package/packages/create-basement-app/templates/webgl/README.md +221 -0
  215. package/packages/create-basement-app/templates/webgl/_gitignore +67 -0
  216. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  217. package/packages/create-basement-app/templates/webgl/app/layout.tsx +104 -0
  218. package/packages/create-basement-app/templates/webgl/app/page.tsx +10 -0
  219. package/packages/create-basement-app/templates/webgl/app/robots.ts +15 -0
  220. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +16 -0
  221. package/packages/create-basement-app/templates/webgl/biome.json +250 -0
  222. package/packages/create-basement-app/templates/webgl/components/basement.svg +1 -0
  223. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +27 -0
  224. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +11 -0
  225. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +66 -0
  226. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +65 -0
  227. package/packages/create-basement-app/templates/webgl/components/ui/README.md +77 -0
  228. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +37 -0
  229. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +224 -0
  230. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +146 -0
  231. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/dynamic.tsx +34 -0
  232. package/packages/create-basement-app/templates/webgl/components/webgl/canvas/index.tsx +43 -0
  233. package/packages/create-basement-app/templates/webgl/components/webgl/components/scene/index.tsx +21 -0
  234. package/packages/create-basement-app/templates/webgl/lib/README.md +33 -0
  235. package/packages/create-basement-app/templates/webgl/lib/hooks/index.ts +12 -0
  236. package/packages/create-basement-app/templates/webgl/lib/hooks/use-device-detection.ts +81 -0
  237. package/packages/create-basement-app/templates/webgl/lib/hooks/use-media-breakpoint.ts +15 -0
  238. package/packages/create-basement-app/templates/webgl/lib/hooks/use-prefetch.ts +74 -0
  239. package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
  240. package/packages/create-basement-app/templates/webgl/lib/scripts/dev.ts +52 -0
  241. package/packages/create-basement-app/templates/webgl/lib/scripts/generate-component.ts +322 -0
  242. package/packages/create-basement-app/templates/webgl/lib/scripts/generate-page.ts +193 -0
  243. package/packages/create-basement-app/templates/webgl/lib/scripts/generate.ts +79 -0
  244. package/packages/create-basement-app/templates/webgl/lib/scripts/utils.ts +246 -0
  245. package/packages/create-basement-app/templates/webgl/lib/store/app.ts +11 -0
  246. package/packages/create-basement-app/templates/webgl/lib/store/index.ts +11 -0
  247. package/packages/create-basement-app/templates/webgl/lib/styles/README.md +64 -0
  248. package/packages/create-basement-app/templates/webgl/lib/styles/cn.ts +7 -0
  249. package/packages/create-basement-app/templates/webgl/lib/styles/colors.ts +63 -0
  250. package/packages/create-basement-app/templates/webgl/lib/styles/config.ts +34 -0
  251. package/packages/create-basement-app/templates/webgl/lib/styles/css/global.css +85 -0
  252. package/packages/create-basement-app/templates/webgl/lib/styles/css/index.css +6 -0
  253. package/packages/create-basement-app/templates/webgl/lib/styles/css/reset.css +166 -0
  254. package/packages/create-basement-app/templates/webgl/lib/styles/css/root.css +68 -0
  255. package/packages/create-basement-app/templates/webgl/lib/styles/css/tailwind.css +132 -0
  256. package/packages/create-basement-app/templates/webgl/lib/styles/easings.ts +21 -0
  257. package/packages/create-basement-app/templates/webgl/lib/styles/fonts.ts +28 -0
  258. package/packages/create-basement-app/templates/webgl/lib/styles/index.ts +12 -0
  259. package/packages/create-basement-app/templates/webgl/lib/styles/layout.mjs +27 -0
  260. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/README.md +29 -0
  261. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-root.ts +57 -0
  262. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/generate-tailwind.ts +162 -0
  263. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/postcss-functions.mjs +168 -0
  264. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/setup-styles.ts +24 -0
  265. package/packages/create-basement-app/templates/webgl/lib/styles/scripts/utils.ts +20 -0
  266. package/packages/create-basement-app/templates/webgl/lib/styles/typography.ts +36 -0
  267. package/packages/create-basement-app/templates/webgl/lib/utils/README.md +40 -0
  268. package/packages/create-basement-app/templates/webgl/lib/utils/css.d.ts +21 -0
  269. package/packages/create-basement-app/templates/webgl/lib/utils/easings.ts +240 -0
  270. package/packages/create-basement-app/templates/webgl/lib/utils/fetch.ts +84 -0
  271. package/packages/create-basement-app/templates/webgl/lib/utils/math.test.ts +221 -0
  272. package/packages/create-basement-app/templates/webgl/lib/utils/math.ts +236 -0
  273. package/packages/create-basement-app/templates/webgl/lib/utils/metadata.ts +126 -0
  274. package/packages/create-basement-app/templates/webgl/lib/utils/strings.test.ts +166 -0
  275. package/packages/create-basement-app/templates/webgl/lib/utils/strings.ts +246 -0
  276. package/packages/create-basement-app/templates/webgl/lib/utils/types.d.ts +15 -0
  277. package/packages/create-basement-app/templates/webgl/lib/utils/viewport.test.ts +256 -0
  278. package/packages/create-basement-app/templates/webgl/lib/utils/viewport.ts +193 -0
  279. package/packages/create-basement-app/templates/webgl/next.config.ts +142 -0
  280. package/packages/create-basement-app/templates/webgl/package.json +68 -0
  281. package/packages/create-basement-app/templates/webgl/postcss.config.mjs +42 -0
  282. package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
  283. package/packages/create-basement-app/templates/webgl/tsconfig.json +43 -0
  284. package/packages/create-basement-app/templates/webgpu/.biome/plugins/README.md +21 -0
  285. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-anchor-element.grit +12 -0
  286. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-relative-parent-imports.grit +10 -0
  287. package/packages/create-basement-app/templates/webgpu/.biome/plugins/no-unnecessary-forwardref.grit +9 -0
  288. package/packages/create-basement-app/templates/webgpu/.cursor/rules/README.md +184 -0
  289. package/packages/create-basement-app/templates/webgpu/.cursor/rules/architecture.mdc +437 -0
  290. package/packages/create-basement-app/templates/webgpu/.cursor/rules/components.mdc +436 -0
  291. package/packages/create-basement-app/templates/webgpu/.cursor/rules/integrations.mdc +447 -0
  292. package/packages/create-basement-app/templates/webgpu/.cursor/rules/main.mdc +278 -0
  293. package/packages/create-basement-app/templates/webgpu/.cursor/rules/styling.mdc +433 -0
  294. package/packages/create-basement-app/templates/webgpu/.editorconfig +40 -0
  295. package/packages/create-basement-app/templates/webgpu/.env.example +81 -0
  296. package/packages/create-basement-app/templates/webgpu/.gitattributes +19 -0
  297. package/packages/create-basement-app/templates/webgpu/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  298. package/packages/create-basement-app/templates/webgpu/.github/workflows/lighthouse-to-slack.yml +136 -0
  299. package/packages/create-basement-app/templates/webgpu/.vscode/extensions.json +20 -0
  300. package/packages/create-basement-app/templates/webgpu/.vscode/settings.json +105 -0
  301. package/packages/create-basement-app/templates/webgpu/README.md +221 -0
  302. package/packages/create-basement-app/templates/webgpu/_gitignore +67 -0
  303. package/packages/create-basement-app/templates/webgpu/app/favicon.ico +0 -0
  304. package/packages/create-basement-app/templates/webgpu/app/layout.tsx +104 -0
  305. package/packages/create-basement-app/templates/webgpu/app/page.tsx +275 -0
  306. package/packages/create-basement-app/templates/webgpu/app/robots.ts +15 -0
  307. package/packages/create-basement-app/templates/webgpu/app/sitemap.ts +16 -0
  308. package/packages/create-basement-app/templates/webgpu/biome.json +250 -0
  309. package/packages/create-basement-app/templates/webgpu/components/basement.svg +1 -0
  310. package/packages/create-basement-app/templates/webgpu/components/layout/footer/index.tsx +27 -0
  311. package/packages/create-basement-app/templates/webgpu/components/layout/header/index.tsx +11 -0
  312. package/packages/create-basement-app/templates/webgpu/components/layout/theme/index.tsx +66 -0
  313. package/packages/create-basement-app/templates/webgpu/components/layout/wrapper/index.tsx +65 -0
  314. package/packages/create-basement-app/templates/webgpu/components/ui/README.md +77 -0
  315. package/packages/create-basement-app/templates/webgpu/components/ui/image/README.md +37 -0
  316. package/packages/create-basement-app/templates/webgpu/components/ui/image/index.tsx +224 -0
  317. package/packages/create-basement-app/templates/webgpu/components/ui/link/index.tsx +146 -0
  318. package/packages/create-basement-app/templates/webgpu/lib/README.md +33 -0
  319. package/packages/create-basement-app/templates/webgpu/lib/hooks/index.ts +12 -0
  320. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-device-detection.ts +81 -0
  321. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-media-breakpoint.ts +15 -0
  322. package/packages/create-basement-app/templates/webgpu/lib/hooks/use-prefetch.ts +74 -0
  323. package/packages/create-basement-app/templates/webgpu/lib/integrations/.gitkeep +0 -0
  324. package/packages/create-basement-app/templates/webgpu/lib/scripts/dev.ts +52 -0
  325. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-component.ts +322 -0
  326. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate-page.ts +193 -0
  327. package/packages/create-basement-app/templates/webgpu/lib/scripts/generate.ts +79 -0
  328. package/packages/create-basement-app/templates/webgpu/lib/scripts/utils.ts +246 -0
  329. package/packages/create-basement-app/templates/webgpu/lib/store/app.ts +11 -0
  330. package/packages/create-basement-app/templates/webgpu/lib/store/index.ts +11 -0
  331. package/packages/create-basement-app/templates/webgpu/lib/styles/README.md +64 -0
  332. package/packages/create-basement-app/templates/webgpu/lib/styles/cn.ts +7 -0
  333. package/packages/create-basement-app/templates/webgpu/lib/styles/colors.ts +63 -0
  334. package/packages/create-basement-app/templates/webgpu/lib/styles/config.ts +34 -0
  335. package/packages/create-basement-app/templates/webgpu/lib/styles/css/global.css +85 -0
  336. package/packages/create-basement-app/templates/webgpu/lib/styles/css/index.css +6 -0
  337. package/packages/create-basement-app/templates/webgpu/lib/styles/css/reset.css +166 -0
  338. package/packages/create-basement-app/templates/webgpu/lib/styles/css/root.css +68 -0
  339. package/packages/create-basement-app/templates/webgpu/lib/styles/css/tailwind.css +132 -0
  340. package/packages/create-basement-app/templates/webgpu/lib/styles/easings.ts +21 -0
  341. package/packages/create-basement-app/templates/webgpu/lib/styles/fonts.ts +28 -0
  342. package/packages/create-basement-app/templates/webgpu/lib/styles/index.ts +12 -0
  343. package/packages/create-basement-app/templates/webgpu/lib/styles/layout.mjs +27 -0
  344. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/README.md +29 -0
  345. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-root.ts +57 -0
  346. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/generate-tailwind.ts +162 -0
  347. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/postcss-functions.mjs +168 -0
  348. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/setup-styles.ts +24 -0
  349. package/packages/create-basement-app/templates/webgpu/lib/styles/scripts/utils.ts +20 -0
  350. package/packages/create-basement-app/templates/webgpu/lib/styles/typography.ts +36 -0
  351. package/packages/create-basement-app/templates/webgpu/lib/utils/README.md +40 -0
  352. package/packages/create-basement-app/templates/webgpu/lib/utils/css.d.ts +21 -0
  353. package/packages/create-basement-app/templates/webgpu/lib/utils/easings.ts +240 -0
  354. package/packages/create-basement-app/templates/webgpu/lib/utils/fetch.ts +84 -0
  355. package/packages/create-basement-app/templates/webgpu/lib/utils/math.test.ts +221 -0
  356. package/packages/create-basement-app/templates/webgpu/lib/utils/math.ts +236 -0
  357. package/packages/create-basement-app/templates/webgpu/lib/utils/metadata.ts +126 -0
  358. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.test.ts +166 -0
  359. package/packages/create-basement-app/templates/webgpu/lib/utils/strings.ts +246 -0
  360. package/packages/create-basement-app/templates/webgpu/lib/utils/types.d.ts +15 -0
  361. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.test.ts +256 -0
  362. package/packages/create-basement-app/templates/webgpu/lib/utils/viewport.ts +193 -0
  363. package/packages/create-basement-app/templates/webgpu/next.config.ts +142 -0
  364. package/packages/create-basement-app/templates/webgpu/package.json +69 -0
  365. package/packages/create-basement-app/templates/webgpu/postcss.config.mjs +42 -0
  366. package/packages/create-basement-app/templates/webgpu/public/fonts/geist/Geist-Mono.woff2 +0 -0
  367. package/packages/create-basement-app/templates/webgpu/tsconfig.json +43 -0
  368. package/tasks/.last-branch +1 -0
  369. package/tasks/CLAUDE.md +104 -0
  370. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +153 -0
  371. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +115 -0
  372. package/tasks/prd-project-restructure.md +375 -0
  373. package/tasks/prd.json +227 -91
  374. package/tasks/progress.txt +281 -87
  375. package/tasks/ralph.sh +113 -0
  376. package/layers/experiment/components/layout/header/index.tsx +0 -58
  377. package/layers/experiment/components/layout/navigation-menu.tsx +0 -127
  378. package/layers/experiment/lib/constants.ts +0 -12
  379. package/layers/webgl/app/page.tsx +0 -10
  380. package/layers/webgl/components/webgl/canvas/dynamic.tsx +0 -34
  381. package/layers/webgl/components/webgl/canvas/index.tsx +0 -43
  382. package/layers/webgl/components/webgl/components/scene/index.tsx +0 -21
  383. package/src/mergers/next-config-merger.js +0 -63
  384. /package/{src → packages/cli/src}/commands/setup-sanity.js +0 -0
  385. /package/{src → packages/cli/src}/commands/worktree.js +0 -0
  386. /package/{integrations/basehub → packages/create-basement-app/integrations/basehub/files}/README.md +0 -0
  387. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/disable/route.ts +0 -0
  388. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/draft-mode/enable/route.ts +0 -0
  389. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/api/revalidate/route.ts +0 -0
  390. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/layout.tsx +0 -0
  391. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/sitemap.ts +0 -0
  392. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/[[...tool]]/page.tsx +0 -0
  393. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/app/studio/layout.tsx +0 -0
  394. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/components/ui/sanity-image/index.tsx +0 -0
  395. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/README.md +0 -0
  396. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/check-integration.ts +0 -0
  397. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/README.md +0 -0
  398. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/client.ts +0 -0
  399. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  400. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/components/rich-text.tsx +0 -0
  401. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/env.ts +0 -0
  402. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/live/index.tsx +0 -0
  403. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/queries.ts +0 -0
  404. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.cli.ts +0 -0
  405. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.config.ts +0 -0
  406. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/sanity.types.ts +0 -0
  407. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schema.json +0 -0
  408. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/article.ts +0 -0
  409. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/example.ts +0 -0
  410. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/index.ts +0 -0
  411. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/link.ts +0 -0
  412. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/metadata.ts +0 -0
  413. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/navigation.ts +0 -0
  414. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/page.ts +0 -0
  415. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/schemas/richText.ts +0 -0
  416. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/structure.ts +0 -0
  417. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/image.ts +0 -0
  418. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/integrations/sanity/utils/link.ts +0 -0
  419. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/copy-sanity-mcp.ts +0 -0
  420. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/scripts/generate-page.ts +0 -0
  421. /package/{integrations/sanity → packages/create-basement-app/integrations/sanity/files}/lib/utils/metadata.ts +0 -0
  422. /package/{plugins → packages/create-basement-app/plugins}/README.md +0 -0
  423. /package/{plugins → packages/create-basement-app/plugins}/no-anchor-element.grit +0 -0
  424. /package/{plugins → packages/create-basement-app/plugins}/no-relative-parent-imports.grit +0 -0
  425. /package/{plugins → packages/create-basement-app/plugins}/no-unnecessary-forwardref.grit +0 -0
  426. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-battery.ts +0 -0
  427. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-device-perf.ts +0 -0
  428. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-intersection-observer.ts +0 -0
  429. /package/{template-hooks → packages/create-basement-app/template-hooks}/use-media.ts +0 -0
  430. /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
@@ -0,0 +1,14 @@
1
+ ## Summary
2
+
3
+ <!-- Brief description of what this PR does -->
4
+
5
+ ## Changes
6
+
7
+ -
8
+
9
+ ## Checklist
10
+
11
+ - [ ] `bun lint` passes
12
+ - [ ] Tested locally in dev mode
13
+ - [ ] No breaking changes (or documented in summary)
14
+
@@ -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
+ [![Deploy with Vercel](https://vercel.com/button)](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