bsmnt 0.4.0 → 0.4.2

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 (536) hide show
  1. package/dist/{helpers/add → application/add-hooks}/index.d.ts +4 -4
  2. package/dist/application/add-hooks/index.d.ts.map +1 -0
  3. package/dist/{helpers/add → application/add-hooks}/index.js +22 -35
  4. package/dist/application/add-hooks/index.js.map +1 -0
  5. package/dist/{utils → application/add-integration}/format-results.d.ts +1 -6
  6. package/dist/application/add-integration/format-results.d.ts.map +1 -0
  7. package/dist/{utils → application/add-integration}/format-results.js +1 -6
  8. package/dist/application/add-integration/format-results.js.map +1 -0
  9. package/dist/{helpers/integrate → application/add-integration}/index.d.ts +2 -1
  10. package/dist/application/add-integration/index.d.ts.map +1 -0
  11. package/dist/{helpers/integrate → application/add-integration}/index.js +46 -41
  12. package/dist/application/add-integration/index.js.map +1 -0
  13. package/dist/application/create-project/build-context.d.ts +9 -0
  14. package/dist/application/create-project/build-context.d.ts.map +1 -0
  15. package/dist/application/create-project/build-context.js +13 -0
  16. package/dist/application/create-project/build-context.js.map +1 -0
  17. package/dist/application/create-project/index.d.ts +44 -0
  18. package/dist/application/create-project/index.d.ts.map +1 -0
  19. package/dist/application/create-project/index.js +70 -0
  20. package/dist/application/create-project/index.js.map +1 -0
  21. package/dist/application/create-project/map-selection-to-registry.d.ts +3 -0
  22. package/dist/application/create-project/map-selection-to-registry.d.ts.map +1 -0
  23. package/dist/application/create-project/map-selection-to-registry.js +30 -0
  24. package/dist/application/create-project/map-selection-to-registry.js.map +1 -0
  25. package/dist/application/create-project/resolve-selection.d.ts +15 -0
  26. package/dist/application/create-project/resolve-selection.d.ts.map +1 -0
  27. package/dist/application/create-project/resolve-selection.js +11 -0
  28. package/dist/application/create-project/resolve-selection.js.map +1 -0
  29. package/dist/{helpers/skills → application/install-skills}/index.d.ts +1 -1
  30. package/dist/application/install-skills/index.d.ts.map +1 -0
  31. package/dist/{helpers/skills → application/install-skills}/index.js +31 -44
  32. package/dist/application/install-skills/index.js.map +1 -0
  33. package/dist/{utils/detect-project.d.ts → application/shared/project-detection.d.ts} +8 -15
  34. package/dist/application/shared/project-detection.d.ts.map +1 -0
  35. package/dist/{utils/detect-project.js → application/shared/project-detection.js} +8 -24
  36. package/dist/application/shared/project-detection.js.map +1 -0
  37. package/dist/core/create/build-plan.d.ts +8 -0
  38. package/dist/core/create/build-plan.d.ts.map +1 -0
  39. package/dist/core/create/build-plan.js +89 -0
  40. package/dist/core/create/build-plan.js.map +1 -0
  41. package/dist/core/create/execute-plan.d.ts +23 -0
  42. package/dist/core/create/execute-plan.d.ts.map +1 -0
  43. package/dist/core/create/execute-plan.js +23 -0
  44. package/dist/core/create/execute-plan.js.map +1 -0
  45. package/dist/core/create/internal-ids.d.ts +23 -0
  46. package/dist/core/create/internal-ids.d.ts.map +1 -0
  47. package/dist/core/create/internal-ids.js +36 -0
  48. package/dist/core/create/internal-ids.js.map +1 -0
  49. package/dist/core/create/registry.d.ts +12 -0
  50. package/dist/core/create/registry.d.ts.map +1 -0
  51. package/dist/core/create/registry.js +33 -0
  52. package/dist/core/create/registry.js.map +1 -0
  53. package/dist/core/create/types.d.ts +96 -0
  54. package/dist/core/create/types.d.ts.map +1 -0
  55. package/dist/core/create/types.js +2 -0
  56. package/dist/core/create/types.js.map +1 -0
  57. package/dist/domain/agents.d.ts +61 -0
  58. package/dist/domain/agents.d.ts.map +1 -0
  59. package/dist/domain/agents.js +35 -0
  60. package/dist/domain/agents.js.map +1 -0
  61. package/dist/domain/animations.d.ts +20 -0
  62. package/dist/domain/animations.d.ts.map +1 -0
  63. package/dist/domain/animations.js +13 -0
  64. package/dist/domain/animations.js.map +1 -0
  65. package/dist/domain/cms.d.ts +24 -0
  66. package/dist/domain/cms.d.ts.map +1 -0
  67. package/dist/domain/cms.js +13 -0
  68. package/dist/domain/cms.js.map +1 -0
  69. package/dist/domain/hooks.d.ts +67 -0
  70. package/dist/domain/hooks.d.ts.map +1 -0
  71. package/dist/domain/hooks.js +52 -0
  72. package/dist/domain/hooks.js.map +1 -0
  73. package/dist/domain/skills.d.ts +70 -0
  74. package/dist/domain/skills.d.ts.map +1 -0
  75. package/dist/domain/skills.js +84 -0
  76. package/dist/domain/skills.js.map +1 -0
  77. package/dist/domain/templates.d.ts +51 -0
  78. package/dist/domain/templates.d.ts.map +1 -0
  79. package/dist/domain/templates.js +27 -0
  80. package/dist/domain/templates.js.map +1 -0
  81. package/dist/index.js +124 -115
  82. package/dist/index.js.map +1 -1
  83. package/dist/infrastructure/agents/register-sanity-mcp.d.ts +12 -0
  84. package/dist/infrastructure/agents/register-sanity-mcp.d.ts.map +1 -0
  85. package/dist/infrastructure/agents/register-sanity-mcp.js +153 -0
  86. package/dist/infrastructure/agents/register-sanity-mcp.js.map +1 -0
  87. package/dist/infrastructure/create/apply-copy-paths.d.ts +3 -0
  88. package/dist/infrastructure/create/apply-copy-paths.d.ts.map +1 -0
  89. package/dist/infrastructure/create/apply-copy-paths.js +12 -0
  90. package/dist/infrastructure/create/apply-copy-paths.js.map +1 -0
  91. package/dist/infrastructure/create/apply-merge-paths.d.ts +3 -0
  92. package/dist/infrastructure/create/apply-merge-paths.d.ts.map +1 -0
  93. package/dist/infrastructure/create/apply-merge-paths.js +17 -0
  94. package/dist/infrastructure/create/apply-merge-paths.js.map +1 -0
  95. package/dist/infrastructure/create/apply-package-json.d.ts +8 -0
  96. package/dist/infrastructure/create/apply-package-json.d.ts.map +1 -0
  97. package/dist/infrastructure/create/apply-package-json.js +46 -0
  98. package/dist/infrastructure/create/apply-package-json.js.map +1 -0
  99. package/dist/infrastructure/create/copy-template.d.ts +10 -0
  100. package/dist/infrastructure/create/copy-template.d.ts.map +1 -0
  101. package/dist/infrastructure/create/copy-template.js.map +1 -0
  102. package/dist/infrastructure/create/executor.d.ts +3 -0
  103. package/dist/infrastructure/create/executor.d.ts.map +1 -0
  104. package/dist/infrastructure/create/executor.js +21 -0
  105. package/dist/infrastructure/create/executor.js.map +1 -0
  106. package/dist/{helpers/create/init-git.d.ts → infrastructure/create/init-git-repo.d.ts} +2 -3
  107. package/dist/infrastructure/create/init-git-repo.d.ts.map +1 -0
  108. package/dist/{helpers/create/init-git.js → infrastructure/create/init-git-repo.js} +1 -4
  109. package/dist/infrastructure/create/init-git-repo.js.map +1 -0
  110. package/dist/{helpers/create/install.d.ts → infrastructure/create/install-dependencies.d.ts} +1 -1
  111. package/dist/infrastructure/create/install-dependencies.d.ts.map +1 -0
  112. package/dist/{helpers/create/install.js → infrastructure/create/install-dependencies.js} +1 -1
  113. package/dist/infrastructure/create/install-dependencies.js.map +1 -0
  114. package/dist/infrastructure/create/lifecycle-registry.d.ts +3 -0
  115. package/dist/infrastructure/create/lifecycle-registry.d.ts.map +1 -0
  116. package/dist/infrastructure/create/lifecycle-registry.js +38 -0
  117. package/dist/infrastructure/create/lifecycle-registry.js.map +1 -0
  118. package/dist/infrastructure/create/merge-registry.d.ts +3 -0
  119. package/dist/infrastructure/create/merge-registry.d.ts.map +1 -0
  120. package/dist/infrastructure/create/merge-registry.js +27 -0
  121. package/dist/infrastructure/create/merge-registry.js.map +1 -0
  122. package/dist/infrastructure/create/rename-files.d.ts.map +1 -0
  123. package/dist/infrastructure/create/rename-files.js.map +1 -0
  124. package/dist/{helpers → infrastructure}/create/setup-agent.d.ts +9 -7
  125. package/dist/infrastructure/create/setup-agent.d.ts.map +1 -0
  126. package/dist/infrastructure/create/setup-agent.js +77 -0
  127. package/dist/infrastructure/create/setup-agent.js.map +1 -0
  128. package/dist/infrastructure/create/setup-sanity.d.ts.map +1 -0
  129. package/dist/{helpers → infrastructure}/create/setup-sanity.js +1 -19
  130. package/dist/infrastructure/create/setup-sanity.js.map +1 -0
  131. package/dist/infrastructure/integrations/inject-integration.d.ts +9 -0
  132. package/dist/infrastructure/integrations/inject-integration.d.ts.map +1 -0
  133. package/dist/{helpers/integrate/merge-orchestrator.js → infrastructure/integrations/inject-integration.js} +26 -38
  134. package/dist/infrastructure/integrations/inject-integration.js.map +1 -0
  135. package/dist/modules/features/agents/index.d.ts +3 -0
  136. package/dist/modules/features/agents/index.d.ts.map +1 -0
  137. package/dist/modules/features/agents/index.js +4 -0
  138. package/dist/modules/features/agents/index.js.map +1 -0
  139. package/dist/modules/features/agents/shared.d.ts +4 -0
  140. package/dist/modules/features/agents/shared.d.ts.map +1 -0
  141. package/dist/modules/features/agents/shared.js +21 -0
  142. package/dist/modules/features/agents/shared.js.map +1 -0
  143. package/dist/{configs/animations.d.ts → modules/features/animation/config.d.ts} +1 -1
  144. package/dist/modules/features/animation/config.d.ts.map +1 -0
  145. package/dist/{configs/animations.js → modules/features/animation/config.js} +1 -1
  146. package/dist/modules/features/animation/config.js.map +1 -0
  147. package/dist/modules/features/animation/gsap.d.ts +3 -0
  148. package/dist/modules/features/animation/gsap.d.ts.map +1 -0
  149. package/dist/modules/features/animation/gsap.js +16 -0
  150. package/dist/modules/features/animation/gsap.js.map +1 -0
  151. package/dist/modules/features/animation/index.d.ts +3 -0
  152. package/dist/modules/features/animation/index.d.ts.map +1 -0
  153. package/dist/modules/features/animation/index.js +4 -0
  154. package/dist/modules/features/animation/index.js.map +1 -0
  155. package/dist/modules/features/animation/motion.d.ts +3 -0
  156. package/dist/modules/features/animation/motion.d.ts.map +1 -0
  157. package/dist/modules/features/animation/motion.js +16 -0
  158. package/dist/modules/features/animation/motion.js.map +1 -0
  159. package/dist/modules/features/cms/index.d.ts +3 -0
  160. package/dist/modules/features/cms/index.d.ts.map +1 -0
  161. package/dist/modules/features/cms/index.js +7 -0
  162. package/dist/modules/features/cms/index.js.map +1 -0
  163. package/dist/modules/features/cms/sanity/config.d.ts.map +1 -0
  164. package/dist/{helpers/integrate → modules/features/cms}/sanity/config.js +3 -2
  165. package/dist/modules/features/cms/sanity/config.js.map +1 -0
  166. package/dist/modules/features/cms/sanity/index.d.ts +3 -0
  167. package/dist/modules/features/cms/sanity/index.d.ts.map +1 -0
  168. package/dist/modules/features/cms/sanity/index.js +61 -0
  169. package/dist/modules/features/cms/sanity/index.js.map +1 -0
  170. package/dist/{helpers/integrate/sanity/mergers/check-integration-merger.d.ts → modules/features/cms/sanity/mergers/check-integration.d.ts} +1 -1
  171. package/dist/modules/features/cms/sanity/mergers/check-integration.d.ts.map +1 -0
  172. package/dist/{helpers/integrate/sanity/mergers/check-integration-merger.js → modules/features/cms/sanity/mergers/check-integration.js} +1 -1
  173. package/dist/modules/features/cms/sanity/mergers/check-integration.js.map +1 -0
  174. package/dist/{helpers/integrate/sanity/mergers/layout-merger.d.ts → modules/features/cms/sanity/mergers/layout.d.ts} +1 -1
  175. package/dist/modules/features/cms/sanity/mergers/layout.d.ts.map +1 -0
  176. package/dist/{helpers/integrate/sanity/mergers/layout-merger.js → modules/features/cms/sanity/mergers/layout.js} +1 -1
  177. package/dist/modules/features/cms/sanity/mergers/layout.js.map +1 -0
  178. package/dist/modules/features/cms/sanity/mergers/sitemap.d.ts +13 -0
  179. package/dist/modules/features/cms/sanity/mergers/sitemap.d.ts.map +1 -0
  180. package/dist/modules/features/cms/sanity/mergers/sitemap.js +92 -0
  181. package/dist/modules/features/cms/sanity/mergers/sitemap.js.map +1 -0
  182. package/dist/modules/features/cms/sanity-pagebuilder/config.d.ts +14 -0
  183. package/dist/modules/features/cms/sanity-pagebuilder/config.d.ts.map +1 -0
  184. package/dist/modules/features/cms/sanity-pagebuilder/config.js +44 -0
  185. package/dist/modules/features/cms/sanity-pagebuilder/config.js.map +1 -0
  186. package/dist/modules/features/cms/sanity-pagebuilder/index.d.ts +3 -0
  187. package/dist/modules/features/cms/sanity-pagebuilder/index.d.ts.map +1 -0
  188. package/dist/modules/features/cms/sanity-pagebuilder/index.js +46 -0
  189. package/dist/modules/features/cms/sanity-pagebuilder/index.js.map +1 -0
  190. package/dist/modules/features/hooks/factory.d.ts +4 -0
  191. package/dist/modules/features/hooks/factory.d.ts.map +1 -0
  192. package/dist/modules/features/hooks/factory.js +26 -0
  193. package/dist/modules/features/hooks/factory.js.map +1 -0
  194. package/dist/modules/features/hooks/index.d.ts +3 -0
  195. package/dist/modules/features/hooks/index.d.ts.map +1 -0
  196. package/dist/modules/features/hooks/index.js +4 -0
  197. package/dist/modules/features/hooks/index.js.map +1 -0
  198. package/dist/modules/presets/index.d.ts +3 -0
  199. package/dist/modules/presets/index.d.ts.map +1 -0
  200. package/dist/modules/presets/index.js +11 -0
  201. package/dist/modules/presets/index.js.map +1 -0
  202. package/dist/modules/presets/next-default.d.ts +3 -0
  203. package/dist/modules/presets/next-default.d.ts.map +1 -0
  204. package/dist/modules/presets/next-default.js +9 -0
  205. package/dist/modules/presets/next-default.js.map +1 -0
  206. package/dist/modules/presets/next-experiments.d.ts +3 -0
  207. package/dist/modules/presets/next-experiments.d.ts.map +1 -0
  208. package/dist/modules/presets/next-experiments.js +9 -0
  209. package/dist/modules/presets/next-experiments.js.map +1 -0
  210. package/dist/modules/presets/next-pagebuilder.d.ts +3 -0
  211. package/dist/modules/presets/next-pagebuilder.d.ts.map +1 -0
  212. package/dist/modules/presets/next-pagebuilder.js +10 -0
  213. package/dist/modules/presets/next-pagebuilder.js.map +1 -0
  214. package/dist/modules/presets/next-webgl.d.ts +3 -0
  215. package/dist/modules/presets/next-webgl.d.ts.map +1 -0
  216. package/dist/modules/presets/next-webgl.js +9 -0
  217. package/dist/modules/presets/next-webgl.js.map +1 -0
  218. package/dist/paths.d.ts +7 -1
  219. package/dist/paths.d.ts.map +1 -1
  220. package/dist/paths.js +8 -2
  221. package/dist/paths.js.map +1 -1
  222. package/index.js +2 -2
  223. package/package.json +11 -4
  224. package/src/modules/features/cms/sanity/files/.knip.json +8 -0
  225. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/blog/[slug]/route.ts +3 -4
  226. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/revalidate/route.ts +1 -4
  227. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/blog/[slug]/page.tsx +8 -9
  228. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/layout.tsx +2 -2
  229. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/sitemap.md/route.ts +18 -29
  230. package/src/modules/features/cms/sanity/files/app/sitemap.xml/route.ts +51 -0
  231. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/env.ts +2 -4
  232. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/queries.ts +0 -42
  233. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/index.ts +1 -1
  234. package/src/modules/features/cms/sanity/files/lib/scripts/copy-sanity-mcp.ts +23 -0
  235. package/src/modules/features/cms/sanity/files/lib/scripts/generate-page.ts +297 -0
  236. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/utils/json-ld.tsx +1 -6
  237. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/utils/metadata.ts +2 -2
  238. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/utils/url.ts +4 -2
  239. package/src/{helpers/integrate → modules/features/cms}/sanity/files/proxy.ts +11 -11
  240. package/src/template-hooks/use-device-perf.ts +27 -17
  241. package/src/templates/next-default/.env.example +3 -3
  242. package/src/templates/next-default/.vscode/extensions.json +1 -5
  243. package/src/templates/next-default/.vscode/settings.json +1 -1
  244. package/src/templates/next-default/.zed/settings.json +47 -0
  245. package/src/templates/next-default/README.md +7 -6
  246. package/src/templates/next-default/_gitignore +1 -3
  247. package/src/templates/next-default/app/layout.tsx +21 -35
  248. package/src/templates/next-default/app/robots.ts +3 -4
  249. package/src/templates/next-default/app/sitemap.xml/route.ts +29 -29
  250. package/src/templates/next-default/biome.json +9 -2
  251. package/src/templates/next-default/components/ui/image/index.tsx +2 -1
  252. package/src/templates/next-default/components/ui/link/index.tsx +35 -35
  253. package/src/templates/next-default/lefthook.yml +25 -0
  254. package/src/templates/next-default/lib/README.md +8 -4
  255. package/src/templates/next-default/lib/hooks/use-media.ts +6 -3
  256. package/src/templates/next-default/lib/scripts/dev.ts +32 -0
  257. package/src/templates/next-default/lib/styles/README.md +13 -0
  258. package/src/templates/next-default/lib/styles/fonts.ts +20 -0
  259. package/src/templates/next-default/lib/styles/global.css +15 -196
  260. package/src/templates/next-default/lib/styles/index.css +3 -0
  261. package/src/templates/next-default/lib/styles/tokens.css +182 -0
  262. package/src/templates/next-default/lib/utils/README.md +40 -0
  263. package/src/templates/next-default/lib/utils/easings.ts +240 -0
  264. package/src/templates/next-default/lib/utils/fetch.ts +84 -0
  265. package/src/templates/next-default/lib/utils/global-css.d.ts +1 -0
  266. package/src/templates/next-default/lib/utils/json-ld.tsx +70 -68
  267. package/src/templates/next-default/lib/utils/math.ts +236 -0
  268. package/src/templates/next-default/lib/utils/metadata.ts +26 -27
  269. package/src/templates/next-default/lib/utils/strings.ts +246 -0
  270. package/src/templates/next-default/lib/utils/types.d.ts +15 -0
  271. package/src/templates/next-default/lib/utils/url.ts +8 -5
  272. package/src/templates/next-default/lib/utils/viewport.ts +199 -0
  273. package/src/templates/next-default/package.json +12 -7
  274. package/src/templates/next-default/svg.d.ts +1 -0
  275. package/src/templates/next-experiments/.env.example +3 -3
  276. package/src/templates/next-experiments/.knip.json +3 -0
  277. package/src/templates/next-experiments/.vscode/extensions.json +1 -5
  278. package/src/templates/next-experiments/.vscode/settings.json +1 -1
  279. package/src/templates/next-experiments/.zed/settings.json +47 -0
  280. package/src/templates/next-experiments/README.md +7 -6
  281. package/src/templates/next-experiments/_gitignore +1 -3
  282. package/src/templates/next-experiments/app/layout.tsx +21 -35
  283. package/src/templates/next-experiments/app/robots.ts +5 -2
  284. package/src/templates/next-experiments/app/sitemap.xml/route.ts +51 -0
  285. package/src/templates/next-experiments/biome.json +4 -2
  286. package/src/templates/next-experiments/components/layout/navigation-menu.tsx +1 -1
  287. package/src/templates/next-experiments/components/layout/wrapper/index.tsx +6 -6
  288. package/src/templates/next-experiments/components/ui/image/index.tsx +33 -33
  289. package/src/templates/next-experiments/lib/README.md +8 -4
  290. package/src/templates/next-experiments/lib/hooks/use-media.ts +6 -3
  291. package/src/templates/next-experiments/lib/scripts/dev.ts +32 -0
  292. package/src/templates/next-experiments/lib/styles/README.md +13 -0
  293. package/src/templates/next-experiments/lib/styles/fonts.ts +20 -0
  294. package/src/templates/next-experiments/lib/styles/global.css +16 -196
  295. package/src/templates/next-experiments/lib/styles/index.css +3 -0
  296. package/src/templates/next-experiments/lib/styles/tokens.css +182 -0
  297. package/src/templates/next-experiments/lib/utils/README.md +40 -0
  298. package/src/templates/next-experiments/lib/utils/easings.ts +240 -0
  299. package/src/templates/next-experiments/lib/utils/fetch.ts +84 -0
  300. package/src/templates/next-experiments/lib/utils/global-css.d.ts +1 -0
  301. package/src/templates/next-experiments/lib/utils/json-ld.tsx +70 -68
  302. package/src/templates/next-experiments/lib/utils/math.ts +236 -0
  303. package/src/templates/next-experiments/lib/utils/metadata.ts +26 -27
  304. package/src/templates/next-experiments/lib/utils/strings.ts +246 -0
  305. package/src/templates/next-experiments/lib/utils/types.d.ts +15 -0
  306. package/src/templates/next-experiments/lib/utils/url.ts +8 -5
  307. package/src/templates/next-experiments/lib/utils/viewport.ts +199 -0
  308. package/src/templates/next-experiments/package.json +6 -6
  309. package/src/templates/next-experiments/svg.d.ts +1 -0
  310. package/src/templates/next-pagebuilder/.vscode/extensions.json +16 -0
  311. package/src/templates/next-pagebuilder/.vscode/settings.json +105 -0
  312. package/src/templates/next-pagebuilder/.zed/settings.json +47 -0
  313. package/src/templates/next-pagebuilder/_gitignore +1 -3
  314. package/src/templates/next-pagebuilder/app/(content)/[[...slug]]/page.tsx +17 -8
  315. package/src/templates/next-pagebuilder/app/(content)/layout.tsx +18 -7
  316. package/src/templates/next-pagebuilder/app/actions/refresh.ts +5 -0
  317. package/src/templates/next-pagebuilder/app/robots.ts +3 -4
  318. package/src/templates/next-pagebuilder/biome.json +17 -0
  319. package/src/templates/next-pagebuilder/components/layout/footer/index.tsx +17 -22
  320. package/src/templates/next-pagebuilder/components/layout/header/index.tsx +3 -5
  321. package/src/templates/next-pagebuilder/components/layout/json-ld/index.tsx +11 -10
  322. package/src/templates/next-pagebuilder/components/layout/wrapper/index.tsx +14 -4
  323. package/src/templates/next-pagebuilder/components/page-builder/components/article-content/index.tsx +4 -9
  324. package/src/templates/next-pagebuilder/components/page-builder/components/article-content/related-post-item.tsx +4 -4
  325. package/src/templates/next-pagebuilder/components/page-builder/components/{post-collection → content-collection}/content-card.tsx +2 -2
  326. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/content-filters.tsx +93 -0
  327. package/src/templates/next-pagebuilder/components/page-builder/components/{post-collection → content-collection}/content-grid.tsx +7 -9
  328. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/content-pagination-nav.tsx +71 -0
  329. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/index.tsx +219 -0
  330. package/src/templates/next-pagebuilder/components/page-builder/components/{post-collection → content-collection}/types.ts +7 -4
  331. package/src/templates/next-pagebuilder/components/page-builder/renderer.tsx +17 -5
  332. package/src/templates/next-pagebuilder/components/page-builder/types.ts +9 -7
  333. package/src/templates/next-pagebuilder/components/page-document/index.tsx +19 -4
  334. package/src/templates/next-pagebuilder/lefthook.yml +25 -0
  335. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.types.ts +208 -0
  336. package/src/templates/next-pagebuilder/lib/styles/global.css +0 -1
  337. package/src/templates/next-pagebuilder/next.config.ts +1 -0
  338. package/src/templates/next-pagebuilder/package.json +13 -26
  339. package/src/templates/next-pagebuilder/postcss.config.mjs +27 -1
  340. package/src/templates/next-pagebuilder/svg.d.ts +1 -0
  341. package/src/templates/next-webgl/.env.example +3 -3
  342. package/src/templates/next-webgl/.vscode/extensions.json +1 -5
  343. package/src/templates/next-webgl/.vscode/settings.json +1 -1
  344. package/src/templates/next-webgl/.zed/settings.json +47 -0
  345. package/src/templates/next-webgl/README.md +7 -6
  346. package/src/templates/next-webgl/_gitignore +1 -3
  347. package/src/templates/next-webgl/app/layout.tsx +21 -35
  348. package/src/templates/next-webgl/app/robots.ts +3 -4
  349. package/src/templates/next-webgl/app/sitemap.xml/route.ts +29 -29
  350. package/src/templates/next-webgl/biome.json +9 -2
  351. package/src/templates/next-webgl/components/ui/image/index.tsx +2 -1
  352. package/src/templates/next-webgl/components/webgl/components/scene/index.tsx +0 -2
  353. package/src/templates/next-webgl/lefthook.yml +25 -0
  354. package/src/templates/next-webgl/lib/README.md +8 -4
  355. package/src/templates/next-webgl/lib/hooks/use-media.ts +6 -3
  356. package/src/templates/next-webgl/lib/scripts/dev.ts +32 -0
  357. package/src/templates/next-webgl/lib/styles/README.md +13 -0
  358. package/src/templates/next-webgl/lib/styles/fonts.ts +20 -0
  359. package/src/templates/next-webgl/lib/styles/global.css +16 -196
  360. package/src/templates/next-webgl/lib/styles/index.css +3 -0
  361. package/src/templates/next-webgl/lib/styles/tokens.css +182 -0
  362. package/src/templates/next-webgl/lib/utils/README.md +40 -0
  363. package/src/templates/next-webgl/lib/utils/easings.ts +240 -0
  364. package/src/templates/next-webgl/lib/utils/fetch.ts +84 -0
  365. package/src/templates/next-webgl/lib/utils/global-css.d.ts +1 -0
  366. package/src/templates/next-webgl/lib/utils/json-ld.tsx +70 -68
  367. package/src/templates/next-webgl/lib/utils/math.ts +236 -0
  368. package/src/templates/next-webgl/lib/utils/metadata.ts +26 -27
  369. package/src/templates/next-webgl/lib/utils/strings.ts +246 -0
  370. package/src/templates/next-webgl/lib/utils/types.d.ts +15 -0
  371. package/src/templates/next-webgl/lib/utils/url.ts +8 -5
  372. package/src/templates/next-webgl/lib/utils/viewport.ts +199 -0
  373. package/src/templates/next-webgl/package.json +13 -8
  374. package/src/templates/next-webgl/svg.d.ts +1 -0
  375. package/src/templates/next-webgl/tsconfig.tsbuildinfo +1 -1
  376. package/dist/configs/animations.d.ts.map +0 -1
  377. package/dist/configs/animations.js.map +0 -1
  378. package/dist/configs/skills.d.ts +0 -27
  379. package/dist/configs/skills.d.ts.map +0 -1
  380. package/dist/configs/skills.js +0 -18
  381. package/dist/configs/skills.js.map +0 -1
  382. package/dist/configs/skills.json +0 -26
  383. package/dist/helpers/add/hooks-config.d.ts +0 -22
  384. package/dist/helpers/add/hooks-config.d.ts.map +0 -1
  385. package/dist/helpers/add/hooks-config.js +0 -31
  386. package/dist/helpers/add/hooks-config.js.map +0 -1
  387. package/dist/helpers/add/index.d.ts.map +0 -1
  388. package/dist/helpers/add/index.js.map +0 -1
  389. package/dist/helpers/create/copy-template.d.ts +0 -11
  390. package/dist/helpers/create/copy-template.d.ts.map +0 -1
  391. package/dist/helpers/create/copy-template.js.map +0 -1
  392. package/dist/helpers/create/index.d.ts +0 -24
  393. package/dist/helpers/create/index.d.ts.map +0 -1
  394. package/dist/helpers/create/index.js +0 -99
  395. package/dist/helpers/create/index.js.map +0 -1
  396. package/dist/helpers/create/init-git.d.ts.map +0 -1
  397. package/dist/helpers/create/init-git.js.map +0 -1
  398. package/dist/helpers/create/install.d.ts.map +0 -1
  399. package/dist/helpers/create/install.js.map +0 -1
  400. package/dist/helpers/create/rename-files.d.ts.map +0 -1
  401. package/dist/helpers/create/rename-files.js.map +0 -1
  402. package/dist/helpers/create/setup-agent.d.ts.map +0 -1
  403. package/dist/helpers/create/setup-agent.js +0 -91
  404. package/dist/helpers/create/setup-agent.js.map +0 -1
  405. package/dist/helpers/create/setup-sanity.d.ts.map +0 -1
  406. package/dist/helpers/create/setup-sanity.js.map +0 -1
  407. package/dist/helpers/create/update-package.d.ts +0 -20
  408. package/dist/helpers/create/update-package.d.ts.map +0 -1
  409. package/dist/helpers/create/update-package.js +0 -97
  410. package/dist/helpers/create/update-package.js.map +0 -1
  411. package/dist/helpers/integrate/index.d.ts.map +0 -1
  412. package/dist/helpers/integrate/index.js.map +0 -1
  413. package/dist/helpers/integrate/merge-config.d.ts +0 -21
  414. package/dist/helpers/integrate/merge-config.d.ts.map +0 -1
  415. package/dist/helpers/integrate/merge-config.js +0 -42
  416. package/dist/helpers/integrate/merge-config.js.map +0 -1
  417. package/dist/helpers/integrate/merge-orchestrator.d.ts +0 -10
  418. package/dist/helpers/integrate/merge-orchestrator.d.ts.map +0 -1
  419. package/dist/helpers/integrate/merge-orchestrator.js.map +0 -1
  420. package/dist/helpers/integrate/sanity/config.d.ts.map +0 -1
  421. package/dist/helpers/integrate/sanity/config.js.map +0 -1
  422. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts.map +0 -1
  423. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js.map +0 -1
  424. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +0 -1
  425. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +0 -1
  426. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts +0 -11
  427. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts.map +0 -1
  428. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js +0 -133
  429. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js.map +0 -1
  430. package/dist/helpers/skills/index.d.ts.map +0 -1
  431. package/dist/helpers/skills/index.js.map +0 -1
  432. package/dist/utils/detect-project.d.ts.map +0 -1
  433. package/dist/utils/detect-project.js.map +0 -1
  434. package/dist/utils/format-results.d.ts.map +0 -1
  435. package/dist/utils/format-results.js.map +0 -1
  436. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/WEBHOOK-SETUP.md +0 -74
  437. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/sitemap.ts +0 -90
  438. package/src/template-hooks/config.js +0 -32
  439. package/src/templates/next-default/css.d.ts +0 -1
  440. package/src/templates/next-default/lib/utils/portable-text-to-markdown.ts +0 -83
  441. package/src/templates/next-default/tsconfig.tsbuildinfo +0 -1
  442. package/src/templates/next-experiments/css.d.ts +0 -1
  443. package/src/templates/next-experiments/lib/utils/portable-text-to-markdown.ts +0 -83
  444. package/src/templates/next-pagebuilder/app/api/[[...slug]]/route.ts +0 -100
  445. package/src/templates/next-pagebuilder/app/api/draft-mode/disable/route.ts +0 -7
  446. package/src/templates/next-pagebuilder/app/api/draft-mode/enable/route.ts +0 -20
  447. package/src/templates/next-pagebuilder/app/api/revalidate/route.ts +0 -121
  448. package/src/templates/next-pagebuilder/app/sitemap.md/route.ts +0 -124
  449. package/src/templates/next-pagebuilder/app/studio/[[...tool]]/page.tsx +0 -8
  450. package/src/templates/next-pagebuilder/components/page-builder/components/post-collection/index.tsx +0 -28
  451. package/src/templates/next-pagebuilder/components/sanity/draft-mode-toggle.tsx +0 -27
  452. package/src/templates/next-pagebuilder/components/sanity/rich-text.tsx +0 -87
  453. package/src/templates/next-pagebuilder/components/sanity/visual-editing.tsx +0 -27
  454. package/src/templates/next-pagebuilder/components/ui/sanity-image/index.tsx +0 -41
  455. package/src/templates/next-pagebuilder/lib/integrations/check-integration.ts +0 -5
  456. package/src/templates/next-pagebuilder/lib/integrations/sanity/client.ts +0 -27
  457. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -23
  458. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/page-builder-input.tsx +0 -36
  459. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/page-category-input.tsx +0 -50
  460. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/rich-text.tsx +0 -84
  461. package/src/templates/next-pagebuilder/lib/integrations/sanity/confirm-publish-action.ts +0 -40
  462. package/src/templates/next-pagebuilder/lib/integrations/sanity/env.ts +0 -34
  463. package/src/templates/next-pagebuilder/lib/integrations/sanity/fetchers/layout.ts +0 -35
  464. package/src/templates/next-pagebuilder/lib/integrations/sanity/icons.ts +0 -58
  465. package/src/templates/next-pagebuilder/lib/integrations/sanity/live/index.tsx +0 -61
  466. package/src/templates/next-pagebuilder/lib/integrations/sanity/markdown-proxy.config.ts +0 -50
  467. package/src/templates/next-pagebuilder/lib/integrations/sanity/page-builder-config.ts +0 -132
  468. package/src/templates/next-pagebuilder/lib/integrations/sanity/page-category.ts +0 -28
  469. package/src/templates/next-pagebuilder/lib/integrations/sanity/queries.ts +0 -281
  470. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.cli.ts +0 -29
  471. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.config.ts +0 -211
  472. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/index.ts +0 -4
  473. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/blog-content.ts +0 -89
  474. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/description.ts +0 -29
  475. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/hero.ts +0 -28
  476. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/singleton/content-collection.ts +0 -45
  477. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/content/author.ts +0 -70
  478. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/content/blog-category.ts +0 -55
  479. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/index.ts +0 -96
  480. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/company-data.ts +0 -62
  481. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/footer.ts +0 -79
  482. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/navbar.ts +0 -74
  483. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/link.ts +0 -125
  484. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/logo-field.ts +0 -9
  485. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/metadata.ts +0 -68
  486. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/nav-objects.ts +0 -192
  487. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page-builder.ts +0 -39
  488. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page-folder.ts +0 -124
  489. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page.ts +0 -232
  490. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/richText.ts +0 -63
  491. package/src/templates/next-pagebuilder/lib/integrations/sanity/singletons.ts +0 -44
  492. package/src/templates/next-pagebuilder/lib/integrations/sanity/structure.ts +0 -453
  493. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/image.ts +0 -8
  494. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/link.ts +0 -137
  495. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/page-builder-markdown.ts +0 -81
  496. package/src/templates/next-pagebuilder/lib/scripts/sanity-typegen.ts +0 -45
  497. package/src/templates/next-pagebuilder/lib/utils/json-ld.tsx +0 -213
  498. package/src/templates/next-pagebuilder/lib/utils/metadata.ts +0 -167
  499. package/src/templates/next-pagebuilder/lib/utils/sitemap.ts +0 -37
  500. package/src/templates/next-pagebuilder/proxy.ts +0 -81
  501. package/src/templates/next-webgl/css.d.ts +0 -1
  502. package/src/templates/next-webgl/lib/utils/portable-text-to-markdown.ts +0 -83
  503. package/dist/{helpers → infrastructure}/create/copy-template.js +0 -0
  504. package/dist/{helpers → infrastructure}/create/rename-files.d.ts +0 -0
  505. package/dist/{helpers → infrastructure}/create/rename-files.js +0 -0
  506. package/dist/{helpers → infrastructure}/create/setup-sanity.d.ts +0 -0
  507. package/dist/{helpers/integrate → modules/features/cms}/sanity/config.d.ts +0 -0
  508. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/draft-mode/disable/route.ts +0 -0
  509. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/draft-mode/enable/route.ts +0 -0
  510. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/studio/[[...tool]]/page.tsx +0 -0
  511. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/studio/layout.tsx +0 -0
  512. package/src/{helpers/integrate → modules/features/cms}/sanity/files/components/ui/sanity-image/index.tsx +0 -0
  513. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/README.md +0 -0
  514. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/check-integration.ts +0 -0
  515. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/MARKDOWN-PROXY.md +0 -0
  516. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/README.md +0 -0
  517. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/client.ts +0 -0
  518. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  519. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -0
  520. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/confirm-publish-action.ts +0 -0
  521. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/live/index.tsx +1 -1
  522. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/markdown-proxy.config.ts +0 -0
  523. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -0
  524. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.config.ts +1 -1
  525. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -0
  526. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schema.json +0 -0
  527. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -0
  528. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -0
  529. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -0
  530. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -0
  531. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -0
  532. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -0
  533. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/structure.ts +0 -0
  534. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/utils/image.ts +0 -0
  535. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/utils/link.ts +0 -0
  536. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/utils/portable-text-to-markdown.ts +0 -0
@@ -5,10 +5,20 @@ import { memo, useEffect } from "react";
5
5
  import { create } from "zustand";
6
6
  import { useShallow } from "zustand/react/shallow";
7
7
 
8
- import { Quality, useAppStore } from "@/stores/use-app-store";
9
-
10
8
  import { useBattery } from "./use-battery";
11
9
 
10
+ export const Quality = {
11
+ LOW: 1,
12
+ MEDIUM: 2,
13
+ HIGH: 3,
14
+ } as const;
15
+
16
+ export type Quality = 1 | 2 | 3;
17
+
18
+ function minQuality(left: Quality, right: Quality): Quality {
19
+ return Math.min(left, right) as Quality;
20
+ }
21
+
12
22
  export interface DeviceType {
13
23
  browserName: string;
14
24
  browserVersion: string;
@@ -64,12 +74,14 @@ interface UseDeviceStore {
64
74
  device: DeviceType | null;
65
75
  gpu: TierResult | null;
66
76
  battery: Battery | null;
77
+ quality: Quality;
67
78
  }
68
79
 
69
80
  export const useDevice = create<UseDeviceStore>(() => ({
70
81
  device: null,
71
82
  gpu: null,
72
83
  battery: null,
84
+ quality: Quality.HIGH,
73
85
  }));
74
86
 
75
87
  function useSyncDeviceScore(): void {
@@ -78,55 +90,53 @@ function useSyncDeviceScore(): void {
78
90
  const batteryData = useDevice(useShallow((state) => state.battery));
79
91
 
80
92
  useEffect(() => {
81
- let score = Quality.HIGH;
93
+ let score: Quality = Quality.HIGH;
82
94
 
83
95
  if (deviceData) {
84
96
  if (deviceData.isMobile) {
85
- score = Math.min(score, Quality.LOW);
97
+ score = minQuality(score, Quality.LOW);
86
98
  } else if (deviceData.isTablet) {
87
- score = Math.min(score, Quality.MEDIUM);
99
+ score = minQuality(score, Quality.MEDIUM);
88
100
  } else if (deviceData.isDesktop) {
89
- score = Math.min(score, Quality.HIGH);
101
+ score = minQuality(score, Quality.HIGH);
90
102
  }
91
103
  }
92
104
 
93
105
  if (!batteryData) {
94
106
  // not battery
95
- score = Math.min(score, Quality.HIGH);
107
+ score = minQuality(score, Quality.HIGH);
96
108
  } else {
97
109
  // has battery
98
110
  if (batteryData.charging) {
99
111
  if (batteryData.level > 0.3) {
100
112
  // charging and high
101
- score = Math.min(score, Quality.HIGH);
113
+ score = minQuality(score, Quality.HIGH);
102
114
  } else {
103
115
  // charging but low
104
- score = Math.min(score, Quality.LOW);
116
+ score = minQuality(score, Quality.LOW);
105
117
  }
106
118
  } else {
107
119
  if (batteryData.level > 0.5) {
108
120
  // not charging but high
109
- score = Math.min(score, Quality.HIGH);
121
+ score = minQuality(score, Quality.HIGH);
110
122
  } else {
111
123
  // not charging and low
112
- score = Math.min(score, Quality.LOW);
124
+ score = minQuality(score, Quality.LOW);
113
125
  }
114
126
  }
115
127
  }
116
128
 
117
129
  if (gpuData) {
118
130
  if (gpuData.tier === 3) {
119
- score = Math.min(score, Quality.HIGH);
131
+ score = minQuality(score, Quality.HIGH);
120
132
  } else if (gpuData.tier === 2) {
121
- score = Math.min(score, Quality.MEDIUM);
133
+ score = minQuality(score, Quality.MEDIUM);
122
134
  } else if (gpuData.tier === 1) {
123
- score = Math.min(score, Quality.LOW);
135
+ score = minQuality(score, Quality.LOW);
124
136
  }
125
137
  }
126
138
 
127
- useAppStore.setState({
128
- qualityConfig: score,
129
- });
139
+ useDevice.setState({ quality: score });
130
140
  }, [deviceData, gpuData, batteryData]);
131
141
  }
132
142
 
@@ -13,9 +13,9 @@
13
13
  # CORE (Recommended)
14
14
  # ============================================
15
15
 
16
- # Base URL (sitemaps, OG tags, canonical URLs)
17
- # On Vercel: auto-detected if unset. Set explicitly for custom domains.
18
- # Local: http://localhost:3000
16
+ # Base URL for your site (used for SEO, canonical URLs, etc.)
17
+ # Development: http://localhost:3000
18
+ # Production: https://your-domain.com
19
19
  NEXT_PUBLIC_BASE_URL="http://localhost:3000"
20
20
 
21
21
  # Draft mode secret for preview functionality
@@ -7,14 +7,10 @@
7
7
  "bradlc.vscode-tailwindcss",
8
8
  "csstools.postcss",
9
9
 
10
- // GraphQL (Shopify, etc.)
11
- "graphql.vscode-graphql-syntax",
12
-
13
10
  // Sanity CMS (GROQ syntax + validation)
14
11
  "sanity-io.vscode-sanity",
15
12
 
16
13
  // DX Enhancements
17
- "yoavbls.pretty-ts-errors",
18
- "waderyan.gitblame"
14
+ "yoavbls.pretty-ts-errors"
19
15
  ]
20
16
  }
@@ -82,7 +82,7 @@
82
82
  ["cn\\(([^)]*)\\)", "(?:'|\"|`)([^\"'`]*)(?:'|\"|`)"],
83
83
  ["cva\\(([^)]*)\\)", "[\"'`]([^\"'`]*).*?[\"'`]"]
84
84
  ],
85
- "tailwindCSS.experimental.configFile": "./lib/styles/global.css",
85
+ "tailwindCSS.experimental.configFile": "./lib/styles/css/tailwind.css",
86
86
  "tailwindCSS.includeLanguages": {
87
87
  "typescriptreact": "html"
88
88
  },
@@ -0,0 +1,47 @@
1
+ {
2
+ "format_on_save": "on",
3
+ "lsp": {
4
+ "vscode-css-language-server": {
5
+ "settings": {
6
+ "css": {
7
+ "lint": {
8
+ "unknownAtRules": "ignore"
9
+ }
10
+ }
11
+ }
12
+ }
13
+ },
14
+ "languages": {
15
+ "JavaScript": {
16
+ "language_servers": ["biome", "..."],
17
+ "formatter": { "language_server": { "name": "biome" } },
18
+ "code_actions_on_format": {
19
+ "source.fixAll.biome": true,
20
+ "source.organizeImports.biome": true
21
+ }
22
+ },
23
+ "TypeScript": {
24
+ "formatter": { "language_server": { "name": "biome" } },
25
+ "code_actions_on_format": {
26
+ "source.fixAll.biome": true,
27
+ "source.organizeImports.biome": true
28
+ }
29
+ },
30
+ "TSX": {
31
+ "formatter": { "language_server": { "name": "biome" } },
32
+ "code_actions_on_format": {
33
+ "source.fixAll.biome": true,
34
+ "source.organizeImports.biome": true
35
+ }
36
+ },
37
+ "CSS": {
38
+ "formatter": { "language_server": { "name": "biome" } }
39
+ },
40
+ "JSON": {
41
+ "formatter": { "language_server": { "name": "biome" } }
42
+ },
43
+ "JSONC": {
44
+ "formatter": { "language_server": { "name": "biome" } }
45
+ }
46
+ }
47
+ }
@@ -34,16 +34,17 @@ lib/
34
34
  scripts/
35
35
  store/
36
36
  styles/
37
+ index.css
38
+ tokens.css
37
39
  global.css
40
+ fonts.ts
38
41
  cn.ts
39
42
  utils/
40
- metadata.ts
41
- portable-text-to-markdown.ts
42
- json-ld.ts
43
43
  ```
44
44
 
45
45
  ## Styling
46
46
 
47
- - Import `@/lib/styles/global.css` once in `app/layout.tsx`.
48
- - `lib/styles/global.css` includes Tailwind utilities, theme tokens, and app-wide global styles.
49
- - `lib/styles/cn.ts` is the shared class merge helper.
47
+ - Import `@/lib/styles/index.css` once in `app/layout.tsx`.
48
+ - Edit `lib/styles/tokens.css` for theme variables, breakpoints, and custom Tailwind utilities.
49
+ - Edit `lib/styles/global.css` for reset rules and app-wide global styles.
50
+ - `lib/styles/fonts.ts` handles font variables.
@@ -29,7 +29,6 @@
29
29
  # misc
30
30
  .DS_Store
31
31
  *.pem
32
- .cursor/scratchpad.md
33
32
 
34
33
  # debug
35
34
  npm-debug.log*
@@ -57,8 +56,7 @@ yarn-error.log*
57
56
  certificates
58
57
 
59
58
  next-env.d.ts
60
- # claude
61
- .claude
59
+
62
60
 
63
61
  # unlighthouse
64
62
  .unlighthouse/
@@ -1,40 +1,26 @@
1
- import type { Metadata, Viewport } from "next";
2
- import { Geist, Geist_Mono } from "next/font/google";
3
- import { type PropsWithChildren, Suspense } from "react";
4
- import { Link } from "@/components/ui/link";
5
- import AppData from "@/package.json";
6
- import "@/lib/styles/global.css";
7
- import { cn } from "@/lib/styles/cn";
8
- import { getBaseUrl } from "@/lib/utils/url";
1
+ import type { Metadata, Viewport } from "next"
2
+ import { Geist } from "next/font/google"
3
+ import { type PropsWithChildren, Suspense } from "react"
4
+ import { Link } from "@/components/ui/link"
5
+ import { fontsVariable } from "@/lib/styles/fonts"
6
+ import AppData from "@/package.json"
7
+ import "@/lib/styles/index.css"
8
+ import { cn } from "@/lib/styles/cn"
9
9
  import {
10
- JsonLd,
11
- generateWebSiteJsonLd,
12
10
  generateOrganizationJsonLd,
13
- } from "@/lib/utils/json-ld";
11
+ generateWebSiteJsonLd,
12
+ JsonLd,
13
+ } from "@/lib/utils/json-ld"
14
14
 
15
- const APP_NAME = AppData.name;
16
- const APP_DEFAULT_TITLE = "Basement Starter";
17
- const APP_TITLE_TEMPLATE = "%s - Basement Starter";
18
- const APP_DESCRIPTION = AppData.description;
19
- const APP_BASE_URL = getBaseUrl();
15
+ const APP_NAME = AppData.name
16
+ const APP_DEFAULT_TITLE = "Basement Starter"
17
+ const APP_TITLE_TEMPLATE = "%s - Basement Starter"
18
+ const APP_DESCRIPTION = AppData.description
19
+ const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL ?? "http://localhost:3000"
20
20
 
21
21
  const geist = Geist({
22
22
  subsets: ["latin"],
23
- });
24
-
25
- const mono = Geist_Mono({
26
- subsets: ["latin"],
27
- display: "swap",
28
- variable: "--geist-mono",
29
- fallback: [
30
- "ui-monospace",
31
- "SFMono-Regular",
32
- "Consolas",
33
- "Liberation Mono",
34
- "Menlo",
35
- "monospace",
36
- ],
37
- });
23
+ })
38
24
 
39
25
  export const metadata: Metadata = {
40
26
  alternates: {
@@ -87,19 +73,19 @@ export const metadata: Metadata = {
87
73
  template: APP_TITLE_TEMPLATE,
88
74
  },
89
75
  },
90
- };
76
+ }
91
77
 
92
78
  export const viewport: Viewport = {
93
79
  colorScheme: "normal",
94
80
  themeColor: "#000000",
95
- };
81
+ }
96
82
 
97
83
  export default async function Layout({ children }: PropsWithChildren) {
98
84
  return (
99
85
  <html
100
86
  lang="en"
101
87
  dir="ltr"
102
- className={cn(mono.variable, geist.className)}
88
+ className={cn(fontsVariable, geist.className)}
103
89
  // NOTE: This is due to the data-theme attribute being set which causes hydration errors
104
90
  suppressHydrationWarning
105
91
  >
@@ -130,5 +116,5 @@ export default async function Layout({ children }: PropsWithChildren) {
130
116
  {children}
131
117
  </body>
132
118
  </html>
133
- );
119
+ )
134
120
  }
@@ -1,7 +1,6 @@
1
- import type { MetadataRoute } from "next";
2
- import { getBaseUrl } from "@/lib/utils/url";
1
+ import type { MetadataRoute } from "next"
3
2
 
4
- const APP_BASE_URL = getBaseUrl();
3
+ const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL ?? "http://localhost:3000"
5
4
 
6
5
  export default function robots(): MetadataRoute.Robots {
7
6
  return {
@@ -11,5 +10,5 @@ export default function robots(): MetadataRoute.Robots {
11
10
  disallow: [],
12
11
  },
13
12
  sitemap: `${APP_BASE_URL}/sitemap.xml`,
14
- };
13
+ }
15
14
  }
@@ -1,51 +1,51 @@
1
- import { getBaseUrl } from "@/lib/utils/url";
1
+ import { getBaseUrl } from "@/lib/utils/url"
2
2
 
3
- const BASE_URL = getBaseUrl();
3
+ const BASE_URL = getBaseUrl()
4
4
 
5
- export const dynamic = "force-dynamic";
5
+ export const dynamic = "force-dynamic"
6
6
 
7
7
  interface SitemapEntry {
8
- loc: string;
9
- lastmod: string;
10
- changefreq: string;
11
- priority: number;
8
+ loc: string
9
+ lastmod: string
10
+ changefreq: string
11
+ priority: number
12
12
  }
13
13
 
14
14
  function toXml(entries: SitemapEntry[]): string {
15
- const urls = entries
16
- .map(
17
- (entry) => `
15
+ const urls = entries
16
+ .map(
17
+ (entry) => `
18
18
  <url>
19
19
  <loc>${entry.loc}</loc>
20
20
  <lastmod>${entry.lastmod}</lastmod>
21
21
  <changefreq>${entry.changefreq}</changefreq>
22
22
  <priority>${entry.priority}</priority>
23
- </url>`,
24
- )
25
- .join("");
23
+ </url>`
24
+ )
25
+ .join("")
26
26
 
27
- return `<?xml version="1.0" encoding="UTF-8"?>
27
+ return `<?xml version="1.0" encoding="UTF-8"?>
28
28
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">${urls}
29
- </urlset>`;
29
+ </urlset>`
30
30
  }
31
31
 
32
32
  function getStaticEntries(): SitemapEntry[] {
33
- return [
34
- {
35
- loc: BASE_URL,
36
- lastmod: new Date().toISOString(),
37
- changefreq: "daily",
38
- priority: 1,
39
- },
40
- ];
33
+ return [
34
+ {
35
+ loc: BASE_URL,
36
+ lastmod: new Date().toISOString(),
37
+ changefreq: "daily",
38
+ priority: 1,
39
+ },
40
+ ]
41
41
  }
42
42
 
43
43
  export async function GET() {
44
- const entries: SitemapEntry[] = getStaticEntries();
44
+ const entries: SitemapEntry[] = getStaticEntries()
45
45
 
46
- return new Response(toXml(entries), {
47
- headers: {
48
- "Content-Type": "application/xml",
49
- },
50
- });
46
+ return new Response(toXml(entries), {
47
+ headers: {
48
+ "Content-Type": "application/xml",
49
+ },
50
+ })
51
51
  }
@@ -95,6 +95,7 @@
95
95
  },
96
96
  "nursery": {
97
97
  "useSortedClasses": {
98
+ "fix": "safe",
98
99
  "level": "warn",
99
100
  "options": {
100
101
  "attributes": ["class", "className"],
@@ -140,6 +141,11 @@
140
141
  "useTemplate": "warn"
141
142
  },
142
143
  "suspicious": {
144
+ "noConsole": {
145
+ "fix": "none",
146
+ "level": "warn",
147
+ "options": { "allow": ["warn", "error", "info"] }
148
+ },
143
149
  "noDebugger": "warn",
144
150
  "noDoubleEquals": "error",
145
151
  "noEmptyBlockStatements": "warn",
@@ -214,11 +220,12 @@
214
220
  }
215
221
  },
216
222
  {
217
- "includes": ["lib/styles/global.css"],
223
+ "includes": ["lib/styles/tokens.css"],
218
224
  "linter": {
219
225
  "rules": {
220
226
  "suspicious": {
221
- "noDuplicateCustomProperties": "off"
227
+ "noDuplicateCustomProperties": "off",
228
+ "noUnknownAtRules": "off"
222
229
  }
223
230
  }
224
231
  }
@@ -167,7 +167,8 @@ export function Image({
167
167
  }: ImageProps) {
168
168
  // Generate responsive sizes if not provided
169
169
  const finalSizes =
170
- sizes || `(max-width: ${DESKTOP_BREAKPOINT}px) ${mobileSize}, ${desktopSize}`
170
+ sizes ||
171
+ `(max-width: ${DESKTOP_BREAKPOINT}px) ${mobileSize}, ${desktopSize}`
171
172
 
172
173
  // Early return after hooks
173
174
  if (!src) return null
@@ -1,14 +1,14 @@
1
- "use client";
1
+ "use client"
2
2
 
3
- import NextLink from "next/link";
4
- import { usePathname } from "next/navigation";
3
+ import NextLink from "next/link"
4
+ import { usePathname } from "next/navigation"
5
5
  import {
6
6
  type AnchorHTMLAttributes,
7
7
  type ComponentProps,
8
8
  type MouseEvent,
9
9
  useEffect,
10
10
  useState,
11
- } from "react";
11
+ } from "react"
12
12
 
13
13
  // Helper to extract props safe for button elements
14
14
  function getButtonProps(props: Record<string, unknown>) {
@@ -18,8 +18,8 @@ function getButtonProps(props: Record<string, unknown>) {
18
18
  rel,
19
19
  "data-external": _dataExternal,
20
20
  ...buttonProps
21
- } = props;
22
- return buttonProps;
21
+ } = props
22
+ return buttonProps
23
23
  }
24
24
 
25
25
  // Helper to extract props safe for div elements
@@ -31,8 +31,8 @@ function getDivProps(props: Record<string, unknown>) {
31
31
  onClick,
32
32
  "data-external": _dataExternal,
33
33
  ...divProps
34
- } = props;
35
- return divProps;
34
+ } = props
35
+ return divProps
36
36
  }
37
37
 
38
38
  type CustomLinkProps = Omit<
@@ -40,10 +40,10 @@ type CustomLinkProps = Omit<
40
40
  keyof ComponentProps<typeof NextLink> | "href"
41
41
  > &
42
42
  Omit<ComponentProps<typeof NextLink>, "href"> & {
43
- href?: string;
44
- onClick?: (e: MouseEvent<HTMLElement>) => void;
45
- scroll?: boolean;
46
- };
43
+ href?: string
44
+ onClick?: (e: MouseEvent<HTMLElement>) => void
45
+ scroll?: boolean
46
+ }
47
47
 
48
48
  export function Link({
49
49
  href,
@@ -52,47 +52,47 @@ export function Link({
52
52
  scroll = false, // Default to false to prevent scroll restoration warnings with fixed/sticky elements
53
53
  ...props
54
54
  }: CustomLinkProps) {
55
- const [shouldPrefetch, setShouldPrefetch] = useState(false);
56
- const [isExternal, setIsExternal] = useState(false);
57
- const [isActive, setIsActive] = useState(false);
55
+ const [shouldPrefetch, setShouldPrefetch] = useState(false)
56
+ const [isExternal, setIsExternal] = useState(false)
57
+ const [isActive, setIsActive] = useState(false)
58
58
 
59
59
  // Get pathname - deferred to avoid blocking static generation
60
60
  // usePathname is safe to call but we defer the active check to useEffect
61
- const pathname = usePathname();
61
+ const pathname = usePathname()
62
62
 
63
63
  useEffect(() => {
64
64
  // Check if this link is active (current page)
65
65
  if (href && pathname) {
66
- setIsActive(pathname === href);
66
+ setIsActive(pathname === href)
67
67
  }
68
- }, [href, pathname]);
68
+ }, [href, pathname])
69
69
 
70
70
  useEffect(() => {
71
71
  // Skip if no href
72
- if (!href) return;
72
+ if (!href) return
73
73
 
74
74
  // Check if external link
75
75
  try {
76
- const url = new URL(href, window.location.href);
77
- setIsExternal(url.host !== window.location.host);
76
+ const url = new URL(href, window.location.href)
77
+ setIsExternal(url.host !== window.location.host)
78
78
  } catch {
79
- setIsExternal(false);
79
+ setIsExternal(false)
80
80
  }
81
81
 
82
82
  // Only prefetch on good connections
83
83
  const connection = (
84
84
  navigator as Navigator & {
85
- connection?: { effectiveType: string; saveData: boolean };
85
+ connection?: { effectiveType: string; saveData: boolean }
86
86
  }
87
- ).connection;
87
+ ).connection
88
88
  if (connection) {
89
- const { effectiveType, saveData } = connection;
90
- setShouldPrefetch(effectiveType === "4g" && !saveData);
89
+ const { effectiveType, saveData } = connection
90
+ setShouldPrefetch(effectiveType === "4g" && !saveData)
91
91
  } else {
92
92
  // Default to prefetching if API not available
93
- setShouldPrefetch(true);
93
+ setShouldPrefetch(true)
94
94
  }
95
- }, [href]);
95
+ }, [href])
96
96
 
97
97
  // If no href is provided but there's an onClick, render a button
98
98
  if (!href && onClick) {
@@ -104,23 +104,23 @@ export function Link({
104
104
  >
105
105
  {children}
106
106
  </button>
107
- );
107
+ )
108
108
  }
109
109
 
110
110
  // If no href and no onClick, render a div
111
111
  if (!href) {
112
- return <div {...getDivProps(props)}>{children}</div>;
112
+ return <div {...getDivProps(props)}>{children}</div>
113
113
  }
114
114
 
115
115
  // Block dangerous URIs (javascript:, data:, vbscript:)
116
- const isDangerousHref = /^(javascript|data|vbscript):/i.test(href);
116
+ const isDangerousHref = /^(javascript|data|vbscript):/i.test(href)
117
117
  if (isDangerousHref) {
118
- return <span {...getDivProps(props)}>{children}</span>;
118
+ return <span {...getDivProps(props)}>{children}</span>
119
119
  }
120
120
 
121
121
  // For SSR, check if it's external based on the href pattern
122
122
  const isExternalSSR =
123
- href.startsWith("http://") || href.startsWith("https://");
123
+ href.startsWith("http://") || href.startsWith("https://")
124
124
 
125
125
  if (isExternalSSR || isExternal) {
126
126
  return (
@@ -134,7 +134,7 @@ export function Link({
134
134
  >
135
135
  {children}
136
136
  </a>
137
- );
137
+ )
138
138
  }
139
139
 
140
140
  return (
@@ -148,5 +148,5 @@ export function Link({
148
148
  >
149
149
  {children}
150
150
  </NextLink>
151
- );
151
+ )
152
152
  }
@@ -0,0 +1,25 @@
1
+ # Lefthook configuration for git hooks
2
+ # Cross-platform compatible (Windows, macOS, Linux)
3
+ # https://github.com/evilmartians/lefthook
4
+
5
+ pre-commit:
6
+ parallel: true
7
+ commands:
8
+ biome:
9
+ glob: '*.{js,mjs,ts,jsx,tsx,css,scss}'
10
+ run: bun biome check --max-diagnostics=200 --write --unsafe {staged_files}
11
+ stage_fixed: true
12
+ typecheck:
13
+ glob: '*.{ts,tsx}'
14
+ run: bunx tsgo --noEmit --incremental false
15
+ stage_fixed: false
16
+
17
+ post-merge:
18
+ commands:
19
+ install-deps:
20
+ run: bun i
21
+
22
+ post-checkout:
23
+ commands:
24
+ install-deps:
25
+ run: '[ "{3}" = "1" ] && bun i || true'