create-nextblock 0.12.8 → 0.12.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.
- package/docker-template/.dockerignore +23 -23
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/libs/db/tsconfig.lib.json +3 -3
- package/libs/editor/tsconfig.lib.json +3 -3
- package/libs/ui/tsconfig.lib.json +3 -3
- package/libs/utils/tsconfig.json +3 -3
- package/package.json +1 -1
- package/project.json +19 -19
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.dockerignore +23 -23
- package/templates/nextblock-template/README.md +34 -34
- package/templates/nextblock-template/app/(auth-pages)/layout.tsx +9 -9
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -27
- package/templates/nextblock-template/app/(auth-pages)/sign-up/SignUpForm.tsx +141 -141
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -91
- package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +123 -123
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/ToasterProvider.tsx +17 -17
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -7
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/interactions.test.ts +301 -301
- package/templates/nextblock-template/app/actions/interactions.ts +373 -373
- package/templates/nextblock-template/app/actions/postActions.ts +146 -146
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/ai/global-agent/route.ts +964 -964
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3490 -3490
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +5597 -5597
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +90 -90
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -58
- package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -244
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +36 -36
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -1522
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -228
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +431 -391
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/interactions/InteractionsModerationClient.tsx +408 -408
- package/templates/nextblock-template/app/cms/interactions/page.tsx +51 -51
- package/templates/nextblock-template/app/cms/layout.tsx +73 -73
- package/templates/nextblock-template/app/cms/media/components/FolderNavigator.tsx +273 -273
- package/templates/nextblock-template/app/cms/media/components/FolderTree.tsx +122 -122
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -69
- package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +149 -149
- package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -101
- package/templates/nextblock-template/app/cms/navigation/components/NavigationMenuDnd.tsx +3 -3
- package/templates/nextblock-template/app/cms/pages/page.tsx +18 -17
- package/templates/nextblock-template/app/cms/posts/page.tsx +19 -18
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -13
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/products/page.tsx +39 -27
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -133
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -5
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -19
- package/templates/nextblock-template/app/cms/revisions/utils.ts +132 -132
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -93
- package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -129
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +497 -497
- package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -410
- package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +246 -246
- package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -80
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -331
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -494
- package/templates/nextblock-template/app/cms/settings/email/actions.ts +64 -64
- package/templates/nextblock-template/app/cms/settings/email/components/EmailForm.tsx +181 -181
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -767
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -93
- package/templates/nextblock-template/app/cms/settings/google-analytics/actions.ts +60 -60
- package/templates/nextblock-template/app/cms/settings/google-analytics/components/GoogleAnalyticsForm.tsx +129 -129
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/languages/actions.ts +16 -16
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -339
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -20
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -122
- package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +52 -52
- package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +148 -148
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/actions.ts +44 -44
- package/templates/nextblock-template/app/cms/settings/registration/components/RegistrationForm.tsx +65 -65
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/actions.ts +284 -284
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +522 -522
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -21
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -20
- package/templates/nextblock-template/app/cms/users/actions.ts +222 -222
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +44 -44
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/lib/sitemap-utils.ts +253 -253
- package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -73
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -16
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -9
- package/templates/nextblock-template/app/profile/account-data.ts +37 -37
- package/templates/nextblock-template/app/profile/account-links.ts +22 -22
- package/templates/nextblock-template/app/profile/account-types.ts +11 -11
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -79
- package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -32
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- package/templates/nextblock-template/app/profile/page.tsx +42 -42
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -128
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -59
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -27
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/sitemap.ts +130 -130
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -7
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -23
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -70
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -69
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/FooterNavigation.tsx +32 -32
- package/templates/nextblock-template/components/GitHubLoginButton.tsx +15 -15
- package/templates/nextblock-template/components/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- package/templates/nextblock-template/components/PostCommentsSection.tsx +369 -369
- package/templates/nextblock-template/components/ProductReviewsSection.tsx +419 -419
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -12
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -12
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -23
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +249 -249
- package/templates/nextblock-template/components/blocks/types.ts +7 -7
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -464
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -1319
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +173 -173
- package/templates/nextblock-template/docs/12-VERCEL-DEPLOYMENT.md +170 -170
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +151 -151
- package/templates/nextblock-template/docs/README.md +39 -39
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12505 -12505
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -21
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -101
- package/templates/nextblock-template/index.d.ts +7 -7
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/auth/twoFactor.ts +208 -208
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/blocks/blockRegistry.ts +6 -6
- package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -18
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +100 -77
- package/templates/nextblock-template/lib/cms-transfer/csv.ts +403 -399
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -2243
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/config/email-settings.ts +217 -217
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -256
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -743
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +54 -54
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/onboarding/status.ts +222 -222
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -60
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/search/server.ts +585 -585
- package/templates/nextblock-template/lib/search/types.ts +27 -27
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +37 -37
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/site-url.ts +48 -48
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/next.config.js +6 -0
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
- package/templates/nextblock-template/tsconfig.tsbuildinfo +0 -1
package/libs/utils/tsconfig.json
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
{
|
|
2
|
-
"extends": "../../../../libs/utils/tsconfig.json"
|
|
3
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"extends": "../../../../libs/utils/tsconfig.json"
|
|
3
|
+
}
|
package/package.json
CHANGED
package/project.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "create-nextblock",
|
|
3
|
-
"projectType": "application",
|
|
4
|
-
"root": "apps/create-nextblock",
|
|
5
|
-
"sourceRoot": "apps/create-nextblock",
|
|
6
|
-
"targets": {
|
|
7
|
-
"lint": {
|
|
8
|
-
"executor": "@nx/eslint:lint",
|
|
9
|
-
"outputs": ["{options.outputFile}"],
|
|
10
|
-
"options": {
|
|
11
|
-
"lintFilePatterns": [
|
|
12
|
-
"apps/create-nextblock/bin/**/*.js",
|
|
13
|
-
"apps/create-nextblock/scripts/**/*.js"
|
|
14
|
-
]
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
},
|
|
18
|
-
"tags": []
|
|
19
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "create-nextblock",
|
|
3
|
+
"projectType": "application",
|
|
4
|
+
"root": "apps/create-nextblock",
|
|
5
|
+
"sourceRoot": "apps/create-nextblock",
|
|
6
|
+
"targets": {
|
|
7
|
+
"lint": {
|
|
8
|
+
"executor": "@nx/eslint:lint",
|
|
9
|
+
"outputs": ["{options.outputFile}"],
|
|
10
|
+
"options": {
|
|
11
|
+
"lintFilePatterns": [
|
|
12
|
+
"apps/create-nextblock/bin/**/*.js",
|
|
13
|
+
"apps/create-nextblock/scripts/**/*.js"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"tags": []
|
|
19
|
+
}
|
|
@@ -1,11 +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
|
+
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,23 +1,23 @@
|
|
|
1
|
-
# Keep the build context lean; deps are reinstalled in the image and secrets stay out.
|
|
2
|
-
node_modules
|
|
3
|
-
.git
|
|
4
|
-
.github
|
|
5
|
-
.next
|
|
6
|
-
out
|
|
7
|
-
dist
|
|
8
|
-
coverage
|
|
9
|
-
tmp
|
|
10
|
-
backup
|
|
11
|
-
backups
|
|
12
|
-
*.log
|
|
13
|
-
npm-debug.log*
|
|
14
|
-
|
|
15
|
-
# Secrets never enter the image (NEXT_PUBLIC_* arrive as build args).
|
|
16
|
-
.env
|
|
17
|
-
.env.*
|
|
18
|
-
!.env.docker.example
|
|
19
|
-
|
|
20
|
-
# Not needed inside the app image (mounted/used by other compose services instead).
|
|
21
|
-
docker
|
|
22
|
-
supabase/.branches
|
|
23
|
-
supabase/.temp
|
|
1
|
+
# Keep the build context lean; deps are reinstalled in the image and secrets stay out.
|
|
2
|
+
node_modules
|
|
3
|
+
.git
|
|
4
|
+
.github
|
|
5
|
+
.next
|
|
6
|
+
out
|
|
7
|
+
dist
|
|
8
|
+
coverage
|
|
9
|
+
tmp
|
|
10
|
+
backup
|
|
11
|
+
backups
|
|
12
|
+
*.log
|
|
13
|
+
npm-debug.log*
|
|
14
|
+
|
|
15
|
+
# Secrets never enter the image (NEXT_PUBLIC_* arrive as build args).
|
|
16
|
+
.env
|
|
17
|
+
.env.*
|
|
18
|
+
!.env.docker.example
|
|
19
|
+
|
|
20
|
+
# Not needed inside the app image (mounted/used by other compose services instead).
|
|
21
|
+
docker
|
|
22
|
+
supabase/.branches
|
|
23
|
+
supabase/.temp
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
# apps/nextblock
|
|
2
|
-
|
|
3
|
-
`apps/nextblock` is the canonical NextBlock™ application. It contains:
|
|
4
|
-
|
|
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
|
|
10
|
-
|
|
11
|
-
If you are trying to understand current runtime behavior, start here before you
|
|
12
|
-
look at generated template output.
|
|
13
|
-
|
|
14
|
-
## Related Docs
|
|
15
|
-
|
|
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
|
-
|
|
23
|
-
## Common Workflows
|
|
24
|
-
|
|
25
|
-
From the repo root:
|
|
26
|
-
|
|
27
|
-
```bash
|
|
28
|
-
npx nx serve nextblock
|
|
29
|
-
npx nx build nextblock
|
|
30
|
-
npx nx lint nextblock --skip-nx-cache
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
Use the root docs for architecture and workflow details instead of maintaining a
|
|
34
|
-
second app-specific guide here.
|
|
1
|
+
# apps/nextblock
|
|
2
|
+
|
|
3
|
+
`apps/nextblock` is the canonical NextBlock™ application. It contains:
|
|
4
|
+
|
|
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
|
|
10
|
+
|
|
11
|
+
If you are trying to understand current runtime behavior, start here before you
|
|
12
|
+
look at generated template output.
|
|
13
|
+
|
|
14
|
+
## Related Docs
|
|
15
|
+
|
|
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
|
+
|
|
23
|
+
## Common Workflows
|
|
24
|
+
|
|
25
|
+
From the repo root:
|
|
26
|
+
|
|
27
|
+
```bash
|
|
28
|
+
npx nx serve nextblock
|
|
29
|
+
npx nx build nextblock
|
|
30
|
+
npx nx lint nextblock --skip-nx-cache
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Use the root docs for architecture and workflow details instead of maintaining a
|
|
34
|
+
second app-specific guide here.
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export default async function Layout({
|
|
2
|
-
children,
|
|
3
|
-
}: {
|
|
4
|
-
children: React.ReactNode;
|
|
5
|
-
}) {
|
|
6
|
-
return (
|
|
7
|
-
<div className="max-w-7xl mx-auto flex flex-col gap-12 items-start mb-4">{children}</div>
|
|
8
|
-
);
|
|
9
|
-
}
|
|
1
|
+
export default async function Layout({
|
|
2
|
+
children,
|
|
3
|
+
}: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
}) {
|
|
6
|
+
return (
|
|
7
|
+
<div className="max-w-7xl mx-auto flex flex-col gap-12 items-start mb-4">{children}</div>
|
|
8
|
+
);
|
|
9
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
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
|
-
}
|
|
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
|
+
}
|
|
@@ -1,141 +1,141 @@
|
|
|
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";
|
|
14
|
-
import { AuthBotProtection } from "../../../components/auth/AuthBotProtection";
|
|
15
|
-
|
|
16
|
-
type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
|
|
17
|
-
|
|
18
|
-
interface SignUpFormProps {
|
|
19
|
-
botProtection: { provider: BotProtectionProvider; siteKey: string };
|
|
20
|
-
scriptNonce?: string;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
function getMessage(searchParams: URLSearchParams): Message | undefined {
|
|
24
|
-
if (searchParams.has('error')) {
|
|
25
|
-
const error = searchParams.get('error');
|
|
26
|
-
if (error) return { error };
|
|
27
|
-
}
|
|
28
|
-
if (searchParams.has('success')) {
|
|
29
|
-
const success = searchParams.get('success');
|
|
30
|
-
if (success) return { success };
|
|
31
|
-
}
|
|
32
|
-
if (searchParams.has('message')) {
|
|
33
|
-
const message = searchParams.get('message');
|
|
34
|
-
if (message) return { message };
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export default function SignUpForm({ botProtection, scriptNonce }: SignUpFormProps) {
|
|
40
|
-
const { t } = useTranslations();
|
|
41
|
-
const searchParams = useSearchParams();
|
|
42
|
-
const formMessage = getMessage(searchParams);
|
|
43
|
-
const successKey = searchParams.get('success');
|
|
44
|
-
|
|
45
|
-
if (successKey) {
|
|
46
|
-
return (
|
|
47
|
-
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
48
|
-
<div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
|
|
49
|
-
<CheckCircle2 className="h-5 w-5" />
|
|
50
|
-
</div>
|
|
51
|
-
<p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
|
|
52
|
-
{t('auth.signup_success_badge')}
|
|
53
|
-
</p>
|
|
54
|
-
<h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
|
|
55
|
-
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
56
|
-
{t(successKey)}
|
|
57
|
-
</p>
|
|
58
|
-
|
|
59
|
-
<div className="mt-8 rounded-lg border p-5">
|
|
60
|
-
<div className="flex items-start gap-3">
|
|
61
|
-
<div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
|
|
62
|
-
<Mail className="h-4 w-4" />
|
|
63
|
-
</div>
|
|
64
|
-
<div className="space-y-3 text-sm text-muted-foreground">
|
|
65
|
-
<p>{t('auth.signup_success_step_confirm')}</p>
|
|
66
|
-
<p>{t('auth.signup_success_step_profile')}</p>
|
|
67
|
-
<p>{t('auth.signup_success_step_spam')}</p>
|
|
68
|
-
</div>
|
|
69
|
-
</div>
|
|
70
|
-
</div>
|
|
71
|
-
|
|
72
|
-
<div className="mt-6 flex flex-col gap-3 sm:flex-row">
|
|
73
|
-
<Button asChild>
|
|
74
|
-
<Link href="/sign-in">
|
|
75
|
-
{t('auth.back_to_sign_in')}
|
|
76
|
-
<ArrowRight className="ml-2 h-4 w-4" />
|
|
77
|
-
</Link>
|
|
78
|
-
</Button>
|
|
79
|
-
<Button asChild variant="outline">
|
|
80
|
-
<Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
|
|
81
|
-
</Button>
|
|
82
|
-
</div>
|
|
83
|
-
</div>
|
|
84
|
-
);
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
return (
|
|
88
|
-
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
89
|
-
<form className="flex flex-col">
|
|
90
|
-
<SandboxCredentialsAlert />
|
|
91
|
-
<h1 className="text-2xl font-medium">{t('sign_up')}</h1>
|
|
92
|
-
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
93
|
-
{t('auth.signup_form_description')}
|
|
94
|
-
</p>
|
|
95
|
-
<p className="text-sm text-foreground">
|
|
96
|
-
{t('already_have_account')}{" "}
|
|
97
|
-
<Link className="text-foreground font-medium underline" href="/sign-in">
|
|
98
|
-
{t('sign_in')}
|
|
99
|
-
</Link>
|
|
100
|
-
</p>
|
|
101
|
-
|
|
102
|
-
<div className="mt-8 flex flex-col gap-2">
|
|
103
|
-
<GitHubLoginButton t={t} redirectTo="/profile" />
|
|
104
|
-
|
|
105
|
-
<div className="relative py-2">
|
|
106
|
-
<div className="absolute inset-0 flex items-center">
|
|
107
|
-
<span className="w-full border-t" />
|
|
108
|
-
</div>
|
|
109
|
-
<div className="relative flex justify-center text-xs uppercase">
|
|
110
|
-
<span className="bg-background px-2 text-muted-foreground">
|
|
111
|
-
{t('or_continue_with') || "Or continue with"}
|
|
112
|
-
</span>
|
|
113
|
-
</div>
|
|
114
|
-
</div>
|
|
115
|
-
|
|
116
|
-
<div className="flex flex-col gap-2 [&>input]:mb-3">
|
|
117
|
-
<Label htmlFor="email">{t('email')}</Label>
|
|
118
|
-
<Input name="email" placeholder={t('you_at_example_com')} required />
|
|
119
|
-
<Label htmlFor="password">{t('password')}</Label>
|
|
120
|
-
<Input
|
|
121
|
-
type="password"
|
|
122
|
-
name="password"
|
|
123
|
-
placeholder={t('your_password')}
|
|
124
|
-
minLength={6}
|
|
125
|
-
required
|
|
126
|
-
/>
|
|
127
|
-
<AuthBotProtection
|
|
128
|
-
provider={botProtection.provider}
|
|
129
|
-
siteKey={botProtection.siteKey}
|
|
130
|
-
scriptNonce={scriptNonce}
|
|
131
|
-
/>
|
|
132
|
-
<SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
|
|
133
|
-
{t('sign_up')}
|
|
134
|
-
</SubmitButton>
|
|
135
|
-
<FormMessage message={formMessage} />
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
</form>
|
|
139
|
-
</div>
|
|
140
|
-
);
|
|
141
|
-
}
|
|
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";
|
|
14
|
+
import { AuthBotProtection } from "../../../components/auth/AuthBotProtection";
|
|
15
|
+
|
|
16
|
+
type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
|
|
17
|
+
|
|
18
|
+
interface SignUpFormProps {
|
|
19
|
+
botProtection: { provider: BotProtectionProvider; siteKey: string };
|
|
20
|
+
scriptNonce?: string;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function getMessage(searchParams: URLSearchParams): Message | undefined {
|
|
24
|
+
if (searchParams.has('error')) {
|
|
25
|
+
const error = searchParams.get('error');
|
|
26
|
+
if (error) return { error };
|
|
27
|
+
}
|
|
28
|
+
if (searchParams.has('success')) {
|
|
29
|
+
const success = searchParams.get('success');
|
|
30
|
+
if (success) return { success };
|
|
31
|
+
}
|
|
32
|
+
if (searchParams.has('message')) {
|
|
33
|
+
const message = searchParams.get('message');
|
|
34
|
+
if (message) return { message };
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default function SignUpForm({ botProtection, scriptNonce }: SignUpFormProps) {
|
|
40
|
+
const { t } = useTranslations();
|
|
41
|
+
const searchParams = useSearchParams();
|
|
42
|
+
const formMessage = getMessage(searchParams);
|
|
43
|
+
const successKey = searchParams.get('success');
|
|
44
|
+
|
|
45
|
+
if (successKey) {
|
|
46
|
+
return (
|
|
47
|
+
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
48
|
+
<div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
|
|
49
|
+
<CheckCircle2 className="h-5 w-5" />
|
|
50
|
+
</div>
|
|
51
|
+
<p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
|
|
52
|
+
{t('auth.signup_success_badge')}
|
|
53
|
+
</p>
|
|
54
|
+
<h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
|
|
55
|
+
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
56
|
+
{t(successKey)}
|
|
57
|
+
</p>
|
|
58
|
+
|
|
59
|
+
<div className="mt-8 rounded-lg border p-5">
|
|
60
|
+
<div className="flex items-start gap-3">
|
|
61
|
+
<div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
|
|
62
|
+
<Mail className="h-4 w-4" />
|
|
63
|
+
</div>
|
|
64
|
+
<div className="space-y-3 text-sm text-muted-foreground">
|
|
65
|
+
<p>{t('auth.signup_success_step_confirm')}</p>
|
|
66
|
+
<p>{t('auth.signup_success_step_profile')}</p>
|
|
67
|
+
<p>{t('auth.signup_success_step_spam')}</p>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</div>
|
|
71
|
+
|
|
72
|
+
<div className="mt-6 flex flex-col gap-3 sm:flex-row">
|
|
73
|
+
<Button asChild>
|
|
74
|
+
<Link href="/sign-in">
|
|
75
|
+
{t('auth.back_to_sign_in')}
|
|
76
|
+
<ArrowRight className="ml-2 h-4 w-4" />
|
|
77
|
+
</Link>
|
|
78
|
+
</Button>
|
|
79
|
+
<Button asChild variant="outline">
|
|
80
|
+
<Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
|
|
81
|
+
</Button>
|
|
82
|
+
</div>
|
|
83
|
+
</div>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return (
|
|
88
|
+
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
89
|
+
<form className="flex flex-col">
|
|
90
|
+
<SandboxCredentialsAlert />
|
|
91
|
+
<h1 className="text-2xl font-medium">{t('sign_up')}</h1>
|
|
92
|
+
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
93
|
+
{t('auth.signup_form_description')}
|
|
94
|
+
</p>
|
|
95
|
+
<p className="text-sm text-foreground">
|
|
96
|
+
{t('already_have_account')}{" "}
|
|
97
|
+
<Link className="text-foreground font-medium underline" href="/sign-in">
|
|
98
|
+
{t('sign_in')}
|
|
99
|
+
</Link>
|
|
100
|
+
</p>
|
|
101
|
+
|
|
102
|
+
<div className="mt-8 flex flex-col gap-2">
|
|
103
|
+
<GitHubLoginButton t={t} redirectTo="/profile" />
|
|
104
|
+
|
|
105
|
+
<div className="relative py-2">
|
|
106
|
+
<div className="absolute inset-0 flex items-center">
|
|
107
|
+
<span className="w-full border-t" />
|
|
108
|
+
</div>
|
|
109
|
+
<div className="relative flex justify-center text-xs uppercase">
|
|
110
|
+
<span className="bg-background px-2 text-muted-foreground">
|
|
111
|
+
{t('or_continue_with') || "Or continue with"}
|
|
112
|
+
</span>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div className="flex flex-col gap-2 [&>input]:mb-3">
|
|
117
|
+
<Label htmlFor="email">{t('email')}</Label>
|
|
118
|
+
<Input name="email" placeholder={t('you_at_example_com')} required />
|
|
119
|
+
<Label htmlFor="password">{t('password')}</Label>
|
|
120
|
+
<Input
|
|
121
|
+
type="password"
|
|
122
|
+
name="password"
|
|
123
|
+
placeholder={t('your_password')}
|
|
124
|
+
minLength={6}
|
|
125
|
+
required
|
|
126
|
+
/>
|
|
127
|
+
<AuthBotProtection
|
|
128
|
+
provider={botProtection.provider}
|
|
129
|
+
siteKey={botProtection.siteKey}
|
|
130
|
+
scriptNonce={scriptNonce}
|
|
131
|
+
/>
|
|
132
|
+
<SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
|
|
133
|
+
{t('sign_up')}
|
|
134
|
+
</SubmitButton>
|
|
135
|
+
<FormMessage message={formMessage} />
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
</form>
|
|
139
|
+
</div>
|
|
140
|
+
);
|
|
141
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
import { Suspense } from "react";
|
|
2
|
-
import { headers } from "next/headers";
|
|
3
|
-
import { createClient } from "@nextblock-cms/db/server";
|
|
4
|
-
import SignUpForm from "./SignUpForm";
|
|
5
|
-
|
|
6
|
-
type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
|
|
7
|
-
|
|
8
|
-
// Server wrapper: resolves the site-wide bot-protection provider + site key
|
|
9
|
-
// (CMS → Settings → Bot Protection) and the CSP nonce, then hands them to the
|
|
10
|
-
// interactive client form. Mirrors the read in components/BlockRenderer.tsx.
|
|
11
|
-
export default async function SignUpPage() {
|
|
12
|
-
let scriptNonce = '';
|
|
13
|
-
try {
|
|
14
|
-
scriptNonce = (await headers()).get('x-nonce') || '';
|
|
15
|
-
} catch (e) {
|
|
16
|
-
console.error('[Bot Protection] Error loading CSP nonce on sign-up page:', e);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
let botProtection: { provider: BotProtectionProvider; siteKey: string } = {
|
|
20
|
-
provider: 'none',
|
|
21
|
-
siteKey: '',
|
|
22
|
-
};
|
|
23
|
-
try {
|
|
24
|
-
const supabase = createClient();
|
|
25
|
-
const { data: publicSetting } = await supabase
|
|
26
|
-
.from('site_settings')
|
|
27
|
-
.select('value')
|
|
28
|
-
.eq('key', 'bot_protection_public')
|
|
29
|
-
.maybeSingle();
|
|
30
|
-
if (publicSetting?.value) {
|
|
31
|
-
const publicVal = publicSetting.value as Record<string, any>;
|
|
32
|
-
botProtection = {
|
|
33
|
-
provider: publicVal.provider || 'none',
|
|
34
|
-
siteKey: publicVal.siteKey || '',
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
} catch (e) {
|
|
38
|
-
console.error('[Bot Protection] Error loading settings on sign-up page:', e);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return (
|
|
42
|
-
<Suspense fallback={null}>
|
|
43
|
-
<SignUpForm botProtection={botProtection} scriptNonce={scriptNonce} />
|
|
44
|
-
</Suspense>
|
|
45
|
-
);
|
|
46
|
-
}
|
|
1
|
+
import { Suspense } from "react";
|
|
2
|
+
import { headers } from "next/headers";
|
|
3
|
+
import { createClient } from "@nextblock-cms/db/server";
|
|
4
|
+
import SignUpForm from "./SignUpForm";
|
|
5
|
+
|
|
6
|
+
type BotProtectionProvider = 'none' | 'turnstile' | 'recaptcha';
|
|
7
|
+
|
|
8
|
+
// Server wrapper: resolves the site-wide bot-protection provider + site key
|
|
9
|
+
// (CMS → Settings → Bot Protection) and the CSP nonce, then hands them to the
|
|
10
|
+
// interactive client form. Mirrors the read in components/BlockRenderer.tsx.
|
|
11
|
+
export default async function SignUpPage() {
|
|
12
|
+
let scriptNonce = '';
|
|
13
|
+
try {
|
|
14
|
+
scriptNonce = (await headers()).get('x-nonce') || '';
|
|
15
|
+
} catch (e) {
|
|
16
|
+
console.error('[Bot Protection] Error loading CSP nonce on sign-up page:', e);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
let botProtection: { provider: BotProtectionProvider; siteKey: string } = {
|
|
20
|
+
provider: 'none',
|
|
21
|
+
siteKey: '',
|
|
22
|
+
};
|
|
23
|
+
try {
|
|
24
|
+
const supabase = createClient();
|
|
25
|
+
const { data: publicSetting } = await supabase
|
|
26
|
+
.from('site_settings')
|
|
27
|
+
.select('value')
|
|
28
|
+
.eq('key', 'bot_protection_public')
|
|
29
|
+
.maybeSingle();
|
|
30
|
+
if (publicSetting?.value) {
|
|
31
|
+
const publicVal = publicSetting.value as Record<string, any>;
|
|
32
|
+
botProtection = {
|
|
33
|
+
provider: publicVal.provider || 'none',
|
|
34
|
+
siteKey: publicVal.siteKey || '',
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
} catch (e) {
|
|
38
|
+
console.error('[Bot Protection] Error loading settings on sign-up page:', e);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return (
|
|
42
|
+
<Suspense fallback={null}>
|
|
43
|
+
<SignUpForm botProtection={botProtection} scriptNonce={scriptNonce} />
|
|
44
|
+
</Suspense>
|
|
45
|
+
);
|
|
46
|
+
}
|