create-nextblock 0.2.77 → 0.8.0
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/bin/create-nextblock.js +740 -459
- package/package.json +1 -2
- package/scripts/sync-template.js +18 -1
- package/templates/nextblock-template/.browserslistrc +11 -0
- package/templates/nextblock-template/.swcrc +30 -30
- package/templates/nextblock-template/README.md +23 -114
- package/templates/nextblock-template/app/(auth-pages)/post-sign-in/page.tsx +27 -28
- package/templates/nextblock-template/app/(auth-pages)/sign-in/page.tsx +50 -25
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +111 -56
- package/templates/nextblock-template/app/(auth-pages)/two-factor/actions.ts +91 -0
- package/templates/nextblock-template/app/(auth-pages)/two-factor/components/TwoFactorForm.tsx +118 -0
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -0
- package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -0
- package/templates/nextblock-template/app/[slug]/PageClientContent.tsx +48 -28
- package/templates/nextblock-template/app/[slug]/page.tsx +63 -6
- package/templates/nextblock-template/app/[slug]/page.utils.ts +374 -157
- package/templates/nextblock-template/app/[slug]/pageClientActions.ts +7 -0
- package/templates/nextblock-template/app/actions/consent.ts +57 -0
- package/templates/nextblock-template/app/actions/formActions.ts +130 -11
- package/templates/nextblock-template/app/actions/languageActions.ts +31 -30
- package/templates/nextblock-template/app/actions/package-actions.ts +183 -0
- package/templates/nextblock-template/app/actions/postActions.ts +146 -48
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +21 -0
- package/templates/nextblock-template/app/actions/visualEditingActions.test.ts +179 -0
- package/templates/nextblock-template/app/actions/visualEditingActions.ts +345 -0
- package/templates/nextblock-template/app/actions.ts +67 -12
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -0
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -0
- package/templates/nextblock-template/app/api/ai/global-agent/route.ts +965 -0
- package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -0
- package/templates/nextblock-template/app/api/checkout/route.ts +146 -0
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -0
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -0
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +3413 -17
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +7830 -0
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +35 -0
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -0
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -0
- package/templates/nextblock-template/app/api/draft/disable/route.ts +25 -0
- package/templates/nextblock-template/app/api/draft/route.ts +93 -0
- package/templates/nextblock-template/app/api/draft/start/route.ts +77 -0
- package/templates/nextblock-template/app/api/media/library/route.ts +65 -0
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -0
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -0
- package/templates/nextblock-template/app/api/search/route.ts +43 -0
- package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -0
- package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -0
- package/templates/nextblock-template/app/api/webhooks/freemius/route.ts +34 -0
- package/templates/nextblock-template/app/api/webhooks/stripe/route.ts +27 -0
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +392 -128
- package/templates/nextblock-template/app/article/[slug]/page.tsx +179 -127
- package/templates/nextblock-template/app/article/[slug]/page.utils.ts +262 -77
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -58
- package/templates/nextblock-template/app/cart/page.tsx +7 -0
- package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -0
- package/templates/nextblock-template/app/checkout/page.tsx +52 -0
- package/templates/nextblock-template/app/checkout/success/actions.ts +136 -0
- package/templates/nextblock-template/app/checkout/success/page.tsx +186 -0
- package/templates/nextblock-template/app/cms/CmsClientLayout.tsx +163 -33
- package/templates/nextblock-template/app/cms/blocks/actions.ts +424 -235
- package/templates/nextblock-template/app/cms/blocks/components/BackgroundSelector.tsx +212 -151
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorArea.tsx +41 -20
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +152 -19
- package/templates/nextblock-template/app/cms/blocks/components/BlockTypeCard.tsx +25 -17
- package/templates/nextblock-template/app/cms/blocks/components/BlockTypeSelector.tsx +200 -18
- package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +33 -16
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -0
- package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +37 -18
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -67
- package/templates/nextblock-template/app/cms/blocks/components/SectionConfigPanel.tsx +108 -31
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -0
- package/templates/nextblock-template/app/cms/blocks/editors/FeaturedProductBlockEditor.tsx +31 -0
- package/templates/nextblock-template/app/cms/blocks/editors/FormBlockEditor.tsx +2 -2
- package/templates/nextblock-template/app/cms/blocks/editors/HeadingBlockEditor.tsx +1 -1
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +29 -29
- package/templates/nextblock-template/app/cms/blocks/editors/PostsGridBlockEditor.tsx +14 -18
- package/templates/nextblock-template/app/cms/blocks/editors/ProductGridBlockEditor.tsx +41 -0
- package/templates/nextblock-template/app/cms/blocks/editors/SectionBlockEditor.tsx +318 -118
- package/templates/nextblock-template/app/cms/blocks/editors/TextBlockEditor.tsx +98 -21
- package/templates/nextblock-template/app/cms/blocks/editors/VideoEmbedBlockEditor.tsx +1 -1
- package/templates/nextblock-template/app/cms/components/ContentLanguageSwitcher.tsx +27 -9
- package/templates/nextblock-template/app/cms/components/CopyContentFromLanguage.tsx +1 -1
- package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -0
- package/templates/nextblock-template/app/cms/components/CortexAiPageContext.tsx +58 -0
- package/templates/nextblock-template/app/cms/components/CortexGlobalAgentChat.tsx +1507 -0
- package/templates/nextblock-template/app/cms/components/DraftStatusActions.tsx +145 -0
- package/templates/nextblock-template/app/cms/components/FeatureImageField.tsx +244 -0
- package/templates/nextblock-template/app/cms/components/FeedbackModal.tsx +38 -24
- package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -0
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlockComposer.tsx +1522 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -0
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -0
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -0
- package/templates/nextblock-template/app/cms/dashboard/actions.ts +228 -98
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -0
- package/templates/nextblock-template/app/cms/dashboard/page.tsx +191 -151
- package/templates/nextblock-template/app/cms/import-export/ContentTransferControls.tsx +391 -0
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -0
- package/templates/nextblock-template/app/cms/layout.tsx +29 -10
- package/templates/nextblock-template/app/cms/media/UploadFolderContext.tsx +22 -22
- package/templates/nextblock-template/app/cms/media/actions.ts +45 -124
- package/templates/nextblock-template/app/cms/media/components/DeleteMediaButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/media/components/MediaEditForm.tsx +26 -26
- package/templates/nextblock-template/app/cms/media/components/MediaGridClient.tsx +69 -64
- package/templates/nextblock-template/app/cms/media/components/MediaPickerDialog.tsx +227 -158
- package/templates/nextblock-template/app/cms/media/components/MediaUploadForm.tsx +101 -89
- package/templates/nextblock-template/app/cms/media/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/navigation/components/NavigationItemForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/orders/[id]/MarkPaidButton.tsx +44 -0
- package/templates/nextblock-template/app/cms/orders/[id]/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/orders/actions.ts +201 -0
- package/templates/nextblock-template/app/cms/orders/page.tsx +20 -0
- package/templates/nextblock-template/app/cms/orders/types.ts +20 -0
- package/templates/nextblock-template/app/cms/pages/[id]/edit/EditPageClient.tsx +156 -121
- package/templates/nextblock-template/app/cms/pages/[id]/edit/page.tsx +79 -26
- package/templates/nextblock-template/app/cms/pages/actions.ts +54 -38
- package/templates/nextblock-template/app/cms/pages/components/DeletePageButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/pages/components/PageForm.tsx +267 -116
- package/templates/nextblock-template/app/cms/pages/page.tsx +25 -18
- package/templates/nextblock-template/app/cms/payments/page.tsx +16 -0
- package/templates/nextblock-template/app/cms/posts/[id]/edit/page.tsx +132 -90
- package/templates/nextblock-template/app/cms/posts/actions.ts +71 -72
- package/templates/nextblock-template/app/cms/posts/components/DeletePostButtonClient.tsx +1 -1
- package/templates/nextblock-template/app/cms/posts/components/PostForm.tsx +256 -245
- package/templates/nextblock-template/app/cms/posts/new/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/posts/page.tsx +20 -13
- package/templates/nextblock-template/app/cms/products/ClientNotionEditor.tsx +16 -0
- package/templates/nextblock-template/app/cms/products/ProductFormClientShell.tsx +56 -0
- package/templates/nextblock-template/app/cms/products/[id]/edit/page.tsx +292 -0
- package/templates/nextblock-template/app/cms/products/attributes/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -0
- package/templates/nextblock-template/app/cms/products/inventory/page.tsx +13 -0
- package/templates/nextblock-template/app/cms/products/new/page.tsx +143 -0
- package/templates/nextblock-template/app/cms/products/page.tsx +42 -0
- package/templates/nextblock-template/app/cms/products/productFormData.ts +133 -0
- package/templates/nextblock-template/app/cms/products/settings/page.tsx +5 -0
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -0
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -0
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -0
- package/templates/nextblock-template/app/cms/revisions/RevisionHistoryButton.tsx +2 -2
- package/templates/nextblock-template/app/cms/revisions/actions.ts +285 -285
- package/templates/nextblock-template/app/cms/revisions/service.ts +19 -16
- package/templates/nextblock-template/app/cms/revisions/utils.ts +8 -3
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -0
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/actions.ts +93 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/components/BotProtectionForm.tsx +129 -0
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -0
- package/templates/nextblock-template/app/cms/settings/copyright/actions.ts +1 -1
- package/templates/nextblock-template/app/cms/settings/copyright/components/CopyrightForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/settings/copyright/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +496 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/StoredCortexAiSettingsClient.tsx +410 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/actions.ts +248 -0
- package/templates/nextblock-template/app/cms/settings/cortex-ai/page.tsx +80 -0
- package/templates/nextblock-template/app/cms/settings/currencies/actions.ts +331 -0
- package/templates/nextblock-template/app/cms/settings/currencies/page.tsx +494 -0
- package/templates/nextblock-template/app/cms/settings/extra-translations/ExtraTranslationsWorkspace.tsx +767 -0
- package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +203 -44
- package/templates/nextblock-template/app/cms/settings/extra-translations/page.tsx +93 -242
- package/templates/nextblock-template/app/cms/settings/global-css/actions.ts +65 -0
- package/templates/nextblock-template/app/cms/settings/global-css/components/GlobalCssForm.tsx +46 -0
- package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +24 -0
- package/templates/nextblock-template/app/cms/settings/languages/components/DeleteLanguageButton.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/languages/components/LanguageForm.tsx +2 -2
- package/templates/nextblock-template/app/cms/settings/languages/page.tsx +1 -1
- package/templates/nextblock-template/app/cms/settings/logos/[id]/edit/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/settings/logos/actions.ts +82 -6
- package/templates/nextblock-template/app/cms/settings/logos/components/BrandingSettingsForm.tsx +339 -0
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -18
- package/templates/nextblock-template/app/cms/settings/logos/components/LogoForm.tsx +20 -16
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -0
- package/templates/nextblock-template/app/cms/settings/logos/new/page.tsx +8 -8
- package/templates/nextblock-template/app/cms/settings/logos/page.tsx +120 -82
- package/templates/nextblock-template/app/cms/settings/logos/types.ts +8 -8
- package/templates/nextblock-template/app/cms/settings/packages/activation-form.tsx +84 -0
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +122 -0
- package/templates/nextblock-template/app/cms/settings/packages/page.tsx +49 -0
- package/templates/nextblock-template/app/cms/settings/privacy/actions.ts +53 -0
- package/templates/nextblock-template/app/cms/settings/privacy/components/PrivacyForm.tsx +196 -0
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +26 -0
- package/templates/nextblock-template/app/cms/settings/security/actions.ts +251 -0
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +453 -0
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +13 -0
- package/templates/nextblock-template/app/cms/settings/taxes/page.tsx +21 -0
- package/templates/nextblock-template/app/cms/shipping/page.tsx +20 -0
- package/templates/nextblock-template/app/cms/users/[id]/edit/page.tsx +28 -23
- package/templates/nextblock-template/app/cms/users/actions.ts +105 -40
- package/templates/nextblock-template/app/cms/users/components/DeleteUserButton.tsx +1 -1
- package/templates/nextblock-template/app/cms/users/components/UserForm.tsx +65 -152
- package/templates/nextblock-template/app/cms/users/page.tsx +15 -10
- package/templates/nextblock-template/app/globals.css +9 -0
- package/templates/nextblock-template/app/layout.tsx +372 -116
- package/templates/nextblock-template/app/lib/seo.test.ts +52 -0
- package/templates/nextblock-template/app/lib/seo.ts +279 -0
- package/templates/nextblock-template/app/lib/site-settings.ts +87 -0
- package/templates/nextblock-template/app/lib/sitemap-utils.ts +224 -39
- package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -0
- package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -0
- package/templates/nextblock-template/app/lib/ucp/server.ts +1914 -0
- package/templates/nextblock-template/app/page.tsx +165 -73
- package/templates/nextblock-template/app/product/[slug]/page.tsx +433 -0
- package/templates/nextblock-template/app/profile/ProfileAccountSidebar.tsx +73 -0
- package/templates/nextblock-template/app/profile/ProfilePageHeader.tsx +16 -0
- package/templates/nextblock-template/app/profile/ProfilePageMissingState.tsx +9 -0
- package/templates/nextblock-template/app/profile/account-data.ts +37 -0
- package/templates/nextblock-template/app/profile/account-links.ts +22 -0
- package/templates/nextblock-template/app/profile/account-types.ts +11 -0
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -0
- package/templates/nextblock-template/app/profile/orders/[id]/CustomerOrderDetailPageClient.tsx +79 -0
- package/templates/nextblock-template/app/profile/orders/[id]/page.tsx +32 -0
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -0
- package/templates/nextblock-template/app/profile/page.tsx +51 -0
- package/templates/nextblock-template/app/profile/password/PasswordSettingsPageClient.tsx +128 -0
- package/templates/nextblock-template/app/profile/password/actions.ts +59 -0
- package/templates/nextblock-template/app/profile/password/page.tsx +27 -0
- package/templates/nextblock-template/app/providers.tsx +55 -17
- package/templates/nextblock-template/app/robots.txt/route.ts +11 -1
- package/templates/nextblock-template/app/sitemap.ts +128 -0
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -0
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -0
- package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -0
- package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -0
- package/templates/nextblock-template/components/AppShell.tsx +154 -0
- package/templates/nextblock-template/components/BlockRenderer.tsx +210 -64
- package/templates/nextblock-template/components/CartDrawerLoader.tsx +7 -0
- package/templates/nextblock-template/components/CartTranslator.tsx +210 -0
- package/templates/nextblock-template/components/CurrentContentSetter.tsx +25 -0
- package/templates/nextblock-template/components/DeferredCartDrawer.tsx +23 -0
- package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -0
- package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -0
- package/templates/nextblock-template/components/DeferredGoogleTagManager.tsx +70 -0
- package/templates/nextblock-template/components/DeferredSpeedInsights.tsx +69 -0
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -0
- package/templates/nextblock-template/components/GitHubLoginButton.tsx +36 -0
- package/templates/nextblock-template/components/GlobalSearch.tsx +557 -0
- package/templates/nextblock-template/components/Header.tsx +49 -41
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +55 -32
- package/templates/nextblock-template/components/ResponsiveNav.tsx +138 -43
- package/templates/nextblock-template/components/blocks/PostCardSkeleton.tsx +12 -8
- package/templates/nextblock-template/components/blocks/PostsGridBlock.tsx +12 -55
- package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +42 -37
- package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +6 -2
- package/templates/nextblock-template/components/blocks/ecommerceRendererLoaders.ts +23 -0
- package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -0
- package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -84
- package/templates/nextblock-template/components/blocks/renderers/CartBlockRenderer.tsx +17 -0
- package/templates/nextblock-template/components/blocks/renderers/CheckoutBlockRenderer.tsx +19 -0
- package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +262 -8
- package/templates/nextblock-template/components/blocks/renderers/FeaturedProductBlockRenderer.tsx +22 -0
- package/templates/nextblock-template/components/blocks/renderers/FormBlockRenderer.tsx +320 -37
- package/templates/nextblock-template/components/blocks/renderers/HeadingBlockRenderer.tsx +11 -8
- package/templates/nextblock-template/components/blocks/renderers/ImageBlockRenderer.tsx +12 -3
- package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +18 -13
- package/templates/nextblock-template/components/blocks/renderers/ProductDetailsBlockRenderer.tsx +90 -0
- package/templates/nextblock-template/components/blocks/renderers/ProductGridBlockRenderer.tsx +31 -0
- package/templates/nextblock-template/components/blocks/renderers/SectionBlockRenderer.tsx +424 -55
- package/templates/nextblock-template/components/blocks/renderers/SectionSlider.tsx +137 -0
- package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -0
- package/templates/nextblock-template/components/blocks/renderers/TextBlockRenderer.tsx +37 -22
- package/templates/nextblock-template/components/blocks/renderers/VideoEmbedBlockRenderer.tsx +23 -15
- package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +1 -3
- package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +1 -3
- package/templates/nextblock-template/components/blocks/types.ts +7 -6
- package/templates/nextblock-template/components/env-var-warning.tsx +3 -3
- package/templates/nextblock-template/components/form-message.tsx +32 -26
- package/templates/nextblock-template/components/header-auth.tsx +69 -17
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +127 -0
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +59 -0
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -0
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -0
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +464 -0
- package/templates/nextblock-template/components/theme-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -0
- package/templates/nextblock-template/components/visual-editing/NextblockVisualEditing.tsx +1172 -0
- package/templates/nextblock-template/context/AuthContext.tsx +23 -90
- package/templates/nextblock-template/context/CurrentContentContext.tsx +10 -4
- package/templates/nextblock-template/context/LanguageContext.tsx +16 -16
- package/templates/nextblock-template/context/language-rest-client.ts +31 -0
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -0
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -0
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -0
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +252 -0
- package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +238 -0
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +125 -0
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -0
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +1319 -0
- package/templates/nextblock-template/docs/09-LIVE-DRAFT-MODE.md +104 -0
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -0
- package/templates/nextblock-template/docs/README.md +34 -0
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12507 -0
- package/templates/nextblock-template/hooks/use-hotkeys.ts +21 -14
- package/templates/nextblock-template/hooks/useGlobalSearch.ts +101 -0
- package/templates/nextblock-template/index.d.ts +2 -0
- package/templates/nextblock-template/lib/ai-block-generation.ts +339 -0
- package/templates/nextblock-template/lib/ai-client.ts +247 -0
- package/templates/nextblock-template/lib/ai-config.ts +81 -0
- package/templates/nextblock-template/lib/ai-cortex-widget-builder.ts +125 -0
- package/templates/nextblock-template/lib/ai-global-agent-custom-block-tools.ts +363 -0
- package/templates/nextblock-template/lib/ai-global-agent-db-tools.test.ts +405 -0
- package/templates/nextblock-template/lib/ai-global-agent-db-tools.ts +1228 -0
- package/templates/nextblock-template/lib/ai-global-agent-ecommerce.ts +5 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools-stats.test.ts +223 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools.test.ts +2183 -0
- package/templates/nextblock-template/lib/ai-global-agent-tools.ts +4807 -0
- package/templates/nextblock-template/lib/ai-key-crypto.test.ts +70 -0
- package/templates/nextblock-template/lib/ai-key-crypto.ts +132 -0
- package/templates/nextblock-template/lib/ai-model-catalog.test.ts +49 -0
- package/templates/nextblock-template/lib/ai-model-catalog.ts +41 -0
- package/templates/nextblock-template/lib/ai-model-registry.test.ts +231 -0
- package/templates/nextblock-template/lib/ai-model-registry.ts +522 -0
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -0
- package/templates/nextblock-template/lib/auth/crypto.ts +42 -0
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -0
- package/templates/nextblock-template/lib/auth/twoFactor.ts +167 -0
- package/templates/nextblock-template/lib/auth-redirects.ts +46 -0
- package/templates/nextblock-template/lib/blocks/FeaturedProductBlock.tsx +94 -0
- package/templates/nextblock-template/lib/blocks/ProductGridBlock.tsx +137 -0
- package/templates/nextblock-template/lib/blocks/README.md +13 -670
- package/templates/nextblock-template/lib/blocks/blockRegistry.ts +138 -56
- package/templates/nextblock-template/lib/blocks/blockTypes.ts +18 -0
- package/templates/nextblock-template/lib/blocks/ecommerce-block-schemas.ts +31 -0
- package/templates/nextblock-template/lib/cms-transfer/csv.test.ts +77 -0
- package/templates/nextblock-template/lib/cms-transfer/csv.ts +399 -0
- package/templates/nextblock-template/lib/cms-transfer/server.ts +2243 -0
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -0
- package/templates/nextblock-template/lib/cortex-widget-registry.test.ts +199 -0
- package/templates/nextblock-template/lib/cortex-widget-registry.ts +88 -0
- package/templates/nextblock-template/lib/cortex-widget-schema.test.tsx +237 -0
- package/templates/nextblock-template/lib/cortex-widget-schema.ts +393 -0
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -0
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +68 -0
- package/templates/nextblock-template/lib/custom-block-relation-registry.ts +256 -0
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -0
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -0
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -0
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -0
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -0
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -0
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -0
- package/templates/nextblock-template/lib/full-backup/server.ts +743 -0
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +45 -0
- package/templates/nextblock-template/lib/posts/readTime.ts +60 -0
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -0
- package/templates/nextblock-template/lib/privacy/settings.ts +103 -0
- package/templates/nextblock-template/lib/privacy/types.ts +67 -0
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -0
- package/templates/nextblock-template/lib/promotions/server.ts +741 -0
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -0
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -0
- package/templates/nextblock-template/lib/search/server.ts +585 -0
- package/templates/nextblock-template/lib/search/types.ts +27 -0
- package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -0
- package/templates/nextblock-template/lib/visual-editing/draft-content.ts +380 -0
- package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -0
- package/templates/nextblock-template/lib/visual-editing/draft-route.ts +82 -0
- package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -0
- package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -0
- package/templates/nextblock-template/lib/visual-editing/mutations.ts +190 -0
- package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -0
- package/templates/nextblock-template/lib/visual-editing/product-drafts.ts +511 -0
- package/templates/nextblock-template/lib/visual-editing/types.ts +122 -0
- package/templates/nextblock-template/lib/zod-config.ts +5 -0
- package/templates/nextblock-template/next.config.js +190 -66
- package/templates/nextblock-template/package.json +34 -30
- package/templates/nextblock-template/proxy.ts +435 -253
- package/templates/nextblock-template/public/images/NBcover.webp +0 -0
- package/templates/nextblock-template/public/images/cap.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-plan.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-square.webp +0 -0
- package/templates/nextblock-template/public/images/commerce-wide.webp +0 -0
- package/templates/nextblock-template/public/images/cortex-ai-square.webp +0 -0
- package/templates/nextblock-template/public/images/cortex-ai.webp +0 -0
- package/templates/nextblock-template/public/images/extensibility.webp +0 -0
- package/templates/nextblock-template/public/images/goals.webp +0 -0
- package/templates/nextblock-template/public/images/included.webp +0 -0
- package/templates/nextblock-template/public/images/nx-graph.webp +0 -0
- package/templates/nextblock-template/public/images/pants.webp +0 -0
- package/templates/nextblock-template/public/images/t-shirt.webp +0 -0
- package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +100 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -0
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -0
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -0
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -0
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -0
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -0
- package/templates/nextblock-template/tailwind.config.js +1 -0
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -0
- package/templates/nextblock-template/tools/deploy-supabase.js +69 -71
- package/templates/nextblock-template/tsconfig.json +52 -66
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -0
- package/templates/nextblock-template/app/force-styles.tsx +0 -31
- package/templates/nextblock-template/app/sitemap.xml/route.ts +0 -63
- package/templates/nextblock-template/components/blocks/renderers/HeroBlockRenderer.tsx +0 -273
- package/templates/nextblock-template/docs/How to Create a Custom Block.md +0 -149
- package/templates/nextblock-template/docs/cms-application-overview.md +0 -56
- package/templates/nextblock-template/docs/cms-architecture-overview.md +0 -73
- package/templates/nextblock-template/docs/files-structure.md +0 -426
- package/templates/nextblock-template/docs/tiptap-bundle-optimization-summary.md +0 -174
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-nextblock",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.8.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"bin": {
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
"execa": "^9.3.0",
|
|
24
24
|
"fs-extra": "^11.3.2",
|
|
25
25
|
"inquirer": "^12.10.0",
|
|
26
|
-
"open": "^10.1.0",
|
|
27
26
|
"ora": "^8.0.1",
|
|
28
27
|
"picocolors": "^1.1.1"
|
|
29
28
|
}
|
package/scripts/sync-template.js
CHANGED
|
@@ -11,6 +11,7 @@ const PROJECT_ROOT = resolve(__dirname, '..');
|
|
|
11
11
|
const SOURCE_DIR = resolve(PROJECT_ROOT, '../nextblock');
|
|
12
12
|
const TARGET_DIR = resolve(PROJECT_ROOT, 'templates/nextblock-template');
|
|
13
13
|
const REPO_ROOT = resolve(PROJECT_ROOT, '..', '..');
|
|
14
|
+
const ROOT_DOCS_DIR = resolve(REPO_ROOT, 'docs');
|
|
14
15
|
const ROOT_PACKAGE_JSON = resolve(REPO_ROOT, 'package.json');
|
|
15
16
|
const UI_GLOBALS_SOURCE = resolve(
|
|
16
17
|
PROJECT_ROOT,
|
|
@@ -87,6 +88,7 @@ async function ensureTemplateSync() {
|
|
|
87
88
|
await ensureTemplateGitignore();
|
|
88
89
|
await ensureGlobalStyles();
|
|
89
90
|
await ensureClientTranslations();
|
|
91
|
+
await ensureDocsSync();
|
|
90
92
|
await sanitizeBlockEditorImports();
|
|
91
93
|
await sanitizeUiImports();
|
|
92
94
|
await ensureUiProxies();
|
|
@@ -116,7 +118,7 @@ async function ensureEnvExample() {
|
|
|
116
118
|
}
|
|
117
119
|
}
|
|
118
120
|
|
|
119
|
-
const placeholder = `# Environment variables for NextBlock CMS
|
|
121
|
+
const placeholder = `# Environment variables for NextBlock™ CMS
|
|
120
122
|
NEXT_PUBLIC_SUPABASE_URL=
|
|
121
123
|
NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
122
124
|
SUPABASE_SERVICE_ROLE_KEY=
|
|
@@ -127,6 +129,21 @@ NEXT_PUBLIC_URL=http://localhost:3000
|
|
|
127
129
|
await fs.writeFile(destination, placeholder);
|
|
128
130
|
}
|
|
129
131
|
|
|
132
|
+
async function ensureDocsSync() {
|
|
133
|
+
const destination = resolve(TARGET_DIR, 'docs');
|
|
134
|
+
console.log(
|
|
135
|
+
chalk.blue(
|
|
136
|
+
`Syncing docs from ${chalk.bold(relative(PROJECT_ROOT, ROOT_DOCS_DIR))}`,
|
|
137
|
+
),
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
await fs.emptyDir(destination);
|
|
141
|
+
await fs.copy(ROOT_DOCS_DIR, destination, {
|
|
142
|
+
dereference: true,
|
|
143
|
+
filter: (src) => !src.includes('node_modules'),
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
|
|
130
147
|
async function ensureTemplateGitignore() {
|
|
131
148
|
const destination = resolve(TARGET_DIR, 'gitignore'); // Rename to gitignore
|
|
132
149
|
const content = `.DS_Store
|
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
{
|
|
2
|
-
"jsc": {
|
|
3
|
-
"target": "
|
|
4
|
-
"parser": {
|
|
5
|
-
"syntax": "typescript",
|
|
6
|
-
"decorators": true,
|
|
7
|
-
"dynamicImport": true
|
|
8
|
-
},
|
|
9
|
-
"transform": {
|
|
10
|
-
"decoratorMetadata": true,
|
|
11
|
-
"legacyDecorator": true
|
|
12
|
-
},
|
|
13
|
-
"keepClassNames": true,
|
|
14
|
-
"externalHelpers": true,
|
|
15
|
-
"loose": true
|
|
16
|
-
},
|
|
17
|
-
"module": {
|
|
18
|
-
"type": "commonjs"
|
|
19
|
-
},
|
|
20
|
-
"sourceMaps": true,
|
|
21
|
-
"exclude": [
|
|
22
|
-
"jest.config.ts",
|
|
23
|
-
".*\\.spec.tsx?$",
|
|
24
|
-
".*\\.test.tsx?$",
|
|
25
|
-
"./src/jest-setup.ts$",
|
|
26
|
-
"./**/jest-setup.ts$",
|
|
27
|
-
".*.js$",
|
|
28
|
-
".*.d.ts$"
|
|
29
|
-
]
|
|
30
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"jsc": {
|
|
3
|
+
"target": "es2022",
|
|
4
|
+
"parser": {
|
|
5
|
+
"syntax": "typescript",
|
|
6
|
+
"decorators": true,
|
|
7
|
+
"dynamicImport": true
|
|
8
|
+
},
|
|
9
|
+
"transform": {
|
|
10
|
+
"decoratorMetadata": true,
|
|
11
|
+
"legacyDecorator": true
|
|
12
|
+
},
|
|
13
|
+
"keepClassNames": true,
|
|
14
|
+
"externalHelpers": true,
|
|
15
|
+
"loose": true
|
|
16
|
+
},
|
|
17
|
+
"module": {
|
|
18
|
+
"type": "commonjs"
|
|
19
|
+
},
|
|
20
|
+
"sourceMaps": true,
|
|
21
|
+
"exclude": [
|
|
22
|
+
"jest.config.ts",
|
|
23
|
+
".*\\.spec.tsx?$",
|
|
24
|
+
".*\\.test.tsx?$",
|
|
25
|
+
"./src/jest-setup.ts$",
|
|
26
|
+
"./**/jest-setup.ts$",
|
|
27
|
+
".*.js$",
|
|
28
|
+
".*.d.ts$"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
@@ -1,125 +1,34 @@
|
|
|
1
|
-
#
|
|
1
|
+
# apps/nextblock
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
`apps/nextblock` is the canonical NextBlock™ application. It contains:
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
- the public site
|
|
6
|
+
- the authenticated CMS
|
|
7
|
+
- checkout and webhook routes
|
|
8
|
+
- cron routes
|
|
9
|
+
- the route tree used as the source for the scaffold template
|
|
6
10
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
- Block-based content editor for Pages and Posts
|
|
10
|
-
- Media uploads to Cloudflare R2 with a Media Library
|
|
11
|
-
- Static Site Generation (SSG) with Incremental Static Regeneration (ISR) for public-facing content
|
|
12
|
-
- On-demand revalidation via Supabase Database Webhooks
|
|
11
|
+
If you are trying to understand current runtime behavior, start here before you
|
|
12
|
+
look at generated template output.
|
|
13
13
|
|
|
14
|
-
##
|
|
14
|
+
## Related Docs
|
|
15
15
|
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
16
|
+
- [Project Overview](../../docs/01-PROJECT-OVERVIEW.md)
|
|
17
|
+
- [Ecommerce Capabilities](../../docs/02-ECOMMERCE-CAPABILITIES.md)
|
|
18
|
+
- [CMS and Editor](../../docs/03-CMS-AND-EDITOR.md)
|
|
19
|
+
- [Database and Auth](../../docs/04-DATABASE-AND-AUTH.md)
|
|
20
|
+
- [Developer Guide](../../docs/05-DEVELOPER-GUIDE.md)
|
|
21
|
+
- [CLI and Scaffolding](../../docs/06-CLI-AND-SCAFFOLDING.md)
|
|
22
22
|
|
|
23
|
-
##
|
|
23
|
+
## Common Workflows
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
From the repo root:
|
|
26
26
|
|
|
27
27
|
```bash
|
|
28
|
-
|
|
28
|
+
npx nx serve nextblock
|
|
29
|
+
npx nx build nextblock
|
|
30
|
+
npx nx lint nextblock --skip-nx-cache
|
|
29
31
|
```
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
1. Scaffold a new NextBlock project.
|
|
34
|
-
2. Guide you through Supabase and Cloudflare R2 configuration.
|
|
35
|
-
3. Set up your local environment variables automatically.
|
|
36
|
-
|
|
37
|
-
### Manual Setup
|
|
38
|
-
|
|
39
|
-
If you are contributing to the core repo or prefer manual setup:
|
|
40
|
-
|
|
41
|
-
1. **Clone the repo:**
|
|
42
|
-
|
|
43
|
-
```bash
|
|
44
|
-
git clone https://github.com/nextblock-cms/nextblock.git
|
|
45
|
-
cd nextblock
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
2. **Install dependencies:**
|
|
49
|
-
|
|
50
|
-
```bash
|
|
51
|
-
npm install
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
3. **Setup Environment:**
|
|
55
|
-
Copy `.env.exemple` to `apps/nextblock/.env.local` and fill in your Supabase/R2 credentials.
|
|
56
|
-
|
|
57
|
-
4. **Run the Dev Server:**
|
|
58
|
-
|
|
59
|
-
```bash
|
|
60
|
-
nx serve nextblock
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
5. **Initial Admin User Setup:**
|
|
64
|
-
- Sign up for a new user account through the application's sign-up page.
|
|
65
|
-
- After signing up and verifying the email, you'll need to manually update this user's role to `ADMIN` in the Supabase `profiles` table.
|
|
66
|
-
|
|
67
|
-
6. **Shadcn/UI Styling (Optional):**
|
|
68
|
-
- This template comes with the default shadcn/ui style initialized. If you want to customize the theme or use a different base color, you can delete `components.json` and re-initialize shadcn/ui following their [official documentation](https://ui.shadcn.com/docs/installation/next).
|
|
69
|
-
|
|
70
|
-
## Project Structure Highlights
|
|
71
|
-
|
|
72
|
-
- `app/`: Next.js App Router.
|
|
73
|
-
- `app/(auth-pages)/`: Routes for sign-in, sign-up, etc.
|
|
74
|
-
- `app/cms/`: CMS admin panel routes and layouts.
|
|
75
|
-
- `app/cms/[entity]/`: CRUD pages for different content types (pages, posts, media, users, navigation, languages).
|
|
76
|
-
- `app/cms/blocks/`: Components and actions related to the block editor.
|
|
77
|
-
- `app/[slug]/`: Dynamic route for public "Pages".
|
|
78
|
-
- `app/article/[slug]/`: Dynamic route for public "Articles".
|
|
79
|
-
- `app/api/`: API routes (e.g., for revalidation, R2 pre-signed URLs).
|
|
80
|
-
- `components/`: Shared UI components (shadcn/ui based).
|
|
81
|
-
- `components/ui/`: shadcn/ui components.
|
|
82
|
-
- `context/`: React Context providers (e.g., `AuthContext`, `LanguageContext`).
|
|
83
|
-
- `lib/`: Utility functions and configurations.
|
|
84
|
-
- `lib/cloudflare/`: Client for Cloudflare R2.
|
|
85
|
-
- `utils/supabase/`: Supabase client setup, types, and middleware helpers.
|
|
86
|
-
- `supabase/migrations/`: SQL database migrations.
|
|
87
|
-
|
|
88
|
-
## Documentation
|
|
89
|
-
|
|
90
|
-
For a deeper understanding of the CMS's internal workings, please refer to the detailed documentation:
|
|
91
|
-
|
|
92
|
-
- **[CMS Application Overview](./docs/cms-application-overview.md):** A high-level guide to the Next.js application structure, core modules, and key functionalities.
|
|
93
|
-
- **[Block Editor Architecture](./docs/cms-architecture-overview.md):** A technical deep-dive into the architecture of the block-based content editor.
|
|
94
|
-
|
|
95
|
-
## Deployment
|
|
96
|
-
|
|
97
|
-
This project is optimized for deployment on [Vercel](https://vercel.com/).
|
|
98
|
-
|
|
99
|
-
1. Push your code to a GitHub/GitLab/Bitbucket repository.
|
|
100
|
-
2. Import the project into Vercel.
|
|
101
|
-
3. **Configure Environment Variables in Vercel:**
|
|
102
|
-
- Add all the environment variables from your `.env.local` file to your Vercel project settings (Project Settings -> Environment Variables). This includes Supabase keys, R2 keys, `NEXT_PUBLIC_SITE_URL` (set to your production domain), and `REVALIDATE_SECRET_TOKEN`.
|
|
103
|
-
4. Vercel will automatically build and deploy your Next.js application.
|
|
104
|
-
5. Ensure your Supabase Database Webhooks are pointing to your production Next.js API endpoint for revalidation.
|
|
105
|
-
|
|
106
|
-
## Database Backup
|
|
107
|
-
|
|
108
|
-
This project includes a simple script to backup your Supabase PostgreSQL database.
|
|
109
|
-
|
|
110
|
-
**Requirements:**
|
|
111
|
-
|
|
112
|
-
- You must have the PostgreSQL command-line tools (`pg_dump`) installed and available in your system's PATH.
|
|
113
|
-
|
|
114
|
-
**Usage:**
|
|
115
|
-
To create a backup, run the following command from your project root:
|
|
116
|
-
|
|
117
|
-
```bash
|
|
118
|
-
npm run db:backup
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
This command will generate a timestamped SQL dump file and save it to the `backup/` directory.
|
|
122
|
-
|
|
123
|
-
## Feedback and Issues
|
|
124
|
-
|
|
125
|
-
Please file feedback and issues on the GitHub repository for this project.
|
|
33
|
+
Use the root docs for architecture and workflow details instead of maintaining a
|
|
34
|
+
second app-specific guide here.
|
|
@@ -1,28 +1,27 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
1
|
+
import { createClient } from '@nextblock-cms/db/server';
|
|
2
|
+
import { redirect } from 'next/navigation';
|
|
3
|
+
import { resolvePostAuthRedirect } from '../../../lib/auth-redirects';
|
|
4
|
+
|
|
5
|
+
export default async function PostSignIn({
|
|
6
|
+
searchParams,
|
|
7
|
+
}: {
|
|
8
|
+
searchParams: Promise<{ redirect_to?: string }>;
|
|
9
|
+
}) {
|
|
10
|
+
const params = await searchParams;
|
|
11
|
+
const supabase = createClient();
|
|
12
|
+
const {
|
|
13
|
+
data: { user },
|
|
14
|
+
} = await supabase.auth.getUser();
|
|
15
|
+
|
|
16
|
+
if (!user) {
|
|
17
|
+
redirect('/sign-in');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const { data: profile } = await supabase
|
|
21
|
+
.from('profiles')
|
|
22
|
+
.select('role, full_name')
|
|
23
|
+
.eq('id', user.id)
|
|
24
|
+
.single();
|
|
25
|
+
|
|
26
|
+
redirect(resolvePostAuthRedirect(profile ?? null, params.redirect_to));
|
|
27
|
+
}
|
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
import { signInAction } from "../../actions";
|
|
4
4
|
import { FormMessage, Message } from "../../../components/form-message";
|
|
5
5
|
import { SubmitButton } from "../../../components/submit-button";
|
|
6
|
-
import { Input } from "@nextblock-cms/ui";
|
|
7
|
-
import { Label } from "@nextblock-cms/ui";
|
|
6
|
+
import { Input, Label } from "@nextblock-cms/ui";
|
|
8
7
|
import Link from "next/link";
|
|
9
8
|
import { useTranslations } from "@nextblock-cms/utils";
|
|
10
9
|
import { useSearchParams } from "next/navigation";
|
|
@@ -27,13 +26,16 @@ function getMessage(searchParams: URLSearchParams): Message | undefined {
|
|
|
27
26
|
return undefined;
|
|
28
27
|
}
|
|
29
28
|
|
|
29
|
+
import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
|
|
30
|
+
|
|
30
31
|
export default function Login() {
|
|
31
32
|
const { t } = useTranslations();
|
|
32
33
|
const searchParams = useSearchParams();
|
|
33
34
|
const formMessage = getMessage(searchParams);
|
|
35
|
+
const redirectParam = searchParams.get('redirect');
|
|
34
36
|
|
|
35
37
|
return (
|
|
36
|
-
<
|
|
38
|
+
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
37
39
|
<SandboxCredentialsAlert />
|
|
38
40
|
<h1 className="text-2xl font-medium">{t('sign_in')}</h1>
|
|
39
41
|
<p className="text-sm text-foreground">
|
|
@@ -42,29 +44,52 @@ export default function Login() {
|
|
|
42
44
|
{t('sign_up')}
|
|
43
45
|
</Link>
|
|
44
46
|
</p>
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
<
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
<
|
|
51
|
-
className="
|
|
52
|
-
|
|
53
|
-
>
|
|
54
|
-
{t('
|
|
55
|
-
</
|
|
47
|
+
|
|
48
|
+
<div className="flex flex-col gap-2 mt-8">
|
|
49
|
+
<GitHubLoginButton t={t} redirectTo={redirectParam || undefined} />
|
|
50
|
+
|
|
51
|
+
<div className="relative py-2">
|
|
52
|
+
<div className="absolute inset-0 flex items-center">
|
|
53
|
+
<span className="w-full border-t" />
|
|
54
|
+
</div>
|
|
55
|
+
<div className="relative flex justify-center text-xs uppercase">
|
|
56
|
+
<span className="bg-background px-2 text-muted-foreground">{t('or_continue_with') || "Or continue with"}</span>
|
|
57
|
+
</div>
|
|
56
58
|
</div>
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
name="
|
|
60
|
-
|
|
61
|
-
required
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
59
|
+
|
|
60
|
+
<form className="flex flex-col gap-2 [&>input]:mb-3">
|
|
61
|
+
{redirectParam && <input type="hidden" name="redirect" value={redirectParam} />}
|
|
62
|
+
<Label htmlFor="email">{t('email')}</Label>
|
|
63
|
+
<Input name="email" placeholder={t('you_at_example_com')} required />
|
|
64
|
+
<div className="flex justify-between items-center">
|
|
65
|
+
<Label htmlFor="password">{t('password')}</Label>
|
|
66
|
+
{process.env.NEXT_PUBLIC_IS_SANDBOX !== 'true' && <Link
|
|
67
|
+
className="text-xs text-foreground underline"
|
|
68
|
+
href="/forgot-password"
|
|
69
|
+
>
|
|
70
|
+
{t('forgot_password')}
|
|
71
|
+
</Link>}
|
|
72
|
+
</div>
|
|
73
|
+
<Input
|
|
74
|
+
type="password"
|
|
75
|
+
name="password"
|
|
76
|
+
placeholder={t('your_password')}
|
|
77
|
+
required
|
|
78
|
+
/>
|
|
79
|
+
<label className="mb-3 flex items-center gap-2 text-sm text-muted-foreground">
|
|
80
|
+
<input
|
|
81
|
+
type="checkbox"
|
|
82
|
+
name="remember_device"
|
|
83
|
+
className="h-4 w-4 rounded border-input accent-primary"
|
|
84
|
+
/>
|
|
85
|
+
{t('remember_this_device') || 'Remember this device'}
|
|
86
|
+
</label>
|
|
87
|
+
<SubmitButton pendingText={t('signing_in_pending')} formAction={signInAction}>
|
|
88
|
+
{t('sign_in')}
|
|
89
|
+
</SubmitButton>
|
|
90
|
+
<FormMessage message={formMessage} />
|
|
91
|
+
</form>
|
|
67
92
|
</div>
|
|
68
|
-
</
|
|
93
|
+
</div>
|
|
69
94
|
);
|
|
70
95
|
}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
-
'use client';
|
|
2
|
-
|
|
3
|
-
import { signUpAction } from "../../actions";
|
|
4
|
-
import { FormMessage, Message } from "../../../components/form-message";
|
|
5
|
-
import { SubmitButton } from "../../../components/submit-button";
|
|
6
|
-
import { Input } from "@nextblock-cms/ui";
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
import { signUpAction } from "../../actions";
|
|
4
|
+
import { FormMessage, Message } from "../../../components/form-message";
|
|
5
|
+
import { SubmitButton } from "../../../components/submit-button";
|
|
6
|
+
import { Button, Input, Label } from "@nextblock-cms/ui";
|
|
7
|
+
import Link from "next/link";
|
|
8
|
+
import { useTranslations } from "@nextblock-cms/utils";
|
|
9
|
+
import { useSearchParams } from "next/navigation";
|
|
10
|
+
import { GitHubLoginButton } from "../../../components/GitHubLoginButton";
|
|
11
|
+
import { ArrowRight, CheckCircle2, Mail } from "lucide-react";
|
|
12
|
+
|
|
13
|
+
import { SandboxCredentialsAlert } from "../../../components/SandboxCredentialsAlert";
|
|
13
14
|
|
|
14
15
|
function getMessage(searchParams: URLSearchParams): Message | undefined {
|
|
15
16
|
if (searchParams.has('error')) {
|
|
@@ -27,47 +28,101 @@ function getMessage(searchParams: URLSearchParams): Message | undefined {
|
|
|
27
28
|
return undefined;
|
|
28
29
|
}
|
|
29
30
|
|
|
30
|
-
export default function Signup() {
|
|
31
|
-
const { t } = useTranslations();
|
|
32
|
-
const searchParams = useSearchParams();
|
|
33
|
-
const formMessage = getMessage(searchParams);
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
<
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
31
|
+
export default function Signup() {
|
|
32
|
+
const { t } = useTranslations();
|
|
33
|
+
const searchParams = useSearchParams();
|
|
34
|
+
const formMessage = getMessage(searchParams);
|
|
35
|
+
const successKey = searchParams.get('success');
|
|
36
|
+
|
|
37
|
+
if (successKey) {
|
|
38
|
+
return (
|
|
39
|
+
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
40
|
+
<div className="mb-4 flex h-11 w-11 items-center justify-center rounded-full bg-primary/10 text-primary">
|
|
41
|
+
<CheckCircle2 className="h-5 w-5" />
|
|
42
|
+
</div>
|
|
43
|
+
<p className="text-xs font-medium uppercase tracking-[0.18em] text-muted-foreground">
|
|
44
|
+
{t('auth.signup_success_badge')}
|
|
45
|
+
</p>
|
|
46
|
+
<h1 className="mt-3 text-2xl font-medium">{t('auth.signup_success_title')}</h1>
|
|
47
|
+
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
48
|
+
{t(successKey)}
|
|
49
|
+
</p>
|
|
50
|
+
|
|
51
|
+
<div className="mt-8 rounded-lg border p-5">
|
|
52
|
+
<div className="flex items-start gap-3">
|
|
53
|
+
<div className="mt-0.5 rounded-full bg-muted p-2 text-muted-foreground">
|
|
54
|
+
<Mail className="h-4 w-4" />
|
|
55
|
+
</div>
|
|
56
|
+
<div className="space-y-3 text-sm text-muted-foreground">
|
|
57
|
+
<p>{t('auth.signup_success_step_confirm')}</p>
|
|
58
|
+
<p>{t('auth.signup_success_step_profile')}</p>
|
|
59
|
+
<p>{t('auth.signup_success_step_spam')}</p>
|
|
60
|
+
</div>
|
|
61
|
+
</div>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div className="mt-6 flex flex-col gap-3 sm:flex-row">
|
|
65
|
+
<Button asChild>
|
|
66
|
+
<Link href="/sign-in">
|
|
67
|
+
{t('auth.back_to_sign_in')}
|
|
68
|
+
<ArrowRight className="ml-2 h-4 w-4" />
|
|
69
|
+
</Link>
|
|
70
|
+
</Button>
|
|
71
|
+
<Button asChild variant="outline">
|
|
72
|
+
<Link href="/sign-up">{t('auth.signup_use_different_email')}</Link>
|
|
73
|
+
</Button>
|
|
74
|
+
</div>
|
|
75
|
+
</div>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return (
|
|
80
|
+
<div className="flex-1 flex flex-col w-full max-w-160 mx-auto">
|
|
81
|
+
<form className="flex flex-col">
|
|
82
|
+
<SandboxCredentialsAlert />
|
|
83
|
+
<h1 className="text-2xl font-medium">{t('sign_up')}</h1>
|
|
84
|
+
<p className="mt-2 text-sm leading-6 text-muted-foreground">
|
|
85
|
+
{t('auth.signup_form_description')}
|
|
86
|
+
</p>
|
|
87
|
+
<p className="text-sm text-foreground">
|
|
88
|
+
{t('already_have_account')}{" "}
|
|
89
|
+
<Link className="text-foreground font-medium underline" href="/sign-in">
|
|
90
|
+
{t('sign_in')}
|
|
91
|
+
</Link>
|
|
92
|
+
</p>
|
|
93
|
+
|
|
94
|
+
<div className="mt-8 flex flex-col gap-2">
|
|
95
|
+
<GitHubLoginButton t={t} redirectTo="/profile" />
|
|
96
|
+
|
|
97
|
+
<div className="relative py-2">
|
|
98
|
+
<div className="absolute inset-0 flex items-center">
|
|
99
|
+
<span className="w-full border-t" />
|
|
100
|
+
</div>
|
|
101
|
+
<div className="relative flex justify-center text-xs uppercase">
|
|
102
|
+
<span className="bg-background px-2 text-muted-foreground">
|
|
103
|
+
{t('or_continue_with') || "Or continue with"}
|
|
104
|
+
</span>
|
|
105
|
+
</div>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div className="flex flex-col gap-2 [&>input]:mb-3">
|
|
109
|
+
<Label htmlFor="email">{t('email')}</Label>
|
|
110
|
+
<Input name="email" placeholder={t('you_at_example_com')} required />
|
|
111
|
+
<Label htmlFor="password">{t('password')}</Label>
|
|
112
|
+
<Input
|
|
113
|
+
type="password"
|
|
114
|
+
name="password"
|
|
115
|
+
placeholder={t('your_password')}
|
|
116
|
+
minLength={6}
|
|
117
|
+
required
|
|
118
|
+
/>
|
|
119
|
+
<SubmitButton formAction={signUpAction} pendingText={t('signing_up_pending')}>
|
|
120
|
+
{t('sign_up')}
|
|
121
|
+
</SubmitButton>
|
|
122
|
+
<FormMessage message={formMessage} />
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</form>
|
|
126
|
+
</div>
|
|
127
|
+
);
|
|
128
|
+
}
|