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,193 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Generate Page Module
4
+ *
5
+ * Generates new pages with pre-configured templates through interactive prompts.
6
+ * Used by the unified generator: `bun run generate`
7
+ *
8
+ * Cross-platform compatible (Windows, macOS, Linux)
9
+ */
10
+
11
+ import * as p from "@clack/prompts"
12
+ import { createDir } from "./utils"
13
+
14
+ interface PageOptions {
15
+ theme?: string
16
+ css?: boolean
17
+ }
18
+
19
+ export interface PageConfig {
20
+ name: string
21
+ options: PageOptions
22
+ }
23
+
24
+ /**
25
+ * Interactive prompts for page configuration
26
+ */
27
+ export const promptPageConfig = async (): Promise<PageConfig> => {
28
+ const name = await p.text({
29
+ message: "What should the page be called?",
30
+ placeholder: "about, contact, products",
31
+ validate: (value) => {
32
+ if (!value) return "Page name is required"
33
+ if (!/^[a-zA-Z][a-zA-Z0-9-_]*$/.test(value)) {
34
+ return "Page name must start with a letter and contain only letters, numbers, hyphens, and underscores"
35
+ }
36
+ return undefined
37
+ },
38
+ })
39
+
40
+ if (p.isCancel(name)) {
41
+ p.cancel("Page generation cancelled")
42
+ process.exit(0)
43
+ }
44
+
45
+ const theme = await p.select({
46
+ message: "Choose a theme for the page",
47
+ options: [
48
+ { value: "dark", label: "Dark (default)", hint: "Standard dark theme" },
49
+ { value: "light", label: "Light", hint: "Light theme" },
50
+ { value: "red", label: "Red", hint: "Red accent theme" },
51
+ ],
52
+ initialValue: "dark",
53
+ })
54
+
55
+ if (p.isCancel(theme)) {
56
+ p.cancel("Page generation cancelled")
57
+ process.exit(0)
58
+ }
59
+
60
+ const includeCss = await p.confirm({
61
+ message: "Include a CSS module file?",
62
+ initialValue: false,
63
+ })
64
+
65
+ if (p.isCancel(includeCss)) {
66
+ p.cancel("Page generation cancelled")
67
+ process.exit(0)
68
+ }
69
+
70
+ return {
71
+ name,
72
+ options: {
73
+ theme,
74
+ css: includeCss,
75
+ },
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Generate page.tsx content
81
+ */
82
+ const generatePageContent = (
83
+ pageName: string,
84
+ options: PageOptions
85
+ ): string => {
86
+ const { theme = "dark" } = options
87
+
88
+ // Capitalize first letter for title
89
+ const title = pageName.charAt(0).toUpperCase() + pageName.slice(1)
90
+
91
+ // Build imports
92
+ const imports: string[] = []
93
+ imports.push(`import type { Metadata } from 'next'`)
94
+ imports.push(`import { Wrapper } from '@/components/layout/wrapper'`)
95
+
96
+ // Build wrapper props
97
+ const wrapperProps: string[] = [`theme="${theme}"`]
98
+
99
+ const componentBody: string = `(
100
+ <Wrapper ${wrapperProps.join(" ")}>
101
+ <section className="py-44">
102
+ <div className="container">
103
+ <h1>${title}</h1>
104
+ {/* Your content here */}
105
+ </div>
106
+ </section>
107
+ </Wrapper>
108
+ )`
109
+
110
+ // Build metadata export
111
+ const metadataExport: string = `
112
+ export const metadata: Metadata = {
113
+ title: '${title}',
114
+ description: '${title} page description',
115
+ }`
116
+
117
+ return `${imports.join("\n")}
118
+ ${metadataExport}
119
+
120
+ export default function ${title}Page() {
121
+ return ${componentBody}
122
+ }
123
+ `
124
+ }
125
+
126
+ /**
127
+ * Create page files and directories
128
+ */
129
+ export const createPage = async (
130
+ pageName: string,
131
+ options: PageOptions
132
+ ): Promise<void> => {
133
+ const s = p.spinner()
134
+
135
+ try {
136
+ // Create directory structure
137
+ const pageDir = `app/${pageName}`
138
+ const componentsDir = `${pageDir}/_components`
139
+
140
+ s.start(`Creating page structure for "${pageName}"`)
141
+
142
+ // Create main page directory (cross-platform)
143
+ await createDir(pageDir)
144
+
145
+ // Create _components subdirectory (cross-platform)
146
+ await createDir(componentsDir)
147
+
148
+ // Create .gitkeep in _components
149
+ await Bun.write(`${componentsDir}/.gitkeep`, "")
150
+
151
+ // Generate and write page.tsx
152
+ const pageContent = generatePageContent(pageName, options)
153
+ await Bun.write(`${pageDir}/page.tsx`, pageContent)
154
+
155
+ // Create CSS module if requested
156
+ if (options.css) {
157
+ const cssContent = `/* ${pageName}.module.css */
158
+
159
+ .container {
160
+ /* Add your styles here */
161
+ }
162
+ `
163
+ await Bun.write(`${pageDir}/${pageName}.module.css`, cssContent)
164
+ }
165
+
166
+ s.stop(`Page "${pageName}" generated successfully!`)
167
+
168
+ // Show what was created
169
+ p.log.success(`Generated files:`)
170
+ p.log.message(` 📄 ${pageDir}/page.tsx`)
171
+ p.log.message(` 📁 ${componentsDir}/`)
172
+ if (options.css) {
173
+ p.log.message(` 🎨 ${pageDir}/${pageName}.module.css`)
174
+ }
175
+
176
+ // Build next steps message
177
+ const nextSteps = [`1. Customize ${pageDir}/page.tsx`]
178
+
179
+ nextSteps.push(
180
+ `${nextSteps.length + 1}. Add components to ${componentsDir}/`
181
+ )
182
+ nextSteps.push(
183
+ `${nextSteps.length + 1}. Visit /${pageName} to see your page`
184
+ )
185
+
186
+ p.note(`Next steps:\n ${nextSteps.join("\n ")}`)
187
+ } catch (error) {
188
+ s.stop(`Failed to generate page "${pageName}"`)
189
+ throw error
190
+ }
191
+ }
192
+
193
+ // Export functions for use by unified generate script
@@ -0,0 +1,79 @@
1
+ #!/usr/bin/env bun
2
+ /**
3
+ * Satūs Generator CLI
4
+ *
5
+ * Interactive scaffolding for new pages and components.
6
+ * Generates pre-configured templates following project conventions.
7
+ *
8
+ * Usage:
9
+ * bun run generate
10
+ *
11
+ * Options:
12
+ * - Page: Creates route with layout, metadata, and optional integrations
13
+ * - Component: Creates UI component with CSS module and barrel export
14
+ */
15
+
16
+ import * as p from "@clack/prompts"
17
+ import { createComponent, promptComponentConfig } from "./generate-component"
18
+ // Import the existing generators
19
+ import { createPage, promptPageConfig } from "./generate-page"
20
+
21
+ /**
22
+ * Main CLI function
23
+ */
24
+ const main = async (): Promise<void> => {
25
+ console.clear()
26
+
27
+ p.intro("Satūs Generator")
28
+
29
+ // Ask what to create
30
+ const createType = await p.select({
31
+ message: "What would you like to generate?",
32
+ options: [
33
+ {
34
+ value: "page",
35
+ label: "Page",
36
+ hint: "New route/page with layout and components",
37
+ },
38
+ {
39
+ value: "component",
40
+ label: "Component",
41
+ hint: "New reusable UI component",
42
+ },
43
+ ],
44
+ })
45
+
46
+ if (p.isCancel(createType)) {
47
+ p.cancel("Generation cancelled")
48
+ process.exit(0)
49
+ }
50
+
51
+ try {
52
+ if (createType === "page") {
53
+ // Get page configuration through interactive prompts
54
+ const { name: pageName, options } = await promptPageConfig()
55
+
56
+ // Create the page
57
+ await createPage(pageName, options)
58
+ } else if (createType === "component") {
59
+ // Get component configuration through interactive prompts
60
+ const { path: componentPath, options } = await promptComponentConfig()
61
+
62
+ // Create the component
63
+ await createComponent(componentPath, options)
64
+ }
65
+
66
+ p.outro("Generation completed successfully! 🚀")
67
+ } catch (error) {
68
+ p.log.error(
69
+ `Generation failed: ${error instanceof Error ? error.message : String(error)}`
70
+ )
71
+ process.exit(1)
72
+ }
73
+ }
74
+
75
+ // Run the CLI
76
+ main().catch((err) => {
77
+ p.log.error(`Unexpected error: ${err.message}`)
78
+ process.exit(1)
79
+ })
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Shared Script Utilities
3
+ *
4
+ * Cross-platform utilities for CLI scripts.
5
+ * Works on Windows, macOS, and Linux.
6
+ */
7
+
8
+ import { access, mkdir, rm } from "node:fs/promises"
9
+
10
+ // ============================================================================
11
+ // Path Utilities
12
+ // ============================================================================
13
+
14
+ /**
15
+ * Get the project root directory
16
+ */
17
+ export const projectRoot = process.cwd()
18
+
19
+ /**
20
+ * Resolve a path relative to the project root
21
+ */
22
+ export const resolvePath = (path: string): string => `${projectRoot}/${path}`
23
+
24
+ /**
25
+ * Check if a file or directory exists
26
+ */
27
+ export const pathExists = async (path: string): Promise<boolean> => {
28
+ try {
29
+ await access(path)
30
+ return true
31
+ } catch {
32
+ return false
33
+ }
34
+ }
35
+
36
+ // ============================================================================
37
+ // File System Operations (Cross-platform)
38
+ // ============================================================================
39
+
40
+ /**
41
+ * Remove a directory recursively
42
+ * @param path - Relative path from project root
43
+ * @param dryRun - If true, skip actual deletion
44
+ */
45
+ export const removeDir = async (
46
+ path: string,
47
+ dryRun = false
48
+ ): Promise<boolean> => {
49
+ try {
50
+ const fullPath = resolvePath(path)
51
+
52
+ // Check if path exists
53
+ if (!(await pathExists(fullPath))) {
54
+ return false
55
+ }
56
+
57
+ if (!dryRun) {
58
+ await rm(fullPath, { recursive: true, force: true })
59
+ }
60
+ return true
61
+ } catch {
62
+ return false
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Remove a file
68
+ * @param path - Relative path from project root
69
+ * @param dryRun - If true, skip actual deletion
70
+ */
71
+ export const removeFile = async (
72
+ path: string,
73
+ dryRun = false
74
+ ): Promise<boolean> => {
75
+ try {
76
+ const fullPath = resolvePath(path)
77
+ const file = Bun.file(fullPath)
78
+ const exists = await file.exists()
79
+
80
+ if (!exists) return false
81
+
82
+ if (!dryRun) {
83
+ await rm(fullPath, { force: true })
84
+ }
85
+ return true
86
+ } catch {
87
+ return false
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Create a directory (and parent directories if needed)
93
+ * @param path - Relative path from project root
94
+ */
95
+ export const createDir = async (path: string): Promise<void> => {
96
+ await mkdir(resolvePath(path), { recursive: true })
97
+ }
98
+
99
+ // ============================================================================
100
+ // Process Utilities
101
+ // ============================================================================
102
+
103
+ /**
104
+ * Get the current Bun executable path (cross-platform)
105
+ */
106
+ export const bunExecutable = process.execPath
107
+
108
+ /**
109
+ * Current platform
110
+ */
111
+ export const platform = process.platform
112
+
113
+ /**
114
+ * Check if running on Windows
115
+ */
116
+ export const isWindows = platform === "win32"
117
+
118
+ /**
119
+ * Check if running on macOS
120
+ */
121
+ export const isMacOS = platform === "darwin"
122
+
123
+ /**
124
+ * Check if running on Linux
125
+ */
126
+ export const isLinux = platform === "linux"
127
+
128
+ // ============================================================================
129
+ // CLI Argument Utilities
130
+ // ============================================================================
131
+
132
+ /**
133
+ * Parse common CLI flags from process.argv
134
+ */
135
+ export const parseCliFlags = (
136
+ argv: string[] = process.argv.slice(2)
137
+ ): {
138
+ dryRun: boolean
139
+ verbose: boolean
140
+ help: boolean
141
+ args: string[]
142
+ } => {
143
+ return {
144
+ dryRun: argv.includes("--dry-run") || argv.includes("-d"),
145
+ verbose: argv.includes("--verbose") || argv.includes("-v"),
146
+ help: argv.includes("--help") || argv.includes("-h"),
147
+ args: argv.filter(
148
+ (arg) =>
149
+ !["--dry-run", "-d", "--verbose", "-v", "--help", "-h"].includes(arg)
150
+ ),
151
+ }
152
+ }
153
+
154
+ // ============================================================================
155
+ // Clipboard Utilities (Cross-platform)
156
+ // ============================================================================
157
+
158
+ /**
159
+ * Copy text to clipboard (cross-platform)
160
+ * @returns true if successful, false otherwise
161
+ */
162
+ export const copyToClipboard = async (text: string): Promise<boolean> => {
163
+ try {
164
+ if (isMacOS) {
165
+ const proc = Bun.spawn(["pbcopy"], { stdin: "pipe" })
166
+ proc.stdin.write(text)
167
+ proc.stdin.end()
168
+ await proc.exited
169
+ return proc.exitCode === 0
170
+ }
171
+
172
+ if (isLinux) {
173
+ // Try xclip first, then xsel
174
+ for (const cmd of [
175
+ ["xclip", "-selection", "clipboard"],
176
+ ["xsel", "--clipboard", "--input"],
177
+ ]) {
178
+ try {
179
+ const proc = Bun.spawn(cmd, { stdin: "pipe" })
180
+ proc.stdin.write(text)
181
+ proc.stdin.end()
182
+ await proc.exited
183
+ if (proc.exitCode === 0) return true
184
+ } catch {
185
+ // Silently try next clipboard command
186
+ }
187
+ }
188
+ return false
189
+ }
190
+
191
+ if (isWindows) {
192
+ const proc = Bun.spawn(["clip"], { stdin: "pipe" })
193
+ proc.stdin.write(text)
194
+ proc.stdin.end()
195
+ await proc.exited
196
+ return proc.exitCode === 0
197
+ }
198
+
199
+ return false
200
+ } catch {
201
+ return false
202
+ }
203
+ }
204
+
205
+ // ============================================================================
206
+ // Spawn Utilities
207
+ // ============================================================================
208
+
209
+ /**
210
+ * Spawn a process with inherited stdio (cross-platform)
211
+ * Uses Bun.spawn with proper defaults
212
+ */
213
+ export const spawn = (
214
+ args: string[],
215
+ options: {
216
+ env?: Record<string, string | undefined>
217
+ cwd?: string
218
+ stdin?: "inherit" | "pipe"
219
+ stdout?: "inherit" | "pipe"
220
+ stderr?: "inherit" | "pipe"
221
+ } = {}
222
+ ) => {
223
+ const spawnOptions: Parameters<typeof Bun.spawn>[1] = {
224
+ stdin: options.stdin ?? "inherit",
225
+ stdout: options.stdout ?? "inherit",
226
+ stderr: options.stderr ?? "inherit",
227
+ }
228
+
229
+ if (options.cwd) spawnOptions.cwd = options.cwd
230
+ if (options.env) spawnOptions.env = options.env
231
+
232
+ return Bun.spawn(args, spawnOptions)
233
+ }
234
+
235
+ /**
236
+ * Build environment with FORCE_COLOR enabled
237
+ * Removes NO_COLOR to prevent warnings
238
+ */
239
+ export const colorEnv = (): Record<string, string | undefined> => {
240
+ const env = { ...process.env, FORCE_COLOR: "1" } as Record<
241
+ string,
242
+ string | undefined
243
+ >
244
+ delete env.NO_COLOR
245
+ return env
246
+ }
@@ -0,0 +1,11 @@
1
+ import { create } from "zustand"
2
+
3
+ type Store = {
4
+ isNavOpened: boolean
5
+ setIsNavOpened: (value: boolean) => void
6
+ }
7
+
8
+ export const useStore = create<Store>((set) => ({
9
+ isNavOpened: false,
10
+ setIsNavOpened: (value: boolean) => set({ isNavOpened: value }),
11
+ }))
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Custom Zustand Stores
3
+ *
4
+ * Import individual hooks:
5
+ * import { useStore } from '@/store/app'
6
+ *
7
+ * Or import from barrel:
8
+ * import { useStore } from '@/store/app'
9
+ */
10
+
11
+ export { useStore } from "./app"
@@ -0,0 +1,64 @@
1
+ # Styles
2
+
3
+ Hybrid styling with Tailwind CSS v4 and custom PostCSS functions.
4
+
5
+ ## PostCSS Functions
6
+
7
+ ```css
8
+ /* Viewport-relative sizing */
9
+ .element {
10
+ width: tovw(100); /* 6.94vw (100px at 1440px) */
11
+ width: tovw(100, 50); /* max(50px, 6.94vw) */
12
+ width: tovw(16, undefined, 'mobile'); /* 4.27vw (16px at 375px) */
13
+ }
14
+
15
+ /* Relative units */
16
+ .text {
17
+ font-size: torem(24); /* 1.5rem (24px / 16px) */
18
+ padding: toem(16, 14); /* 1.14em (16px / 14px) */
19
+ }
20
+
21
+ /* Grid columns */
22
+ .sidebar {
23
+ width: columns(3); /* Spans 3 columns + gaps */
24
+ }
25
+ ```
26
+
27
+ ## Custom Utilities (`dr-*`)
28
+
29
+ ```tsx
30
+ // Responsive sizing (scales with viewport)
31
+ <div className="dr-w-150 dr-h-100" />
32
+
33
+ // Column-based sizing
34
+ <div className="dr-w-col-4" /> {/* 4 columns wide */}
35
+
36
+ // Grid layout
37
+ <div className="dr-grid" /> {/* 4 cols mobile, 12 cols desktop */}
38
+ ```
39
+
40
+ ## Breakpoints
41
+
42
+ ```css
43
+ @media (--mobile) { /* <= 799px */ }
44
+ @media (--desktop) { /* >= 800px */ }
45
+ ```
46
+
47
+ ## Configuration
48
+
49
+ | File | Purpose |
50
+ |------|---------|
51
+ | `colors.ts` | Color palette & themes |
52
+ | `typography.ts` | Font sizes & weights |
53
+ | `layout.mjs` | Grid, breakpoints, spacing |
54
+ | `easings.ts` | Animation curves |
55
+ | `fonts.ts` | Font loading |
56
+
57
+ After changing config: `bun setup:styles`
58
+
59
+ ## Generated Files (Don't Edit)
60
+
61
+ - `css/root.css` — CSS custom properties
62
+ - `css/tailwind.css` — Tailwind utilities
63
+
64
+ See [scripts/README.md](scripts/README.md) for generation details.
@@ -0,0 +1,7 @@
1
+ import { cx } from "class-variance-authority"
2
+ import type { ClassValue } from "class-variance-authority/types"
3
+ import { twMerge } from "tailwind-merge"
4
+
5
+ export function cn(...inputs: ClassValue[]) {
6
+ return twMerge(cx(inputs))
7
+ }
@@ -0,0 +1,63 @@
1
+ const palettes = {
2
+ gray: {
3
+ 50: "#F5F5F5",
4
+ 100: "#E0E0E0",
5
+ 200: "#C2C2C2",
6
+ 300: "#A3A3A3",
7
+ 400: "#858585",
8
+ 500: "#666666",
9
+ 600: "#4D4D4D",
10
+ 700: "#333333",
11
+ 800: "#1A1A1A",
12
+ },
13
+ blue: {
14
+ 500: "#487CFF",
15
+ },
16
+ green: {
17
+ 500: "#00FF9B",
18
+ },
19
+ violet: {
20
+ 500: "#F101A5",
21
+ },
22
+ pink: {
23
+ 500: "#FF73A6",
24
+ },
25
+ orange: {
26
+ 500: "#FF4D00",
27
+ },
28
+ }
29
+
30
+ const colors = {
31
+ black: "#000000",
32
+ white: "#ffffff",
33
+ orange: palettes.orange[500],
34
+ blue: palettes.blue[500],
35
+ green: palettes.green[500],
36
+ violet: palettes.violet[500],
37
+ pink: palettes.pink[500],
38
+ gray: palettes.gray[500],
39
+ } as const
40
+
41
+ const themeNames = ["light", "dark"] as const
42
+ const colorNames = ["primary", "secondary", "contrast"] as const
43
+
44
+ const themes = {
45
+ light: {
46
+ primary: colors.white,
47
+ secondary: colors.black,
48
+ contrast: colors.orange,
49
+ },
50
+ dark: {
51
+ primary: colors.black,
52
+ secondary: colors.white,
53
+ contrast: colors.orange,
54
+ },
55
+ } as const satisfies Themes
56
+
57
+ export { colors, palettes, themeNames, themes }
58
+
59
+ // UTIL TYPES
60
+ export type Themes = Record<
61
+ (typeof themeNames)[number],
62
+ Record<(typeof colorNames)[number], string>
63
+ >
@@ -0,0 +1,34 @@
1
+ import { colors, palettes, themeNames, themes } from "./colors"
2
+ import { easings } from "./easings"
3
+ import { breakpoints, customSizes, layout, screens } from "./layout.mjs"
4
+ import { fonts, typography } from "./typography"
5
+
6
+ const config = {
7
+ breakpoints,
8
+ colors,
9
+ customSizes,
10
+ easings,
11
+ fonts,
12
+ layout,
13
+ palettes,
14
+ screens,
15
+ themeNames,
16
+ themes,
17
+ typography,
18
+ } as const
19
+
20
+ export {
21
+ breakpoints,
22
+ colors,
23
+ customSizes,
24
+ easings,
25
+ fonts,
26
+ layout,
27
+ palettes,
28
+ screens,
29
+ themeNames,
30
+ themes,
31
+ typography,
32
+ }
33
+ export type ThemeName = keyof typeof themes
34
+ export type Config = typeof config