create-nextblock 0.13.10 → 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 (255) 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/CustomBlockEditorPreview.tsx +160 -160
  46. package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
  47. package/templates/nextblock-template/app/cms/blocks/components/MultiEntityPicker.tsx +263 -263
  48. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  49. package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
  50. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  51. package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
  52. package/templates/nextblock-template/app/cms/components/EcommerceActiveContext.tsx +27 -27
  53. package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
  54. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  55. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  56. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  57. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  58. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  59. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  60. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  61. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  62. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  63. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  64. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  65. package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
  66. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  67. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  68. package/templates/nextblock-template/app/cms/interactions/EmailRecipientsInput.tsx +189 -189
  69. package/templates/nextblock-template/app/cms/layout.tsx +73 -73
  70. package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
  71. package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
  72. package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
  73. package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
  74. package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
  75. package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
  76. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  77. package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
  78. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  79. package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
  80. package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
  81. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  82. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  83. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  84. package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
  85. package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
  86. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  87. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  88. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  89. package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
  90. package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
  91. package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
  92. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  93. package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
  94. package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
  95. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  96. package/templates/nextblock-template/app/cms/settings/languages/components/LanguageDetectionPanel.tsx +188 -188
  97. package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
  98. package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
  99. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  100. package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
  101. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  102. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  103. package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
  104. package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
  105. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  106. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  107. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  108. package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
  109. package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
  110. package/templates/nextblock-template/app/cms/users/components/CreateUserForm.tsx +217 -217
  111. package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
  112. package/templates/nextblock-template/app/cms/users/new/page.tsx +44 -44
  113. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  114. package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
  115. package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
  116. package/templates/nextblock-template/app/profile/account-links.ts +22 -22
  117. package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
  118. package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
  119. package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
  120. package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
  121. package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
  122. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  123. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  124. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  125. package/templates/nextblock-template/app/sitemap.ts +130 -130
  126. package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
  127. package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
  128. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  129. package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
  130. package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
  131. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  132. package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
  133. package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
  134. package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
  135. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  136. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  137. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  138. package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
  139. package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
  140. package/templates/nextblock-template/components/blocks/ProductGridClient.tsx +114 -114
  141. package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
  142. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +8 -1
  143. package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
  144. package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +29 -23
  145. package/templates/nextblock-template/components/blocks/types.ts +7 -7
  146. package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
  147. package/templates/nextblock-template/components/form-message.tsx +32 -32
  148. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +69 -0
  149. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -0
  150. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  151. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  152. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  153. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  154. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -464
  155. package/templates/nextblock-template/components/submit-button.tsx +23 -23
  156. package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
  157. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  158. package/templates/nextblock-template/context/AuthContext.tsx +23 -23
  159. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  160. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  161. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  162. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  163. package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
  164. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  165. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
  166. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
  167. package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
  168. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  169. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  170. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
  171. package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
  172. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
  173. package/templates/nextblock-template/docs/README.md +39 -39
  174. package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
  175. package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
  176. package/templates/nextblock-template/index.d.ts +7 -7
  177. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  178. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  179. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  180. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  181. package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
  182. package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +78 -78
  183. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  184. package/templates/nextblock-template/lib/blocks/product-grid-data.ts +210 -210
  185. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  186. package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
  187. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  188. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  189. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  190. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  191. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  192. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  193. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  194. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  195. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  196. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  197. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  198. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  199. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  200. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  201. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  202. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  203. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  204. package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
  205. package/templates/nextblock-template/lib/i18n/country-languages.ts +247 -247
  206. package/templates/nextblock-template/lib/i18n/detection.test.ts +197 -197
  207. package/templates/nextblock-template/lib/i18n/detection.ts +192 -192
  208. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  209. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
  210. package/templates/nextblock-template/lib/media/youtube.ts +81 -0
  211. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  212. package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
  213. package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
  214. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  215. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  216. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  217. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  218. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  219. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  220. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  221. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  222. package/templates/nextblock-template/lib/search/types.ts +27 -27
  223. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  224. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  225. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  226. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +87 -82
  227. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  228. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  229. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  230. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  231. package/templates/nextblock-template/lib/site-url.ts +48 -48
  232. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  233. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  234. package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
  235. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  236. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  237. package/templates/nextblock-template/package.json +1 -1
  238. package/templates/nextblock-template/postcss.config.js +6 -6
  239. package/templates/nextblock-template/scripts/backup.js +115 -115
  240. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  241. package/templates/nextblock-template/scripts/restore.js +385 -385
  242. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  243. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  244. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  245. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  246. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  247. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  248. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  249. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  250. package/templates/nextblock-template/tailwind.config.js +25 -25
  251. package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
  252. package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
  253. package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
  254. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
  255. 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