bsmnt 0.1.2 → 0.2.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 (447) hide show
  1. package/README.md +18 -18
  2. package/dist/configs/animations.d.ts +25 -0
  3. package/dist/configs/animations.d.ts.map +1 -0
  4. package/dist/configs/animations.js +29 -0
  5. package/dist/configs/animations.js.map +1 -0
  6. package/dist/helpers/add/hooks-config.d.ts +22 -0
  7. package/dist/helpers/add/hooks-config.d.ts.map +1 -0
  8. package/dist/helpers/add/hooks-config.js +37 -0
  9. package/dist/helpers/add/hooks-config.js.map +1 -0
  10. package/dist/helpers/add/index.d.ts +18 -0
  11. package/dist/helpers/add/index.d.ts.map +1 -0
  12. package/dist/helpers/add/index.js +152 -0
  13. package/dist/helpers/add/index.js.map +1 -0
  14. package/dist/helpers/create/copy-template.d.ts +11 -0
  15. package/dist/helpers/create/copy-template.d.ts.map +1 -0
  16. package/dist/helpers/create/copy-template.js +19 -0
  17. package/dist/helpers/create/copy-template.js.map +1 -0
  18. package/dist/helpers/create/index.d.ts +22 -0
  19. package/dist/helpers/create/index.d.ts.map +1 -0
  20. package/dist/helpers/create/index.js +81 -0
  21. package/dist/helpers/create/index.js.map +1 -0
  22. package/dist/helpers/create/install.d.ts +8 -0
  23. package/dist/helpers/create/install.d.ts.map +1 -0
  24. package/dist/helpers/create/install.js +20 -0
  25. package/dist/helpers/create/install.js.map +1 -0
  26. package/dist/helpers/create/rename-files.d.ts +10 -0
  27. package/dist/helpers/create/rename-files.d.ts.map +1 -0
  28. package/dist/helpers/create/rename-files.js +17 -0
  29. package/dist/helpers/create/rename-files.js.map +1 -0
  30. package/dist/helpers/create/setup-agent.d.ts +21 -0
  31. package/dist/helpers/create/setup-agent.d.ts.map +1 -0
  32. package/dist/helpers/create/setup-agent.js +65 -0
  33. package/dist/helpers/create/setup-agent.js.map +1 -0
  34. package/dist/helpers/create/setup-sanity.d.ts +23 -0
  35. package/dist/helpers/create/setup-sanity.d.ts.map +1 -0
  36. package/dist/helpers/create/setup-sanity.js +354 -0
  37. package/dist/helpers/create/setup-sanity.js.map +1 -0
  38. package/dist/helpers/create/update-package.d.ts +20 -0
  39. package/dist/helpers/create/update-package.d.ts.map +1 -0
  40. package/dist/helpers/create/update-package.js +87 -0
  41. package/dist/helpers/create/update-package.js.map +1 -0
  42. package/dist/helpers/integrate/index.d.ts +13 -0
  43. package/dist/helpers/integrate/index.d.ts.map +1 -0
  44. package/dist/helpers/integrate/index.js +204 -0
  45. package/dist/helpers/integrate/index.js.map +1 -0
  46. package/dist/helpers/integrate/merge-config.d.ts +21 -0
  47. package/dist/helpers/integrate/merge-config.d.ts.map +1 -0
  48. package/dist/helpers/integrate/merge-config.js +38 -0
  49. package/dist/helpers/integrate/merge-config.js.map +1 -0
  50. package/dist/helpers/integrate/merge-orchestrator.d.ts +10 -0
  51. package/dist/helpers/integrate/merge-orchestrator.d.ts.map +1 -0
  52. package/dist/helpers/integrate/merge-orchestrator.js +188 -0
  53. package/dist/helpers/integrate/merge-orchestrator.js.map +1 -0
  54. package/dist/helpers/integrate/sanity/config.d.ts +14 -0
  55. package/dist/helpers/integrate/sanity/config.d.ts.map +1 -0
  56. package/dist/helpers/integrate/sanity/config.js +38 -0
  57. package/dist/helpers/integrate/sanity/config.js.map +1 -0
  58. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts +13 -0
  59. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts.map +1 -0
  60. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js +84 -0
  61. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js.map +1 -0
  62. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts +23 -0
  63. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +1 -0
  64. package/dist/helpers/integrate/sanity/mergers/layout-merger.js +161 -0
  65. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +1 -0
  66. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts +13 -0
  67. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts.map +1 -0
  68. package/{packages/create-basement-app/src → dist/helpers/integrate/sanity}/mergers/sitemap-merger.js +33 -45
  69. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js.map +1 -0
  70. package/dist/index.d.ts +3 -0
  71. package/dist/index.d.ts.map +1 -0
  72. package/dist/index.js +337 -0
  73. package/dist/index.js.map +1 -0
  74. package/dist/paths.d.ts +14 -0
  75. package/dist/paths.d.ts.map +1 -0
  76. package/dist/paths.js +24 -0
  77. package/dist/paths.js.map +1 -0
  78. package/dist/utils/detect-project.d.ts +40 -0
  79. package/dist/utils/detect-project.d.ts.map +1 -0
  80. package/dist/utils/detect-project.js +69 -0
  81. package/dist/utils/detect-project.js.map +1 -0
  82. package/dist/utils/format-results.d.ts +24 -0
  83. package/dist/utils/format-results.d.ts.map +1 -0
  84. package/dist/utils/format-results.js +27 -0
  85. package/dist/utils/format-results.js.map +1 -0
  86. package/index.js +25 -0
  87. package/package.json +25 -12
  88. package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/package.json +1 -1
  89. package/src/templates/next-webgl/lib/renderer.ts +7 -0
  90. package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/package.json +1 -1
  91. package/.changeset/README.md +0 -10
  92. package/.changeset/config.json +0 -16
  93. package/.github/workflows/ci.yml +0 -37
  94. package/.github/workflows/release.yml +0 -56
  95. package/.tldr/cache/call_graph.json +0 -7
  96. package/.tldr/languages.json +0 -6
  97. package/.tldr/status +0 -1
  98. package/.tldrignore +0 -84
  99. package/.vscode/settings.json +0 -98
  100. package/CHANGELOG.md +0 -68
  101. package/CLAUDE.md +0 -156
  102. package/biome.json +0 -45
  103. package/bun.lock +0 -496
  104. package/changelog/04-02-26.md +0 -86
  105. package/changelog/05-02-26.md +0 -101
  106. package/changelog/09-02-26.md +0 -83
  107. package/docs/architecture.drawio +0 -250
  108. package/docs/architecture.mermaid +0 -85
  109. package/docs/fix-studio-hydration.md +0 -46
  110. package/docs/plans/2026-01-29-sanity-smart-merge-design.md +0 -196
  111. package/docs/plans/2026-01-29-sanity-smart-merge-implementation.md +0 -695
  112. package/docs/sanity-setup-steps.md +0 -199
  113. package/packages/cli/bin/index.js +0 -259
  114. package/packages/cli/package.json +0 -16
  115. package/packages/cli/src/commands/add-integration.js +0 -310
  116. package/packages/cli/src/commands/create.js +0 -409
  117. package/packages/cli/src/commands/setup-sanity.js +0 -426
  118. package/packages/cli/src/commands/worktree.js +0 -805
  119. package/packages/create-basement-app/integrations/sanity/config.js +0 -46
  120. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/disable/route.ts +0 -7
  121. package/packages/create-basement-app/integrations/sanity/files/app/api/draft-mode/enable/route.ts +0 -21
  122. package/packages/create-basement-app/integrations/sanity/files/app/api/revalidate/route.ts +0 -37
  123. package/packages/create-basement-app/integrations/sanity/files/app/layout.tsx +0 -111
  124. package/packages/create-basement-app/integrations/sanity/files/app/sitemap.ts +0 -80
  125. package/packages/create-basement-app/integrations/sanity/files/app/studio/[[...tool]]/page.tsx +0 -8
  126. package/packages/create-basement-app/integrations/sanity/files/app/studio/layout.tsx +0 -7
  127. package/packages/create-basement-app/integrations/sanity/files/components/ui/sanity-image/index.tsx +0 -37
  128. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/README.md +0 -58
  129. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/check-integration.ts +0 -62
  130. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/README.md +0 -144
  131. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/client.ts +0 -30
  132. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -29
  133. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -73
  134. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/env.ts +0 -38
  135. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/live/index.tsx +0 -34
  136. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/queries.ts +0 -99
  137. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -20
  138. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.config.ts +0 -94
  139. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -337
  140. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schema.json +0 -1850
  141. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -132
  142. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -203
  143. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/index.ts +0 -37
  144. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -127
  145. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -68
  146. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -39
  147. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/page.ts +0 -77
  148. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -59
  149. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/structure.ts +0 -5
  150. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/image.ts +0 -11
  151. package/packages/create-basement-app/integrations/sanity/files/lib/integrations/sanity/utils/link.ts +0 -61
  152. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/copy-sanity-mcp.ts +0 -23
  153. package/packages/create-basement-app/integrations/sanity/files/lib/scripts/generate-page.ts +0 -310
  154. package/packages/create-basement-app/integrations/sanity/files/lib/utils/metadata.ts +0 -190
  155. package/packages/create-basement-app/integrations/sanity/mergers/check-integration-merger.js +0 -105
  156. package/packages/create-basement-app/integrations/sanity/mergers/layout-merger.js +0 -223
  157. package/packages/create-basement-app/integrations/sanity/mergers/sitemap-merger.js +0 -121
  158. package/packages/create-basement-app/package.json +0 -10
  159. package/packages/create-basement-app/src/configs/animations.js +0 -28
  160. package/packages/create-basement-app/src/index.js +0 -15
  161. package/packages/create-basement-app/src/mergers/check-integration-merger.js +0 -105
  162. package/packages/create-basement-app/src/mergers/config.js +0 -109
  163. package/packages/create-basement-app/src/mergers/index.js +0 -346
  164. package/packages/create-basement-app/src/mergers/layout-merger.js +0 -223
  165. package/packages/create-basement-app/templates/experiment/.cursor/rules/README.md +0 -184
  166. package/packages/create-basement-app/templates/experiment/.cursor/rules/architecture.mdc +0 -437
  167. package/packages/create-basement-app/templates/experiment/.cursor/rules/components.mdc +0 -436
  168. package/packages/create-basement-app/templates/experiment/.cursor/rules/integrations.mdc +0 -447
  169. package/packages/create-basement-app/templates/experiment/.cursor/rules/main.mdc +0 -278
  170. package/packages/create-basement-app/templates/experiment/.cursor/rules/styling.mdc +0 -433
  171. package/packages/create-basement-app/templates/experiment/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  172. package/packages/create-basement-app/templates/experiment/.vscode/extensions.json +0 -20
  173. package/packages/create-basement-app/templates/experiment/app/page.tsx +0 -275
  174. package/packages/create-basement-app/templates/webgl/.biome/plugins/README.md +0 -21
  175. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-anchor-element.grit +0 -12
  176. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-relative-parent-imports.grit +0 -10
  177. package/packages/create-basement-app/templates/webgl/.biome/plugins/no-unnecessary-forwardref.grit +0 -9
  178. package/packages/create-basement-app/templates/webgl/.cursor/rules/README.md +0 -184
  179. package/packages/create-basement-app/templates/webgl/.cursor/rules/architecture.mdc +0 -437
  180. package/packages/create-basement-app/templates/webgl/.cursor/rules/components.mdc +0 -436
  181. package/packages/create-basement-app/templates/webgl/.cursor/rules/integrations.mdc +0 -447
  182. package/packages/create-basement-app/templates/webgl/.cursor/rules/main.mdc +0 -278
  183. package/packages/create-basement-app/templates/webgl/.cursor/rules/styling.mdc +0 -433
  184. package/packages/create-basement-app/templates/webgl/.github/PULL_REQUEST_TEMPLATE.md +0 -14
  185. package/packages/create-basement-app/templates/webgl/.github/workflows/lighthouse-to-slack.yml +0 -136
  186. package/packages/create-basement-app/templates/webgl/.vscode/extensions.json +0 -20
  187. package/packages/create-basement-app/templates/webgl/.vscode/settings.json +0 -105
  188. package/packages/create-basement-app/templates/webgl/app/favicon.ico +0 -0
  189. package/packages/create-basement-app/templates/webgl/app/layout.tsx +0 -104
  190. package/packages/create-basement-app/templates/webgl/app/robots.ts +0 -15
  191. package/packages/create-basement-app/templates/webgl/app/sitemap.ts +0 -16
  192. package/packages/create-basement-app/templates/webgl/components/layout/footer/index.tsx +0 -27
  193. package/packages/create-basement-app/templates/webgl/components/layout/header/index.tsx +0 -11
  194. package/packages/create-basement-app/templates/webgl/components/layout/theme/index.tsx +0 -66
  195. package/packages/create-basement-app/templates/webgl/components/layout/wrapper/index.tsx +0 -65
  196. package/packages/create-basement-app/templates/webgl/components/ui/README.md +0 -77
  197. package/packages/create-basement-app/templates/webgl/components/ui/image/README.md +0 -37
  198. package/packages/create-basement-app/templates/webgl/components/ui/image/index.tsx +0 -224
  199. package/packages/create-basement-app/templates/webgl/components/ui/link/index.tsx +0 -146
  200. package/packages/create-basement-app/templates/webgl/lib/integrations/.gitkeep +0 -0
  201. package/packages/create-basement-app/templates/webgl/public/fonts/geist/Geist-Mono.woff2 +0 -0
  202. package/tasks/.last-branch +0 -1
  203. package/tasks/CLAUDE.md +0 -104
  204. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/prd.json +0 -153
  205. package/tasks/archive/2026-02-09-next-starter-dynamic-layers/progress.txt +0 -115
  206. package/tasks/prd-next-starter-dynamic-layers.md +0 -184
  207. package/tasks/prd-project-restructure.md +0 -375
  208. package/tasks/prd.json +0 -289
  209. package/tasks/progress.txt +0 -309
  210. package/tasks/ralph.sh +0 -113
  211. /package/{packages/create-basement-app/plugins → plugins}/no-anchor-element.grit +0 -0
  212. /package/{packages/create-basement-app/plugins → plugins}/no-relative-parent-imports.grit +0 -0
  213. /package/{packages/create-basement-app/plugins → plugins}/no-unnecessary-forwardref.grit +0 -0
  214. /package/{packages/create-basement-app → src}/template-hooks/config.js +0 -0
  215. /package/{packages/create-basement-app → src}/template-hooks/use-battery.ts +0 -0
  216. /package/{packages/create-basement-app → src}/template-hooks/use-device-perf.ts +0 -0
  217. /package/{packages/create-basement-app → src}/template-hooks/use-intersection-observer.ts +0 -0
  218. /package/{packages/create-basement-app → src}/template-hooks/use-media.ts +0 -0
  219. /package/{packages/create-basement-app → src/templates/next-default/.biome}/plugins/README.md +0 -0
  220. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.editorconfig +0 -0
  221. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.env.example +0 -0
  222. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/.gitattributes +0 -0
  223. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/README.md +0 -0
  224. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/_gitignore +0 -0
  225. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/biome.json +0 -0
  226. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/components/basement.svg +0 -0
  227. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/README.md +0 -0
  228. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/index.ts +0 -0
  229. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-device-detection.ts +0 -0
  230. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-media-breakpoint.ts +0 -0
  231. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/hooks/use-prefetch.ts +0 -0
  232. /package/{.github/workflows → src/templates/next-default/lib/integrations}/.gitkeep +0 -0
  233. /package/{packages/create-basement-app/templates/webgl → src/templates/next-default}/lib/renderer.ts +0 -0
  234. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/dev.ts +0 -0
  235. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-component.ts +0 -0
  236. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate-page.ts +0 -0
  237. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/generate.ts +0 -0
  238. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/scripts/utils.ts +0 -0
  239. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/app.ts +0 -0
  240. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/store/index.ts +0 -0
  241. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/README.md +0 -0
  242. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/cn.ts +0 -0
  243. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/colors.ts +0 -0
  244. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/config.ts +0 -0
  245. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/global.css +0 -0
  246. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/index.css +0 -0
  247. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/reset.css +0 -0
  248. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/root.css +0 -0
  249. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/css/tailwind.css +0 -0
  250. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/easings.ts +0 -0
  251. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/fonts.ts +0 -0
  252. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/index.ts +0 -0
  253. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/layout.mjs +0 -0
  254. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/README.md +0 -0
  255. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-root.ts +0 -0
  256. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/generate-tailwind.ts +0 -0
  257. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/postcss-functions.mjs +0 -0
  258. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/setup-styles.ts +0 -0
  259. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/scripts/utils.ts +0 -0
  260. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/styles/typography.ts +0 -0
  261. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/README.md +0 -0
  262. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/css.d.ts +0 -0
  263. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/easings.ts +0 -0
  264. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/fetch.ts +0 -0
  265. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.test.ts +0 -0
  266. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/math.ts +0 -0
  267. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/metadata.ts +0 -0
  268. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.test.ts +0 -0
  269. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/strings.ts +0 -0
  270. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/types.d.ts +0 -0
  271. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.test.ts +0 -0
  272. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/lib/utils/viewport.ts +0 -0
  273. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/next.config.ts +0 -0
  274. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/package.json +0 -0
  275. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/postcss.config.mjs +0 -0
  276. /package/{packages/create-basement-app/templates/default → src/templates/next-default}/tsconfig.json +0 -0
  277. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/README.md +0 -0
  278. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-anchor-element.grit +0 -0
  279. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  280. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  281. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/README.md +0 -0
  282. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/architecture.mdc +0 -0
  283. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/components.mdc +0 -0
  284. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/integrations.mdc +0 -0
  285. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/main.mdc +0 -0
  286. /package/{.cursor → src/templates/next-experiments/.cursor}/rules/styling.mdc +0 -0
  287. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.editorconfig +0 -0
  288. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.env.example +0 -0
  289. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/.gitattributes +0 -0
  290. /package/{.github → src/templates/next-experiments/.github}/PULL_REQUEST_TEMPLATE.md +0 -0
  291. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.github/workflows/lighthouse-to-slack.yml +0 -0
  292. /package/{.vscode → src/templates/next-experiments/.vscode}/extensions.json +0 -0
  293. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/.vscode/settings.json +0 -0
  294. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/README.md +0 -0
  295. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/_gitignore +0 -0
  296. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/favicon.ico +0 -0
  297. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/layout.tsx +0 -0
  298. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/page.tsx +0 -0
  299. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/robots.ts +0 -0
  300. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/app/sitemap.ts +0 -0
  301. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/biome.json +0 -0
  302. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/basement.svg +0 -0
  303. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/footer/index.tsx +0 -0
  304. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/header/index.tsx +0 -0
  305. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/components/layout/navigation-menu.tsx +0 -0
  306. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/theme/index.tsx +0 -0
  307. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/layout/wrapper/index.tsx +0 -0
  308. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/README.md +0 -0
  309. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/README.md +0 -0
  310. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/image/index.tsx +0 -0
  311. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/components/ui/link/index.tsx +0 -0
  312. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/README.md +0 -0
  313. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/constants.ts +0 -0
  314. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/index.ts +0 -0
  315. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-device-detection.ts +0 -0
  316. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-media-breakpoint.ts +0 -0
  317. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/hooks/use-prefetch.ts +0 -0
  318. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/lib/integrations/.gitkeep +0 -0
  319. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/dev.ts +0 -0
  320. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-component.ts +0 -0
  321. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate-page.ts +0 -0
  322. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/generate.ts +0 -0
  323. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/scripts/utils.ts +0 -0
  324. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/app.ts +0 -0
  325. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/store/index.ts +0 -0
  326. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/README.md +0 -0
  327. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/cn.ts +0 -0
  328. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/colors.ts +0 -0
  329. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/config.ts +0 -0
  330. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/global.css +0 -0
  331. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/index.css +0 -0
  332. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/reset.css +0 -0
  333. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/root.css +0 -0
  334. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/css/tailwind.css +0 -0
  335. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/easings.ts +0 -0
  336. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/fonts.ts +0 -0
  337. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/index.ts +0 -0
  338. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/layout.mjs +0 -0
  339. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/README.md +0 -0
  340. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-root.ts +0 -0
  341. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/generate-tailwind.ts +0 -0
  342. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/postcss-functions.mjs +0 -0
  343. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/setup-styles.ts +0 -0
  344. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/scripts/utils.ts +0 -0
  345. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/styles/typography.ts +0 -0
  346. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/README.md +0 -0
  347. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/css.d.ts +0 -0
  348. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/easings.ts +0 -0
  349. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/fetch.ts +0 -0
  350. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.test.ts +0 -0
  351. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/math.ts +0 -0
  352. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/metadata.ts +0 -0
  353. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.test.ts +0 -0
  354. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/strings.ts +0 -0
  355. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/types.d.ts +0 -0
  356. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.test.ts +0 -0
  357. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/lib/utils/viewport.ts +0 -0
  358. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/next.config.ts +0 -0
  359. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/postcss.config.mjs +0 -0
  360. /package/{packages/create-basement-app/templates/default → src/templates/next-experiments}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  361. /package/{packages/create-basement-app/templates/experiment → src/templates/next-experiments}/tsconfig.json +0 -0
  362. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/README.md +0 -0
  363. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-anchor-element.grit +0 -0
  364. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-relative-parent-imports.grit +0 -0
  365. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.biome/plugins/no-unnecessary-forwardref.grit +0 -0
  366. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/README.md +0 -0
  367. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/architecture.mdc +0 -0
  368. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/components.mdc +0 -0
  369. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/integrations.mdc +0 -0
  370. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/main.mdc +0 -0
  371. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.cursor/rules/styling.mdc +0 -0
  372. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.editorconfig +0 -0
  373. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.env.example +0 -0
  374. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/.gitattributes +0 -0
  375. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  376. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.github/workflows/lighthouse-to-slack.yml +0 -0
  377. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/.vscode/extensions.json +0 -0
  378. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/.vscode/settings.json +0 -0
  379. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/README.md +0 -0
  380. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/_gitignore +0 -0
  381. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/favicon.ico +0 -0
  382. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/layout.tsx +0 -0
  383. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/app/page.tsx +0 -0
  384. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/robots.ts +0 -0
  385. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/app/sitemap.ts +0 -0
  386. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/biome.json +0 -0
  387. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/basement.svg +0 -0
  388. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/footer/index.tsx +0 -0
  389. /package/{packages/create-basement-app/templates/default → src/templates/next-webgl}/components/layout/header/index.tsx +0 -0
  390. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/theme/index.tsx +0 -0
  391. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/layout/wrapper/index.tsx +0 -0
  392. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/README.md +0 -0
  393. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/README.md +0 -0
  394. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/image/index.tsx +0 -0
  395. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/components/ui/link/index.tsx +0 -0
  396. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/dynamic.tsx +0 -0
  397. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/canvas/index.tsx +0 -0
  398. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/components/webgl/components/scene/index.tsx +0 -0
  399. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/README.md +0 -0
  400. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/index.ts +0 -0
  401. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-device-detection.ts +0 -0
  402. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-media-breakpoint.ts +0 -0
  403. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/hooks/use-prefetch.ts +0 -0
  404. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/lib/integrations/.gitkeep +0 -0
  405. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/dev.ts +0 -0
  406. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-component.ts +0 -0
  407. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate-page.ts +0 -0
  408. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/generate.ts +0 -0
  409. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/scripts/utils.ts +0 -0
  410. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/app.ts +0 -0
  411. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/store/index.ts +0 -0
  412. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/README.md +0 -0
  413. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/cn.ts +0 -0
  414. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/colors.ts +0 -0
  415. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/config.ts +0 -0
  416. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/global.css +0 -0
  417. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/index.css +0 -0
  418. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/reset.css +0 -0
  419. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/root.css +0 -0
  420. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/css/tailwind.css +0 -0
  421. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/easings.ts +0 -0
  422. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/fonts.ts +0 -0
  423. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/index.ts +0 -0
  424. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/layout.mjs +0 -0
  425. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/README.md +0 -0
  426. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-root.ts +0 -0
  427. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/generate-tailwind.ts +0 -0
  428. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/postcss-functions.mjs +0 -0
  429. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/setup-styles.ts +0 -0
  430. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/scripts/utils.ts +0 -0
  431. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/styles/typography.ts +0 -0
  432. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/README.md +0 -0
  433. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/css.d.ts +0 -0
  434. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/easings.ts +0 -0
  435. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/fetch.ts +0 -0
  436. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.test.ts +0 -0
  437. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/math.ts +0 -0
  438. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/metadata.ts +0 -0
  439. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.test.ts +0 -0
  440. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/strings.ts +0 -0
  441. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/types.d.ts +0 -0
  442. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.test.ts +0 -0
  443. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/lib/utils/viewport.ts +0 -0
  444. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/next.config.ts +0 -0
  445. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/postcss.config.mjs +0 -0
  446. /package/{packages/create-basement-app/templates/experiment → src/templates/next-webgl}/public/fonts/geist/Geist-Mono.woff2 +0 -0
  447. /package/{packages/create-basement-app/templates/webgl → src/templates/next-webgl}/tsconfig.json +0 -0
@@ -1,37 +0,0 @@
1
- # Image Component
2
-
3
- Optimized images with smart loading, blur placeholders, and responsive sizing.
4
-
5
- ## Usage
6
-
7
- ```tsx
8
- import { Image } from '@/components/ui/image'
9
-
10
- // Basic
11
- <Image src="/hero.jpg" alt="Hero" aspectRatio={16/9} />
12
-
13
- // Priority (LCP images)
14
- <Image src="/hero.jpg" alt="Hero" aspectRatio={16/9} priority />
15
-
16
- // Responsive
17
- <Image
18
- src="/product.jpg"
19
- alt="Product"
20
- mobileSize="100vw"
21
- desktopSize="33vw"
22
- />
23
- ```
24
-
25
- ## Props
26
-
27
- | Prop | Description |
28
- |------|-------------|
29
- | `aspectRatio` | Prevents layout shift, enables blur placeholder |
30
- | `priority` | Eager loading for above-the-fold images |
31
- | `mobileSize` / `desktopSize` | Responsive sizing |
32
-
33
- ## Best Practices
34
-
35
- - Always provide `aspectRatio` (prevents CLS)
36
- - Use `priority` for LCP images
37
- - Never use `next/image` directly
@@ -1,224 +0,0 @@
1
- /**
2
- * Enhanced Image Component
3
- *
4
- * Next.js Image wrapper with optimized defaults and error handling.
5
- * Always use this component instead of next/image directly.
6
- */
7
- "use client"
8
-
9
- import cn from "clsx"
10
- import NextImage, { type ImageProps as NextImageProps } from "next/image"
11
- import type { CSSProperties, Ref } from "react"
12
- import { breakpoints } from "@/lib/styles/config"
13
- import s from "./image.module.css"
14
-
15
- /**
16
- * Enhanced Image component props extending Next.js Image.
17
- *
18
- * Adds responsive sizing, aspect ratio support, and automatic blur placeholders.
19
- * Always use this component instead of next/image directly.
20
- */
21
- export type ImageProps = Omit<NextImageProps, "objectFit" | "alt"> & {
22
- /** CSS object-fit property for image positioning */
23
- objectFit?: CSSProperties["objectFit"]
24
- /** Display as block element (adds display: block) */
25
- block?: boolean
26
- /** Size on mobile devices (e.g., "100vw", "50vw") */
27
- mobileSize?: `${number}vw`
28
- /** Size on desktop devices (e.g., "33vw", "25vw") */
29
- desktopSize?: `${number}vw`
30
- /** Ref for accessing the underlying img element */
31
- ref?: Ref<HTMLImageElement>
32
- /** Alt text for accessibility (required for meaningful images) */
33
- alt?: string
34
- /** Aspect ratio for automatic placeholder and layout stability */
35
- aspectRatio?: number
36
- }
37
-
38
- // Memoize helper functions to avoid recreation
39
- const toBase64 = (str: string) =>
40
- typeof window === "undefined"
41
- ? Buffer.from(str).toString("base64")
42
- : window.btoa(str)
43
-
44
- // Helper to generate blur placeholder with transparent background by default
45
- const generateShimmer = (w: number, h: number) => `
46
- <svg width="${w}" height="${h}" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
47
- <defs>
48
- <linearGradient id="g">
49
- <stop stop-color="rgba(255,255,255,0.1)" offset="20%" />
50
- <stop stop-color="rgba(255,255,255,0.2)" offset="50%" />
51
- <stop stop-color="rgba(255,255,255,0.1)" offset="70%" />
52
- </linearGradient>
53
- </defs>
54
- <rect width="${w}" height="${h}" fill="rgba(0,0,0,0)" />
55
- <rect id="r" width="${w}" height="${h}" fill="url(#g)" />
56
- <animate xlink:href="#r" attributeName="x" from="-${w}" to="${w}" dur="1s" repeatCount="indefinite" />
57
- </svg>`
58
-
59
- // Helper to determine if blur placeholder should be used
60
- const shouldUseBlurPlaceholder = (
61
- src: NextImageProps["src"],
62
- placeholder: string,
63
- blurDataURL: string | undefined
64
- ): boolean => {
65
- if (!src) return false
66
- const isSvg = typeof src === "string" && src.includes(".svg")
67
- return !isSvg && placeholder === "blur" && !blurDataURL
68
- }
69
-
70
- // Helper to generate blur data URL
71
- const generateBlurDataURL = (
72
- shouldUse: boolean,
73
- aspectRatio: number | undefined,
74
- existingBlurDataURL: string | undefined
75
- ): string | undefined => {
76
- if (!(shouldUse && aspectRatio)) return existingBlurDataURL
77
-
78
- const shimmerSvg = generateShimmer(700, Math.round(700 / aspectRatio))
79
- return `data:image/svg+xml;base64,${toBase64(shimmerSvg)}`
80
- }
81
-
82
- // Helper to determine final placeholder value
83
- const getFinalPlaceholder = (
84
- shouldUse: boolean,
85
- aspectRatio: number | undefined,
86
- blurDataURL: string | undefined,
87
- originalPlaceholder: NextImageProps["placeholder"]
88
- ): NextImageProps["placeholder"] => {
89
- if (!shouldUse) {
90
- return originalPlaceholder === "blur" && !blurDataURL
91
- ? "empty"
92
- : originalPlaceholder
93
- }
94
-
95
- return aspectRatio || blurDataURL ? "blur" : "empty"
96
- }
97
-
98
- /**
99
- * Enhanced Image component with responsive sizing and automatic optimizations.
100
- *
101
- * Always use this component instead of next/image directly. Provides:
102
- * - Automatic responsive sizes generation
103
- * - Smart blur placeholders with aspect ratio support
104
- * - Performance optimizations (lazy loading by default)
105
- * - Preload for LCP images
106
- *
107
- * @param props - Image props extending Next.js Image
108
- * @param props.aspectRatio - Aspect ratio for layout stability and blur placeholder
109
- * @param props.mobileSize - Size on mobile (e.g., "100vw")
110
- * @param props.desktopSize - Size on desktop (e.g., "50vw")
111
- * @param props.block - Display as block element
112
- * @param props.preload - Enable preloading for LCP images
113
- *
114
- * @example
115
- * ```tsx
116
- * // Basic usage with aspect ratio
117
- * <Image
118
- * src="/hero.jpg"
119
- * alt="Hero image"
120
- * aspectRatio={16/9}
121
- * />
122
- * ```
123
- *
124
- * @example
125
- * ```tsx
126
- * // LCP image with preload
127
- * <Image
128
- * src="/hero.jpg"
129
- * alt="Hero image"
130
- * aspectRatio={16/9}
131
- * preload // Preloads image for LCP
132
- * />
133
- * ```
134
- *
135
- * @example
136
- * ```tsx
137
- * // Responsive grid image
138
- * <Image
139
- * src="/product.jpg"
140
- * alt="Product"
141
- * aspectRatio={1}
142
- * mobileSize="100vw"
143
- * desktopSize="33vw"
144
- * />
145
- * ```
146
- */
147
- export function Image({
148
- style,
149
- className,
150
- loading,
151
- objectFit = "cover",
152
- quality = 90,
153
- alt = "",
154
- fill,
155
- block = !fill,
156
- width = block ? 1 : undefined,
157
- height = block ? 1 : undefined,
158
- mobileSize = "100vw",
159
- desktopSize = "100vw",
160
- sizes,
161
- src,
162
- unoptimized,
163
- ref,
164
- aspectRatio,
165
- placeholder = "blur",
166
- preload = false,
167
- ...props
168
- }: ImageProps) {
169
- // Determine loading strategy
170
- const finalLoading = loading ?? (preload ? "eager" : "lazy")
171
-
172
- // Generate responsive sizes if not provided
173
- const finalSizes =
174
- sizes ||
175
- `(max-width: ${breakpoints.desktop}px) ${mobileSize}, ${desktopSize}`
176
-
177
- // Early return after hooks
178
- if (!src) return null
179
-
180
- // Determine SVG status and placeholder logic
181
- const isSvg = typeof src === "string" && src.includes(".svg")
182
- const shouldUsePlaceholder = shouldUseBlurPlaceholder(
183
- src,
184
- placeholder,
185
- props.blurDataURL
186
- )
187
- const blurDataURL = generateBlurDataURL(
188
- shouldUsePlaceholder,
189
- aspectRatio,
190
- props.blurDataURL
191
- )
192
- const finalPlaceholder = getFinalPlaceholder(
193
- shouldUsePlaceholder,
194
- aspectRatio,
195
- props.blurDataURL,
196
- placeholder
197
- )
198
-
199
- return (
200
- <NextImage
201
- ref={ref}
202
- fill={!block}
203
- {...(width !== undefined && { width })}
204
- {...(height !== undefined && { height })}
205
- loading={finalLoading}
206
- quality={quality}
207
- alt={alt}
208
- style={{
209
- objectFit,
210
- ...style,
211
- }}
212
- className={cn(className, block && s.block)}
213
- sizes={finalSizes}
214
- src={src}
215
- unoptimized={unoptimized || isSvg}
216
- draggable={false}
217
- onDragStart={(e) => e.preventDefault()}
218
- {...(finalPlaceholder && { placeholder: finalPlaceholder })}
219
- {...(blurDataURL && { blurDataURL })}
220
- preload={preload}
221
- {...props}
222
- />
223
- )
224
- }
@@ -1,146 +0,0 @@
1
- "use client"
2
-
3
- import NextLink from "next/link"
4
- import { usePathname } from "next/navigation"
5
- import {
6
- type AnchorHTMLAttributes,
7
- type ComponentProps,
8
- type MouseEvent,
9
- useEffect,
10
- useState,
11
- } from "react"
12
-
13
- // Helper to extract props safe for button elements
14
- function getButtonProps(props: Record<string, unknown>) {
15
- const {
16
- href,
17
- target,
18
- rel,
19
- "data-external": _dataExternal,
20
- ...buttonProps
21
- } = props
22
- return buttonProps
23
- }
24
-
25
- // Helper to extract props safe for div elements
26
- function getDivProps(props: Record<string, unknown>) {
27
- const {
28
- href,
29
- target,
30
- rel,
31
- onClick,
32
- "data-external": _dataExternal,
33
- ...divProps
34
- } = props
35
- return divProps
36
- }
37
-
38
- type CustomLinkProps = Omit<
39
- AnchorHTMLAttributes<HTMLAnchorElement>,
40
- keyof ComponentProps<typeof NextLink> | "href"
41
- > &
42
- Omit<ComponentProps<typeof NextLink>, "href"> & {
43
- href?: string
44
- onClick?: (e: MouseEvent<HTMLElement>) => void
45
- scroll?: boolean
46
- }
47
-
48
- export function Link({
49
- href,
50
- children,
51
- onClick,
52
- scroll = false, // Default to false to prevent scroll restoration warnings with fixed/sticky elements
53
- ...props
54
- }: CustomLinkProps) {
55
- const [shouldPrefetch, setShouldPrefetch] = useState(false)
56
- const [isExternal, setIsExternal] = useState(false)
57
- const [isActive, setIsActive] = useState(false)
58
-
59
- // Get pathname - deferred to avoid blocking static generation
60
- // usePathname is safe to call but we defer the active check to useEffect
61
- const pathname = usePathname()
62
-
63
- useEffect(() => {
64
- // Check if this link is active (current page)
65
- if (href && pathname) {
66
- setIsActive(pathname === href)
67
- }
68
- }, [href, pathname])
69
-
70
- useEffect(() => {
71
- // Skip if no href
72
- if (!href) return
73
-
74
- // Check if external link
75
- try {
76
- const url = new URL(href, window.location.href)
77
- setIsExternal(url.host !== window.location.host)
78
- } catch {
79
- setIsExternal(false)
80
- }
81
-
82
- // Only prefetch on good connections
83
- const connection = (
84
- navigator as Navigator & {
85
- connection?: { effectiveType: string; saveData: boolean }
86
- }
87
- ).connection
88
- if (connection) {
89
- const { effectiveType, saveData } = connection
90
- setShouldPrefetch(effectiveType === "4g" && !saveData)
91
- } else {
92
- // Default to prefetching if API not available
93
- setShouldPrefetch(true)
94
- }
95
- }, [href])
96
-
97
- // If no href is provided but there's an onClick, render a button
98
- if (!href && onClick) {
99
- return (
100
- <button
101
- onClick={(e: MouseEvent<HTMLButtonElement>) => onClick(e)}
102
- type="button"
103
- {...getButtonProps(props)}
104
- >
105
- {children}
106
- </button>
107
- )
108
- }
109
-
110
- // If no href and no onClick, render a div
111
- if (!href) {
112
- return <div {...getDivProps(props)}>{children}</div>
113
- }
114
-
115
- // For SSR, check if it's external based on the href pattern
116
- const isExternalSSR =
117
- href.startsWith("http://") || href.startsWith("https://")
118
-
119
- if (isExternalSSR || isExternal) {
120
- return (
121
- <a
122
- href={href}
123
- target="_blank"
124
- rel="noopener noreferrer"
125
- data-external
126
- onClick={onClick}
127
- {...props}
128
- >
129
- {children}
130
- </a>
131
- )
132
- }
133
-
134
- return (
135
- <NextLink
136
- href={href as ComponentProps<typeof NextLink>["href"]}
137
- prefetch={shouldPrefetch}
138
- scroll={scroll}
139
- data-active={isActive || undefined}
140
- {...(onClick && { onClick })}
141
- {...props}
142
- >
143
- {children}
144
- </NextLink>
145
- )
146
- }
@@ -1 +0,0 @@
1
- BertovDev/project-restructure
package/tasks/CLAUDE.md DELETED
@@ -1,104 +0,0 @@
1
- # Ralph Agent Instructions
2
-
3
- You are an autonomous coding agent working on a software project.
4
-
5
- ## Your Task
6
-
7
- 1. Read the PRD at `prd.json` (in the same directory as this file)
8
- 2. Read the progress log at `progress.txt` (check Codebase Patterns section first)
9
- 3. Check you're on the correct branch from PRD `branchName`. If not, check it out or create from main.
10
- 4. Pick the **highest priority** user story where `passes: false`
11
- 5. Implement that single user story
12
- 6. Run quality checks (e.g., typecheck, lint, test - use whatever your project requires)
13
- 7. Update CLAUDE.md files if you discover reusable patterns (see below)
14
- 8. If checks pass, commit ALL changes with message: `feat: [Story ID] - [Story Title]`
15
- 9. Update the PRD to set `passes: true` for the completed story
16
- 10. Append your progress to `progress.txt`
17
-
18
- ## Progress Report Format
19
-
20
- APPEND to progress.txt (never replace, always append):
21
- ```
22
- ## [Date/Time] - [Story ID]
23
- - What was implemented
24
- - Files changed
25
- - **Learnings for future iterations:**
26
- - Patterns discovered (e.g., "this codebase uses X for Y")
27
- - Gotchas encountered (e.g., "don't forget to update Z when changing W")
28
- - Useful context (e.g., "the evaluation panel is in component X")
29
- ---
30
- ```
31
-
32
- The learnings section is critical - it helps future iterations avoid repeating mistakes and understand the codebase better.
33
-
34
- ## Consolidate Patterns
35
-
36
- If you discover a **reusable pattern** that future iterations should know, add it to the `## Codebase Patterns` section at the TOP of progress.txt (create it if it doesn't exist). This section should consolidate the most important learnings:
37
-
38
- ```
39
- ## Codebase Patterns
40
- - Example: Use `sql<number>` template for aggregations
41
- - Example: Always use `IF NOT EXISTS` for migrations
42
- - Example: Export types from actions.ts for UI components
43
- ```
44
-
45
- Only add patterns that are **general and reusable**, not story-specific details.
46
-
47
- ## Update CLAUDE.md Files
48
-
49
- Before committing, check if any edited files have learnings worth preserving in nearby CLAUDE.md files:
50
-
51
- 1. **Identify directories with edited files** - Look at which directories you modified
52
- 2. **Check for existing CLAUDE.md** - Look for CLAUDE.md in those directories or parent directories
53
- 3. **Add valuable learnings** - If you discovered something future developers/agents should know:
54
- - API patterns or conventions specific to that module
55
- - Gotchas or non-obvious requirements
56
- - Dependencies between files
57
- - Testing approaches for that area
58
- - Configuration or environment requirements
59
-
60
- **Examples of good CLAUDE.md additions:**
61
- - "When modifying X, also update Y to keep them in sync"
62
- - "This module uses pattern Z for all API calls"
63
- - "Tests require the dev server running on PORT 3000"
64
- - "Field names must match the template exactly"
65
-
66
- **Do NOT add:**
67
- - Story-specific implementation details
68
- - Temporary debugging notes
69
- - Information already in progress.txt
70
-
71
- Only update CLAUDE.md if you have **genuinely reusable knowledge** that would help future work in that directory.
72
-
73
- ## Quality Requirements
74
-
75
- - ALL commits must pass your project's quality checks (typecheck, lint, test)
76
- - Do NOT commit broken code
77
- - Keep changes focused and minimal
78
- - Follow existing code patterns
79
-
80
- ## Browser Testing (If Available)
81
-
82
- For any story that changes UI, verify it works in the browser if you have browser testing tools configured (e.g., via MCP):
83
-
84
- 1. Navigate to the relevant page
85
- 2. Verify the UI changes work as expected
86
- 3. Take a screenshot if helpful for the progress log
87
-
88
- If no browser tools are available, note in your progress report that manual browser verification is needed.
89
-
90
- ## Stop Condition
91
-
92
- After completing a user story, check if ALL stories have `passes: true`.
93
-
94
- If ALL stories are complete and passing, reply with:
95
- <promise>COMPLETE</promise>
96
-
97
- If there are still stories with `passes: false`, end your response normally (another iteration will pick up the next story).
98
-
99
- ## Important
100
-
101
- - Work on ONE story per iteration
102
- - Commit frequently
103
- - Keep CI green
104
- - Read the Codebase Patterns section in progress.txt before starting
@@ -1,153 +0,0 @@
1
- {
2
- "project": "basement-cli",
3
- "branchName": "ralph/next-starter-dynamic-layers",
4
- "description": "Replace 4 static templates with next-starter clone + dynamic technology layers to eliminate maintenance burden",
5
- "userStories": [
6
- {
7
- "id": "US-001",
8
- "title": "Create layer configuration system",
9
- "description": "As a CLI maintainer, I want technology layers defined in a config file so that adding or modifying layers only requires changing one file.",
10
- "acceptanceCriteria": [
11
- "Add LAYER_CONFIG export to src/mergers/config.js alongside existing CMS_CONFIG",
12
- "Each layer config defines: replaceFiles, additivePaths, dependencies, devDependencies",
13
- "Add getLayerConfig(layer) helper function export",
14
- "Config contains entries for webgl, webgpu, and experiment",
15
- "webgpu is a deps-only layer (empty replaceFiles and additivePaths arrays)",
16
- "webgl dependencies: @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.182.0, @gsap/react ^2.0.0, @radix-ui/react-navigation-menu ^1.2.5, leva ^0.9.35, devDeps: @types/three ^0.182.0",
17
- "webgpu dependencies: @react-three/fiber 10.0.0-alpha.2, @react-three/drei ^11.0.0-alpha.4, three ^0.182.0, leva ^0.9.35, lucide-react ^0.474.0, @radix-ui/react-navigation-menu ^1.2.5, devDeps: @types/three ^0.182.0",
18
- "experiment dependencies: @react-three/fiber ^9.5.0, @react-three/drei ^10.7.7, three ^0.172.0, leva ^0.9.35, lucide-react ^0.474.0, @radix-ui/react-navigation-menu ^1.2.5, devDeps: @types/three ^0.182.0",
19
- "Typecheck passes"
20
- ],
21
- "priority": 1,
22
- "passes": true,
23
- "notes": ""
24
- },
25
- {
26
- "id": "US-002",
27
- "title": "Extract layer files from templates",
28
- "description": "As a CLI maintainer, I need the unique files from each template extracted into a layers/ directory so they can be overlaid on next-starter.",
29
- "acceptanceCriteria": [
30
- "Create layers/webgl/app/page.tsx copied from template/webgl/app/page.tsx (the one that imports DynamicCanvas)",
31
- "Create layers/webgl/components/webgl/canvas/dynamic.tsx from template/webgl/components/webgl/canvas/dynamic.tsx",
32
- "Create layers/webgl/components/webgl/canvas/index.tsx from template/webgl/components/webgl/canvas/index.tsx",
33
- "Create layers/webgl/components/webgl/components/scene/index.tsx from template/webgl/components/webgl/components/scene/index.tsx",
34
- "Create layers/experiment/components/layout/header/index.tsx from template/experiment/components/layout/header/index.tsx",
35
- "Create layers/experiment/components/layout/navigation-menu.tsx from template/experiment/components/layout/navigation-menu.tsx",
36
- "Create layers/experiment/lib/constats.ts from template/experiment/lib/constats.ts",
37
- "Create layers/experiment/lib/utils/cn.ts from template/experiment/lib/utils/cn.ts",
38
- "Create empty layers/webgpu/ directory with a .gitkeep file",
39
- "All copied files are byte-for-byte identical to their template source files",
40
- "Typecheck passes"
41
- ],
42
- "priority": 2,
43
- "passes": true,
44
- "notes": ""
45
- },
46
- {
47
- "id": "US-003",
48
- "title": "Implement layer injection function",
49
- "description": "As the CLI system, I need to overlay layer-specific files on top of the next-starter base so that WebGL/WebGPU/Experiment projects get their unique components.",
50
- "acceptanceCriteria": [
51
- "Add injectLayer(targetDir, layer, spinner) function to src/mergers/index.js",
52
- "Function resolves layer directory from CLI repo's layers/{type}/ path using __dirname",
53
- "Function calls existing detectPathPrefix() to handle src/ directory structure",
54
- "Function copies additive files from local layers/ directory (no tiged clone needed)",
55
- "Function replaces files listed in replaceFiles config (overwrites base version with overwrite: true)",
56
- "Function uses existing transformPath() for path prefix support",
57
- "Function returns results object with replaced, copied, skipped, and failed arrays",
58
- "When layer is 'default' or not found in config, function returns early with skipped result (no error)",
59
- "Extend formatMergeResults() to display replaced entries with checkmark prefix",
60
- "Typecheck passes"
61
- ],
62
- "priority": 3,
63
- "passes": true,
64
- "notes": "Reuses existing detectPathPrefix() and transformPath() from src/mergers/index.js. Layer files are local (no network request)."
65
- },
66
- {
67
- "id": "US-004",
68
- "title": "Change create.js to clone next-starter instead of template",
69
- "description": "As a developer using the CLI, I want my project scaffolded from the latest next-starter repo so I always get the most up-to-date base.",
70
- "acceptanceCriteria": [
71
- "Change tiged source on line 124 of src/commands/create.js from 'github:basementstudio/basement-cli/template/${type}#${branch}' to 'github:basementstudio/next-starter#main'",
72
- "Remove the BASEMENT_CLI_BRANCH env var usage for template (keep if used elsewhere)",
73
- "Delete bun.lock file after clone if it exists (since dependencies will be modified)",
74
- "Update download spinner text to say 'Downloading next-starter from GitHub...' instead of mentioning template type",
75
- "Update error/troubleshooting message in catch block to reference basementstudio/next-starter instead of basementstudio/basement-cli/template/{type}",
76
- "Typecheck passes"
77
- ],
78
- "priority": 4,
79
- "passes": true,
80
- "notes": ""
81
- },
82
- {
83
- "id": "US-005",
84
- "title": "Wire layer injection into create flow",
85
- "description": "As the CLI system, I need the layer injection step between template download and CMS integration so layers are applied at the right time.",
86
- "acceptanceCriteria": [
87
- "Add new step between template download (step 3) and CMS integration (step 3.5) in src/commands/create.js",
88
- "Layer injection only runs when type !== 'default'",
89
- "Import injectLayer and formatMergeResults from src/mergers/index.js",
90
- "Show ora spinner with layer name during injection (e.g. 'Applying webgl layer...')",
91
- "Display injection results to user using formatMergeResults",
92
- "On failure, show warning (not hard error) and continue with project creation",
93
- "Typecheck passes"
94
- ],
95
- "priority": 5,
96
- "passes": true,
97
- "notes": "Must run BEFORE CMS integration because layers don't modify layout.tsx, and CMS mergers need the base layout intact."
98
- },
99
- {
100
- "id": "US-006",
101
- "title": "Config-driven dependency injection in package.json hydration",
102
- "description": "As the CLI system, I need package.json hydration to read layer dependencies from LAYER_CONFIG instead of being hardcoded.",
103
- "acceptanceCriteria": [
104
- "Import getLayerConfig from src/mergers/config.js in create.js",
105
- "Read layer dependencies from LAYER_CONFIG and merge into package.json: pkg.dependencies = { ...pkg.dependencies, ...layerConfig.dependencies }",
106
- "Also merge devDependencies from layer config",
107
- "CMS dependency injection (Sanity/BaseHub) still works unchanged",
108
- "Animation library injection (GSAP/Framer Motion) still works unchanged",
109
- "Simplify package.json handling: next-starter uses package.json directly (not package.template.json), remove the rename logic",
110
- "Project name still set to user-provided name, version still set to 0.1.0",
111
- "Typecheck passes"
112
- ],
113
- "priority": 6,
114
- "passes": true,
115
- "notes": "next-starter uses package.json not package.template.json, so the existsSync check for package.template.json can be simplified."
116
- },
117
- {
118
- "id": "US-007",
119
- "title": "Delete template directory",
120
- "description": "As a CLI maintainer, I want the template/ directory removed so there's no duplicated code to maintain.",
121
- "acceptanceCriteria": [
122
- "Delete template/default/ directory and all contents",
123
- "Delete template/webgl/ directory and all contents",
124
- "Delete template/webgpu/ directory and all contents",
125
- "Delete template/experiment/ directory and all contents",
126
- "Grep source code for any remaining references to 'template/' paths and remove them",
127
- "Grep source code for any remaining references to 'basementstudio/basement-cli/template/' and remove them",
128
- "Typecheck passes"
129
- ],
130
- "priority": 7,
131
- "passes": true,
132
- "notes": ""
133
- },
134
- {
135
- "id": "US-008",
136
- "title": "End-to-end verification of all template types",
137
- "description": "As a CLI maintainer, I need to verify all template + CMS + animation combinations produce working projects.",
138
- "acceptanceCriteria": [
139
- "Run npm link to install CLI locally",
140
- "Run: basement -c test-default -d -no-cms -no-animation -claude -no-hooks — project creates successfully",
141
- "Run: basement -c test-webgl -webgl -no-cms -no-animation -claude -no-hooks — project has R3F components in components/webgl/",
142
- "Run: basement -c test-webgpu -webgpu -no-cms -no-animation -claude -no-hooks — project has WebGPU deps in package.json",
143
- "Run: basement -c test-experiment -exp -no-cms -no-animation -claude -no-hooks — project has custom header with NavigationMenu",
144
- "Run: basement -c test-sanity -webgl -sanity -gsap -claude -no-hooks — project has CMS + animation + layer deps",
145
- "All generated projects pass bun install without errors",
146
- "Typecheck passes"
147
- ],
148
- "priority": 8,
149
- "passes": true,
150
- "notes": "This is the final validation step. Each test project should be cleaned up after verification."
151
- }
152
- ]
153
- }