create-nextblock 0.16.4 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) 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 +270 -205
  24. package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +8096 -7198
  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/04-DATABASE-AND-AUTH.md +11 -0
  122. package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
  123. package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +19 -0
  124. package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
  125. package/templates/nextblock-template/lib/app-secrets.ts +39 -39
  126. package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
  127. package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
  128. package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
  129. package/templates/nextblock-template/lib/blocks/README.md +13 -13
  130. package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
  131. package/templates/nextblock-template/lib/cms/payments-reminder.test.ts +135 -135
  132. package/templates/nextblock-template/lib/cms/payments-reminder.ts +105 -105
  133. package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
  134. package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
  135. package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
  136. package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
  137. package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
  138. package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
  139. package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
  140. package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
  141. package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
  142. package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
  143. package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
  144. package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
  145. package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
  146. package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
  147. package/templates/nextblock-template/lib/email/branding.ts +76 -76
  148. package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
  149. package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
  150. package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
  151. package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +56 -54
  152. package/templates/nextblock-template/lib/media/youtube.ts +99 -99
  153. package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
  154. package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
  155. package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
  156. package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
  157. package/templates/nextblock-template/lib/privacy/types.ts +69 -69
  158. package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
  159. package/templates/nextblock-template/lib/promotions/server.ts +741 -741
  160. package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
  161. package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
  162. package/templates/nextblock-template/lib/seo/page-document.ts +4 -4
  163. package/templates/nextblock-template/lib/setup/actions.ts +460 -460
  164. package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
  165. package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
  166. package/templates/nextblock-template/lib/setup/migrations-bundle.ts +42 -12
  167. package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
  168. package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
  169. package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
  170. package/templates/nextblock-template/lib/setup/types.ts +18 -18
  171. package/templates/nextblock-template/lib/storage/provider.ts +66 -66
  172. package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
  173. package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
  174. package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
  175. package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -105
  176. package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -42
  177. package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -143
  178. package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -94
  179. package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -81
  180. package/templates/nextblock-template/lib/zod-config.ts +5 -5
  181. package/templates/nextblock-template/next-env.d.ts +1 -0
  182. package/templates/nextblock-template/package.json +1 -1
  183. package/templates/nextblock-template/public/images/cortex_post.webp +0 -0
  184. package/templates/nextblock-template/public/images/update_nextblock.webp +0 -0
  185. package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
  186. package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -112
  187. package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
  188. package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
  189. package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
  190. package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
  191. package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
  192. package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
  193. package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
  194. package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
  195. package/templates/nextblock-template/tools/deploy-supabase.js +159 -159
  196. 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,303 @@ 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 libs/db/src/supabase/migrations/00000000000041_marketing_review_free_cms_trial.sql
1429
+ // (the migration seeds prod; this function re-seeds the sandbox after every reset). Keep the two in step.
1430
+ // ── Section 0: Hero (MCP-native positioning, 30-day trial, two columns) ──
1413
1431
  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
- },
1432
+ "container_type": "container",
1433
+ "background": {
1434
+ "type": "gradient",
1435
+ "gradient": {
1436
+ "type": "linear",
1437
+ "direction": "135deg",
1438
+ "stops": [
1439
+ {
1440
+ "color": "#1e1b4b",
1441
+ "position": 0
1442
+ },
1443
+ {
1444
+ "color": "#312e81",
1445
+ "position": 35
1446
+ },
1447
+ {
1448
+ "color": "#0f172a",
1449
+ "position": 100
1450
+ }
1451
+ ]
1452
+ }
1426
1453
  },
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: [
1454
+ "responsive_columns": {
1455
+ "mobile": 1,
1456
+ "tablet": 1,
1457
+ "desktop": 2
1458
+ },
1459
+ "column_gap": "xl",
1460
+ "vertical_alignment": "center",
1461
+ "padding": {
1462
+ "top": "xl",
1463
+ "bottom": "xl"
1464
+ },
1465
+ "column_blocks": [
1432
1466
  [
1433
1467
  {
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
- },
1468
+ "block_type": "text",
1469
+ "content": {
1470
+ "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>"
1471
+ }
1440
1472
  },
1441
1473
  {
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
- },
1474
+ "block_type": "button",
1475
+ "content": {
1476
+ "text": "Read the MCP Setup Guide ",
1477
+ "url": "/article/cortex-ai-mcp-connection-guide",
1478
+ "variant": "default",
1479
+ "size": "lg",
1480
+ "position": "left"
1481
+ }
1482
+ }
1451
1483
  ],
1452
1484
  [
1453
1485
  {
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
- ],
1486
+ "block_type": "text",
1487
+ "content": {
1488
+ "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>"
1489
+ }
1490
+ }
1491
+ ]
1492
+ ]
1481
1493
  };
1482
1494
 
1483
- // ── Section 1: Social-proof metrics bar ──
1495
+ // ── Section 1: Trial + contract metrics bar ──
1484
1496
  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
- ],
1497
+ "container_type": "container",
1498
+ "background": {
1499
+ "type": "theme",
1500
+ "theme": "muted"
1501
+ },
1502
+ "responsive_columns": {
1503
+ "mobile": 1,
1504
+ "tablet": 2,
1505
+ "desktop": 4
1506
+ },
1507
+ "column_gap": "lg",
1508
+ "padding": {
1509
+ "top": "lg",
1510
+ "bottom": "lg"
1511
+ },
1512
+ "vertical_alignment": "center",
1513
+ "column_blocks": [
1514
+ [
1515
+ {
1516
+ "block_type": "text",
1517
+ "content": {
1518
+ "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>"
1519
+ }
1520
+ }
1521
+ ],
1522
+ [
1523
+ {
1524
+ "block_type": "text",
1525
+ "content": {
1526
+ "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>"
1527
+ }
1528
+ }
1529
+ ],
1530
+ [
1531
+ {
1532
+ "block_type": "text",
1533
+ "content": {
1534
+ "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>"
1535
+ }
1536
+ }
1537
+ ],
1538
+ [
1539
+ {
1540
+ "block_type": "text",
1541
+ "content": {
1542
+ "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>"
1543
+ }
1544
+ }
1545
+ ]
1546
+ ]
1497
1547
  };
1498
1548
 
1499
- // ── Section 2: Three-column feature cards ──
1549
+ // ── Section 2: MCP tool cards (5 contract tools + the rest of the registry) ──
1500
1550
  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: [
1551
+ "container_type": "container",
1552
+ "background": {
1553
+ "type": "none"
1554
+ },
1555
+ "responsive_columns": {
1556
+ "mobile": 1,
1557
+ "tablet": 2,
1558
+ "desktop": 3
1559
+ },
1560
+ "column_gap": "lg",
1561
+ "padding": {
1562
+ "top": "xl",
1563
+ "bottom": "xl"
1564
+ },
1565
+ "vertical_alignment": "stretch",
1566
+ "column_blocks": [
1508
1567
  [
1509
1568
  {
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
- },
1569
+ "block_type": "text",
1570
+ "content": {
1571
+ "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>"
1572
+ }
1518
1573
  },
1574
+ {
1575
+ "block_type": "text",
1576
+ "content": {
1577
+ "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>"
1578
+ }
1579
+ }
1519
1580
  ],
1520
1581
  [
1521
1582
  {
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
- },
1583
+ "block_type": "text",
1584
+ "content": {
1585
+ "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>"
1586
+ }
1530
1587
  },
1588
+ {
1589
+ "block_type": "text",
1590
+ "content": {
1591
+ "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>"
1592
+ }
1593
+ }
1531
1594
  ],
1532
1595
  [
1533
1596
  {
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
- },
1597
+ "block_type": "text",
1598
+ "content": {
1599
+ "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>"
1600
+ }
1542
1601
  },
1543
- ],
1544
- ],
1602
+ {
1603
+ "block_type": "text",
1604
+ "content": {
1605
+ "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>"
1606
+ }
1607
+ }
1608
+ ]
1609
+ ]
1545
1610
  };
1546
1611
 
1547
- // ── Section 3: Deep-dive 2-col ──
1612
+ // ── Section 3: Deep-dive 2-col (transport, auth, editor BYOK) ──
1548
1613
  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
- },
1614
+ "container_type": "container",
1615
+ "background": {
1616
+ "type": "gradient",
1617
+ "gradient": {
1618
+ "type": "linear",
1619
+ "direction": "180deg",
1620
+ "stops": [
1621
+ {
1622
+ "color": "#020617",
1623
+ "position": 0
1624
+ },
1625
+ {
1626
+ "color": "#0f172a",
1627
+ "position": 100
1628
+ }
1629
+ ]
1630
+ }
1560
1631
  },
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: [
1632
+ "responsive_columns": {
1633
+ "mobile": 1,
1634
+ "tablet": 1,
1635
+ "desktop": 2
1636
+ },
1637
+ "column_gap": "xl",
1638
+ "vertical_alignment": "center",
1639
+ "padding": {
1640
+ "top": "xl",
1641
+ "bottom": "xl"
1642
+ },
1643
+ "column_blocks": [
1566
1644
  [
1567
1645
  {
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
- },
1646
+ "block_type": "text",
1647
+ "content": {
1648
+ "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>"
1649
+ }
1650
+ }
1593
1651
  ],
1594
1652
  [
1595
1653
  {
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
- ],
1654
+ "block_type": "text",
1655
+ "content": {
1656
+ "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>"
1657
+ }
1658
+ }
1659
+ ]
1660
+ ]
1616
1661
  };
1617
1662
 
1618
- // ── Section 4: CTA ──
1663
+ // ── Section 4: CTA (start the free trial) ──
1619
1664
  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
- },
1665
+ "container_type": "container",
1666
+ "background": {
1667
+ "type": "gradient",
1668
+ "gradient": {
1669
+ "type": "linear",
1670
+ "direction": "135deg",
1671
+ "stops": [
1672
+ {
1673
+ "color": "#312e81",
1674
+ "position": 0
1675
+ },
1676
+ {
1677
+ "color": "#1e1b4b",
1678
+ "position": 100
1679
+ }
1680
+ ]
1681
+ }
1631
1682
  },
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: [
1683
+ "responsive_columns": {
1684
+ "mobile": 1,
1685
+ "tablet": 1,
1686
+ "desktop": 1
1687
+ },
1688
+ "column_gap": "none",
1689
+ "padding": {
1690
+ "top": "xl",
1691
+ "bottom": "xl"
1692
+ },
1693
+ "vertical_alignment": "center",
1694
+ "column_blocks": [
1637
1695
  [
1638
1696
  {
1639
- block_type: 'heading',
1640
- content: { level: 2, text_content: 'Ready to add AI to your editor?', textAlign: 'center', textColor: 'background' },
1697
+ "block_type": "heading",
1698
+ "content": {
1699
+ "level": 2,
1700
+ "text_content": "Ready to connect your AI to your CMS?",
1701
+ "textAlign": "center",
1702
+ "textColor": "background"
1703
+ }
1641
1704
  },
1642
1705
  {
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
- },
1706
+ "block_type": "text",
1707
+ "content": {
1708
+ "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>"
1709
+ }
1647
1710
  },
1648
1711
  {
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
- ],
1712
+ "block_type": "button",
1713
+ "content": {
1714
+ "text": "Start the 30-Day Free Trial",
1715
+ "url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license",
1716
+ "variant": "secondary",
1717
+ "size": "lg",
1718
+ "position": "center"
1719
+ }
1720
+ }
1721
+ ]
1722
+ ]
1660
1723
  };
1661
1724
 
1662
1725
  const cortexSectionsEn = [cortexS0En, cortexS1En, cortexS2En, cortexS3En, cortexS4En];
@@ -1664,8 +1727,10 @@ async function enrichCortexAiProducts(params: {
1664
1727
  await params.sql`
1665
1728
  UPDATE public.products
1666
1729
  SET
1667
- title = 'NextBlock™ Cortex AI - Cortex AI License',
1730
+ title = 'NextBlock™ Cortex AI MCP Server & AI Editor License',
1668
1731
  short_description = ${shortDescEn},
1732
+ meta_title = 'Cortex AI MCP Server — Connect Claude & Cursor to Your CMS',
1733
+ 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
1734
  description_json = NULL,
1670
1735
  product_type = 'digital',
1671
1736
  payment_provider = 'freemius'