bsmnt 0.4.1 → 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 (531) 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 +1 -1
  315. package/src/templates/next-pagebuilder/app/(content)/layout.tsx +0 -1
  316. package/src/templates/next-pagebuilder/app/robots.ts +3 -4
  317. package/src/templates/next-pagebuilder/biome.json +17 -0
  318. package/src/templates/next-pagebuilder/components/layout/footer/index.tsx +4 -5
  319. package/src/templates/next-pagebuilder/components/layout/header/index.tsx +1 -1
  320. package/src/templates/next-pagebuilder/components/page-builder/components/article-content/index.tsx +4 -9
  321. package/src/templates/next-pagebuilder/components/page-builder/components/article-content/related-post-item.tsx +4 -4
  322. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/content-card.tsx +3 -1
  323. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/index.tsx +12 -5
  324. package/src/templates/next-pagebuilder/components/page-builder/components/content-collection/types.ts +3 -1
  325. package/src/templates/next-pagebuilder/components/page-builder/renderer.tsx +6 -2
  326. package/src/templates/next-pagebuilder/components/page-builder/types.ts +9 -7
  327. package/src/templates/next-pagebuilder/components/page-document/index.tsx +12 -2
  328. package/src/templates/next-pagebuilder/lefthook.yml +25 -0
  329. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.types.ts +208 -0
  330. package/src/templates/next-pagebuilder/lib/styles/global.css +0 -1
  331. package/src/templates/next-pagebuilder/next.config.ts +0 -2
  332. package/src/templates/next-pagebuilder/package.json +13 -25
  333. package/src/templates/next-pagebuilder/postcss.config.mjs +27 -1
  334. package/src/templates/next-pagebuilder/svg.d.ts +1 -0
  335. package/src/templates/next-webgl/.env.example +3 -3
  336. package/src/templates/next-webgl/.vscode/extensions.json +1 -5
  337. package/src/templates/next-webgl/.vscode/settings.json +1 -1
  338. package/src/templates/next-webgl/.zed/settings.json +47 -0
  339. package/src/templates/next-webgl/README.md +7 -6
  340. package/src/templates/next-webgl/_gitignore +1 -3
  341. package/src/templates/next-webgl/app/layout.tsx +21 -35
  342. package/src/templates/next-webgl/app/robots.ts +3 -4
  343. package/src/templates/next-webgl/app/sitemap.xml/route.ts +29 -29
  344. package/src/templates/next-webgl/biome.json +9 -2
  345. package/src/templates/next-webgl/components/ui/image/index.tsx +2 -1
  346. package/src/templates/next-webgl/components/webgl/components/scene/index.tsx +0 -2
  347. package/src/templates/next-webgl/lefthook.yml +25 -0
  348. package/src/templates/next-webgl/lib/README.md +8 -4
  349. package/src/templates/next-webgl/lib/hooks/use-media.ts +6 -3
  350. package/src/templates/next-webgl/lib/scripts/dev.ts +32 -0
  351. package/src/templates/next-webgl/lib/styles/README.md +13 -0
  352. package/src/templates/next-webgl/lib/styles/fonts.ts +20 -0
  353. package/src/templates/next-webgl/lib/styles/global.css +16 -196
  354. package/src/templates/next-webgl/lib/styles/index.css +3 -0
  355. package/src/templates/next-webgl/lib/styles/tokens.css +182 -0
  356. package/src/templates/next-webgl/lib/utils/README.md +40 -0
  357. package/src/templates/next-webgl/lib/utils/easings.ts +240 -0
  358. package/src/templates/next-webgl/lib/utils/fetch.ts +84 -0
  359. package/src/templates/next-webgl/lib/utils/global-css.d.ts +1 -0
  360. package/src/templates/next-webgl/lib/utils/json-ld.tsx +70 -68
  361. package/src/templates/next-webgl/lib/utils/math.ts +236 -0
  362. package/src/templates/next-webgl/lib/utils/metadata.ts +26 -27
  363. package/src/templates/next-webgl/lib/utils/strings.ts +246 -0
  364. package/src/templates/next-webgl/lib/utils/types.d.ts +15 -0
  365. package/src/templates/next-webgl/lib/utils/url.ts +8 -5
  366. package/src/templates/next-webgl/lib/utils/viewport.ts +199 -0
  367. package/src/templates/next-webgl/package.json +13 -8
  368. package/src/templates/next-webgl/svg.d.ts +1 -0
  369. package/src/templates/next-webgl/tsconfig.tsbuildinfo +1 -1
  370. package/dist/configs/animations.d.ts.map +0 -1
  371. package/dist/configs/animations.js.map +0 -1
  372. package/dist/configs/skills.d.ts +0 -27
  373. package/dist/configs/skills.d.ts.map +0 -1
  374. package/dist/configs/skills.js +0 -18
  375. package/dist/configs/skills.js.map +0 -1
  376. package/dist/configs/skills.json +0 -26
  377. package/dist/helpers/add/hooks-config.d.ts +0 -22
  378. package/dist/helpers/add/hooks-config.d.ts.map +0 -1
  379. package/dist/helpers/add/hooks-config.js +0 -31
  380. package/dist/helpers/add/hooks-config.js.map +0 -1
  381. package/dist/helpers/add/index.d.ts.map +0 -1
  382. package/dist/helpers/add/index.js.map +0 -1
  383. package/dist/helpers/create/copy-template.d.ts +0 -11
  384. package/dist/helpers/create/copy-template.d.ts.map +0 -1
  385. package/dist/helpers/create/copy-template.js.map +0 -1
  386. package/dist/helpers/create/index.d.ts +0 -24
  387. package/dist/helpers/create/index.d.ts.map +0 -1
  388. package/dist/helpers/create/index.js +0 -99
  389. package/dist/helpers/create/index.js.map +0 -1
  390. package/dist/helpers/create/init-git.d.ts.map +0 -1
  391. package/dist/helpers/create/init-git.js.map +0 -1
  392. package/dist/helpers/create/install.d.ts.map +0 -1
  393. package/dist/helpers/create/install.js.map +0 -1
  394. package/dist/helpers/create/rename-files.d.ts.map +0 -1
  395. package/dist/helpers/create/rename-files.js.map +0 -1
  396. package/dist/helpers/create/setup-agent.d.ts.map +0 -1
  397. package/dist/helpers/create/setup-agent.js +0 -91
  398. package/dist/helpers/create/setup-agent.js.map +0 -1
  399. package/dist/helpers/create/setup-sanity.d.ts.map +0 -1
  400. package/dist/helpers/create/setup-sanity.js.map +0 -1
  401. package/dist/helpers/create/update-package.d.ts +0 -20
  402. package/dist/helpers/create/update-package.d.ts.map +0 -1
  403. package/dist/helpers/create/update-package.js +0 -97
  404. package/dist/helpers/create/update-package.js.map +0 -1
  405. package/dist/helpers/integrate/index.d.ts.map +0 -1
  406. package/dist/helpers/integrate/index.js.map +0 -1
  407. package/dist/helpers/integrate/merge-config.d.ts +0 -21
  408. package/dist/helpers/integrate/merge-config.d.ts.map +0 -1
  409. package/dist/helpers/integrate/merge-config.js +0 -42
  410. package/dist/helpers/integrate/merge-config.js.map +0 -1
  411. package/dist/helpers/integrate/merge-orchestrator.d.ts +0 -10
  412. package/dist/helpers/integrate/merge-orchestrator.d.ts.map +0 -1
  413. package/dist/helpers/integrate/merge-orchestrator.js.map +0 -1
  414. package/dist/helpers/integrate/sanity/config.d.ts.map +0 -1
  415. package/dist/helpers/integrate/sanity/config.js.map +0 -1
  416. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.d.ts.map +0 -1
  417. package/dist/helpers/integrate/sanity/mergers/check-integration-merger.js.map +0 -1
  418. package/dist/helpers/integrate/sanity/mergers/layout-merger.d.ts.map +0 -1
  419. package/dist/helpers/integrate/sanity/mergers/layout-merger.js.map +0 -1
  420. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts +0 -11
  421. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.d.ts.map +0 -1
  422. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js +0 -133
  423. package/dist/helpers/integrate/sanity/mergers/sitemap-merger.js.map +0 -1
  424. package/dist/helpers/skills/index.d.ts.map +0 -1
  425. package/dist/helpers/skills/index.js.map +0 -1
  426. package/dist/utils/detect-project.d.ts.map +0 -1
  427. package/dist/utils/detect-project.js.map +0 -1
  428. package/dist/utils/format-results.d.ts.map +0 -1
  429. package/dist/utils/format-results.js.map +0 -1
  430. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/WEBHOOK-SETUP.md +0 -74
  431. package/src/helpers/integrate/sanity/files/lib/integrations/sanity/sitemap.ts +0 -90
  432. package/src/template-hooks/config.js +0 -32
  433. package/src/templates/next-default/css.d.ts +0 -1
  434. package/src/templates/next-default/lib/utils/portable-text-to-markdown.ts +0 -83
  435. package/src/templates/next-default/tsconfig.tsbuildinfo +0 -1
  436. package/src/templates/next-experiments/css.d.ts +0 -1
  437. package/src/templates/next-experiments/lib/utils/portable-text-to-markdown.ts +0 -83
  438. package/src/templates/next-pagebuilder/app/api/[[...slug]]/route.ts +0 -100
  439. package/src/templates/next-pagebuilder/app/api/draft-mode/disable/route.ts +0 -7
  440. package/src/templates/next-pagebuilder/app/api/draft-mode/enable/route.ts +0 -20
  441. package/src/templates/next-pagebuilder/app/api/revalidate/route.ts +0 -121
  442. package/src/templates/next-pagebuilder/app/sitemap.md/route.ts +0 -124
  443. package/src/templates/next-pagebuilder/app/studio/[[...tool]]/page.tsx +0 -8
  444. package/src/templates/next-pagebuilder/components/sanity/draft-mode-toggle.tsx +0 -27
  445. package/src/templates/next-pagebuilder/components/sanity/rich-text.tsx +0 -87
  446. package/src/templates/next-pagebuilder/components/sanity/visual-editing.tsx +0 -28
  447. package/src/templates/next-pagebuilder/components/ui/sanity-image/index.tsx +0 -41
  448. package/src/templates/next-pagebuilder/lib/integrations/check-integration.ts +0 -5
  449. package/src/templates/next-pagebuilder/lib/integrations/sanity/client.ts +0 -27
  450. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -23
  451. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/page-builder-input.tsx +0 -36
  452. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/page-category-input.tsx +0 -50
  453. package/src/templates/next-pagebuilder/lib/integrations/sanity/components/rich-text.tsx +0 -84
  454. package/src/templates/next-pagebuilder/lib/integrations/sanity/confirm-publish-action.ts +0 -40
  455. package/src/templates/next-pagebuilder/lib/integrations/sanity/constants.ts +0 -1
  456. package/src/templates/next-pagebuilder/lib/integrations/sanity/env.ts +0 -34
  457. package/src/templates/next-pagebuilder/lib/integrations/sanity/fetchers/layout.ts +0 -34
  458. package/src/templates/next-pagebuilder/lib/integrations/sanity/icons.ts +0 -58
  459. package/src/templates/next-pagebuilder/lib/integrations/sanity/live/index.tsx +0 -88
  460. package/src/templates/next-pagebuilder/lib/integrations/sanity/markdown-proxy.config.ts +0 -50
  461. package/src/templates/next-pagebuilder/lib/integrations/sanity/page-builder-config.ts +0 -132
  462. package/src/templates/next-pagebuilder/lib/integrations/sanity/page-category.ts +0 -28
  463. package/src/templates/next-pagebuilder/lib/integrations/sanity/presentation.ts +0 -118
  464. package/src/templates/next-pagebuilder/lib/integrations/sanity/queries.ts +0 -394
  465. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.cli.ts +0 -29
  466. package/src/templates/next-pagebuilder/lib/integrations/sanity/sanity.config.ts +0 -116
  467. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/index.ts +0 -4
  468. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/blog-content.ts +0 -89
  469. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/description.ts +0 -29
  470. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/reusable/hero.ts +0 -28
  471. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/components/singleton/content-collection.ts +0 -45
  472. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/content/author.ts +0 -70
  473. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/content/blog-category.ts +0 -55
  474. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/index.ts +0 -96
  475. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/company-data.ts +0 -62
  476. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/footer.ts +0 -79
  477. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/layout/navbar.ts +0 -74
  478. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/link.ts +0 -125
  479. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/logo-field.ts +0 -9
  480. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/metadata.ts +0 -68
  481. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/nav-objects.ts +0 -192
  482. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page-builder.ts +0 -39
  483. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page-folder.ts +0 -124
  484. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/page.ts +0 -232
  485. package/src/templates/next-pagebuilder/lib/integrations/sanity/schemas/shared/richText.ts +0 -63
  486. package/src/templates/next-pagebuilder/lib/integrations/sanity/singletons.ts +0 -44
  487. package/src/templates/next-pagebuilder/lib/integrations/sanity/structure.ts +0 -453
  488. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/image.ts +0 -8
  489. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/link.ts +0 -137
  490. package/src/templates/next-pagebuilder/lib/integrations/sanity/utils/page-builder-markdown.ts +0 -81
  491. package/src/templates/next-pagebuilder/lib/scripts/sanity-typegen.ts +0 -45
  492. package/src/templates/next-pagebuilder/lib/utils/json-ld.tsx +0 -213
  493. package/src/templates/next-pagebuilder/lib/utils/metadata.ts +0 -167
  494. package/src/templates/next-pagebuilder/lib/utils/sitemap.ts +0 -37
  495. package/src/templates/next-pagebuilder/proxy.ts +0 -81
  496. package/src/templates/next-webgl/css.d.ts +0 -1
  497. package/src/templates/next-webgl/lib/utils/portable-text-to-markdown.ts +0 -83
  498. package/dist/{helpers → infrastructure}/create/copy-template.js +0 -0
  499. package/dist/{helpers → infrastructure}/create/rename-files.d.ts +0 -0
  500. package/dist/{helpers → infrastructure}/create/rename-files.js +0 -0
  501. package/dist/{helpers → infrastructure}/create/setup-sanity.d.ts +0 -0
  502. package/dist/{helpers/integrate → modules/features/cms}/sanity/config.d.ts +0 -0
  503. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/draft-mode/disable/route.ts +0 -0
  504. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/api/draft-mode/enable/route.ts +0 -0
  505. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/studio/[[...tool]]/page.tsx +0 -0
  506. package/src/{helpers/integrate → modules/features/cms}/sanity/files/app/studio/layout.tsx +0 -0
  507. package/src/{helpers/integrate → modules/features/cms}/sanity/files/components/ui/sanity-image/index.tsx +0 -0
  508. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/README.md +0 -0
  509. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/check-integration.ts +0 -0
  510. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/MARKDOWN-PROXY.md +0 -0
  511. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/README.md +0 -0
  512. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/client.ts +0 -0
  513. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/components/disable-draft-mode.tsx +0 -0
  514. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/components/rich-text.tsx +0 -0
  515. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/confirm-publish-action.ts +0 -0
  516. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/live/index.tsx +1 -1
  517. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/markdown-proxy.config.ts +0 -0
  518. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.cli.ts +0 -0
  519. package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.config.ts +1 -1
  520. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/sanity.types.ts +0 -0
  521. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schema.json +0 -0
  522. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/article.ts +0 -0
  523. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/example.ts +0 -0
  524. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/link.ts +0 -0
  525. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/metadata.ts +0 -0
  526. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/navigation.ts +0 -0
  527. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/schemas/richText.ts +0 -0
  528. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/structure.ts +0 -0
  529. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/utils/image.ts +0 -0
  530. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/integrations/sanity/utils/link.ts +0 -0
  531. /package/src/{helpers/integrate → modules/features/cms}/sanity/files/lib/utils/portable-text-to-markdown.ts +0 -0
@@ -0,0 +1,40 @@
1
+ # Utils
2
+
3
+ Pure utility functions organized by concern.
4
+
5
+ Use explicit imports for clarity and better tree-shaking:
6
+
7
+ ```tsx
8
+ import { clamp, lerp, mapRange } from '@/utils/math'
9
+ import { slugify } from '@/utils/strings'
10
+ import { generatePageMetadata } from '@/utils/metadata'
11
+ import { tovw, torem, toem } from '@/utils/viewport'
12
+ ```
13
+
14
+ ## Modules
15
+
16
+ | Module | Functions |
17
+ |--------|-----------|
18
+ | `math` | `clamp`, `lerp`, `mapRange`, `modulo`, `normalize`, `distance` |
19
+ | `easings` | All easing functions (`easeOutCubic`, etc.) |
20
+ | `viewport` | `tovw`, `torem`, `toem` |
21
+ | `strings` | `slugify`, `mergeRefs`, `capitalizeFirstLetter` |
22
+ | `metadata` | `generatePageMetadata` |
23
+
24
+ ## Common Patterns
25
+
26
+ ```tsx
27
+ // Math
28
+ clamp(0, value, 100)
29
+ lerp(0, 100, 0.5) // → 50
30
+ mapRange(0, 1000, scrollY, 0, 1)
31
+
32
+ // Viewport units
33
+ tovw(100, 50, 'desktop') // → "max(50px, 6.94vw)"
34
+ tovw(16, undefined, 'mobile') // → "4.27vw"
35
+ torem(24) // → "1.5rem"
36
+ toem(16, 14) // → "1.14em"
37
+
38
+ // SEO
39
+ export const metadata = generatePageMetadata({ title: 'About' })
40
+ ```
@@ -0,0 +1,240 @@
1
+ /**
2
+ * Easing Functions
3
+ *
4
+ * A complete collection of easing curves for animations.
5
+ * All functions take a progress value (0-1) and return an eased value (0-1).
6
+ *
7
+ * @see https://easings.net for visual references
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import { easings, type EasingName } from '@/utils/easings'
12
+ *
13
+ * // Direct usage
14
+ * const eased = easings.easeOutCubic(0.5)
15
+ *
16
+ * // With a variable easing name
17
+ * const easingName: EasingName = 'easeInOutQuart'
18
+ * const value = easings[easingName](progress)
19
+ * ```
20
+ *
21
+ * ## Choosing an Easing
22
+ *
23
+ * | Category | Use Case |
24
+ * |----------|----------|
25
+ * | `easeOut*` | UI feedback, appearing elements (most common) |
26
+ * | `easeIn*` | Exiting elements, building tension |
27
+ * | `easeInOut*` | State transitions, loading indicators |
28
+ * | `*Cubic/Quart` | Natural, balanced motion |
29
+ * | `*Expo` | Dramatic, snappy motion |
30
+ * | `*Elastic/Bounce` | Playful, attention-grabbing |
31
+ */
32
+
33
+ const pow = Math.pow
34
+ const sqrt = Math.sqrt
35
+ const sin = Math.sin
36
+ const cos = Math.cos
37
+ const PI = Math.PI
38
+
39
+ // Easing constants
40
+ const c1 = 1.70158
41
+ const c2 = c1 * 1.525
42
+ const c3 = c1 + 1
43
+ const c4 = (2 * PI) / 3
44
+ const c5 = (2 * PI) / 4.5
45
+
46
+ /** Bounce out helper (used by bounce easings) */
47
+ const bounceOut = (x: number): number => {
48
+ const n1 = 7.5625
49
+ const d1 = 2.75
50
+
51
+ if (x < 1 / d1) {
52
+ return n1 * x * x
53
+ }
54
+ if (x < 2 / d1) {
55
+ return n1 * (x - 1.5 / d1) * x + 0.75
56
+ }
57
+ if (x < 2.5 / d1) {
58
+ return n1 * (x - 2.25 / d1) * x + 0.9375
59
+ }
60
+ return n1 * (x - 2.625 / d1) * x + 0.984375
61
+ }
62
+
63
+ /**
64
+ * Collection of easing functions.
65
+ * Each function takes progress (0-1) and returns eased value (0-1).
66
+ */
67
+ export const easings = {
68
+ // ─────────────────────────────────────────────────────────────────────────────
69
+ // Linear (no easing)
70
+ // ─────────────────────────────────────────────────────────────────────────────
71
+
72
+ /** No easing - constant speed */
73
+ linear: (x: number): number => x,
74
+
75
+ // ─────────────────────────────────────────────────────────────────────────────
76
+ // Quadratic (power of 2)
77
+ // ─────────────────────────────────────────────────────────────────────────────
78
+
79
+ /** Slow start */
80
+ easeInQuad: (x: number): number => x * x,
81
+
82
+ /** Slow end */
83
+ easeOutQuad: (x: number): number => 1 - (1 - x) * (1 - x),
84
+
85
+ /** Slow start and end */
86
+ easeInOutQuad: (x: number): number =>
87
+ x < 0.5 ? 2 * x * x : 1 - pow(-2 * x + 2, 2) / 2,
88
+
89
+ // ─────────────────────────────────────────────────────────────────────────────
90
+ // Cubic (power of 3) - Most commonly used
91
+ // ─────────────────────────────────────────────────────────────────────────────
92
+
93
+ /** Slow start, natural feel */
94
+ easeInCubic: (x: number): number => x * x * x,
95
+
96
+ /** Slow end, natural feel - great for UI interactions */
97
+ easeOutCubic: (x: number): number => 1 - pow(1 - x, 3),
98
+
99
+ /** Smooth start and end - great for transitions */
100
+ easeInOutCubic: (x: number): number =>
101
+ x < 0.5 ? 4 * x * x * x : 1 - pow(-2 * x + 2, 3) / 2,
102
+
103
+ // ─────────────────────────────────────────────────────────────────────────────
104
+ // Quartic (power of 4)
105
+ // ─────────────────────────────────────────────────────────────────────────────
106
+
107
+ /** Slower start than cubic */
108
+ easeInQuart: (x: number): number => x * x * x * x,
109
+
110
+ /** Slower end than cubic */
111
+ easeOutQuart: (x: number): number => 1 - pow(1 - x, 4),
112
+
113
+ /** More pronounced ease than cubic */
114
+ easeInOutQuart: (x: number): number =>
115
+ x < 0.5 ? 8 * x * x * x * x : 1 - pow(-2 * x + 2, 4) / 2,
116
+
117
+ // ─────────────────────────────────────────────────────────────────────────────
118
+ // Quintic (power of 5)
119
+ // ─────────────────────────────────────────────────────────────────────────────
120
+
121
+ /** Very slow start */
122
+ easeInQuint: (x: number): number => x * x * x * x * x,
123
+
124
+ /** Very slow end */
125
+ easeOutQuint: (x: number): number => 1 - pow(1 - x, 5),
126
+
127
+ /** Very pronounced ease */
128
+ easeInOutQuint: (x: number): number =>
129
+ x < 0.5 ? 16 * x * x * x * x * x : 1 - pow(-2 * x + 2, 5) / 2,
130
+
131
+ // ─────────────────────────────────────────────────────────────────────────────
132
+ // Sinusoidal - Gentle, wave-like
133
+ // ─────────────────────────────────────────────────────────────────────────────
134
+
135
+ /** Gentle slow start */
136
+ easeInSine: (x: number): number => 1 - cos((x * PI) / 2),
137
+
138
+ /** Gentle slow end */
139
+ easeOutSine: (x: number): number => sin((x * PI) / 2),
140
+
141
+ /** Gentle ease both ends */
142
+ easeInOutSine: (x: number): number => -(cos(PI * x) - 1) / 2,
143
+
144
+ // ─────────────────────────────────────────────────────────────────────────────
145
+ // Exponential - Dramatic, snappy
146
+ // ─────────────────────────────────────────────────────────────────────────────
147
+
148
+ /** Dramatic slow start - almost stationary then fast */
149
+ easeInExpo: (x: number): number => (x === 0 ? 0 : pow(2, 10 * x - 10)),
150
+
151
+ /** Dramatic slow end - fast then almost stops */
152
+ easeOutExpo: (x: number): number => (x === 1 ? 1 : 1 - pow(2, -10 * x)),
153
+
154
+ /** Dramatic both ends */
155
+ easeInOutExpo: (x: number): number => {
156
+ if (x === 0) return 0
157
+ if (x === 1) return 1
158
+ if (x < 0.5) return pow(2, 20 * x - 10) / 2
159
+ return (2 - pow(2, -20 * x + 10)) / 2
160
+ },
161
+
162
+ // ─────────────────────────────────────────────────────────────────────────────
163
+ // Circular - Based on circle quarter
164
+ // ─────────────────────────────────────────────────────────────────────────────
165
+
166
+ /** Circular slow start */
167
+ easeInCirc: (x: number): number => 1 - sqrt(1 - pow(x, 2)),
168
+
169
+ /** Circular slow end */
170
+ easeOutCirc: (x: number): number => sqrt(1 - pow(x - 1, 2)),
171
+
172
+ /** Circular both ends */
173
+ easeInOutCirc: (x: number): number =>
174
+ x < 0.5
175
+ ? (1 - sqrt(1 - pow(2 * x, 2))) / 2
176
+ : (sqrt(1 - pow(-2 * x + 2, 2)) + 1) / 2,
177
+
178
+ // ─────────────────────────────────────────────────────────────────────────────
179
+ // Back - Overshoots then returns
180
+ // ─────────────────────────────────────────────────────────────────────────────
181
+
182
+ /** Pulls back before accelerating */
183
+ easeInBack: (x: number): number => c3 * x * x * x - c1 * x * x,
184
+
185
+ /** Overshoots target then settles */
186
+ easeOutBack: (x: number): number =>
187
+ 1 + c3 * pow(x - 1, 3) + c1 * pow(x - 1, 2),
188
+
189
+ /** Pulls back, overshoots, settles */
190
+ easeInOutBack: (x: number): number =>
191
+ x < 0.5
192
+ ? (pow(2 * x, 2) * ((c2 + 1) * 2 * x - c2)) / 2
193
+ : (pow(2 * x - 2, 2) * ((c2 + 1) * (x * 2 - 2) + c2) + 2) / 2,
194
+
195
+ // ─────────────────────────────────────────────────────────────────────────────
196
+ // Elastic - Spring-like oscillation
197
+ // ─────────────────────────────────────────────────────────────────────────────
198
+
199
+ /** Wobbles at start */
200
+ easeInElastic: (x: number): number => {
201
+ if (x === 0) return 0
202
+ if (x === 1) return 1
203
+ return -pow(2, 10 * x - 10) * sin((x * 10 - 10.75) * c4)
204
+ },
205
+
206
+ /** Wobbles at end - great for attention */
207
+ easeOutElastic: (x: number): number => {
208
+ if (x === 0) return 0
209
+ if (x === 1) return 1
210
+ return pow(2, -10 * x) * sin((x * 10 - 0.75) * c4) + 1
211
+ },
212
+
213
+ /** Wobbles both ends */
214
+ easeInOutElastic: (x: number): number => {
215
+ if (x === 0) return 0
216
+ if (x === 1) return 1
217
+ if (x < 0.5) return -(pow(2, 20 * x - 10) * sin((20 * x - 11.125) * c5)) / 2
218
+ return (pow(2, -20 * x + 10) * sin((20 * x - 11.125) * c5)) / 2 + 1
219
+ },
220
+
221
+ // ─────────────────────────────────────────────────────────────────────────────
222
+ // Bounce - Ball bouncing effect
223
+ // ─────────────────────────────────────────────────────────────────────────────
224
+
225
+ /** Bounces at start */
226
+ easeInBounce: (x: number): number => 1 - bounceOut(1 - x),
227
+
228
+ /** Bounces at end - like a ball settling */
229
+ easeOutBounce: bounceOut,
230
+
231
+ /** Bounces both ends */
232
+ easeInOutBounce: (x: number): number =>
233
+ x < 0.5 ? (1 - bounceOut(1 - 2 * x)) / 2 : (1 + bounceOut(2 * x - 1)) / 2,
234
+ } as const
235
+
236
+ /** All available easing function names */
237
+ export type EasingName = keyof typeof easings
238
+
239
+ /** An easing function signature */
240
+ export type EasingFunction = (progress: number) => number
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Fetch Utilities
3
+ *
4
+ * Wrapper around fetch that adds timeout protection to prevent hanging requests.
5
+ * Use this for all external API calls to improve reliability.
6
+ */
7
+
8
+ export interface FetchWithTimeoutOptions extends RequestInit {
9
+ timeout?: number // Timeout in milliseconds (default: 10000ms)
10
+ }
11
+
12
+ /**
13
+ * Fetch with automatic timeout protection
14
+ *
15
+ * @param url - The URL to fetch
16
+ * @param options - Fetch options with optional timeout
17
+ * @returns Promise<Response>
18
+ * @throws AbortError if timeout is reached
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * try {
23
+ * const response = await fetchWithTimeout('https://api.example.com/data', {
24
+ * timeout: 5000, // 5 second timeout
25
+ * method: 'POST',
26
+ * body: JSON.stringify(data)
27
+ * })
28
+ * const result = await response.json()
29
+ * } catch (error) {
30
+ * if (error.name === 'AbortError') {
31
+ * console.error('Request timed out')
32
+ * }
33
+ * }
34
+ * ```
35
+ */
36
+ export async function fetchWithTimeout(
37
+ url: string,
38
+ options: FetchWithTimeoutOptions = {}
39
+ ): Promise<Response> {
40
+ const { timeout = 10000, signal: externalSignal, ...fetchOptions } = options
41
+
42
+ const controller = new AbortController()
43
+ const timeoutId = setTimeout(() => controller.abort(), timeout)
44
+
45
+ // If an external signal is provided, listen to it and abort our controller
46
+ if (externalSignal) {
47
+ externalSignal.addEventListener("abort", () => controller.abort())
48
+ }
49
+
50
+ try {
51
+ const response = await fetch(url, {
52
+ ...fetchOptions,
53
+ signal: controller.signal,
54
+ })
55
+ return response
56
+ } finally {
57
+ clearTimeout(timeoutId)
58
+ }
59
+ }
60
+
61
+ /**
62
+ * Fetch JSON with timeout protection
63
+ *
64
+ * Convenience wrapper that automatically parses JSON and handles errors
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * const data = await fetchJSON<{ name: string }>('https://api.example.com/user', {
69
+ * timeout: 5000
70
+ * })
71
+ * ```
72
+ */
73
+ export async function fetchJSON<T = unknown>(
74
+ url: string,
75
+ options: FetchWithTimeoutOptions = {}
76
+ ): Promise<T> {
77
+ const response = await fetchWithTimeout(url, options)
78
+
79
+ if (!response.ok) {
80
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`)
81
+ }
82
+
83
+ return response.json() as Promise<T>
84
+ }
@@ -0,0 +1 @@
1
+ declare module "@/lib/styles/index.css"
@@ -1,56 +1,58 @@
1
- type JsonLdValue = {
2
- "@context": "https://schema.org";
3
- "@type": string;
4
- [key: string]: unknown;
5
- };
6
-
7
- const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL;
1
+ import type {
2
+ Article,
3
+ BreadcrumbList,
4
+ Organization,
5
+ SearchAction,
6
+ Thing,
7
+ WebPage,
8
+ WebSite,
9
+ WithContext,
10
+ } from "schema-dts"
11
+
12
+ const APP_BASE_URL = process.env.NEXT_PUBLIC_BASE_URL
8
13
 
9
14
  function isAbsoluteUrl(value: string) {
10
- return /^https?:\/\//.test(value);
15
+ return /^https?:\/\//.test(value)
11
16
  }
12
17
 
13
18
  function resolveUrl(value?: string) {
14
- if (!value) return APP_BASE_URL;
15
- if (isAbsoluteUrl(value)) return value;
16
- if (!APP_BASE_URL) return undefined;
19
+ if (!value) return APP_BASE_URL
20
+ if (isAbsoluteUrl(value)) return value
21
+ if (!APP_BASE_URL) return undefined
17
22
 
18
- return new URL(value, APP_BASE_URL).toString();
23
+ return new URL(value, APP_BASE_URL).toString()
19
24
  }
20
25
 
21
26
  /* -------------------------------- Component ------------------------------- */
22
27
 
23
- export function JsonLd<T extends JsonLdValue>({
24
- data,
25
- }: {
26
- data: T;
27
- }) {
28
+ export function JsonLd<T extends Thing>({ data }: { data: WithContext<T> }) {
28
29
  return (
29
30
  <script
30
31
  type="application/ld+json"
32
+ // biome-ignore lint/security/noDangerouslySetInnerHtml: JSON-LD must be emitted as a raw script payload; `<` is escaped above for XSS protection.
31
33
  dangerouslySetInnerHTML={{
32
34
  __html: JSON.stringify(data).replace(/</g, "\\u003c"),
33
35
  }}
34
36
  />
35
- );
37
+ )
36
38
  }
37
39
 
38
40
  /* -------------------------------- Generators ------------------------------ */
39
41
 
40
42
  interface WebSiteJsonLdOptions {
41
- name: string;
42
- url?: string;
43
- description?: string;
43
+ name: string
44
+ url?: string
45
+ description?: string
44
46
  /** URL to site-wide search (e.g. "/search?q={search_term_string}") */
45
- searchUrl?: string;
47
+ searchUrl?: string
46
48
  }
47
49
 
48
50
  export function generateWebSiteJsonLd(
49
51
  options: WebSiteJsonLdOptions
50
- ): JsonLdValue {
51
- const { name, url, description, searchUrl } = options;
52
- const resolvedUrl = resolveUrl(url);
53
- const resolvedSearchUrl = resolveUrl(searchUrl);
52
+ ): WithContext<WebSite> {
53
+ const { name, url, description, searchUrl } = options
54
+ const resolvedUrl = resolveUrl(url)
55
+ const resolvedSearchUrl = resolveUrl(searchUrl)
54
56
 
55
57
  return {
56
58
  "@context": "https://schema.org",
@@ -63,25 +65,25 @@ export function generateWebSiteJsonLd(
63
65
  "@type": "SearchAction",
64
66
  target: resolvedSearchUrl,
65
67
  "query-input": "required name=search_term_string",
66
- },
68
+ } as SearchAction & { "query-input": string },
67
69
  }),
68
- };
70
+ }
69
71
  }
70
72
 
71
73
  interface OrganizationJsonLdOptions {
72
- name: string;
73
- url?: string;
74
- logo?: string;
75
- description?: string;
76
- sameAs?: string[];
74
+ name: string
75
+ url?: string
76
+ logo?: string
77
+ description?: string
78
+ sameAs?: string[]
77
79
  }
78
80
 
79
81
  export function generateOrganizationJsonLd(
80
82
  options: OrganizationJsonLdOptions
81
- ): JsonLdValue {
82
- const { name, url, logo, description, sameAs } = options;
83
- const resolvedUrl = resolveUrl(url);
84
- const resolvedLogo = resolveUrl(logo);
83
+ ): WithContext<Organization> {
84
+ const { name, url, logo, description, sameAs } = options
85
+ const resolvedUrl = resolveUrl(url)
86
+ const resolvedLogo = resolveUrl(logo)
85
87
 
86
88
  return {
87
89
  "@context": "https://schema.org",
@@ -91,25 +93,25 @@ export function generateOrganizationJsonLd(
91
93
  ...(resolvedLogo && { logo: resolvedLogo }),
92
94
  ...(description && { description }),
93
95
  ...(sameAs && { sameAs }),
94
- };
96
+ }
95
97
  }
96
98
 
97
99
  interface WebPageJsonLdOptions {
98
- title: string;
99
- url?: string;
100
- description?: string;
101
- image?: string;
102
- datePublished?: string;
103
- dateModified?: string;
100
+ title: string
101
+ url?: string
102
+ description?: string
103
+ image?: string
104
+ datePublished?: string
105
+ dateModified?: string
104
106
  }
105
107
 
106
108
  export function generateWebPageJsonLd(
107
109
  options: WebPageJsonLdOptions
108
- ): JsonLdValue {
110
+ ): WithContext<WebPage> {
109
111
  const { title, url, description, image, datePublished, dateModified } =
110
- options;
111
- const resolvedUrl = resolveUrl(url);
112
- const resolvedImage = resolveUrl(image);
112
+ options
113
+ const resolvedUrl = resolveUrl(url)
114
+ const resolvedImage = resolveUrl(image)
113
115
 
114
116
  return {
115
117
  "@context": "https://schema.org",
@@ -120,23 +122,23 @@ export function generateWebPageJsonLd(
120
122
  ...(resolvedImage && { image: resolvedImage }),
121
123
  ...(datePublished && { datePublished }),
122
124
  ...(dateModified && { dateModified }),
123
- };
125
+ }
124
126
  }
125
127
 
126
128
  interface ArticleJsonLdOptions {
127
- title: string;
128
- url?: string;
129
- description?: string;
130
- image?: string;
131
- datePublished?: string;
132
- dateModified?: string;
133
- authorName?: string;
134
- authorUrl?: string;
129
+ title: string
130
+ url?: string
131
+ description?: string
132
+ image?: string
133
+ datePublished?: string
134
+ dateModified?: string
135
+ authorName?: string
136
+ authorUrl?: string
135
137
  }
136
138
 
137
139
  export function generateArticleJsonLd(
138
140
  options: ArticleJsonLdOptions
139
- ): JsonLdValue {
141
+ ): WithContext<Article> {
140
142
  const {
141
143
  title,
142
144
  url,
@@ -146,9 +148,9 @@ export function generateArticleJsonLd(
146
148
  dateModified,
147
149
  authorName,
148
150
  authorUrl,
149
- } = options;
150
- const resolvedUrl = resolveUrl(url);
151
- const resolvedImage = resolveUrl(image);
151
+ } = options
152
+ const resolvedUrl = resolveUrl(url)
153
+ const resolvedImage = resolveUrl(image)
152
154
 
153
155
  return {
154
156
  "@context": "https://schema.org",
@@ -166,29 +168,29 @@ export function generateArticleJsonLd(
166
168
  ...(authorUrl && { url: authorUrl }),
167
169
  },
168
170
  }),
169
- };
171
+ }
170
172
  }
171
173
 
172
174
  interface BreadcrumbItem {
173
- name: string;
174
- url: string;
175
+ name: string
176
+ url: string
175
177
  }
176
178
 
177
179
  export function generateBreadcrumbJsonLd(
178
180
  items: BreadcrumbItem[]
179
- ): JsonLdValue {
181
+ ): WithContext<BreadcrumbList> {
180
182
  return {
181
183
  "@context": "https://schema.org",
182
184
  "@type": "BreadcrumbList",
183
185
  itemListElement: items.map((item, index) => {
184
- const resolvedItemUrl = resolveUrl(item.url);
186
+ const resolvedItemUrl = resolveUrl(item.url)
185
187
 
186
188
  return {
187
189
  "@type": "ListItem",
188
190
  position: index + 1,
189
191
  name: item.name,
190
192
  ...(resolvedItemUrl && { item: resolvedItemUrl }),
191
- };
193
+ }
192
194
  }),
193
- };
195
+ }
194
196
  }