create-nextblock 0.16.4 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/CLAUDE.md +22 -0
  2. package/docker-template/.env.docker.example +69 -69
  3. package/docker-template/docker/db/init/99-jwt.sql +6 -6
  4. package/docker-template/docker/db/init/99-roles.sql +25 -25
  5. package/docker-template/docker/kong/kong.yml +112 -112
  6. package/docker-template/scripts/docker-setup.mjs +310 -310
  7. package/package.json +1 -1
  8. package/templates/nextblock-template/.browserslistrc +11 -11
  9. package/templates/nextblock-template/.swcrc +30 -30
  10. package/templates/nextblock-template/CLAUDE.md +26 -0
  11. package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
  12. package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
  13. package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -16
  14. package/templates/nextblock-template/app/actions/consent.ts +57 -57
  15. package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
  16. package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
  17. package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
  18. package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
  19. package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -29
  20. package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
  21. package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
  22. package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
  23. package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +272 -205
  24. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +10473 -8467
  25. package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
  26. package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
  27. package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
  28. package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
  29. package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
  30. package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -47
  31. package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -47
  32. package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +442 -441
  33. package/templates/nextblock-template/app/article/[slug]/page.utils.ts +4 -1
  34. package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -20
  35. package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +241 -241
  36. package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
  37. package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
  38. package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
  39. package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -23
  40. package/templates/nextblock-template/app/cms/components/SeoScoreBadge.tsx +3 -3
  41. package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
  42. package/templates/nextblock-template/app/cms/components/TablePagination.tsx +136 -136
  43. package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
  44. package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
  45. package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
  46. package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -16
  47. package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -16
  48. package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
  49. package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
  50. package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
  51. package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
  52. package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
  53. package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
  54. package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
  55. package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -200
  56. package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
  57. package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
  58. package/templates/nextblock-template/app/cms/pages/page.tsx +273 -273
  59. package/templates/nextblock-template/app/cms/posts/page.tsx +251 -251
  60. package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
  61. package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
  62. package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
  63. package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
  64. package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
  65. package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
  66. package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
  67. package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
  68. package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
  69. package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +276 -276
  70. package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
  71. package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
  72. package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
  73. package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
  74. package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
  75. package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
  76. package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
  77. package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
  78. package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -190
  79. package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -56
  80. package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
  81. package/templates/nextblock-template/app/setup/layout.tsx +13 -13
  82. package/templates/nextblock-template/app/setup/page.tsx +111 -111
  83. package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -38
  84. package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -68
  85. package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -35
  86. package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -35
  87. package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -35
  88. package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -34
  89. package/templates/nextblock-template/components/CartTranslator.tsx +210 -210
  90. package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -51
  91. package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -68
  92. package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
  93. package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
  94. package/templates/nextblock-template/components/GlobalSearch.tsx +557 -557
  95. package/templates/nextblock-template/components/Header.tsx +38 -38
  96. package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
  97. package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
  98. package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
  99. package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +48 -48
  100. package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +9 -9
  101. package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -25
  102. package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -92
  103. package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +11 -0
  104. package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +24 -24
  105. package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -57
  106. package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +2 -2
  107. package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +2 -2
  108. package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
  109. package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
  110. package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
  111. package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
  112. package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
  113. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
  114. package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
  115. package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
  116. package/templates/nextblock-template/context/language-rest-client.ts +32 -32
  117. package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
  118. package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
  119. package/templates/nextblock-template/docker/kong/kong.yml +112 -112
  120. package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
  121. package/templates/nextblock-template/docs/03-CMS-AND-EDITOR.md +1 -1
  122. package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +402 -282
  123. package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +15 -8
  124. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  125. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +23 -4
  126. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  127. package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +4 -1
  128. package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +8 -0
  129. package/templates/nextblock-template/docs/14-MESSAGES-INBOX.md +2 -2
  130. package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +95 -104
  131. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  132. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  133. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  134. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  135. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  136. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  137. package/templates/nextblock-template/lib/cms/payments-reminder.test.ts +135 -135
  138. package/templates/nextblock-template/lib/cms/payments-reminder.ts +105 -105
  139. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  140. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  141. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  142. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  143. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  144. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  145. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  146. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  147. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  148. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  149. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  150. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  151. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  152. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  153. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  154. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  155. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  156. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  157. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +56 -54
  158. package/templates/nextblock-template/lib/media/youtube.ts +99 -99
  159. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  160. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  161. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  162. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  163. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  164. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  165. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  166. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  167. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  168. package/templates/nextblock-template/lib/seo/page-document.ts +4 -4
  169. package/templates/nextblock-template/lib/seo/redirect-store.ts +3 -2
  170. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  171. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  172. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  173. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +15 -175
  174. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  175. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  176. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  177. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  178. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  179. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  180. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  181. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  182. package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -105
  183. package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -42
  184. package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -143
  185. package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -94
  186. package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -81
  187. package/templates/nextblock-template/lib/zod-config.ts +5 -5
  188. package/templates/nextblock-template/next-env.d.ts +1 -0
  189. package/templates/nextblock-template/package.json +1 -1
  190. package/templates/nextblock-template/public/images/cortex_post.webp +0 -0
  191. package/templates/nextblock-template/public/images/update_nextblock.webp +0 -0
  192. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  193. package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -112
  194. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  195. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  196. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  197. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  198. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  199. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  200. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  201. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  202. package/templates/nextblock-template/tools/deploy-supabase.js +159 -159
  203. package/templates/nextblock-template/types/jsdom.d.ts +6 -6
@@ -171,6 +171,22 @@ const SEEDED_ASSETS: SeedAsset[] = [
171
171
  contentType: 'image/webp',
172
172
  description: 'Sandbox seed asset: Cortex AI cover image.',
173
173
  },
174
+ // Feature images introduced by migration 00000000000037 (the migration owns the
175
+ // media rows; uploading here just keeps the R2 copy in step with public/images).
176
+ {
177
+ source: 'images/update_nextblock.webp',
178
+ dest: 'images/update_nextblock.webp',
179
+ fileName: 'update_nextblock.webp',
180
+ contentType: 'image/webp',
181
+ description: 'NextBlock CMS release update and platform architecture overview',
182
+ },
183
+ {
184
+ source: 'images/cortex_post.webp',
185
+ dest: 'images/cortex_post.webp',
186
+ fileName: 'cortex_post.webp',
187
+ contentType: 'image/webp',
188
+ description: 'Diagram of Cortex AI Model Context Protocol MCP connection to external LLMs',
189
+ },
174
190
  ];
175
191
 
176
192
  const SIZE_TERM_DEFINITIONS: Array<{
@@ -1407,256 +1423,305 @@ async function enrichCortexAiProducts(params: {
1407
1423
  }
1408
1424
 
1409
1425
  const shortDescEn =
1410
- 'NextBlock™ Cortex AI License brings block-level machine intelligence to your Next.js block editor. Generate copy, refactor structures, and automate translations in one click, built on an open, BYOK cost-controlled architecture.';
1426
+ 'NextBlock™ Cortex AI is the AI layer for your free CMS. Route any model through your own OpenRouter key inside the editor, or register /api/mcp and let Claude Code, Cursor, and ChatGPT build layouts, inspect your schema, and manage content on the AI subscription you already pay for. Free for 30 days, no credit card.';
1411
1427
 
1412
- // ── Section 0: Hero Gradient ──
1428
+ // Copy is mirrored by the seeded product blocks in libs/db/src/supabase/migrations/02004_baseline_seed.sql
1429
+ // (originally migration 00000000000041_marketing_review_free_cms_trial, folded into the generation-2
1430
+ // baseline; the seed populates fresh installs, this function re-seeds the sandbox after every reset).
1431
+ // Keep the two in step.
1432
+ // ── Section 0: Hero (MCP-native positioning, 30-day trial, two columns) ──
1413
1433
  const cortexS0En = {
1414
- container_type: 'container',
1415
- background: {
1416
- type: 'gradient',
1417
- gradient: {
1418
- type: 'linear',
1419
- direction: '135deg',
1420
- stops: [
1421
- { color: '#1e1b4b', position: 0 },
1422
- { color: '#312e81', position: 35 },
1423
- { color: '#0f172a', position: 100 },
1424
- ],
1425
- },
1434
+ "container_type": "container",
1435
+ "background": {
1436
+ "type": "gradient",
1437
+ "gradient": {
1438
+ "type": "linear",
1439
+ "direction": "135deg",
1440
+ "stops": [
1441
+ {
1442
+ "color": "#1e1b4b",
1443
+ "position": 0
1444
+ },
1445
+ {
1446
+ "color": "#312e81",
1447
+ "position": 35
1448
+ },
1449
+ {
1450
+ "color": "#0f172a",
1451
+ "position": 100
1452
+ }
1453
+ ]
1454
+ }
1426
1455
  },
1427
- responsive_columns: { mobile: 1, tablet: 1, desktop: 2 },
1428
- column_gap: 'xl',
1429
- vertical_alignment: 'center',
1430
- padding: { top: 'xl', bottom: 'xl' },
1431
- column_blocks: [
1456
+ "responsive_columns": {
1457
+ "mobile": 1,
1458
+ "tablet": 1,
1459
+ "desktop": 2
1460
+ },
1461
+ "column_gap": "xl",
1462
+ "vertical_alignment": "center",
1463
+ "padding": {
1464
+ "top": "xl",
1465
+ "bottom": "xl"
1466
+ },
1467
+ "column_blocks": [
1432
1468
  [
1433
1469
  {
1434
- block_type: 'text',
1435
- content: {
1436
- html_content: `<p class="text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4">AI Intelligence Layer</p>
1437
- <h2 class="text-3xl md:text-5xl font-extrabold text-white leading-tight mb-5">Supercharge Your<br/>Editor with AI.</h2>
1438
- <p class="text-base md:text-lg text-slate-200 leading-relaxed mb-6">Cortex AI integrates state-of-the-art LLMs directly into the block authoring surface. Generate copy, summarize content, refactor layouts, and translate pages — all without leaving your editor.</p>`,
1439
- },
1470
+ "block_type": "text",
1471
+ "content": {
1472
+ "html_content": "<p class='text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4'>MCP-Native AI Layer · 30-Day Free Trial</p><h2 class='text-3xl md:text-5xl font-extrabold text-white leading-tight mb-5'>Your CMS as a Cortex AI MCP Server.</h2><p class='text-base md:text-lg text-slate-200 leading-relaxed mb-4'>Cortex AI runs two ways. Inside the editor it routes to any model through your own OpenRouter key. Over MCP it turns NextBlock into a server that Claude Code, Cursor, and ChatGPT operate from their own chat window.</p><p class='text-base text-slate-300 leading-relaxed mb-6'>The CMS is free forever. Cortex AI is the one license we sell, and it starts with 30 days free and no credit card.</p>"
1473
+ }
1440
1474
  },
1441
1475
  {
1442
- block_type: 'button',
1443
- content: {
1444
- text: 'Get Cortex AI',
1445
- url: 'https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license',
1446
- variant: 'default',
1447
- size: 'lg',
1448
- position: 'left',
1449
- },
1450
- },
1476
+ "block_type": "button",
1477
+ "content": {
1478
+ "text": "Read the MCP Setup Guide ",
1479
+ "url": "/article/cortex-ai-mcp-connection-guide",
1480
+ "variant": "default",
1481
+ "size": "lg",
1482
+ "position": "left"
1483
+ }
1484
+ }
1451
1485
  ],
1452
1486
  [
1453
1487
  {
1454
- block_type: 'text',
1455
- content: {
1456
- html_content: `<div class="rounded-2xl border border-violet-700 bg-slate-950 p-6 shadow-xl sm:p-8">
1457
- <h3 class="text-lg font-bold text-white mb-5">OpenRouter &amp; BYOK Architecture</h3>
1458
- <ul class="space-y-4 text-sm leading-relaxed text-slate-300">
1459
- <li class="flex items-start gap-3">
1460
- <span class="flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold">✓</span>
1461
- <span><strong class="text-white">Bring Your Own Key</strong> — complete cost control using your own OpenRouter API tokens. No hidden fees.</span>
1462
- </li>
1463
- <li class="flex items-start gap-3">
1464
- <span class="flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold">✓</span>
1465
- <span><strong class="text-white">Block-Aware Prompts</strong> — Cortex AI understands the JSONB schema, not just raw text. Outputs valid block structures.</span>
1466
- </li>
1467
- <li class="flex items-start gap-3">
1468
- <span class="flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold">✓</span>
1469
- <span><strong class="text-white">Design-System Aware</strong> — generated content respects your Tailwind config and brand guidelines automatically.</span>
1470
- </li>
1471
- <li class="flex items-start gap-3">
1472
- <span class="flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold">✓</span>
1473
- <span><strong class="text-white">Multi-Model Support</strong> — switch between GPT-4o, Claude, Gemini, and more via a single config toggle.</span>
1474
- </li>
1475
- </ul>
1476
- </div>`,
1477
- },
1478
- },
1479
- ],
1480
- ],
1488
+ "block_type": "text",
1489
+ "content": {
1490
+ "html_content": "<div class='rounded-2xl border border-violet-700 bg-slate-950 p-6 shadow-xl sm:p-8'><h3 class='text-lg font-bold text-white mb-5'>Bring Your Own AI Subscription</h3><ul class='space-y-4 text-sm leading-relaxed text-slate-300'><li class='flex items-start gap-3'><span class='flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold'>✓</span><span><strong class='text-white'>Free for 30 days</strong> — start the trial with no credit card. If you do nothing, it simply ends.</span></li><li class='flex items-start gap-3'><span class='flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold'>✓</span><span><strong class='text-white'>No token markup</strong> — use Claude Pro, ChatGPT Plus, Cursor, or Gemini Advanced by registering /api/mcp. You pay your provider, not us.</span></li><li class='flex items-start gap-3'><span class='flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold'>✓</span><span><strong class='text-white'>Editor BYOK</strong> — OpenRouter routing with your own key, so you pick the model and keep the bill.</span></li><li class='flex items-start gap-3'><span class='flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold'>✓</span><span><strong class='text-white'>Scoped tokens</strong> — mint read-only or write tokens in CMS Settings and revoke them any time.</span></li><li class='flex items-start gap-3'><span class='flex-shrink-0 w-6 h-6 rounded-full bg-violet-950 flex items-center justify-center text-violet-300 text-xs font-bold'>✓</span><span><strong class='text-white'>Live Drafts</strong> — generated layouts stage as drafts. Nothing goes live until an editor publishes it.</span></li></ul></div>"
1491
+ }
1492
+ }
1493
+ ]
1494
+ ]
1481
1495
  };
1482
1496
 
1483
- // ── Section 1: Social-proof metrics bar ──
1497
+ // ── Section 1: Trial + contract metrics bar ──
1484
1498
  const cortexS1En = {
1485
- container_type: 'container',
1486
- background: { type: 'theme', theme: 'muted' },
1487
- responsive_columns: { mobile: 1, tablet: 2, desktop: 4 },
1488
- column_gap: 'lg',
1489
- padding: { top: 'lg', bottom: 'lg' },
1490
- vertical_alignment: 'center',
1491
- column_blocks: [
1492
- [{ block_type: 'text', content: { html_content: '<p class="text-center"><span class="block text-2xl font-extrabold text-foreground">50+</span><span class="text-xs text-muted-foreground uppercase tracking-wider">AI Models Available</span></p>' } }],
1493
- [{ block_type: 'text', content: { html_content: '<p class="text-center"><span class="block text-2xl font-extrabold text-foreground">< 2s</span><span class="text-xs text-muted-foreground uppercase tracking-wider">Avg. Generation Time</span></p>' } }],
1494
- [{ block_type: 'text', content: { html_content: '<p class="text-center"><span class="block text-2xl font-extrabold text-foreground">100 %</span><span class="text-xs text-muted-foreground uppercase tracking-wider">BYOK Cost Control</span></p>' } }],
1495
- [{ block_type: 'text', content: { html_content: '<p class="text-center"><span class="block text-2xl font-extrabold text-foreground">2</span><span class="text-xs text-muted-foreground uppercase tracking-wider">Languages Supported</span></p>' } }],
1496
- ],
1499
+ "container_type": "container",
1500
+ "background": {
1501
+ "type": "theme",
1502
+ "theme": "muted"
1503
+ },
1504
+ "responsive_columns": {
1505
+ "mobile": 1,
1506
+ "tablet": 2,
1507
+ "desktop": 4
1508
+ },
1509
+ "column_gap": "lg",
1510
+ "padding": {
1511
+ "top": "lg",
1512
+ "bottom": "lg"
1513
+ },
1514
+ "vertical_alignment": "center",
1515
+ "column_blocks": [
1516
+ [
1517
+ {
1518
+ "block_type": "text",
1519
+ "content": {
1520
+ "html_content": "<p class='text-center'><span class='block text-2xl font-extrabold text-foreground'>30</span><span class='text-xs text-muted-foreground uppercase tracking-wider'>Days free, no card</span></p>"
1521
+ }
1522
+ }
1523
+ ],
1524
+ [
1525
+ {
1526
+ "block_type": "text",
1527
+ "content": {
1528
+ "html_content": "<p class='text-center'><span class='block text-2xl font-extrabold text-foreground'>0 %</span><span class='text-xs text-muted-foreground uppercase tracking-wider'>Token markup</span></p>"
1529
+ }
1530
+ }
1531
+ ],
1532
+ [
1533
+ {
1534
+ "block_type": "text",
1535
+ "content": {
1536
+ "html_content": "<p class='text-center'><span class='block text-2xl font-extrabold text-foreground'>5</span><span class='text-xs text-muted-foreground uppercase tracking-wider'>MCP contract tools</span></p>"
1537
+ }
1538
+ }
1539
+ ],
1540
+ [
1541
+ {
1542
+ "block_type": "text",
1543
+ "content": {
1544
+ "html_content": "<p class='text-center'><span class='block text-2xl font-extrabold text-foreground'>29</span><span class='text-xs text-muted-foreground uppercase tracking-wider'>Typed agent tools</span></p>"
1545
+ }
1546
+ }
1547
+ ]
1548
+ ]
1497
1549
  };
1498
1550
 
1499
- // ── Section 2: Three-column feature cards ──
1551
+ // ── Section 2: MCP tool cards (5 contract tools + the rest of the registry) ──
1500
1552
  const cortexS2En = {
1501
- container_type: 'container',
1502
- background: { type: 'none' },
1503
- responsive_columns: { mobile: 1, tablet: 2, desktop: 3 },
1504
- column_gap: 'lg',
1505
- padding: { top: 'xl', bottom: 'xl' },
1506
- vertical_alignment: 'stretch',
1507
- column_blocks: [
1553
+ "container_type": "container",
1554
+ "background": {
1555
+ "type": "none"
1556
+ },
1557
+ "responsive_columns": {
1558
+ "mobile": 1,
1559
+ "tablet": 2,
1560
+ "desktop": 3
1561
+ },
1562
+ "column_gap": "lg",
1563
+ "padding": {
1564
+ "top": "xl",
1565
+ "bottom": "xl"
1566
+ },
1567
+ "vertical_alignment": "stretch",
1568
+ "column_blocks": [
1508
1569
  [
1509
1570
  {
1510
- block_type: 'text',
1511
- content: {
1512
- html_content: `<div class="h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7">
1513
- <p class="text-2xl mb-3">✍️</p>
1514
- <h4 class="text-base font-bold text-slate-900 dark:text-white mb-2">One-Click Copywriting</h4>
1515
- <p class="text-sm text-slate-600 dark:text-slate-300 leading-relaxed">Draft blog entries, optimize headlines, generate call-to-actions, and write product descriptions — all with context-aware prompts that know your content.</p>
1516
- </div>`,
1517
- },
1571
+ "block_type": "text",
1572
+ "content": {
1573
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>get_database_schema</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Returns every table the agent may read or change, with columns, keys, and read-only flags. The model plans against real structure, not guesses.</p></div>"
1574
+ }
1518
1575
  },
1576
+ {
1577
+ "block_type": "text",
1578
+ "content": {
1579
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>query_site_analytics</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Reads revenue, order counts, status breakdowns, and top products over a date range. Read-only, so it is safe on any token.</p></div>"
1580
+ }
1581
+ }
1519
1582
  ],
1520
1583
  [
1521
1584
  {
1522
- block_type: 'text',
1523
- content: {
1524
- html_content: `<div class="h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7">
1525
- <p class="text-2xl mb-3">🔄</p>
1526
- <h4 class="text-base font-bold text-slate-900 dark:text-white mb-2">Structure Refactoring</h4>
1527
- <p class="text-sm text-slate-600 dark:text-slate-300 leading-relaxed">Instantly convert columns, add layout grids, or reorganize block nodes. Cortex AI generates valid JSONB schema, not just text suggestions.</p>
1528
- </div>`,
1529
- },
1585
+ "block_type": "text",
1586
+ "content": {
1587
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>generate_jsonb_layout</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Turns a prompt into a complete page layout. Blocks are validated against the NextBlock schema and staged as a Live Draft.</p></div>"
1588
+ }
1530
1589
  },
1590
+ {
1591
+ "block_type": "text",
1592
+ "content": {
1593
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>search_stock_media</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Finds free stock photos on Pexels and Unsplash with alt text and credits. Drop a result straight into an image block.</p></div>"
1594
+ }
1595
+ }
1531
1596
  ],
1532
1597
  [
1533
1598
  {
1534
- block_type: 'text',
1535
- content: {
1536
- html_content: `<div class="h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7">
1537
- <p class="text-2xl mb-3">🌐</p>
1538
- <h4 class="text-base font-bold text-slate-900 dark:text-white mb-2">Automated Translation</h4>
1539
- <p class="text-sm text-slate-600 dark:text-slate-300 leading-relaxed">Localize complete pages between English and French while preserving all nested sub-blocks, layouts, and section styling intact.</p>
1540
- </div>`,
1541
- },
1599
+ "block_type": "text",
1600
+ "content": {
1601
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>update_site_navigation</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Adds, renames, or reorders header menu items per locale. Append to keep the current menu or replace it in one call.</p></div>"
1602
+ }
1542
1603
  },
1543
- ],
1544
- ],
1604
+ {
1605
+ "block_type": "text",
1606
+ "content": {
1607
+ "html_content": "<div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-violet-300 hover:bg-slate-50 dark:border-white/10 dark:bg-slate-950 dark:hover:border-violet-500 sm:p-7'><h3 class='text-base font-bold text-slate-900 dark:text-white mb-2'><code class='rounded bg-violet-50 px-2 py-1 text-sm text-violet-700 dark:bg-violet-950 dark:text-violet-200'>and 24 more</code></h3><p class='text-sm text-slate-600 dark:text-slate-300 leading-relaxed'>Create posts and products, translate pages, upload media, manage themes and scripts. Every tool is typed and scoped.</p></div>"
1608
+ }
1609
+ }
1610
+ ]
1611
+ ]
1545
1612
  };
1546
1613
 
1547
- // ── Section 3: Deep-dive 2-col ──
1614
+ // ── Section 3: Deep-dive 2-col (transport, auth, editor BYOK) ──
1548
1615
  const cortexS3En = {
1549
- container_type: 'container',
1550
- background: {
1551
- type: 'gradient',
1552
- gradient: {
1553
- type: 'linear',
1554
- direction: '180deg',
1555
- stops: [
1556
- { color: '#020617', position: 0 },
1557
- { color: '#0f172a', position: 100 },
1558
- ],
1559
- },
1616
+ "container_type": "container",
1617
+ "background": {
1618
+ "type": "gradient",
1619
+ "gradient": {
1620
+ "type": "linear",
1621
+ "direction": "180deg",
1622
+ "stops": [
1623
+ {
1624
+ "color": "#020617",
1625
+ "position": 0
1626
+ },
1627
+ {
1628
+ "color": "#0f172a",
1629
+ "position": 100
1630
+ }
1631
+ ]
1632
+ }
1560
1633
  },
1561
- responsive_columns: { mobile: 1, tablet: 1, desktop: 2 },
1562
- column_gap: 'xl',
1563
- vertical_alignment: 'center',
1564
- padding: { top: 'xl', bottom: 'xl' },
1565
- column_blocks: [
1634
+ "responsive_columns": {
1635
+ "mobile": 1,
1636
+ "tablet": 1,
1637
+ "desktop": 2
1638
+ },
1639
+ "column_gap": "xl",
1640
+ "vertical_alignment": "center",
1641
+ "padding": {
1642
+ "top": "xl",
1643
+ "bottom": "xl"
1644
+ },
1645
+ "column_blocks": [
1566
1646
  [
1567
1647
  {
1568
- block_type: 'text',
1569
- content: {
1570
- html_content: `<p class="text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4">How It Works</p>
1571
- <h3 class="text-2xl md:text-3xl font-extrabold text-white mb-4">AI That Understands Blocks</h3>
1572
- <p class="text-slate-300 leading-relaxed mb-5">Unlike generic AI tools, Cortex AI is deeply integrated with the NextBlock™ block editor. It understands your section layouts, column structures, and nested content hierarchies — generating outputs that slot directly into your page without manual cleanup.</p>
1573
- <ul class="space-y-3 text-sm text-slate-400">
1574
- <li class="flex items-start gap-2.5">
1575
- <span class="text-violet-400">→</span>
1576
- <span>Inline AI toolbar appears on text selection</span>
1577
- </li>
1578
- <li class="flex items-start gap-2.5">
1579
- <span class="text-violet-400">→</span>
1580
- <span>Prompt presets for common content tasks</span>
1581
- </li>
1582
- <li class="flex items-start gap-2.5">
1583
- <span class="text-violet-400">→</span>
1584
- <span>Full-page generation from a single prompt</span>
1585
- </li>
1586
- <li class="flex items-start gap-2.5">
1587
- <span class="text-violet-400">→</span>
1588
- <span>Token usage tracking in the admin dashboard</span>
1589
- </li>
1590
- </ul>`,
1591
- },
1592
- },
1648
+ "block_type": "text",
1649
+ "content": {
1650
+ "html_content": "<p class='text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4'>How It Works</p><h3 class='text-2xl md:text-3xl font-extrabold text-white mb-4'>One Registry, Standard Transport.</h3><p class='text-slate-300 leading-relaxed mb-5'>The MCP server speaks Streamable HTTP at /api/mcp. Your client posts JSON-RPC messages and gets typed results back. There is no SDK to install and no proxy in the middle.</p><ul class='space-y-3 text-sm text-slate-400'><li class='flex items-start gap-2.5'><span class='text-violet-400'>→</span><span>Bearer tokens are stored as SHA-256 hashes and shown once.</span></li><li class='flex items-start gap-2.5'><span class='text-violet-400'>→</span><span>Localhost trust lets a dev server skip the token while you build.</span></li><li class='flex items-start gap-2.5'><span class='text-violet-400'>→</span><span>Read-only tokens never see a mutating tool in the list.</span></li><li class='flex items-start gap-2.5'><span class='text-violet-400'>→</span><span>Copy-paste config for Claude Code, Cursor, VS Code, and Claude Desktop.</span></li></ul>"
1651
+ }
1652
+ }
1593
1653
  ],
1594
1654
  [
1595
1655
  {
1596
- block_type: 'text',
1597
- content: {
1598
- html_content: `<div class="space-y-4">
1599
- <div class="p-5 rounded-xl border border-slate-700 bg-slate-900">
1600
- <h5 class="text-sm font-bold text-white mb-1">Content Generation</h5>
1601
- <p class="text-xs text-slate-400 leading-relaxed">From short ad copy to long-form articles, Cortex AI generates on-brand content that matches your tone and style. Outputs are pre-formatted for your design system.</p>
1602
- </div>
1603
- <div class="p-5 rounded-xl border border-slate-700 bg-slate-900">
1604
- <h5 class="text-sm font-bold text-white mb-1">SEO Optimization</h5>
1605
- <p class="text-xs text-slate-400 leading-relaxed">Auto-generate meta titles, descriptions, and heading hierarchies. Cortex AI analyzes your content structure and suggests SEO improvements in real-time.</p>
1606
- </div>
1607
- <div class="p-5 rounded-xl border border-slate-700 bg-slate-900">
1608
- <h5 class="text-sm font-bold text-white mb-1">Privacy-First Design</h5>
1609
- <p class="text-xs text-slate-400 leading-relaxed">Your content is sent directly to OpenRouter using YOUR key. NextBlock™ never stores, logs, or proxies your AI requests — full data sovereignty guaranteed.</p>
1610
- </div>
1611
- </div>`,
1612
- },
1613
- },
1614
- ],
1615
- ],
1656
+ "block_type": "text",
1657
+ "content": {
1658
+ "html_content": "<div class='space-y-4'><div class='p-5 rounded-xl border border-slate-700 bg-slate-900'><h4 class='text-sm font-bold text-white mb-1'>Editor BYOK via OpenRouter</h4><p class='text-xs text-slate-400 leading-relaxed'>Pick any model, from Claude to Gemini to open weights, with one key. Costs stay on your OpenRouter bill and switch with a toggle.</p></div><div class='p-5 rounded-xl border border-slate-700 bg-slate-900'><h4 class='text-sm font-bold text-white mb-1'>AI Inside the Editor</h4><p class='text-xs text-slate-400 leading-relaxed'>An inline toolbar rewrites copy, refactors columns, and translates whole pages. Output is valid block data, so layouts never break.</p></div><div class='p-5 rounded-xl border border-slate-700 bg-slate-900'><h4 class='text-sm font-bold text-white mb-1'>Privacy-First Design</h4><p class='text-xs text-slate-400 leading-relaxed'>Requests go straight to your provider with your key. NextBlock never stores, logs, or trains on your content.</p></div></div>"
1659
+ }
1660
+ }
1661
+ ]
1662
+ ]
1616
1663
  };
1617
1664
 
1618
- // ── Section 4: CTA ──
1665
+ // ── Section 4: CTA (start the free trial) ──
1619
1666
  const cortexS4En = {
1620
- container_type: 'container',
1621
- background: {
1622
- type: 'gradient',
1623
- gradient: {
1624
- type: 'linear',
1625
- direction: '135deg',
1626
- stops: [
1627
- { color: '#312e81', position: 0 },
1628
- { color: '#1e1b4b', position: 100 },
1629
- ],
1630
- },
1667
+ "container_type": "container",
1668
+ "background": {
1669
+ "type": "gradient",
1670
+ "gradient": {
1671
+ "type": "linear",
1672
+ "direction": "135deg",
1673
+ "stops": [
1674
+ {
1675
+ "color": "#312e81",
1676
+ "position": 0
1677
+ },
1678
+ {
1679
+ "color": "#1e1b4b",
1680
+ "position": 100
1681
+ }
1682
+ ]
1683
+ }
1631
1684
  },
1632
- responsive_columns: { mobile: 1, tablet: 1, desktop: 1 },
1633
- column_gap: 'none',
1634
- padding: { top: 'xl', bottom: 'xl' },
1635
- vertical_alignment: 'center',
1636
- column_blocks: [
1685
+ "responsive_columns": {
1686
+ "mobile": 1,
1687
+ "tablet": 1,
1688
+ "desktop": 1
1689
+ },
1690
+ "column_gap": "none",
1691
+ "padding": {
1692
+ "top": "xl",
1693
+ "bottom": "xl"
1694
+ },
1695
+ "vertical_alignment": "center",
1696
+ "column_blocks": [
1637
1697
  [
1638
1698
  {
1639
- block_type: 'heading',
1640
- content: { level: 2, text_content: 'Ready to add AI to your editor?', textAlign: 'center', textColor: 'background' },
1699
+ "block_type": "heading",
1700
+ "content": {
1701
+ "level": 2,
1702
+ "text_content": "Ready to connect your AI to your CMS?",
1703
+ "textAlign": "center",
1704
+ "textColor": "background"
1705
+ }
1641
1706
  },
1642
1707
  {
1643
- block_type: 'text',
1644
- content: {
1645
- html_content: '<p class="text-center text-violet-100 max-w-xl mx-auto mt-2 mb-6">Unlock the full power of AI-driven content creation. BYOK, privacy-first, and deeply integrated with your block editor.</p>',
1646
- },
1708
+ "block_type": "text",
1709
+ "content": {
1710
+ "html_content": "<p class='text-center text-violet-100 max-w-xl mx-auto mt-2 mb-6'>One license unlocks Cortex AI in the editor and the MCP server. Start with 30 days free and no credit card, bring your own AI subscription, and keep your data yours.</p>"
1711
+ }
1647
1712
  },
1648
1713
  {
1649
- block_type: 'button',
1650
- content: {
1651
- text: 'Purchase Cortex AI',
1652
- url: 'https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license',
1653
- variant: 'secondary',
1654
- size: 'lg',
1655
- position: 'center',
1656
- },
1657
- },
1658
- ],
1659
- ],
1714
+ "block_type": "button",
1715
+ "content": {
1716
+ "text": "Start the 30-Day Free Trial",
1717
+ "url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license",
1718
+ "variant": "secondary",
1719
+ "size": "lg",
1720
+ "position": "center"
1721
+ }
1722
+ }
1723
+ ]
1724
+ ]
1660
1725
  };
1661
1726
 
1662
1727
  const cortexSectionsEn = [cortexS0En, cortexS1En, cortexS2En, cortexS3En, cortexS4En];
@@ -1664,8 +1729,10 @@ async function enrichCortexAiProducts(params: {
1664
1729
  await params.sql`
1665
1730
  UPDATE public.products
1666
1731
  SET
1667
- title = 'NextBlock™ Cortex AI - Cortex AI License',
1732
+ title = 'NextBlock™ Cortex AI MCP Server & AI Editor License',
1668
1733
  short_description = ${shortDescEn},
1734
+ meta_title = 'Cortex AI MCP Server — Connect Claude & Cursor to Your CMS',
1735
+ meta_description = 'Turn NextBlock into a Cortex AI MCP server. Connect Claude, Cursor, and ChatGPT to create layouts, inspect your schema, and manage content on your AI plan.',
1669
1736
  description_json = NULL,
1670
1737
  product_type = 'digital',
1671
1738
  payment_provider = 'freemius'