create-nextblock 0.2.78 → 0.8.1

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 (413) hide show
  1. package/bin/create-nextblock.js +793 -472
  2. package/package.json +1 -2
  3. package/scripts/sync-template.js +18 -1
  4. package/templates/nextblock-template/.browserslistrc +11 -0
  5. package/templates/nextblock-template/.swcrc +30 -30
  6. package/templates/nextblock-template/README.md +23 -114
  7. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -28
  8. package/templates/nextblock-template/app/(auth-pages)/sign-in/page.tsx +50 -25
  9. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +111 -56
  10. package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -0
  11. package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +118 -0
  12. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -0
  13. package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -0
  14. package/templates/nextblock-template/app/[slug]/PageClientContent.tsx +48 -28
  15. package/templates/nextblock-template/app/[slug]/page.tsx +63 -6
  16. package/templates/nextblock-template/app/[slug]/page.utils.ts +374 -157
  17. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -0
  18. package/templates/nextblock-template/app/actions/consent.ts +57 -0
  19. package/templates/nextblock-template/app/actions/formActions.ts +130 -11
  20. package/templates/nextblock-template/app/actions/languageActions.ts +31 -30
  21. package/templates/nextblock-template/app/actions/package-actions.ts +183 -0
  22. package/templates/nextblock-template/app/actions/postActions.ts +146 -48
  23. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +21 -0
  24. package/templates/nextblock-template/app/actions/visualEditingActions.test.ts +179 -0
  25. package/templates/nextblock-template/app/actions/visualEditingActions.ts +345 -0
  26. package/templates/nextblock-template/app/actions.ts +67 -12
  27. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -0
  28. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -0
  29. package/templates/nextblock-template/app/api/ai/global-agent/route.ts +965 -0
  30. package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -0
  31. package/templates/nextblock-template/app/api/checkout/route.ts +146 -0
  32. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -0
  33. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -0
  34. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3413 -17
  35. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +7830 -0
  36. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +35 -0
  37. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -0
  38. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -0
  39. package/templates/nextblock-template/app/api/draft/disable/route.ts +25 -0
  40. package/templates/nextblock-template/app/api/draft/route.ts +93 -0
  41. package/templates/nextblock-template/app/api/draft/start/route.ts +77 -0
  42. package/templates/nextblock-template/app/api/media/library/route.ts +65 -0
  43. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -0
  44. package/templates/nextblock-template/app/api/media/record/route.ts +160 -0
  45. package/templates/nextblock-template/app/api/search/route.ts +43 -0
  46. package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -0
  47. package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -0
  48. package/templates/nextblock-template/app/api/webhooks/freemius/route.ts +34 -0
  49. package/templates/nextblock-template/app/api/webhooks/stripe/route.ts +27 -0
  50. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +392 -128
  51. package/templates/nextblock-template/app/article/[slug]/page.tsx +179 -127
  52. package/templates/nextblock-template/app/article/[slug]/page.utils.ts +262 -77
  53. package/templates/nextblock-template/app/auth/callback/route.ts +31 -58
  54. package/templates/nextblock-template/app/cart/page.tsx +7 -0
  55. package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -0
  56. package/templates/nextblock-template/app/checkout/page.tsx +52 -0
  57. package/templates/nextblock-template/app/checkout/success/actions.ts +136 -0
  58. package/templates/nextblock-template/app/checkout/success/page.tsx +186 -0
  59. package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +163 -33
  60. package/templates/nextblock-template/app/cms/blocks/actions.ts +424 -235
  61. package/templates/nextblock-template/app/cms/blocks/components/BackgroundSelector.tsx +212 -151
  62. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +41 -20
  63. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +152 -19
  64. package/templates/nextblock-template/app/cms/blocks/components/BlockTypeCard.tsx +25 -17
  65. package/templates/nextblock-template/app/cms/blocks/components/BlockTypeSelector.tsx +200 -18
  66. package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +33 -16
  67. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -0
  68. package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +37 -18
  69. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -67
  70. package/templates/nextblock-template/app/cms/blocks/components/SectionConfigPanel.tsx +108 -31
  71. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -0
  72. package/templates/nextblock-template/app/cms/blocks/editors/FeaturedProductBlockEditor.tsx +31 -0
  73. package/templates/nextblock-template/app/cms/blocks/editors/FormBlockEditor.tsx +2 -2
  74. package/templates/nextblock-template/app/cms/blocks/editors/HeadingBlockEditor.tsx +1 -1
  75. package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
  76. package/templates/nextblock-template/app/cms/blocks/editors/PostsGridBlockEditor.tsx +14 -18
  77. package/templates/nextblock-template/app/cms/blocks/editors/ProductGridBlockEditor.tsx +41 -0
  78. package/templates/nextblock-template/app/cms/blocks/editors/SectionBlockEditor.tsx +318 -118
  79. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +98 -21
  80. package/templates/nextblock-template/app/cms/blocks/editors/VideoEmbedBlockEditor.tsx +1 -1
  81. package/templates/nextblock-template/app/cms/components/ContentLanguageSwitcher.tsx +27 -9
  82. package/templates/nextblock-template/app/cms/components/CopyContentFromLanguage.tsx +1 -1
  83. package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -0
  84. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -0
  85. package/templates/nextblock-template/app/cms/components/CortexGlobalAgentChat.tsx +1507 -0
  86. package/templates/nextblock-template/app/cms/components/DraftStatusActions.tsx +145 -0
  87. package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -0
  88. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +38 -24
  89. package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -0
  90. package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -0
  91. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -0
  92. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -0
  93. package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -0
  94. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -0
  95. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -0
  96. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -0
  97. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -0
  98. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -0
  99. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -98
  100. package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -0
  101. package/templates/nextblock-template/app/cms/dashboard/page.tsx +182 -154
  102. package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +391 -0
  103. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -0
  104. package/templates/nextblock-template/app/cms/layout.tsx +29 -10
  105. package/templates/nextblock-template/app/cms/media/UploadFolderContext.tsx +22 -22
  106. package/templates/nextblock-template/app/cms/media/actions.ts +45 -124
  107. package/templates/nextblock-template/app/cms/media/components/DeleteMediaButtonClient.tsx +1 -1
  108. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  109. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -64
  110. package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +227 -158
  111. package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -89
  112. package/templates/nextblock-template/app/cms/media/page.tsx +1 -1
  113. package/templates/nextblock-template/app/cms/navigation/components/NavigationItemForm.tsx +2 -2
  114. package/templates/nextblock-template/app/cms/orders/[id]/MarkPaidButton.tsx +44 -0
  115. package/templates/nextblock-template/app/cms/orders/[id]/page.tsx +16 -0
  116. package/templates/nextblock-template/app/cms/orders/actions.ts +201 -0
  117. package/templates/nextblock-template/app/cms/orders/page.tsx +20 -0
  118. package/templates/nextblock-template/app/cms/orders/types.ts +20 -0
  119. package/templates/nextblock-template/app/cms/pages/[id]/edit/EditPageClient.tsx +156 -121
  120. package/templates/nextblock-template/app/cms/pages/[id]/edit/page.tsx +79 -26
  121. package/templates/nextblock-template/app/cms/pages/actions.ts +54 -38
  122. package/templates/nextblock-template/app/cms/pages/components/DeletePageButtonClient.tsx +1 -1
  123. package/templates/nextblock-template/app/cms/pages/components/PageForm.tsx +267 -116
  124. package/templates/nextblock-template/app/cms/pages/page.tsx +25 -18
  125. package/templates/nextblock-template/app/cms/payments/page.tsx +16 -0
  126. package/templates/nextblock-template/app/cms/posts/[id]/edit/page.tsx +132 -90
  127. package/templates/nextblock-template/app/cms/posts/actions.ts +71 -72
  128. package/templates/nextblock-template/app/cms/posts/components/DeletePostButtonClient.tsx +1 -1
  129. package/templates/nextblock-template/app/cms/posts/components/PostForm.tsx +256 -245
  130. package/templates/nextblock-template/app/cms/posts/new/page.tsx +1 -1
  131. package/templates/nextblock-template/app/cms/posts/page.tsx +20 -13
  132. package/templates/nextblock-template/app/cms/products/ClientNotionEditor.tsx +16 -0
  133. package/templates/nextblock-template/app/cms/products/ProductFormClientShell.tsx +56 -0
  134. package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +292 -0
  135. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -0
  136. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -0
  137. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -0
  138. package/templates/nextblock-template/app/cms/products/new/page.tsx +143 -0
  139. package/templates/nextblock-template/app/cms/products/page.tsx +42 -0
  140. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -0
  141. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -0
  142. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -0
  143. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -0
  144. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -0
  145. package/templates/nextblock-template/app/cms/revisions/RevisionHistoryButton.tsx +2 -2
  146. package/templates/nextblock-template/app/cms/revisions/actions.ts +285 -285
  147. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -16
  148. package/templates/nextblock-template/app/cms/revisions/utils.ts +8 -3
  149. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -0
  150. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -0
  151. package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -0
  152. package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -0
  153. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -0
  154. package/templates/nextblock-template/app/cms/settings/copyright/actions.ts +1 -1
  155. package/templates/nextblock-template/app/cms/settings/copyright/components/CopyrightForm.tsx +2 -2
  156. package/templates/nextblock-template/app/cms/settings/copyright/page.tsx +1 -1
  157. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +496 -0
  158. package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -0
  159. package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +248 -0
  160. package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -0
  161. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -0
  162. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -0
  163. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -0
  164. package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +203 -44
  165. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -242
  166. package/templates/nextblock-template/app/cms/settings/global-css/actions.ts +65 -0
  167. package/templates/nextblock-template/app/cms/settings/global-css/components/GlobalCssForm.tsx +46 -0
  168. package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +24 -0
  169. package/templates/nextblock-template/app/cms/settings/languages/components/DeleteLanguageButton.tsx +1 -1
  170. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageForm.tsx +2 -2
  171. package/templates/nextblock-template/app/cms/settings/languages/page.tsx +1 -1
  172. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  173. package/templates/nextblock-template/app/cms/settings/logos/actions.ts +82 -6
  174. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -0
  175. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -18
  176. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -16
  177. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -0
  178. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  179. package/templates/nextblock-template/app/cms/settings/logos/page.tsx +120 -82
  180. package/templates/nextblock-template/app/cms/settings/logos/types.ts +8 -8
  181. package/templates/nextblock-template/app/cms/settings/packages/activation-form.tsx +84 -0
  182. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -0
  183. package/templates/nextblock-template/app/cms/settings/packages/page.tsx +49 -0
  184. package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +53 -0
  185. package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +196 -0
  186. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +26 -0
  187. package/templates/nextblock-template/app/cms/settings/security/actions.ts +251 -0
  188. package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +453 -0
  189. package/templates/nextblock-template/app/cms/settings/security/page.tsx +13 -0
  190. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -0
  191. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -0
  192. package/templates/nextblock-template/app/cms/users/[id]/edit/page.tsx +28 -23
  193. package/templates/nextblock-template/app/cms/users/actions.ts +105 -40
  194. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +1 -1
  195. package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +65 -152
  196. package/templates/nextblock-template/app/cms/users/page.tsx +15 -10
  197. package/templates/nextblock-template/app/globals.css +9 -0
  198. package/templates/nextblock-template/app/layout.tsx +372 -120
  199. package/templates/nextblock-template/app/lib/seo.test.ts +52 -0
  200. package/templates/nextblock-template/app/lib/seo.ts +279 -0
  201. package/templates/nextblock-template/app/lib/site-settings.ts +87 -0
  202. package/templates/nextblock-template/app/lib/sitemap-utils.ts +224 -39
  203. package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -0
  204. package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -0
  205. package/templates/nextblock-template/app/lib/ucp/server.ts +1914 -0
  206. package/templates/nextblock-template/app/page.tsx +165 -73
  207. package/templates/nextblock-template/app/product/[slug]/page.tsx +433 -0
  208. package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -0
  209. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -0
  210. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -0
  211. package/templates/nextblock-template/app/profile/account-data.ts +37 -0
  212. package/templates/nextblock-template/app/profile/account-links.ts +22 -0
  213. package/templates/nextblock-template/app/profile/account-types.ts +11 -0
  214. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -0
  215. package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -0
  216. package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -0
  217. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -0
  218. package/templates/nextblock-template/app/profile/page.tsx +51 -0
  219. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -0
  220. package/templates/nextblock-template/app/profile/password/actions.ts +59 -0
  221. package/templates/nextblock-template/app/profile/password/page.tsx +27 -0
  222. package/templates/nextblock-template/app/providers.tsx +55 -17
  223. package/templates/nextblock-template/app/robots.txt/route.ts +11 -1
  224. package/templates/nextblock-template/app/sitemap.ts +128 -0
  225. package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -0
  226. package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -0
  227. package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -0
  228. package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -0
  229. package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -0
  230. package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -0
  231. package/templates/nextblock-template/components/AppShell.tsx +154 -0
  232. package/templates/nextblock-template/components/BlockRenderer.tsx +210 -64
  233. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -0
  234. package/templates/nextblock-template/components/CartTranslator.tsx +210 -0
  235. package/templates/nextblock-template/components/CurrentContentSetter.tsx +25 -0
  236. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -0
  237. package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -0
  238. package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -0
  239. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -0
  240. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -0
  241. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -0
  242. package/templates/nextblock-template/components/GitHubLoginButton.tsx +36 -0
  243. package/templates/nextblock-template/components/GlobalSearch.tsx +557 -0
  244. package/templates/nextblock-template/components/Header.tsx +49 -41
  245. package/templates/nextblock-template/components/LanguageSwitcher.tsx +55 -32
  246. package/templates/nextblock-template/components/ResponsiveNav.tsx +138 -43
  247. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -8
  248. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -55
  249. package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +42 -37
  250. package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +6 -2
  251. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -0
  252. package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -0
  253. package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -84
  254. package/templates/nextblock-template/components/blocks/renderers/CartBlockRenderer.tsx +17 -0
  255. package/templates/nextblock-template/components/blocks/renderers/CheckoutBlockRenderer.tsx +19 -0
  256. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +262 -8
  257. package/templates/nextblock-template/components/blocks/renderers/FeaturedProductBlockRenderer.tsx +22 -0
  258. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +320 -37
  259. package/templates/nextblock-template/components/blocks/renderers/HeadingBlockRenderer.tsx +11 -8
  260. package/templates/nextblock-template/components/blocks/renderers/ImageBlockRenderer.tsx +12 -3
  261. package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +18 -13
  262. package/templates/nextblock-template/components/blocks/renderers/ProductDetailsBlockRenderer.tsx +90 -0
  263. package/templates/nextblock-template/components/blocks/renderers/ProductGridBlockRenderer.tsx +31 -0
  264. package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +424 -55
  265. package/templates/nextblock-template/components/blocks/renderers/SectionSlider.tsx +137 -0
  266. package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -0
  267. package/templates/nextblock-template/components/blocks/renderers/TextBlockRenderer.tsx +37 -22
  268. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +23 -15
  269. package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +1 -3
  270. package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +1 -3
  271. package/templates/nextblock-template/components/blocks/types.ts +7 -6
  272. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  273. package/templates/nextblock-template/components/form-message.tsx +32 -26
  274. package/templates/nextblock-template/components/header-auth.tsx +69 -17
  275. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +127 -0
  276. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +59 -0
  277. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -0
  278. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -0
  279. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -0
  280. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  281. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -0
  282. package/templates/nextblock-template/components/visual-editing/NextblockVisualEditing.tsx +1172 -0
  283. package/templates/nextblock-template/context/AuthContext.tsx +23 -90
  284. package/templates/nextblock-template/context/CurrentContentContext.tsx +10 -4
  285. package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
  286. package/templates/nextblock-template/context/language-rest-client.ts +31 -0
  287. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -0
  288. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -0
  289. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -0
  290. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +252 -0
  291. package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +238 -0
  292. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +125 -0
  293. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -0
  294. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -0
  295. package/templates/nextblock-template/docs/09-LIVE-DRAFT-MODE.md +104 -0
  296. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -0
  297. package/templates/nextblock-template/docs/README.md +34 -0
  298. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12507 -0
  299. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -14
  300. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -0
  301. package/templates/nextblock-template/index.d.ts +2 -0
  302. package/templates/nextblock-template/lib/ai-block-generation.ts +339 -0
  303. package/templates/nextblock-template/lib/ai-client.ts +247 -0
  304. package/templates/nextblock-template/lib/ai-config.ts +81 -0
  305. package/templates/nextblock-template/lib/ai-cortex-widget-builder.ts +125 -0
  306. package/templates/nextblock-template/lib/ai-global-agent-custom-block-tools.ts +363 -0
  307. package/templates/nextblock-template/lib/ai-global-agent-db-tools.test.ts +405 -0
  308. package/templates/nextblock-template/lib/ai-global-agent-db-tools.ts +1228 -0
  309. package/templates/nextblock-template/lib/ai-global-agent-ecommerce.ts +5 -0
  310. package/templates/nextblock-template/lib/ai-global-agent-tools-stats.test.ts +223 -0
  311. package/templates/nextblock-template/lib/ai-global-agent-tools.test.ts +2183 -0
  312. package/templates/nextblock-template/lib/ai-global-agent-tools.ts +4807 -0
  313. package/templates/nextblock-template/lib/ai-key-crypto.test.ts +70 -0
  314. package/templates/nextblock-template/lib/ai-key-crypto.ts +132 -0
  315. package/templates/nextblock-template/lib/ai-model-catalog.test.ts +49 -0
  316. package/templates/nextblock-template/lib/ai-model-catalog.ts +41 -0
  317. package/templates/nextblock-template/lib/ai-model-registry.test.ts +231 -0
  318. package/templates/nextblock-template/lib/ai-model-registry.ts +522 -0
  319. package/templates/nextblock-template/lib/auth/cookies.ts +47 -0
  320. package/templates/nextblock-template/lib/auth/crypto.ts +42 -0
  321. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -0
  322. package/templates/nextblock-template/lib/auth/twoFactor.ts +167 -0
  323. package/templates/nextblock-template/lib/auth-redirects.ts +46 -0
  324. package/templates/nextblock-template/lib/blocks/FeaturedProductBlock.tsx +94 -0
  325. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +137 -0
  326. package/templates/nextblock-template/lib/blocks/README.md +13 -670
  327. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +138 -56
  328. package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -0
  329. package/templates/nextblock-template/lib/blocks/ecommerce-block-schemas.ts +31 -0
  330. package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +77 -0
  331. package/templates/nextblock-template/lib/cms-transfer/csv.ts +399 -0
  332. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -0
  333. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -0
  334. package/templates/nextblock-template/lib/cortex-widget-registry.test.ts +199 -0
  335. package/templates/nextblock-template/lib/cortex-widget-registry.ts +88 -0
  336. package/templates/nextblock-template/lib/cortex-widget-schema.test.tsx +237 -0
  337. package/templates/nextblock-template/lib/cortex-widget-schema.ts +393 -0
  338. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -0
  339. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -0
  340. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -0
  341. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +68 -0
  342. package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -0
  343. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -0
  344. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -0
  345. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -0
  346. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -0
  347. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -0
  348. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -0
  349. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -0
  350. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -0
  351. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -0
  352. package/templates/nextblock-template/lib/full-backup/server.ts +743 -0
  353. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +45 -0
  354. package/templates/nextblock-template/lib/posts/readTime.ts +60 -0
  355. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -0
  356. package/templates/nextblock-template/lib/privacy/settings.ts +103 -0
  357. package/templates/nextblock-template/lib/privacy/types.ts +67 -0
  358. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -0
  359. package/templates/nextblock-template/lib/promotions/server.ts +741 -0
  360. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -0
  361. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -0
  362. package/templates/nextblock-template/lib/search/server.ts +585 -0
  363. package/templates/nextblock-template/lib/search/types.ts +27 -0
  364. package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -0
  365. package/templates/nextblock-template/lib/visual-editing/draft-content.ts +380 -0
  366. package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -0
  367. package/templates/nextblock-template/lib/visual-editing/draft-route.ts +82 -0
  368. package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -0
  369. package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -0
  370. package/templates/nextblock-template/lib/visual-editing/mutations.ts +190 -0
  371. package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -0
  372. package/templates/nextblock-template/lib/visual-editing/product-drafts.ts +511 -0
  373. package/templates/nextblock-template/lib/visual-editing/types.ts +122 -0
  374. package/templates/nextblock-template/lib/zod-config.ts +5 -0
  375. package/templates/nextblock-template/next.config.js +190 -66
  376. package/templates/nextblock-template/package.json +34 -30
  377. package/templates/nextblock-template/proxy.ts +435 -253
  378. package/templates/nextblock-template/public/images/NBcover.webp +0 -0
  379. package/templates/nextblock-template/public/images/cap.webp +0 -0
  380. package/templates/nextblock-template/public/images/commerce-plan.webp +0 -0
  381. package/templates/nextblock-template/public/images/commerce-square.webp +0 -0
  382. package/templates/nextblock-template/public/images/commerce-wide.webp +0 -0
  383. package/templates/nextblock-template/public/images/cortex-ai-square.webp +0 -0
  384. package/templates/nextblock-template/public/images/cortex-ai.webp +0 -0
  385. package/templates/nextblock-template/public/images/extensibility.webp +0 -0
  386. package/templates/nextblock-template/public/images/goals.webp +0 -0
  387. package/templates/nextblock-template/public/images/included.webp +0 -0
  388. package/templates/nextblock-template/public/images/nx-graph.webp +0 -0
  389. package/templates/nextblock-template/public/images/pants.webp +0 -0
  390. package/templates/nextblock-template/public/images/t-shirt.webp +0 -0
  391. package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -0
  392. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +100 -0
  393. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -0
  394. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -0
  395. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -0
  396. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -0
  397. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -0
  398. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -0
  399. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -0
  400. package/templates/nextblock-template/tailwind.config.js +1 -0
  401. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -0
  402. package/templates/nextblock-template/tools/deploy-supabase.js +69 -71
  403. package/templates/nextblock-template/tsconfig.json +52 -66
  404. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  405. package/templates/nextblock-template/types/jsdom.d.ts +6 -0
  406. package/templates/nextblock-template/app/force-styles.tsx +0 -31
  407. package/templates/nextblock-template/app/sitemap.xml/route.ts +0 -63
  408. package/templates/nextblock-template/components/blocks/renderers/HeroBlockRenderer.tsx +0 -273
  409. package/templates/nextblock-template/docs/How to Create a Custom Block.md +0 -149
  410. package/templates/nextblock-template/docs/cms-application-overview.md +0 -56
  411. package/templates/nextblock-template/docs/cms-architecture-overview.md +0 -73
  412. package/templates/nextblock-template/docs/files-structure.md +0 -426
  413. package/templates/nextblock-template/docs/tiptap-bundle-optimization-summary.md +0 -174
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-nextblock",
3
- "version": "0.2.78",
3
+ "version": "0.8.1",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
@@ -23,7 +23,6 @@
23
23
  "execa": "^9.3.0",
24
24
  "fs-extra": "^11.3.2",
25
25
  "inquirer": "^12.10.0",
26
- "open": "^10.1.0",
27
26
  "ora": "^8.0.1",
28
27
  "picocolors": "^1.1.1"
29
28
  }
@@ -11,6 +11,7 @@ const PROJECT_ROOT = resolve(__dirname, '..');
11
11
  const SOURCE_DIR = resolve(PROJECT_ROOT, '../nextblock');
12
12
  const TARGET_DIR = resolve(PROJECT_ROOT, 'templates/nextblock-template');
13
13
  const REPO_ROOT = resolve(PROJECT_ROOT, '..', '..');
14
+ const ROOT_DOCS_DIR = resolve(REPO_ROOT, 'docs');
14
15
  const ROOT_PACKAGE_JSON = resolve(REPO_ROOT, 'package.json');
15
16
  const UI_GLOBALS_SOURCE = resolve(
16
17
  PROJECT_ROOT,
@@ -87,6 +88,7 @@ async function ensureTemplateSync() {
87
88
  await ensureTemplateGitignore();
88
89
  await ensureGlobalStyles();
89
90
  await ensureClientTranslations();
91
+ await ensureDocsSync();
90
92
  await sanitizeBlockEditorImports();
91
93
  await sanitizeUiImports();
92
94
  await ensureUiProxies();
@@ -116,7 +118,7 @@ async function ensureEnvExample() {
116
118
  }
117
119
  }
118
120
 
119
- const placeholder = `# Environment variables for NextBlock CMS
121
+ const placeholder = `# Environment variables for NextBlock CMS
120
122
  NEXT_PUBLIC_SUPABASE_URL=
121
123
  NEXT_PUBLIC_SUPABASE_ANON_KEY=
122
124
  SUPABASE_SERVICE_ROLE_KEY=
@@ -127,6 +129,21 @@ NEXT_PUBLIC_URL=http://localhost:3000
127
129
  await fs.writeFile(destination, placeholder);
128
130
  }
129
131
 
132
+ async function ensureDocsSync() {
133
+ const destination = resolve(TARGET_DIR, 'docs');
134
+ console.log(
135
+ chalk.blue(
136
+ `Syncing docs from ${chalk.bold(relative(PROJECT_ROOT, ROOT_DOCS_DIR))}`,
137
+ ),
138
+ );
139
+
140
+ await fs.emptyDir(destination);
141
+ await fs.copy(ROOT_DOCS_DIR, destination, {
142
+ dereference: true,
143
+ filter: (src) => !src.includes('node_modules'),
144
+ });
145
+ }
146
+
130
147
  async function ensureTemplateGitignore() {
131
148
  const destination = resolve(TARGET_DIR, 'gitignore'); // Rename to gitignore
132
149
  const content = `.DS_Store
@@ -0,0 +1,11 @@
1
+ chrome >= 109
2
+ edge >= 109
3
+ firefox >= 115
4
+ safari >= 15.4
5
+ ios_saf >= 15.4
6
+ and_chr >= 109
7
+ and_ff >= 115
8
+ samsung >= 21
9
+ opera >= 95
10
+ not dead
11
+ not op_mini all
@@ -1,30 +1,30 @@
1
- {
2
- "jsc": {
3
- "target": "es2017",
4
- "parser": {
5
- "syntax": "typescript",
6
- "decorators": true,
7
- "dynamicImport": true
8
- },
9
- "transform": {
10
- "decoratorMetadata": true,
11
- "legacyDecorator": true
12
- },
13
- "keepClassNames": true,
14
- "externalHelpers": true,
15
- "loose": true
16
- },
17
- "module": {
18
- "type": "commonjs"
19
- },
20
- "sourceMaps": true,
21
- "exclude": [
22
- "jest.config.ts",
23
- ".*\\.spec.tsx?$",
24
- ".*\\.test.tsx?$",
25
- "./src/jest-setup.ts$",
26
- "./**/jest-setup.ts$",
27
- ".*.js$",
28
- ".*.d.ts$"
29
- ]
30
- }
1
+ {
2
+ "jsc": {
3
+ "target": "es2022",
4
+ "parser": {
5
+ "syntax": "typescript",
6
+ "decorators": true,
7
+ "dynamicImport": true
8
+ },
9
+ "transform": {
10
+ "decoratorMetadata": true,
11
+ "legacyDecorator": true
12
+ },
13
+ "keepClassNames": true,
14
+ "externalHelpers": true,
15
+ "loose": true
16
+ },
17
+ "module": {
18
+ "type": "commonjs"
19
+ },
20
+ "sourceMaps": true,
21
+ "exclude": [
22
+ "jest.config.ts",
23
+ ".*\\.spec.tsx?$",
24
+ ".*\\.test.tsx?$",
25
+ "./src/jest-setup.ts$",
26
+ "./**/jest-setup.ts$",
27
+ ".*.js$",
28
+ ".*.d.ts$"
29
+ ]
30
+ }
@@ -1,125 +1,34 @@
1
- # Next.js 16 & Supabase - Ultra-Fast CMS Template
1
+ # apps/nextblock
2
2
 
3
- This project is a starter template for building an ultra-fast, localized, block-based Content Management System (CMS) using Next.js 16 (App Router), Supabase for the backend (PostgreSQL, Auth, Storage via R2), Tailwind CSS for styling, and shadcn/ui for components.
3
+ `apps/nextblock` is the canonical NextBlock™ application. It contains:
4
4
 
5
- It features:
5
+ - the public site
6
+ - the authenticated CMS
7
+ - checkout and webhook routes
8
+ - cron routes
9
+ - the route tree used as the source for the scaffold template
6
10
 
7
- - Role-Based Access Control (Admin, Writer, User)
8
- - Internationalization (i18n) with client-side language switching on single URLs
9
- - Block-based content editor for Pages and Posts
10
- - Media uploads to Cloudflare R2 with a Media Library
11
- - Static Site Generation (SSG) with Incremental Static Regeneration (ISR) for public-facing content
12
- - On-demand revalidation via Supabase Database Webhooks
11
+ If you are trying to understand current runtime behavior, start here before you
12
+ look at generated template output.
13
13
 
14
- ## Features Implemented (Phases 1-6)
14
+ ## Related Docs
15
15
 
16
- - **Authentication & Authorization (Phase 1):** User roles (ADMIN, WRITER, USER), profiles table linked to `auth.users`, Row Level Security (RLS) on tables, Next.js middleware for route protection, and client-side auth context.
17
- - **Internationalization (Phase 2):** `languages` table in Supabase, client-side language switching using `LanguageContext` without URL path changes (e.g., `/about-us` serves content based on selected language), and auto-creation of localized placeholder content.
18
- - **CMS Schema & Core CRUD (Phase 3):** Database tables for `pages`, `posts`, `media`, `blocks`, `navigation_items`. CRUD UIs and server actions for managing Pages, Posts, Navigation Items, Users (role changes), and Languages.
19
- - **Block-Based Content Builder (Phase 4):** Dynamic block system for Pages (and Posts), UI for adding, editing (basic forms), deleting, and drag-and-drop reordering of content blocks.
20
- - **Rich Text & Media (Phase 5):** Tiptap rich text editor integrated into "Text" blocks, image insertion from Media Library into Tiptap, and media uploads to Cloudflare R2 with a Media Library UI (upload, view, delete, edit metadata).
21
- - **SSG & Revalidation (Phase 6):** Static generation of public pages/posts (default language), client-side content fetching for language changes, `generateStaticParams`, `generateMetadata`, and on-demand revalidation via Supabase Database Webhooks calling a Next.js API route.
16
+ - [Project Overview](../../docs/01-PROJECT-OVERVIEW.md)
17
+ - [Ecommerce Capabilities](../../docs/02-ECOMMERCE-CAPABILITIES.md)
18
+ - [CMS and Editor](../../docs/03-CMS-AND-EDITOR.md)
19
+ - [Database and Auth](../../docs/04-DATABASE-AND-AUTH.md)
20
+ - [Developer Guide](../../docs/05-DEVELOPER-GUIDE.md)
21
+ - [CLI and Scaffolding](../../docs/06-CLI-AND-SCAFFOLDING.md)
22
22
 
23
- ## 🚀 Getting Started
23
+ ## Common Workflows
24
24
 
25
- The fastest way to start a new project is with our interactive setup wizard.
25
+ From the repo root:
26
26
 
27
27
  ```bash
28
- npm create nextblock@latest
28
+ npx nx serve nextblock
29
+ npx nx build nextblock
30
+ npx nx lint nextblock --skip-nx-cache
29
31
  ```
30
32
 
31
- This command will:
32
-
33
- 1. Scaffold a new NextBlock project.
34
- 2. Guide you through Supabase and Cloudflare R2 configuration.
35
- 3. Set up your local environment variables automatically.
36
-
37
- ### Manual Setup
38
-
39
- If you are contributing to the core repo or prefer manual setup:
40
-
41
- 1. **Clone the repo:**
42
-
43
- ```bash
44
- git clone https://github.com/nextblock-cms/nextblock.git
45
- cd nextblock
46
- ```
47
-
48
- 2. **Install dependencies:**
49
-
50
- ```bash
51
- npm install
52
- ```
53
-
54
- 3. **Setup Environment:**
55
- Copy `.env.exemple` to `apps/nextblock/.env.local` and fill in your Supabase/R2 credentials.
56
-
57
- 4. **Run the Dev Server:**
58
-
59
- ```bash
60
- nx serve nextblock
61
- ```
62
-
63
- 5. **Initial Admin User Setup:**
64
- - Sign up for a new user account through the application's sign-up page.
65
- - After signing up and verifying the email, you'll need to manually update this user's role to `ADMIN` in the Supabase `profiles` table.
66
-
67
- 6. **Shadcn/UI Styling (Optional):**
68
- - This template comes with the default shadcn/ui style initialized. If you want to customize the theme or use a different base color, you can delete `components.json` and re-initialize shadcn/ui following their [official documentation](https://ui.shadcn.com/docs/installation/next).
69
-
70
- ## Project Structure Highlights
71
-
72
- - `app/`: Next.js App Router.
73
- - `app/(auth-pages)/`: Routes for sign-in, sign-up, etc.
74
- - `app/cms/`: CMS admin panel routes and layouts.
75
- - `app/cms/[entity]/`: CRUD pages for different content types (pages, posts, media, users, navigation, languages).
76
- - `app/cms/blocks/`: Components and actions related to the block editor.
77
- - `app/[slug]/`: Dynamic route for public "Pages".
78
- - `app/article/[slug]/`: Dynamic route for public "Articles".
79
- - `app/api/`: API routes (e.g., for revalidation, R2 pre-signed URLs).
80
- - `components/`: Shared UI components (shadcn/ui based).
81
- - `components/ui/`: shadcn/ui components.
82
- - `context/`: React Context providers (e.g., `AuthContext`, `LanguageContext`).
83
- - `lib/`: Utility functions and configurations.
84
- - `lib/cloudflare/`: Client for Cloudflare R2.
85
- - `utils/supabase/`: Supabase client setup, types, and middleware helpers.
86
- - `supabase/migrations/`: SQL database migrations.
87
-
88
- ## Documentation
89
-
90
- For a deeper understanding of the CMS's internal workings, please refer to the detailed documentation:
91
-
92
- - **[CMS Application Overview](./docs/cms-application-overview.md):** A high-level guide to the Next.js application structure, core modules, and key functionalities.
93
- - **[Block Editor Architecture](./docs/cms-architecture-overview.md):** A technical deep-dive into the architecture of the block-based content editor.
94
-
95
- ## Deployment
96
-
97
- This project is optimized for deployment on [Vercel](https://vercel.com/).
98
-
99
- 1. Push your code to a GitHub/GitLab/Bitbucket repository.
100
- 2. Import the project into Vercel.
101
- 3. **Configure Environment Variables in Vercel:**
102
- - Add all the environment variables from your `.env.local` file to your Vercel project settings (Project Settings -> Environment Variables). This includes Supabase keys, R2 keys, `NEXT_PUBLIC_SITE_URL` (set to your production domain), and `REVALIDATE_SECRET_TOKEN`.
103
- 4. Vercel will automatically build and deploy your Next.js application.
104
- 5. Ensure your Supabase Database Webhooks are pointing to your production Next.js API endpoint for revalidation.
105
-
106
- ## Database Backup
107
-
108
- This project includes a simple script to backup your Supabase PostgreSQL database.
109
-
110
- **Requirements:**
111
-
112
- - You must have the PostgreSQL command-line tools (`pg_dump`) installed and available in your system's PATH.
113
-
114
- **Usage:**
115
- To create a backup, run the following command from your project root:
116
-
117
- ```bash
118
- npm run db:backup
119
- ```
120
-
121
- This command will generate a timestamped SQL dump file and save it to the `backup/` directory.
122
-
123
- ## Feedback and Issues
124
-
125
- Please file feedback and issues on the GitHub repository for this project.
33
+ Use the root docs for architecture and workflow details instead of maintaining a
34
+ second app-specific guide here.
@@ -1,28 +1,27 @@
1
- 'use client';
2
-
3
- import { useEffect } from 'react';
4
- import { useSearchParams } from 'next/navigation';
5
-
6
- export default function PostSignIn() {
7
- const searchParams = useSearchParams();
8
- const redirectTo = searchParams.get('redirect_to');
9
-
10
- useEffect(() => {
11
- if (redirectTo) {
12
- window.location.href = redirectTo;
13
- } else {
14
- window.location.href = '/';
15
- }
16
- }, [redirectTo]);
17
-
18
- return (
19
- <div className="flex justify-center items-center h-full w-full py-20">
20
- <div className="relative">
21
- <div className="h-16 w-16 rounded-full border-t-4 border-b-4 border-primary animate-spin"></div>
22
- <div className="absolute inset-0 flex items-center justify-center">
23
- <div className="h-10 w-10 rounded-full bg-background"></div>
24
- </div>
25
- </div>
26
- </div>
27
- );
28
- }
1
+ import { createClient } from '@nextblock-cms/db/server';
2
+ import { redirect } from 'next/navigation';
3
+ import { resolvePostAuthRedirect } from '../../../lib/auth-redirects';
4
+
5
+ export default async function PostSignIn({
6
+ searchParams,
7
+ }: {
8
+ searchParams: Promise<{ redirect_to?: string }>;
9
+ }) {
10
+ const params = await searchParams;
11
+ const supabase = createClient();
12
+ const {
13
+ data: { user },
14
+ } = await supabase.auth.getUser();
15
+
16
+ if (!user) {
17
+ redirect('/sign-in');
18
+ }
19
+
20
+ const { data: profile } = await supabase
21
+ .from('profiles')
22
+ .select('role, full_name')
23
+ .eq('id', user.id)
24
+ .single();
25
+
26
+ redirect(resolvePostAuthRedirect(profile ?? null, params.redirect_to));
27
+ }
@@ -3,8 +3,7 @@
3
3
  import { signInAction } from "../../actions";
4
4
  import { FormMessage, Message } from "../../../components/form-message";
5
5
  import { SubmitButton } from "../../../components/submit-button";
6
- import { Input } from "@nextblock-cms/ui";
7
- import { Label } from "@nextblock-cms/ui";
6
+ import { Input, Label } from "@nextblock-cms/ui";
8
7
  import Link from "next/link";
9
8
  import { useTranslations } from "@nextblock-cms/utils";
10
9
  import { useSearchParams } from "next/navigation";
@@ -27,13 +26,16 @@ function getMessage(searchParams: URLSearchParams): Message | undefined {
27
26
  return undefined;
28
27
  }
29
28
 
29
+ import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
30
+
30
31
  export default function Login() {
31
32
  const { t } = useTranslations();
32
33
  const searchParams = useSearchParams();
33
34
  const formMessage = getMessage(searchParams);
35
+ const redirectParam = searchParams.get('redirect');
34
36
 
35
37
  return (
36
- <form className="flex-1 flex flex-col w-full max-w-160 mx-auto">
38
+ <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
37
39
  <SandboxCredentialsAlert />
38
40
  <h1 className="text-2xl font-medium">{t('sign_in')}</h1>
39
41
  <p className="text-sm text-foreground">
@@ -42,29 +44,52 @@ export default function Login() {
42
44
  {t('sign_up')}
43
45
  </Link>
44
46
  </p>
45
- <div className="flex flex-col gap-2 [&>input]:mb-3 mt-8">
46
- <Label htmlFor="email">{t('email')}</Label>
47
- <Input name="email" placeholder={t('you_at_example_com')} required />
48
- <div className="flex justify-between items-center">
49
- <Label htmlFor="password">{t('password')}</Label>
50
- <Link
51
- className="text-xs text-foreground underline"
52
- href="/forgot-password"
53
- >
54
- {t('forgot_password')}
55
- </Link>
47
+
48
+ <div className="flex flex-col gap-2 mt-8">
49
+ <GitHubLoginButton t={t} redirectTo={redirectParam || undefined} />
50
+
51
+ <div className="relative py-2">
52
+ <div className="absolute inset-0 flex items-center">
53
+ <span className="w-full border-t" />
54
+ </div>
55
+ <div className="relative flex justify-center text-xs uppercase">
56
+ <span className="bg-background px-2 text-muted-foreground">{t('or_continue_with') || "Or continue with"}</span>
57
+ </div>
56
58
  </div>
57
- <Input
58
- type="password"
59
- name="password"
60
- placeholder={t('your_password')}
61
- required
62
- />
63
- <SubmitButton pendingText={t('signing_in_pending')} formAction={signInAction}>
64
- {t('sign_in')}
65
- </SubmitButton>
66
- <FormMessage message={formMessage} />
59
+
60
+ <form className="flex flex-col gap-2 [&>input]:mb-3">
61
+ {redirectParam && <input type="hidden" name="redirect" value={redirectParam} />}
62
+ <Label htmlFor="email">{t('email')}</Label>
63
+ <Input name="email" placeholder={t('you_at_example_com')} required />
64
+ <div className="flex justify-between items-center">
65
+ <Label htmlFor="password">{t('password')}</Label>
66
+ {process.env.NEXT_PUBLIC_IS_SANDBOX !== 'true' && <Link
67
+ className="text-xs text-foreground underline"
68
+ href="/forgot-password"
69
+ >
70
+ {t('forgot_password')}
71
+ </Link>}
72
+ </div>
73
+ <Input
74
+ type="password"
75
+ name="password"
76
+ placeholder={t('your_password')}
77
+ required
78
+ />
79
+ <label className="mb-3 flex items-center gap-2 text-sm text-muted-foreground">
80
+ <input
81
+ type="checkbox"
82
+ name="remember_device"
83
+ className="h-4 w-4 rounded border-input accent-primary"
84
+ />
85
+ {t('remember_this_device') || 'Remember this device'}
86
+ </label>
87
+ <SubmitButton pendingText={t('signing_in_pending')} formAction={signInAction}>
88
+ {t('sign_in')}
89
+ </SubmitButton>
90
+ <FormMessage message={formMessage} />
91
+ </form>
67
92
  </div>
68
- </form>
93
+ </div>
69
94
  );
70
95
  }
@@ -1,15 +1,16 @@
1
- 'use client';
2
-
3
- import { signUpAction } from "../../actions";
4
- import { FormMessage, Message } from "../../../components/form-message";
5
- import { SubmitButton } from "../../../components/submit-button";
6
- import { Input } from "@nextblock-cms/ui";
7
- import { Label } from "@nextblock-cms/ui";
8
- import Link from "next/link";
9
- import { useTranslations } from "@nextblock-cms/utils";
10
- import { useSearchParams } from "next/navigation";
11
-
12
- import { SandboxCredentialsAlert } from "../../../components/SandboxCredentialsAlert";
1
+ 'use client';
2
+
3
+ import { signUpAction } from "../../actions";
4
+ import { FormMessage, Message } from "../../../components/form-message";
5
+ import { SubmitButton } from "../../../components/submit-button";
6
+ import { Button, Input, Label } from "@nextblock-cms/ui";
7
+ import Link from "next/link";
8
+ import { useTranslations } from "@nextblock-cms/utils";
9
+ import { useSearchParams } from "next/navigation";
10
+ import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
11
+ import { ArrowRight, CheckCircle2, Mail } from "lucide-react";
12
+
13
+ import { SandboxCredentialsAlert } from "../../../components/SandboxCredentialsAlert";
13
14
 
14
15
  function getMessage(searchParams: URLSearchParams): Message | undefined {
15
16
  if (searchParams.has('error')) {
@@ -27,47 +28,101 @@ function getMessage(searchParams: URLSearchParams): Message | undefined {
27
28
  return undefined;
28
29
  }
29
30
 
30
- export default function Signup() {
31
- const { t } = useTranslations();
32
- const searchParams = useSearchParams();
33
- const formMessage = getMessage(searchParams);
34
-
35
- if (formMessage && 'message' in formMessage) {
36
- return (
37
- <div className="w-full flex-1 flex items-center h-screen sm:max-w-md justify-center gap-2 p-4">
38
- <FormMessage message={formMessage} />
39
- </div>
40
- );
41
- }
42
-
43
- return (
44
- <>
45
- <form className="flex flex-col w-full max-w-160 mx-auto">
46
- <SandboxCredentialsAlert />
47
- <h1 className="text-2xl font-medium">{t('sign_up')}</h1>
48
- <p className="text-sm text text-foreground">
49
- {t('already_have_account')}{" "}
50
- <Link className="text-primary font-medium underline" href="/sign-in">
51
- {t('sign_in')}
52
- </Link>
53
- </p>
54
- <div className="flex flex-col gap-2 [&>input]:mb-3 mt-8">
55
- <Label htmlFor="email">{t('email')}</Label>
56
- <Input name="email" placeholder={t('you_at_example_com')} required />
57
- <Label htmlFor="password">{t('password')}</Label>
58
- <Input
59
- type="password"
60
- name="password"
61
- placeholder={t('your_password')}
62
- minLength={6}
63
- required
64
- />
65
- <SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
66
- {t('sign_up')}
67
- </SubmitButton>
68
- <FormMessage message={formMessage} />
69
- </div>
70
- </form>
71
- </>
72
- );
73
- }
31
+ export default function Signup() {
32
+ const { t } = useTranslations();
33
+ const searchParams = useSearchParams();
34
+ const formMessage = getMessage(searchParams);
35
+ const successKey = searchParams.get('success');
36
+
37
+ if (successKey) {
38
+ return (
39
+ <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
40
+ <div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
41
+ <CheckCircle2 className="h-5 w-5" />
42
+ </div>
43
+ <p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
44
+ {t('auth.signup_success_badge')}
45
+ </p>
46
+ <h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
47
+ <p className="mt-2 text-sm leading-6 text-muted-foreground">
48
+ {t(successKey)}
49
+ </p>
50
+
51
+ <div className="mt-8 rounded-lg border p-5">
52
+ <div className="flex items-start gap-3">
53
+ <div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
54
+ <Mail className="h-4 w-4" />
55
+ </div>
56
+ <div className="space-y-3 text-sm text-muted-foreground">
57
+ <p>{t('auth.signup_success_step_confirm')}</p>
58
+ <p>{t('auth.signup_success_step_profile')}</p>
59
+ <p>{t('auth.signup_success_step_spam')}</p>
60
+ </div>
61
+ </div>
62
+ </div>
63
+
64
+ <div className="mt-6 flex flex-col gap-3 sm:flex-row">
65
+ <Button asChild>
66
+ <Link href="/sign-in">
67
+ {t('auth.back_to_sign_in')}
68
+ <ArrowRight className="ml-2 h-4 w-4" />
69
+ </Link>
70
+ </Button>
71
+ <Button asChild variant="outline">
72
+ <Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
73
+ </Button>
74
+ </div>
75
+ </div>
76
+ );
77
+ }
78
+
79
+ return (
80
+ <div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
81
+ <form className="flex flex-col">
82
+ <SandboxCredentialsAlert />
83
+ <h1 className="text-2xl font-medium">{t('sign_up')}</h1>
84
+ <p className="mt-2 text-sm leading-6 text-muted-foreground">
85
+ {t('auth.signup_form_description')}
86
+ </p>
87
+ <p className="text-sm text-foreground">
88
+ {t('already_have_account')}{" "}
89
+ <Link className="text-foreground font-medium underline" href="/sign-in">
90
+ {t('sign_in')}
91
+ </Link>
92
+ </p>
93
+
94
+ <div className="mt-8 flex flex-col gap-2">
95
+ <GitHubLoginButton t={t} redirectTo="/profile" />
96
+
97
+ <div className="relative py-2">
98
+ <div className="absolute inset-0 flex items-center">
99
+ <span className="w-full border-t" />
100
+ </div>
101
+ <div className="relative flex justify-center text-xs uppercase">
102
+ <span className="bg-background px-2 text-muted-foreground">
103
+ {t('or_continue_with') || "Or continue with"}
104
+ </span>
105
+ </div>
106
+ </div>
107
+
108
+ <div className="flex flex-col gap-2 [&>input]:mb-3">
109
+ <Label htmlFor="email">{t('email')}</Label>
110
+ <Input name="email" placeholder={t('you_at_example_com')} required />
111
+ <Label htmlFor="password">{t('password')}</Label>
112
+ <Input
113
+ type="password"
114
+ name="password"
115
+ placeholder={t('your_password')}
116
+ minLength={6}
117
+ required
118
+ />
119
+ <SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
120
+ {t('sign_up')}
121
+ </SubmitButton>
122
+ <FormMessage message={formMessage} />
123
+ </div>
124
+ </div>
125
+ </form>
126
+ </div>
127
+ );
128
+ }