create-nextblock 0.14.1 → 0.14.4
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/page.tsx +46 -46
- 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/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/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 +5881 -5623
- 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/CmsClientLayout.tsx +2 -2
- package/templates/nextblock-template/app/cms/blocks/components/ColumnEditor.tsx +17 -22
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/EditableBlock.tsx +13 -19
- 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/HeadingBlockEditor.tsx +45 -34
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +4 -2
- 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/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/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/actions.ts +226 -226
- 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/navigation/components/NavigationMenuDnd.tsx +3 -3
- 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/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/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/cortex-ai/SandboxCortexAiSettingsClient.tsx +688 -688
- 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/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/global-css/components/ThemeEditor.tsx +382 -0
- package/templates/nextblock-template/app/cms/settings/global-css/components/ThemeManager.tsx +267 -0
- package/templates/nextblock-template/app/cms/settings/global-css/page.tsx +40 -24
- package/templates/nextblock-template/app/cms/settings/global-css/theme-actions.ts +259 -0
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- 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 +23 -21
- 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/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/components/SecurityPanel.tsx +9 -7
- 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/components/DeleteUserButton.tsx +12 -12
- package/templates/nextblock-template/app/layout.tsx +49 -0
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- 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-links.ts +22 -22
- package/templates/nextblock-template/app/profile/orders/CustomerOrdersPageClient.tsx +124 -124
- package/templates/nextblock-template/app/profile/orders/page.tsx +19 -19
- 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/providers.tsx +16 -4
- 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/HtmlScriptExecutor.tsx +47 -47
- package/templates/nextblock-template/components/LanguageSwitcher.tsx +2 -2
- 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/renderers/HeadingBlockRenderer.tsx +7 -10
- 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/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.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 +471 -471
- package/templates/nextblock-template/components/submit-button.tsx +23 -23
- package/templates/nextblock-template/components/theme-icon.tsx +78 -0
- package/templates/nextblock-template/components/theme-switcher.tsx +77 -82
- 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/ThemeCatalogContext.tsx +44 -0
- 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 +279 -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/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/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-redirects.ts +46 -46
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/blocks/blockColors.test.ts +114 -0
- package/templates/nextblock-template/lib/blocks/blockColors.ts +132 -0
- package/templates/nextblock-template/lib/blocks/blockRegistry.ts +17 -1
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- 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/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-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/media/youtube.ts +99 -99
- 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/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 +15 -10
- 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/themes/buildThemeCss.test.ts +163 -0
- package/templates/nextblock-template/lib/themes/buildThemeCss.ts +124 -0
- package/templates/nextblock-template/lib/themes/tokenColor.ts +31 -0
- package/templates/nextblock-template/lib/themes/tokens.ts +143 -0
- 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-env.d.ts +2 -2
- 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/scripts/verify-site-themes.ts +63 -0
- 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/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
|
@@ -1,202 +1,279 @@
|
|
|
1
|
-
# 03 CMS and Editor
|
|
2
|
-
|
|
3
|
-
## Two Related Systems
|
|
4
|
-
|
|
5
|
-
NextBlock's content authoring experience is split across two real subsystems:
|
|
6
|
-
|
|
7
|
-
- `libs/editor`: a reusable Tiptap-based rich text package
|
|
8
|
-
- `apps/nextblock/lib/blocks`: the block registry and page-builder layer used
|
|
9
|
-
by pages, posts, and some commerce surfaces
|
|
10
|
-
|
|
11
|
-
They work together, but they are not the same thing.
|
|
12
|
-
|
|
13
|
-
## Block Registry and Page Builder
|
|
14
|
-
|
|
15
|
-
The block registry lives in `apps/nextblock/lib/blocks/blockRegistry.ts`. It is
|
|
16
|
-
the current source of truth for:
|
|
17
|
-
|
|
18
|
-
- available block types
|
|
19
|
-
- Zod schemas
|
|
20
|
-
- default content
|
|
21
|
-
- editor component filenames
|
|
22
|
-
- renderer component filenames
|
|
23
|
-
- human-facing labels and block metadata
|
|
24
|
-
|
|
25
|
-
### Current registered block types
|
|
26
|
-
|
|
27
|
-
The registry currently includes:
|
|
28
|
-
|
|
29
|
-
- `text`
|
|
30
|
-
- `heading`
|
|
31
|
-
- `image`
|
|
32
|
-
- `button`
|
|
33
|
-
- `posts_grid`
|
|
34
|
-
- `video_embed`
|
|
35
|
-
- `section`
|
|
36
|
-
- `form`
|
|
37
|
-
- `testimonial`
|
|
38
|
-
- `product_grid`
|
|
39
|
-
- `featured_product`
|
|
40
|
-
- `cart`
|
|
41
|
-
- `checkout`
|
|
42
|
-
- `product_details`
|
|
43
|
-
|
|
44
|
-
The authoritative type list is `apps/nextblock/lib/blocks/blockTypes.ts`
|
|
45
|
-
(`availableBlockTypes`).
|
|
46
|
-
|
|
47
|
-
A `section` block can contain nested column block arrays, so the page builder
|
|
48
|
-
supports multi-column compositions instead of only flat block lists. Legacy
|
|
49
|
-
`hero` blocks were folded into `section` (carrying an `is_hero` flag) by
|
|
50
|
-
migration `00000000000021_migrate_hero_blocks_to_sections.sql`, so `hero` is no
|
|
51
|
-
longer a standalone registered block type.
|
|
52
|
-
|
|
53
|
-
### How the CMS uses the registry
|
|
54
|
-
|
|
55
|
-
The CMS block editor components under `app/cms/blocks` use the registry to:
|
|
56
|
-
|
|
57
|
-
- validate block types
|
|
58
|
-
- build new block payloads from default content
|
|
59
|
-
- dynamically load editor components
|
|
60
|
-
- dynamically load renderer components
|
|
61
|
-
- render block labels and picker entries
|
|
62
|
-
|
|
63
|
-
The registry also exposes helper functions such as:
|
|
64
|
-
|
|
65
|
-
- `getBlockDefinition()`
|
|
66
|
-
- `getInitialContent()`
|
|
67
|
-
- `getBlockSchema()`
|
|
68
|
-
- `validateBlockContent()`
|
|
69
|
-
- `generateDefaultContent()`
|
|
70
|
-
|
|
71
|
-
## Tiptap Editor Package
|
|
72
|
-
|
|
73
|
-
The reusable editor surface lives in `libs/editor`.
|
|
74
|
-
|
|
75
|
-
The main exports today are:
|
|
76
|
-
|
|
77
|
-
- `Editor`
|
|
78
|
-
- `NotionEditor`
|
|
79
|
-
- `EditorToolbar`
|
|
80
|
-
- `EditorBubbleMenu`
|
|
81
|
-
- `EditorFloatingMenu`
|
|
82
|
-
- `EnhancedFloatingMenu`
|
|
83
|
-
- `SlashCommandList`
|
|
84
|
-
- `DragHandle`
|
|
85
|
-
- `HtmlContent`
|
|
86
|
-
- `editorExtensions`
|
|
87
|
-
|
|
88
|
-
### Core editing capabilities
|
|
89
|
-
|
|
90
|
-
`libs/editor/src/lib/kit.ts` composes the editor from Tiptap extensions and
|
|
91
|
-
custom nodes. The shipped editing surface includes:
|
|
92
|
-
|
|
93
|
-
- StarterKit-based rich text
|
|
94
|
-
- syntax-highlighted code blocks via `CodeBlockLowlight`
|
|
95
|
-
- tables
|
|
96
|
-
- task lists
|
|
97
|
-
- link handling
|
|
98
|
-
- text styling through `TextStyleKit`
|
|
99
|
-
- highlight, subscript, superscript, and typography helpers
|
|
100
|
-
- character counting
|
|
101
|
-
- slash commands
|
|
102
|
-
- drag handles and draggable node movement
|
|
103
|
-
- image handling
|
|
104
|
-
|
|
105
|
-
### Custom HTML-preserving extensions
|
|
106
|
-
|
|
107
|
-
The editor intentionally preserves more HTML than a minimal rich text field.
|
|
108
|
-
Current custom nodes/extensions include support for:
|
|
109
|
-
|
|
110
|
-
- `div`
|
|
111
|
-
- `style`
|
|
112
|
-
- `script`
|
|
113
|
-
- `svg`
|
|
114
|
-
- `span`
|
|
115
|
-
- a catch-all attribute preservation layer
|
|
116
|
-
|
|
117
|
-
This matters because some CMS-authored content and seeded content store richer
|
|
118
|
-
HTML fragments than plain paragraph markup.
|
|
119
|
-
|
|
120
|
-
## Inline Widgets
|
|
121
|
-
|
|
122
|
-
The editor currently ships two inline widget node types:
|
|
123
|
-
|
|
124
|
-
- alert widget
|
|
125
|
-
- call-to-action widget
|
|
126
|
-
|
|
127
|
-
These appear in multiple places:
|
|
128
|
-
|
|
129
|
-
- Tiptap commands and slash-command actions
|
|
130
|
-
- editor node views in `libs/editor`
|
|
131
|
-
- runtime React renderers in `apps/nextblock/components/blocks/renderers/inline`
|
|
132
|
-
|
|
133
|
-
So the widgets are not just editor-only decorations; they have both editing and
|
|
134
|
-
front-end rendering paths.
|
|
135
|
-
|
|
136
|
-
## NotionEditor Integration Pattern
|
|
137
|
-
|
|
138
|
-
`NotionEditor` is the higher-level client component used by the app. It wraps:
|
|
139
|
-
|
|
140
|
-
- the extension kit
|
|
141
|
-
- toolbars and menus
|
|
142
|
-
- content synchronization through `onChange` and `onUpdate`
|
|
143
|
-
- media picker bridging through editor storage
|
|
144
|
-
- hydration-safe initialization with `immediatelyRender: false`
|
|
145
|
-
- a scrollable editing shell and character counts
|
|
146
|
-
|
|
147
|
-
The app currently mounts it in multiple places, including:
|
|
148
|
-
|
|
149
|
-
- text block editing
|
|
150
|
-
- product description editing
|
|
151
|
-
|
|
152
|
-
## Media Picker Integration
|
|
153
|
-
|
|
154
|
-
The editor integrates with a pluggable image picker bridge:
|
|
155
|
-
|
|
156
|
-
- `setOpenImagePicker()` stores a picker callback on the editor instance
|
|
157
|
-
- menus and extensions can open the media picker without knowing app details
|
|
158
|
-
- the CMS supplies the actual picker UI
|
|
159
|
-
|
|
160
|
-
This keeps the editor package reusable while still supporting CMS media
|
|
161
|
-
selection.
|
|
162
|
-
|
|
163
|
-
## Commerce-Aware Blocks
|
|
164
|
-
|
|
165
|
-
The block layer is not content-only. The app also ships block types that render
|
|
166
|
-
commerce primitives backed by `@nextblock-cms/ecommerce`, including:
|
|
167
|
-
|
|
168
|
-
- product grid
|
|
169
|
-
- featured product
|
|
170
|
-
- cart
|
|
171
|
-
- checkout
|
|
172
|
-
- product details
|
|
173
|
-
|
|
174
|
-
These bridge the CMS page builder to the premium commerce library without
|
|
175
|
-
copying storefront logic into the app.
|
|
176
|
-
|
|
177
|
-
## Custom Blocks (Data-Driven CRUD)
|
|
178
|
-
|
|
179
|
-
Beyond the code-defined built-ins above, editors can create their own block
|
|
180
|
-
types at runtime from the CMS, with no code deploy. These **custom block
|
|
181
|
-
definitions** are stored as rows in `custom_block_definitions` (typed fields
|
|
182
|
-
plus a recursive layout schema) and rendered on the public site by a dynamic
|
|
183
|
-
layout engine instead of a compiled React renderer.
|
|
184
|
-
|
|
185
|
-
The wiring is intentionally simple: a page/post block whose `block_type` equals
|
|
186
|
-
a custom definition's `slug` is resolved through
|
|
187
|
-
`getCachedCustomBlockDefinitionBySlug()` and rendered by
|
|
188
|
-
`CachedDynamicLayoutEngine`. Authoring, CRUD, duplicate, and JSON
|
|
189
|
-
import/export/backup all live under `app/cms/custom-blocks`.
|
|
190
|
-
|
|
191
|
-
Full details, including the field types, the layout schema, caching, and the
|
|
192
|
-
Cortex AI "build widget" path, are in
|
|
193
|
-
[10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md).
|
|
194
|
-
|
|
195
|
-
## Relationship to the SDK
|
|
196
|
-
|
|
197
|
-
The registry is the current in-app block system. The formal external authoring
|
|
198
|
-
contract lives in `libs/sdk` and is documented in
|
|
199
|
-
[07-BLOCK-SDK-AND-EXTENSIBILITY.md](./07-BLOCK-SDK-AND-EXTENSIBILITY.md).
|
|
200
|
-
|
|
201
|
-
If you are changing how blocks work inside the CMS, start here. If you are
|
|
202
|
-
designing a reusable third-party block contract, start with the SDK doc.
|
|
1
|
+
# 03 CMS and Editor
|
|
2
|
+
|
|
3
|
+
## Two Related Systems
|
|
4
|
+
|
|
5
|
+
NextBlock's content authoring experience is split across two real subsystems:
|
|
6
|
+
|
|
7
|
+
- `libs/editor`: a reusable Tiptap-based rich text package
|
|
8
|
+
- `apps/nextblock/lib/blocks`: the block registry and page-builder layer used
|
|
9
|
+
by pages, posts, and some commerce surfaces
|
|
10
|
+
|
|
11
|
+
They work together, but they are not the same thing.
|
|
12
|
+
|
|
13
|
+
## Block Registry and Page Builder
|
|
14
|
+
|
|
15
|
+
The block registry lives in `apps/nextblock/lib/blocks/blockRegistry.ts`. It is
|
|
16
|
+
the current source of truth for:
|
|
17
|
+
|
|
18
|
+
- available block types
|
|
19
|
+
- Zod schemas
|
|
20
|
+
- default content
|
|
21
|
+
- editor component filenames
|
|
22
|
+
- renderer component filenames
|
|
23
|
+
- human-facing labels and block metadata
|
|
24
|
+
|
|
25
|
+
### Current registered block types
|
|
26
|
+
|
|
27
|
+
The registry currently includes:
|
|
28
|
+
|
|
29
|
+
- `text`
|
|
30
|
+
- `heading`
|
|
31
|
+
- `image`
|
|
32
|
+
- `button`
|
|
33
|
+
- `posts_grid`
|
|
34
|
+
- `video_embed`
|
|
35
|
+
- `section`
|
|
36
|
+
- `form`
|
|
37
|
+
- `testimonial`
|
|
38
|
+
- `product_grid`
|
|
39
|
+
- `featured_product`
|
|
40
|
+
- `cart`
|
|
41
|
+
- `checkout`
|
|
42
|
+
- `product_details`
|
|
43
|
+
|
|
44
|
+
The authoritative type list is `apps/nextblock/lib/blocks/blockTypes.ts`
|
|
45
|
+
(`availableBlockTypes`).
|
|
46
|
+
|
|
47
|
+
A `section` block can contain nested column block arrays, so the page builder
|
|
48
|
+
supports multi-column compositions instead of only flat block lists. Legacy
|
|
49
|
+
`hero` blocks were folded into `section` (carrying an `is_hero` flag) by
|
|
50
|
+
migration `00000000000021_migrate_hero_blocks_to_sections.sql`, so `hero` is no
|
|
51
|
+
longer a standalone registered block type.
|
|
52
|
+
|
|
53
|
+
### How the CMS uses the registry
|
|
54
|
+
|
|
55
|
+
The CMS block editor components under `app/cms/blocks` use the registry to:
|
|
56
|
+
|
|
57
|
+
- validate block types
|
|
58
|
+
- build new block payloads from default content
|
|
59
|
+
- dynamically load editor components
|
|
60
|
+
- dynamically load renderer components
|
|
61
|
+
- render block labels and picker entries
|
|
62
|
+
|
|
63
|
+
The registry also exposes helper functions such as:
|
|
64
|
+
|
|
65
|
+
- `getBlockDefinition()`
|
|
66
|
+
- `getInitialContent()`
|
|
67
|
+
- `getBlockSchema()`
|
|
68
|
+
- `validateBlockContent()`
|
|
69
|
+
- `generateDefaultContent()`
|
|
70
|
+
|
|
71
|
+
## Tiptap Editor Package
|
|
72
|
+
|
|
73
|
+
The reusable editor surface lives in `libs/editor`.
|
|
74
|
+
|
|
75
|
+
The main exports today are:
|
|
76
|
+
|
|
77
|
+
- `Editor`
|
|
78
|
+
- `NotionEditor`
|
|
79
|
+
- `EditorToolbar`
|
|
80
|
+
- `EditorBubbleMenu`
|
|
81
|
+
- `EditorFloatingMenu`
|
|
82
|
+
- `EnhancedFloatingMenu`
|
|
83
|
+
- `SlashCommandList`
|
|
84
|
+
- `DragHandle`
|
|
85
|
+
- `HtmlContent`
|
|
86
|
+
- `editorExtensions`
|
|
87
|
+
|
|
88
|
+
### Core editing capabilities
|
|
89
|
+
|
|
90
|
+
`libs/editor/src/lib/kit.ts` composes the editor from Tiptap extensions and
|
|
91
|
+
custom nodes. The shipped editing surface includes:
|
|
92
|
+
|
|
93
|
+
- StarterKit-based rich text
|
|
94
|
+
- syntax-highlighted code blocks via `CodeBlockLowlight`
|
|
95
|
+
- tables
|
|
96
|
+
- task lists
|
|
97
|
+
- link handling
|
|
98
|
+
- text styling through `TextStyleKit`
|
|
99
|
+
- highlight, subscript, superscript, and typography helpers
|
|
100
|
+
- character counting
|
|
101
|
+
- slash commands
|
|
102
|
+
- drag handles and draggable node movement
|
|
103
|
+
- image handling
|
|
104
|
+
|
|
105
|
+
### Custom HTML-preserving extensions
|
|
106
|
+
|
|
107
|
+
The editor intentionally preserves more HTML than a minimal rich text field.
|
|
108
|
+
Current custom nodes/extensions include support for:
|
|
109
|
+
|
|
110
|
+
- `div`
|
|
111
|
+
- `style`
|
|
112
|
+
- `script`
|
|
113
|
+
- `svg`
|
|
114
|
+
- `span`
|
|
115
|
+
- a catch-all attribute preservation layer
|
|
116
|
+
|
|
117
|
+
This matters because some CMS-authored content and seeded content store richer
|
|
118
|
+
HTML fragments than plain paragraph markup.
|
|
119
|
+
|
|
120
|
+
## Inline Widgets
|
|
121
|
+
|
|
122
|
+
The editor currently ships two inline widget node types:
|
|
123
|
+
|
|
124
|
+
- alert widget
|
|
125
|
+
- call-to-action widget
|
|
126
|
+
|
|
127
|
+
These appear in multiple places:
|
|
128
|
+
|
|
129
|
+
- Tiptap commands and slash-command actions
|
|
130
|
+
- editor node views in `libs/editor`
|
|
131
|
+
- runtime React renderers in `apps/nextblock/components/blocks/renderers/inline`
|
|
132
|
+
|
|
133
|
+
So the widgets are not just editor-only decorations; they have both editing and
|
|
134
|
+
front-end rendering paths.
|
|
135
|
+
|
|
136
|
+
## NotionEditor Integration Pattern
|
|
137
|
+
|
|
138
|
+
`NotionEditor` is the higher-level client component used by the app. It wraps:
|
|
139
|
+
|
|
140
|
+
- the extension kit
|
|
141
|
+
- toolbars and menus
|
|
142
|
+
- content synchronization through `onChange` and `onUpdate`
|
|
143
|
+
- media picker bridging through editor storage
|
|
144
|
+
- hydration-safe initialization with `immediatelyRender: false`
|
|
145
|
+
- a scrollable editing shell and character counts
|
|
146
|
+
|
|
147
|
+
The app currently mounts it in multiple places, including:
|
|
148
|
+
|
|
149
|
+
- text block editing
|
|
150
|
+
- product description editing
|
|
151
|
+
|
|
152
|
+
## Media Picker Integration
|
|
153
|
+
|
|
154
|
+
The editor integrates with a pluggable image picker bridge:
|
|
155
|
+
|
|
156
|
+
- `setOpenImagePicker()` stores a picker callback on the editor instance
|
|
157
|
+
- menus and extensions can open the media picker without knowing app details
|
|
158
|
+
- the CMS supplies the actual picker UI
|
|
159
|
+
|
|
160
|
+
This keeps the editor package reusable while still supporting CMS media
|
|
161
|
+
selection.
|
|
162
|
+
|
|
163
|
+
## Commerce-Aware Blocks
|
|
164
|
+
|
|
165
|
+
The block layer is not content-only. The app also ships block types that render
|
|
166
|
+
commerce primitives backed by `@nextblock-cms/ecommerce`, including:
|
|
167
|
+
|
|
168
|
+
- product grid
|
|
169
|
+
- featured product
|
|
170
|
+
- cart
|
|
171
|
+
- checkout
|
|
172
|
+
- product details
|
|
173
|
+
|
|
174
|
+
These bridge the CMS page builder to the premium commerce library without
|
|
175
|
+
copying storefront logic into the app.
|
|
176
|
+
|
|
177
|
+
## Custom Blocks (Data-Driven CRUD)
|
|
178
|
+
|
|
179
|
+
Beyond the code-defined built-ins above, editors can create their own block
|
|
180
|
+
types at runtime from the CMS, with no code deploy. These **custom block
|
|
181
|
+
definitions** are stored as rows in `custom_block_definitions` (typed fields
|
|
182
|
+
plus a recursive layout schema) and rendered on the public site by a dynamic
|
|
183
|
+
layout engine instead of a compiled React renderer.
|
|
184
|
+
|
|
185
|
+
The wiring is intentionally simple: a page/post block whose `block_type` equals
|
|
186
|
+
a custom definition's `slug` is resolved through
|
|
187
|
+
`getCachedCustomBlockDefinitionBySlug()` and rendered by
|
|
188
|
+
`CachedDynamicLayoutEngine`. Authoring, CRUD, duplicate, and JSON
|
|
189
|
+
import/export/backup all live under `app/cms/custom-blocks`.
|
|
190
|
+
|
|
191
|
+
Full details, including the field types, the layout schema, caching, and the
|
|
192
|
+
Cortex AI "build widget" path, are in
|
|
193
|
+
[10-CUSTOM-BLOCKS.md](./10-CUSTOM-BLOCKS.md).
|
|
194
|
+
|
|
195
|
+
## Relationship to the SDK
|
|
196
|
+
|
|
197
|
+
The registry is the current in-app block system. The formal external authoring
|
|
198
|
+
contract lives in `libs/sdk` and is documented in
|
|
199
|
+
[07-BLOCK-SDK-AND-EXTENSIBILITY.md](./07-BLOCK-SDK-AND-EXTENSIBILITY.md).
|
|
200
|
+
|
|
201
|
+
If you are changing how blocks work inside the CMS, start here. If you are
|
|
202
|
+
designing a reusable third-party block contract, start with the SDK doc.
|
|
203
|
+
|
|
204
|
+
## Themes and Colour
|
|
205
|
+
|
|
206
|
+
### Editable site themes
|
|
207
|
+
|
|
208
|
+
Themes are rows in `site_themes`, edited at **/cms/settings/global-css**. An
|
|
209
|
+
ADMIN can recolour any theme, create new ones, duplicate, reorder, hide, set the
|
|
210
|
+
site default, and delete non-system themes.
|
|
211
|
+
|
|
212
|
+
The pipeline is:
|
|
213
|
+
|
|
214
|
+
1. `app/layout.tsx` reads the table through a cached `getCachedSiteThemes()`
|
|
215
|
+
(tag `public-layout-site-themes`).
|
|
216
|
+
2. `lib/themes/buildThemeCss.ts` renders each row to a `:root.<slug> { ... }`
|
|
217
|
+
rule, injected as a `<style id="nb-theme-tokens">` in `<head>` — before the
|
|
218
|
+
Global CSS box, so custom CSS can still override a theme.
|
|
219
|
+
3. `app/providers.tsx` feeds the slug list and default to `next-themes`, and
|
|
220
|
+
`context/ThemeCatalogContext.tsx` carries names + icons to the switcher.
|
|
221
|
+
|
|
222
|
+
`libs/ui/src/styles/theme.css` remains as the fallback palette for standalone
|
|
223
|
+
consumers of the published `@nextblock-cms/ui` package. Generated rules use
|
|
224
|
+
`:root.<slug>` (specificity 0,2,0) so they always beat that file's `.dark` /
|
|
225
|
+
`.vibrant` rules (0,1,0) regardless of stylesheet order.
|
|
226
|
+
|
|
227
|
+
### Token storage
|
|
228
|
+
|
|
229
|
+
Colour tokens are stored as **bare HSL triplets** (`"222 47% 11%"`), not hex,
|
|
230
|
+
because `libs/ui/tailwind.config.js` composes them as `hsl(var(--primary))` and
|
|
231
|
+
appends alpha as `hsl(var(--primary) / 0.5)` — only a bare triplet supports
|
|
232
|
+
that. `lib/themes/tokenColor.ts` converts to and from the hex the colour picker
|
|
233
|
+
speaks. The allowed token list lives in `lib/themes/tokens.ts`; anything not on
|
|
234
|
+
it is dropped on save, and values are shape-checked, because the result is
|
|
235
|
+
interpolated into a `<style>` tag.
|
|
236
|
+
|
|
237
|
+
Per-theme `extra_css` is emitted **nested inside** the theme rule, so authors
|
|
238
|
+
write `& h1 { ... }` and scoping is automatic. `sanitizeExtraCss()` strips `<`
|
|
239
|
+
and unbalanced `}` so it cannot escape the rule or close the style element.
|
|
240
|
+
|
|
241
|
+
### Known limitation: `dark:` utilities under custom themes
|
|
242
|
+
|
|
243
|
+
Tailwind's dark variant compiles to `.dark`, and `darkMode: ['class']` is fixed
|
|
244
|
+
at build time. A custom theme with `color_scheme: 'dark'` recolours every token
|
|
245
|
+
and sets CSS `color-scheme`, but does **not** activate `dark:` utilities — the
|
|
246
|
+
same behaviour the shipped `.vibrant` theme has always had.
|
|
247
|
+
|
|
248
|
+
It cannot be fixed by mapping the theme to two classes: `next-themes` applies
|
|
249
|
+
its value with a single `classList.add(value)`, and `DOMTokenList.add` throws
|
|
250
|
+
`InvalidCharacterError` on a string containing a space. Wiring `dark:` to a data
|
|
251
|
+
attribute would require a pre-hydration script mirroring next-themes' own.
|
|
252
|
+
|
|
253
|
+
Verify the database → CSS path without booting the app:
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
npm run verify:site-themes
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Block text colour
|
|
260
|
+
|
|
261
|
+
`apps/nextblock/lib/blocks/blockColors.ts` is the single source of truth for
|
|
262
|
+
block text colour, shared by `HeadingBlockRenderer`, `EditableBlock` and
|
|
263
|
+
`ColumnEditor` so the CMS preview cannot drift from the live page.
|
|
264
|
+
|
|
265
|
+
A stored value is either a **theme token** keyword (`"primary"` — follows the
|
|
266
|
+
theme) or a **literal CSS colour** (`"#FF8800"` — fixed). Tokens render as a
|
|
267
|
+
static Tailwind class; literals render as an inline `style`. `resolveTextColor()`
|
|
268
|
+
returns `{ className?, style? }` and falls back to `{}` for anything it does not
|
|
269
|
+
recognise, so a hand-edited value degrades to the inherited colour instead of
|
|
270
|
+
emitting a bogus class.
|
|
271
|
+
|
|
272
|
+
Class names here are written as **complete literals**. Tailwind v4 ignores the
|
|
273
|
+
`safelist` key in the legacy JS config — `libs/ui/tailwind.config.js` still
|
|
274
|
+
carries one, but v4 never reads it, so a class exists only if the scanner finds
|
|
275
|
+
the whole string in a source file.
|
|
276
|
+
|
|
277
|
+
The editor control is `ColorField` from `libs/ui`, which offers the theme tokens
|
|
278
|
+
and a custom picker (hex, alpha, screen eyedropper, recent colours) with a live
|
|
279
|
+
WCAG contrast badge measured against the section background.
|