create-nextblock 0.13.9 → 0.13.11

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 (260) hide show
  1. package/docker-template/.dockerignore +23 -23
  2. package/docker-template/.env.docker.example +69 -69
  3. package/docker-template/docker/db/init/99-jwt.sql +6 -6
  4. package/docker-template/docker/db/init/99-roles.sql +25 -25
  5. package/docker-template/docker/kong/kong.yml +112 -112
  6. package/docker-template/scripts/docker-setup.mjs +310 -310
  7. package/libs/db/tsconfig.lib.json +3 -3
  8. package/libs/editor/tsconfig.lib.json +3 -3
  9. package/libs/ui/tsconfig.lib.json +3 -3
  10. package/libs/utils/tsconfig.json +3 -3
  11. package/package.json +1 -1
  12. package/project.json +19 -19
  13. package/templates/nextblock-template/.browserslistrc +11 -11
  14. package/templates/nextblock-template/.dockerignore +23 -23
  15. package/templates/nextblock-template/README.md +34 -34
  16. package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
  17. package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
  18. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  19. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  20. package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
  21. package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
  22. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  23. package/templates/nextblock-template/app/actions/postActions.ts +146 -146
  24. package/templates/nextblock-template/app/actions/productGridActions.ts +40 -40
  25. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  26. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  27. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  28. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  29. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  30. package/templates/nextblock-template/app/api/cms/ecommerce/product-picker/route.ts +151 -151
  31. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  32. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  33. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
  34. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5749 -5609
  35. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  36. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  37. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  38. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  39. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  40. package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
  41. package/templates/nextblock-template/app/api/search/route.ts +43 -43
  42. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
  43. package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
  44. package/templates/nextblock-template/app/cart/page.tsx +7 -7
  45. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +10 -1
  46. package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +5 -1
  47. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  48. package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +55 -24
  49. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  50. package/templates/nextblock-template/app/cms/blocks/components/MultiEntityPicker.tsx +263 -251
  51. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  52. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  53. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  54. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  55. package/templates/nextblock-template/app/cms/components/EcommerceActiveContext.tsx +27 -27
  56. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  57. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  58. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  59. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  60. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  61. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  62. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  63. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  64. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  65. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  66. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  67. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  68. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  69. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  70. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  71. package/templates/nextblock-template/app/cms/interactions/EmailRecipientsInput.tsx +189 -189
  72. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  73. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  74. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  75. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  76. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  77. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  78. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  79. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  80. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  81. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  82. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  83. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  84. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  85. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  86. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  87. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  88. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  89. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  90. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  91. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  92. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  93. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  94. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  95. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  96. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  97. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  98. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  99. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageDetectionPanel.tsx +188 -188
  100. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  101. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  102. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  103. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  104. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  105. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  106. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  107. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  108. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  109. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  110. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  111. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  112. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  113. package/templates/nextblock-template/app/cms/users/components/CreateUserForm.tsx +217 -217
  114. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  115. package/templates/nextblock-template/app/cms/users/new/page.tsx +44 -44
  116. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  117. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  118. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  119. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  120. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  121. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  122. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  123. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  124. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  125. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  126. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  127. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  128. package/templates/nextblock-template/app/sitemap.ts +130 -130
  129. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  130. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  131. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  132. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  133. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  134. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  135. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  136. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  137. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  138. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  139. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  140. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  141. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  142. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  143. package/templates/nextblock-template/components/blocks/ProductGridClient.tsx +114 -114
  144. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  145. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +8 -1
  146. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  147. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +29 -23
  148. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  149. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  150. package/templates/nextblock-template/components/form-message.tsx +32 -32
  151. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +69 -0
  152. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -0
  153. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  154. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  155. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  156. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  157. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -464
  158. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  159. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  160. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  161. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  162. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  163. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  164. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  165. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  166. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  167. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  168. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  169. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  170. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  171. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  172. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  173. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  174. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  175. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  176. package/templates/nextblock-template/docs/README.md +39 -39
  177. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  178. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  179. package/templates/nextblock-template/index.d.ts +7 -7
  180. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  181. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  182. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  183. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  184. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  185. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +78 -78
  186. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  187. package/templates/nextblock-template/lib/blocks/blockRegistry.ts +21 -1
  188. package/templates/nextblock-template/lib/blocks/product-grid-data.ts +210 -210
  189. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  190. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  191. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  192. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  193. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  194. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  195. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  196. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  197. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  198. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  199. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  200. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  201. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  202. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  203. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  204. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  205. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  206. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  207. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  208. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  209. package/templates/nextblock-template/lib/i18n/country-languages.ts +247 -247
  210. package/templates/nextblock-template/lib/i18n/detection.test.ts +197 -197
  211. package/templates/nextblock-template/lib/i18n/detection.ts +192 -192
  212. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  213. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  214. package/templates/nextblock-template/lib/media/youtube.ts +81 -0
  215. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  216. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  217. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  218. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  219. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  220. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  221. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  222. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  223. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  224. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  225. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  226. package/templates/nextblock-template/lib/search/types.ts +27 -27
  227. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  228. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  229. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  230. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -82
  231. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  232. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  233. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  234. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  235. package/templates/nextblock-template/lib/site-url.ts +48 -48
  236. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  237. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  238. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  239. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  240. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  241. package/templates/nextblock-template/next-env.d.ts +1 -1
  242. package/templates/nextblock-template/package.json +1 -1
  243. package/templates/nextblock-template/postcss.config.js +6 -6
  244. package/templates/nextblock-template/scripts/backup.js +115 -115
  245. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  246. package/templates/nextblock-template/scripts/restore.js +385 -385
  247. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  248. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  249. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  250. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  251. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  252. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  253. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  254. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  255. package/templates/nextblock-template/tailwind.config.js +25 -25
  256. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  257. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  258. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  259. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  260. package/tsconfig.base.json +3 -3
@@ -1,23 +1,23 @@
1
- "use client";
2
-
3
- import { Button } from "@nextblock-cms/ui";
4
- import { type ComponentProps } from "react";
5
- import { useFormStatus } from "react-dom";
6
-
7
- type Props = ComponentProps<typeof Button> & {
8
- pendingText?: string;
9
- };
10
-
11
- export function SubmitButton({
12
- children,
13
- pendingText = "Submitting...",
14
- ...props
15
- }: Props) {
16
- const { pending } = useFormStatus();
17
-
18
- return (
19
- <Button type="submit" aria-disabled={pending} {...props}>
20
- {pending ? pendingText : children}
21
- </Button>
22
- );
23
- }
1
+ "use client";
2
+
3
+ import { Button } from "@nextblock-cms/ui";
4
+ import { type ComponentProps } from "react";
5
+ import { useFormStatus } from "react-dom";
6
+
7
+ type Props = ComponentProps<typeof Button> & {
8
+ pendingText?: string;
9
+ };
10
+
11
+ export function SubmitButton({
12
+ children,
13
+ pendingText = "Submitting...",
14
+ ...props
15
+ }: Props) {
16
+ const { pending } = useFormStatus();
17
+
18
+ return (
19
+ <Button type="submit" aria-disabled={pending} {...props}>
20
+ {pending ? pendingText : children}
21
+ </Button>
22
+ );
23
+ }
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
 
3
- import { Button } from "@nextblock-cms/ui";
4
- import {
5
- DropdownMenu,
6
- DropdownMenuContent,
7
- DropdownMenuRadioGroup,
8
- DropdownMenuRadioItem,
9
- DropdownMenuTrigger,
10
- } from "@nextblock-cms/ui";
3
+ import { Button } from "@nextblock-cms/ui";
4
+ import {
5
+ DropdownMenu,
6
+ DropdownMenuContent,
7
+ DropdownMenuRadioGroup,
8
+ DropdownMenuRadioItem,
9
+ DropdownMenuTrigger,
10
+ } from "@nextblock-cms/ui";
11
11
  import { Laptop, Moon, Sun, Zap } from "lucide-react";
12
12
  import { useTheme } from "next-themes";
13
13
  import { useEffect, useState } from "react";
@@ -1,21 +1,21 @@
1
- 'use client';
2
-
3
- import dynamic from 'next/dynamic';
4
-
5
- // Defer the visual-editing toolbar (and its heavy editor graph: BlockEditorModal,
6
- // the per-block editors, and editor.css) out of the public bundle. The layout only
7
- // renders this in draft/visual-editing mode, but a *static* import would still ship
8
- // the entire editor graph to every public page. Loading it via next/dynamic with
9
- // ssr:false keeps it out of the public homepage's render-blocking CSS and JS, and
10
- // pulls it in client-side only when visual editing is actually active.
11
- const NextblockVisualEditing = dynamic(
12
- () =>
13
- import('./NextblockVisualEditing').then(
14
- (module) => module.NextblockVisualEditing
15
- ),
16
- { ssr: false }
17
- );
18
-
19
- export function DeferredVisualEditing() {
20
- return <NextblockVisualEditing />;
21
- }
1
+ 'use client';
2
+
3
+ import dynamic from 'next/dynamic';
4
+
5
+ // Defer the visual-editing toolbar (and its heavy editor graph: BlockEditorModal,
6
+ // the per-block editors, and editor.css) out of the public bundle. The layout only
7
+ // renders this in draft/visual-editing mode, but a *static* import would still ship
8
+ // the entire editor graph to every public page. Loading it via next/dynamic with
9
+ // ssr:false keeps it out of the public homepage's render-blocking CSS and JS, and
10
+ // pulls it in client-side only when visual editing is actually active.
11
+ const NextblockVisualEditing = dynamic(
12
+ () =>
13
+ import('./NextblockVisualEditing').then(
14
+ (module) => module.NextblockVisualEditing
15
+ ),
16
+ { ssr: false }
17
+ );
18
+
19
+ export function DeferredVisualEditing() {
20
+ return <NextblockVisualEditing />;
21
+ }
@@ -1,10 +1,10 @@
1
1
  // context/AuthContext.tsx
2
- 'use client';
3
-
4
- import React, { createContext, useContext, useState, useEffect, useMemo } from 'react';
5
- import type { ReactNode } from 'react';
6
- import type { User, SupabaseClient } from '@supabase/supabase-js';
7
- import type { Database } from '@nextblock-cms/db';
2
+ 'use client';
3
+
4
+ import React, { createContext, useContext, useState, useEffect, useMemo } from 'react';
5
+ import type { ReactNode } from 'react';
6
+ import type { User, SupabaseClient } from '@supabase/supabase-js';
7
+ import type { Database } from '@nextblock-cms/db';
8
8
 
9
9
  type Profile = Database['public']['Tables']['profiles']['Row'];
10
10
  type UserRole = Database['public']['Enums']['user_role'];
@@ -28,17 +28,17 @@ interface AuthContextType {
28
28
 
29
29
  const AuthContext = createContext<AuthContextType | undefined>(undefined);
30
30
 
31
- export const AuthProvider = ({ children, serverUser, serverProfile }: AuthProviderProps) => {
32
- const [user, setUser] = useState<User | null>(serverUser);
33
- const [profile, setProfile] = useState<Profile | null>(serverProfile);
34
- const [role, setRole] = useState<UserRole | null>(serverProfile?.role ?? null);
35
- const [isLoading] = useState(false);
36
-
37
- useEffect(() => {
38
- setUser(serverUser);
39
- setProfile(serverProfile);
40
- setRole(serverProfile?.role ?? null);
41
- }, [serverUser, serverProfile]);
31
+ export const AuthProvider = ({ children, serverUser, serverProfile }: AuthProviderProps) => {
32
+ const [user, setUser] = useState<User | null>(serverUser);
33
+ const [profile, setProfile] = useState<Profile | null>(serverProfile);
34
+ const [role, setRole] = useState<UserRole | null>(serverProfile?.role ?? null);
35
+ const [isLoading] = useState(false);
36
+
37
+ useEffect(() => {
38
+ setUser(serverUser);
39
+ setProfile(serverProfile);
40
+ setRole(serverProfile?.role ?? null);
41
+ }, [serverUser, serverProfile]);
42
42
 
43
43
  const isAdmin = role === 'ADMIN';
44
44
  const isWriter = role === 'WRITER';
@@ -49,11 +49,11 @@ export const AuthProvider = ({ children, serverUser, serverProfile }: AuthProvid
49
49
  profile,
50
50
  role,
51
51
  isLoading,
52
- isAdmin,
53
- isWriter,
54
- isUserRole,
55
- supabase: null,
56
- }), [user, profile, role, isLoading, isAdmin, isWriter, isUserRole]);
52
+ isAdmin,
53
+ isWriter,
54
+ isUserRole,
55
+ supabase: null,
56
+ }), [user, profile, role, isLoading, isAdmin, isWriter, isUserRole]);
57
57
 
58
58
  return (
59
59
  <AuthContext.Provider value={value}>
@@ -68,4 +68,4 @@ export const useAuth = () => {
68
68
  throw new Error('useAuth must be used within an AuthProvider');
69
69
  }
70
70
  return context;
71
- };
71
+ };
@@ -1,32 +1,32 @@
1
- import type { Database } from '@nextblock-cms/db';
2
- import { resolveSupabaseAnonKey, resolveSupabaseUrl } from '../lib/setup/env-status';
3
-
4
- type Language = Database['public']['Tables']['languages']['Row'];
5
-
6
- export async function fetchActiveLanguagesFromRest(): Promise<Language[]> {
7
- const supabaseUrl = resolveSupabaseUrl();
8
- const supabaseAnonKey = resolveSupabaseAnonKey();
9
-
10
- if (!supabaseUrl || !supabaseAnonKey) {
11
- return [];
12
- }
13
-
14
- const url = new URL('/rest/v1/languages', supabaseUrl);
15
- url.searchParams.set('select', 'id, code, name, is_default, is_active, created_at, updated_at');
16
- url.searchParams.set('is_active', 'eq.true');
17
- url.searchParams.set('order', 'name.asc');
18
-
19
- const response = await fetch(url.toString(), {
20
- headers: {
21
- apikey: supabaseAnonKey,
22
- Authorization: `Bearer ${supabaseAnonKey}`,
23
- },
24
- });
25
-
26
- if (!response.ok) {
27
- return [];
28
- }
29
-
30
- const data = await response.json();
31
- return Array.isArray(data) ? data : [];
32
- }
1
+ import type { Database } from '@nextblock-cms/db';
2
+ import { resolveSupabaseAnonKey, resolveSupabaseUrl } from '../lib/setup/env-status';
3
+
4
+ type Language = Database['public']['Tables']['languages']['Row'];
5
+
6
+ export async function fetchActiveLanguagesFromRest(): Promise<Language[]> {
7
+ const supabaseUrl = resolveSupabaseUrl();
8
+ const supabaseAnonKey = resolveSupabaseAnonKey();
9
+
10
+ if (!supabaseUrl || !supabaseAnonKey) {
11
+ return [];
12
+ }
13
+
14
+ const url = new URL('/rest/v1/languages', supabaseUrl);
15
+ url.searchParams.set('select', 'id, code, name, is_default, is_active, created_at, updated_at');
16
+ url.searchParams.set('is_active', 'eq.true');
17
+ url.searchParams.set('order', 'name.asc');
18
+
19
+ const response = await fetch(url.toString(), {
20
+ headers: {
21
+ apikey: supabaseAnonKey,
22
+ Authorization: `Bearer ${supabaseAnonKey}`,
23
+ },
24
+ });
25
+
26
+ if (!response.ok) {
27
+ return [];
28
+ }
29
+
30
+ const data = await response.json();
31
+ return Array.isArray(data) ? data : [];
32
+ }
@@ -1,6 +1,6 @@
1
- -- Expose the JWT secret to Postgres as a database GUC, matching Supabase's setup. Runs once.
2
- \set jwt_secret `echo "$JWT_SECRET"`
3
- \set jwt_exp `echo "$JWT_EXP"`
4
-
5
- alter database postgres set "app.settings.jwt_secret" to :'jwt_secret';
6
- alter database postgres set "app.settings.jwt_exp" to :'jwt_exp';
1
+ -- Expose the JWT secret to Postgres as a database GUC, matching Supabase's setup. Runs once.
2
+ \set jwt_secret `echo "$JWT_SECRET"`
3
+ \set jwt_exp `echo "$JWT_EXP"`
4
+
5
+ alter database postgres set "app.settings.jwt_secret" to :'jwt_secret';
6
+ alter database postgres set "app.settings.jwt_exp" to :'jwt_exp';
@@ -1,25 +1,25 @@
1
- -- Self-hosted Supabase role passwords. The supabase/postgres image creates the platform roles;
2
- -- GoTrue logs in as supabase_auth_admin and PostgREST as authenticator. Give the roles that exist
3
- -- the generated POSTGRES_PASSWORD (the set varies by image tag, so each is guarded; the password
4
- -- is passed via a session GUC because psql variables aren't interpolated inside a dollar block).
5
- -- Runs once on first init.
6
- \set pgpass `echo "$POSTGRES_PASSWORD"`
7
- select set_config('nextblock.pgpass', :'pgpass', false);
8
-
9
- do $$
10
- declare
11
- role_name text;
12
- begin
13
- foreach role_name in array array[
14
- 'authenticator',
15
- 'pgbouncer',
16
- 'supabase_auth_admin',
17
- 'supabase_storage_admin',
18
- 'supabase_functions_admin',
19
- 'supabase_read_only_user'
20
- ] loop
21
- if exists (select 1 from pg_roles where rolname = role_name) then
22
- execute format('alter role %I with password %L', role_name, current_setting('nextblock.pgpass'));
23
- end if;
24
- end loop;
25
- end $$;
1
+ -- Self-hosted Supabase role passwords. The supabase/postgres image creates the platform roles;
2
+ -- GoTrue logs in as supabase_auth_admin and PostgREST as authenticator. Give the roles that exist
3
+ -- the generated POSTGRES_PASSWORD (the set varies by image tag, so each is guarded; the password
4
+ -- is passed via a session GUC because psql variables aren't interpolated inside a dollar block).
5
+ -- Runs once on first init.
6
+ \set pgpass `echo "$POSTGRES_PASSWORD"`
7
+ select set_config('nextblock.pgpass', :'pgpass', false);
8
+
9
+ do $$
10
+ declare
11
+ role_name text;
12
+ begin
13
+ foreach role_name in array array[
14
+ 'authenticator',
15
+ 'pgbouncer',
16
+ 'supabase_auth_admin',
17
+ 'supabase_storage_admin',
18
+ 'supabase_functions_admin',
19
+ 'supabase_read_only_user'
20
+ ] loop
21
+ if exists (select 1 from pg_roles where rolname = role_name) then
22
+ execute format('alter role %I with password %L', role_name, current_setting('nextblock.pgpass'));
23
+ end if;
24
+ end loop;
25
+ end $$;
@@ -1,112 +1,112 @@
1
- # Kong declarative (DB-less) gateway config for the NextBlock self-hosted stack.
2
- #
3
- # $SUPABASE_ANON_KEY and $SUPABASE_SERVICE_KEY are substituted at container start by the kong
4
- # service entrypoint (docker-compose.yml) from the generated ANON_KEY / SERVICE_ROLE_KEY env.
5
- # Trimmed to just the Auth (GoTrue) and PostgREST routes the app uses.
6
- _format_version: '2.1'
7
- _transform: true
8
-
9
- consumers:
10
- - username: anon
11
- keyauth_credentials:
12
- - key: $SUPABASE_ANON_KEY
13
- - username: service_role
14
- keyauth_credentials:
15
- - key: $SUPABASE_SERVICE_KEY
16
-
17
- acls:
18
- - consumer: anon
19
- group: anon
20
- - consumer: service_role
21
- group: admin
22
-
23
- services:
24
- - name: auth-v1-open
25
- url: http://auth:9999/verify
26
- routes:
27
- - name: auth-v1-open
28
- strip_path: true
29
- paths:
30
- - /auth/v1/verify
31
- plugins:
32
- - name: cors
33
- - name: auth-v1-open-callback
34
- url: http://auth:9999/callback
35
- routes:
36
- - name: auth-v1-open-callback
37
- strip_path: true
38
- paths:
39
- - /auth/v1/callback
40
- plugins:
41
- - name: cors
42
- - name: auth-v1-open-authorize
43
- url: http://auth:9999/authorize
44
- routes:
45
- - name: auth-v1-open-authorize
46
- strip_path: true
47
- paths:
48
- - /auth/v1/authorize
49
- plugins:
50
- - name: cors
51
-
52
- - name: auth-v1
53
- url: http://auth:9999/
54
- routes:
55
- - name: auth-v1-all
56
- strip_path: true
57
- paths:
58
- - /auth/v1/
59
- plugins:
60
- - name: cors
61
- - name: key-auth
62
- config:
63
- hide_credentials: false
64
- - name: acl
65
- config:
66
- hide_groups_header: true
67
- allow:
68
- - admin
69
- - anon
70
-
71
- - name: rest-v1
72
- url: http://rest:3000/
73
- routes:
74
- - name: rest-v1-all
75
- strip_path: true
76
- paths:
77
- - /rest/v1/
78
- plugins:
79
- - name: cors
80
- - name: key-auth
81
- config:
82
- hide_credentials: true
83
- - name: acl
84
- config:
85
- hide_groups_header: true
86
- allow:
87
- - admin
88
- - anon
89
-
90
- - name: graphql-v1
91
- url: http://rest:3000/rpc/graphql
92
- routes:
93
- - name: graphql-v1-all
94
- strip_path: true
95
- paths:
96
- - /graphql/v1
97
- plugins:
98
- - name: cors
99
- - name: key-auth
100
- config:
101
- hide_credentials: false
102
- - name: request-transformer
103
- config:
104
- add:
105
- headers:
106
- - 'Content-Profile: graphql_public'
107
- - name: acl
108
- config:
109
- hide_groups_header: true
110
- allow:
111
- - admin
112
- - anon
1
+ # Kong declarative (DB-less) gateway config for the NextBlock self-hosted stack.
2
+ #
3
+ # $SUPABASE_ANON_KEY and $SUPABASE_SERVICE_KEY are substituted at container start by the kong
4
+ # service entrypoint (docker-compose.yml) from the generated ANON_KEY / SERVICE_ROLE_KEY env.
5
+ # Trimmed to just the Auth (GoTrue) and PostgREST routes the app uses.
6
+ _format_version: '2.1'
7
+ _transform: true
8
+
9
+ consumers:
10
+ - username: anon
11
+ keyauth_credentials:
12
+ - key: $SUPABASE_ANON_KEY
13
+ - username: service_role
14
+ keyauth_credentials:
15
+ - key: $SUPABASE_SERVICE_KEY
16
+
17
+ acls:
18
+ - consumer: anon
19
+ group: anon
20
+ - consumer: service_role
21
+ group: admin
22
+
23
+ services:
24
+ - name: auth-v1-open
25
+ url: http://auth:9999/verify
26
+ routes:
27
+ - name: auth-v1-open
28
+ strip_path: true
29
+ paths:
30
+ - /auth/v1/verify
31
+ plugins:
32
+ - name: cors
33
+ - name: auth-v1-open-callback
34
+ url: http://auth:9999/callback
35
+ routes:
36
+ - name: auth-v1-open-callback
37
+ strip_path: true
38
+ paths:
39
+ - /auth/v1/callback
40
+ plugins:
41
+ - name: cors
42
+ - name: auth-v1-open-authorize
43
+ url: http://auth:9999/authorize
44
+ routes:
45
+ - name: auth-v1-open-authorize
46
+ strip_path: true
47
+ paths:
48
+ - /auth/v1/authorize
49
+ plugins:
50
+ - name: cors
51
+
52
+ - name: auth-v1
53
+ url: http://auth:9999/
54
+ routes:
55
+ - name: auth-v1-all
56
+ strip_path: true
57
+ paths:
58
+ - /auth/v1/
59
+ plugins:
60
+ - name: cors
61
+ - name: key-auth
62
+ config:
63
+ hide_credentials: false
64
+ - name: acl
65
+ config:
66
+ hide_groups_header: true
67
+ allow:
68
+ - admin
69
+ - anon
70
+
71
+ - name: rest-v1
72
+ url: http://rest:3000/
73
+ routes:
74
+ - name: rest-v1-all
75
+ strip_path: true
76
+ paths:
77
+ - /rest/v1/
78
+ plugins:
79
+ - name: cors
80
+ - name: key-auth
81
+ config:
82
+ hide_credentials: true
83
+ - name: acl
84
+ config:
85
+ hide_groups_header: true
86
+ allow:
87
+ - admin
88
+ - anon
89
+
90
+ - name: graphql-v1
91
+ url: http://rest:3000/rpc/graphql
92
+ routes:
93
+ - name: graphql-v1-all
94
+ strip_path: true
95
+ paths:
96
+ - /graphql/v1
97
+ plugins:
98
+ - name: cors
99
+ - name: key-auth
100
+ config:
101
+ hide_credentials: false
102
+ - name: request-transformer
103
+ config:
104
+ add:
105
+ headers:
106
+ - 'Content-Profile: graphql_public'
107
+ - name: acl
108
+ config:
109
+ hide_groups_header: true
110
+ allow:
111
+ - admin
112
+ - anon