create-nextblock 0.14.0 → 0.14.2
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 +5749 -5749
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/media/record/route.ts +160 -160
- package/templates/nextblock-template/app/api/search/route.ts +43 -43
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +441 -441
- package/templates/nextblock-template/app/auth/callback/route.ts +31 -31
- package/templates/nextblock-template/app/cart/page.tsx +7 -7
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/components/MediaLibraryModal.tsx +149 -149
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/blocks/editors/ImageBlockEditor.tsx +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/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/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/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/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-switcher.tsx +8 -8
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/AuthContext.tsx +23 -23
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/01-PROJECT-OVERVIEW.md +94 -94
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +202 -202
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +246 -246
- package/templates/nextblock-template/docs/06-CLI-AND-SCAFFOLDING.md +176 -176
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/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/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 +87 -87
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/site-url.ts +48 -48
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/check-upstream.ts +441 -441
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/next-env.d.ts +1 -0
- package/templates/nextblock-template/package.json +6 -6
- package/templates/nextblock-template/postcss.config.js +6 -6
- package/templates/nextblock-template/scripts/backup.js +115 -115
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/restore.js +385 -385
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tailwind.config.js +25 -25
- package/templates/nextblock-template/tools/build-migrate.mjs +209 -209
- package/templates/nextblock-template/tools/configure-supabase-auth.js +282 -282
- package/templates/nextblock-template/tsconfig.tsbuildinfo +1 -1
- package/templates/nextblock-template/types/jsdom.d.ts +6 -6
- package/tsconfig.base.json +3 -3
|
@@ -1,202 +1,202 @@
|
|
|
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.
|