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.
- package/CLAUDE.md +22 -0
- package/docker-template/.env.docker.example +69 -69
- package/docker-template/docker/db/init/99-jwt.sql +6 -6
- package/docker-template/docker/db/init/99-roles.sql +25 -25
- package/docker-template/docker/kong/kong.yml +112 -112
- package/docker-template/scripts/docker-setup.mjs +310 -310
- package/package.json +1 -1
- package/templates/nextblock-template/.browserslistrc +11 -11
- package/templates/nextblock-template/.swcrc +30 -30
- package/templates/nextblock-template/CLAUDE.md +26 -0
- package/templates/nextblock-template/app/(auth-pages)/sign-up/page.tsx +46 -46
- package/templates/nextblock-template/app/(auth-pages)/two-factor/page.tsx +51 -51
- package/templates/nextblock-template/app/.well-known/ucp/route.ts +16 -16
- package/templates/nextblock-template/app/actions/consent.ts +57 -57
- package/templates/nextblock-template/app/actions/twoFactorEmail.ts +22 -22
- package/templates/nextblock-template/app/api/ai/cortex/build-widget/route.ts +153 -153
- package/templates/nextblock-template/app/api/ai/generate-blocks/route.ts +96 -96
- package/templates/nextblock-template/app/api/brand/email-logo/route.ts +48 -48
- package/templates/nextblock-template/app/api/checkout/freemius/sync/route.ts +29 -29
- package/templates/nextblock-template/app/api/cms/check-updates/route.ts +44 -44
- package/templates/nextblock-template/app/api/cms/full-backup/export/route.ts +33 -33
- package/templates/nextblock-template/app/api/cms/full-backup/restore/route.ts +63 -63
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +270 -205
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +8096 -7198
- package/templates/nextblock-template/app/api/cron/sync-currencies/route.ts +39 -39
- package/templates/nextblock-template/app/api/custom-blocks/db-relations/route.ts +92 -92
- package/templates/nextblock-template/app/api/custom-blocks/editor-definitions/route.ts +43 -43
- package/templates/nextblock-template/app/api/media/library/route.ts +69 -69
- package/templates/nextblock-template/app/api/media/r2-presigned/route.ts +53 -53
- package/templates/nextblock-template/app/api/visual-editing/block-draft/route.ts +47 -47
- package/templates/nextblock-template/app/api/visual-editing/product-draft/route.ts +47 -47
- package/templates/nextblock-template/app/article/[slug]/PostClientContent.tsx +442 -441
- package/templates/nextblock-template/app/article/[slug]/page.utils.ts +4 -1
- package/templates/nextblock-template/app/checkout/UcpCartHydrator.tsx +20 -20
- package/templates/nextblock-template/app/cms/blocks/components/BlockEditorModal.tsx +241 -241
- package/templates/nextblock-template/app/cms/blocks/components/CustomBlockEditorPreview.tsx +160 -160
- package/templates/nextblock-template/app/cms/blocks/editors/DynamicCustomBlockEditor.tsx +167 -167
- package/templates/nextblock-template/app/cms/components/ConnectGitHubButton.tsx +122 -122
- package/templates/nextblock-template/app/cms/components/CortexAiActiveContext.tsx +23 -23
- package/templates/nextblock-template/app/cms/components/SeoScoreBadge.tsx +3 -3
- package/templates/nextblock-template/app/cms/components/SystemAlertsBanner.tsx +112 -112
- package/templates/nextblock-template/app/cms/components/TablePagination.tsx +136 -136
- package/templates/nextblock-template/app/cms/components/TwoFactorReminderBanner.tsx +45 -45
- package/templates/nextblock-template/app/cms/components/github-connect-actions.ts +102 -102
- package/templates/nextblock-template/app/cms/components/system-alerts-actions.ts +31 -31
- package/templates/nextblock-template/app/cms/coupons/[id]/edit/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/coupons/page.tsx +16 -16
- package/templates/nextblock-template/app/cms/custom-blocks/[id]/edit/page.tsx +66 -66
- package/templates/nextblock-template/app/cms/custom-blocks/actions.ts +519 -519
- package/templates/nextblock-template/app/cms/custom-blocks/components/BlocksLibraryTransferControls.tsx +256 -256
- package/templates/nextblock-template/app/cms/custom-blocks/components/DBRelationSelect.tsx +384 -384
- package/templates/nextblock-template/app/cms/custom-blocks/components/ImageR2Picker.tsx +221 -221
- package/templates/nextblock-template/app/cms/custom-blocks/new/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/custom-blocks/page.tsx +438 -438
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardComponents.tsx +200 -200
- package/templates/nextblock-template/app/cms/dashboard/components/DashboardOnboarding.tsx +130 -130
- package/templates/nextblock-template/app/cms/import-export/actions.ts +226 -226
- package/templates/nextblock-template/app/cms/pages/page.tsx +273 -273
- package/templates/nextblock-template/app/cms/posts/page.tsx +251 -251
- package/templates/nextblock-template/app/cms/products/categories/page.tsx +12 -12
- package/templates/nextblock-template/app/cms/products/new/page.tsx +135 -135
- package/templates/nextblock-template/app/cms/promotions/PromotionsWorkspace.tsx +456 -456
- package/templates/nextblock-template/app/cms/promotions/actions.ts +115 -115
- package/templates/nextblock-template/app/cms/promotions/page.tsx +31 -31
- package/templates/nextblock-template/app/cms/settings/backup-restore/BackupRestoreWorkspace.tsx +1004 -1004
- package/templates/nextblock-template/app/cms/settings/backup-restore/page.tsx +29 -29
- package/templates/nextblock-template/app/cms/settings/bot-protection/page.tsx +24 -24
- package/templates/nextblock-template/app/cms/settings/email/page.tsx +28 -28
- package/templates/nextblock-template/app/cms/settings/extra-translations/actions.ts +276 -276
- package/templates/nextblock-template/app/cms/settings/google-analytics/page.tsx +26 -26
- package/templates/nextblock-template/app/cms/settings/logos/components/DeleteLogoButton.tsx +21 -21
- package/templates/nextblock-template/app/cms/settings/logos/components/SetActiveLogoButton.tsx +42 -42
- package/templates/nextblock-template/app/cms/settings/logos/components/SiteSeoSettingsForm.tsx +133 -133
- package/templates/nextblock-template/app/cms/settings/privacy/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/registration/page.tsx +27 -27
- package/templates/nextblock-template/app/cms/settings/security/page.tsx +33 -33
- package/templates/nextblock-template/app/lib/site-settings.ts +105 -105
- package/templates/nextblock-template/app/lib/ucp/protocol.ts +190 -190
- package/templates/nextblock-template/app/lib/ucp/server.test.ts +56 -56
- package/templates/nextblock-template/app/setup/SetupWizard.tsx +678 -678
- package/templates/nextblock-template/app/setup/layout.tsx +13 -13
- package/templates/nextblock-template/app/setup/page.tsx +111 -111
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/cancel/route.ts +38 -38
- package/templates/nextblock-template/app/ucp/v1/carts/[id]/route.ts +68 -68
- package/templates/nextblock-template/app/ucp/v1/carts/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/lookup/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/product/route.ts +35 -35
- package/templates/nextblock-template/app/ucp/v1/catalog/search/route.ts +34 -34
- package/templates/nextblock-template/components/CartTranslator.tsx +210 -210
- package/templates/nextblock-template/components/DeferredCartTranslator.tsx +51 -51
- package/templates/nextblock-template/components/DeferredGlobalSearch.tsx +68 -68
- package/templates/nextblock-template/components/DeferredGoogleAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/FeatureImageHero.tsx +47 -47
- package/templates/nextblock-template/components/GlobalSearch.tsx +557 -557
- package/templates/nextblock-template/components/Header.tsx +38 -38
- package/templates/nextblock-template/components/PublicEnvBootstrap.tsx +30 -30
- package/templates/nextblock-template/components/ResponsiveNav.tsx +14 -14
- package/templates/nextblock-template/components/auth/AuthBotProtection.tsx +182 -182
- package/templates/nextblock-template/components/blocks/PostsGridClient.tsx +48 -48
- package/templates/nextblock-template/components/blocks/TestimonialBlock.tsx +9 -9
- package/templates/nextblock-template/components/blocks/publicRendererLoaders.ts +25 -25
- package/templates/nextblock-template/components/blocks/renderers/ButtonBlockRenderer.tsx +92 -92
- package/templates/nextblock-template/components/blocks/renderers/ClientTextBlockRenderer.tsx +11 -0
- package/templates/nextblock-template/components/blocks/renderers/PostsGridBlockRenderer.tsx +24 -24
- package/templates/nextblock-template/components/blocks/renderers/TestimonialBlockRenderer.tsx +57 -57
- package/templates/nextblock-template/components/blocks/renderers/inline/AlertWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/blocks/renderers/inline/CtaWidgetRenderer.tsx +2 -2
- package/templates/nextblock-template/components/media/YouTubeFacade.tsx +105 -105
- package/templates/nextblock-template/components/media/youtube-embed-replace.tsx +32 -32
- package/templates/nextblock-template/components/privacy/ConsentBanner.tsx +170 -170
- package/templates/nextblock-template/components/privacy/ConsentGatedAnalytics.tsx +70 -70
- package/templates/nextblock-template/components/renderers/CachedDynamicLayoutEngine.tsx +28 -28
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.test.tsx +166 -166
- package/templates/nextblock-template/components/renderers/DynamicLayoutEngine.tsx +471 -471
- package/templates/nextblock-template/components/visual-editing/DeferredVisualEditing.tsx +21 -21
- package/templates/nextblock-template/context/language-rest-client.ts +32 -32
- package/templates/nextblock-template/docker/db/init/99-jwt.sql +6 -6
- package/templates/nextblock-template/docker/db/init/99-roles.sql +25 -25
- package/templates/nextblock-template/docker/kong/kong.yml +112 -112
- package/templates/nextblock-template/docs/02-ECOMMERCE-CAPABILITIES.md +364 -364
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +11 -0
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +19 -0
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/lib/app-secrets.ts +39 -39
- package/templates/nextblock-template/lib/auth/cookies.ts +47 -47
- package/templates/nextblock-template/lib/auth/crypto.ts +45 -45
- package/templates/nextblock-template/lib/auth/trustedDevices.ts +92 -92
- package/templates/nextblock-template/lib/blocks/README.md +13 -13
- package/templates/nextblock-template/lib/botProtection/verify.ts +134 -134
- package/templates/nextblock-template/lib/cms/payments-reminder.test.ts +135 -135
- package/templates/nextblock-template/lib/cms/payments-reminder.ts +105 -105
- package/templates/nextblock-template/lib/cms-transfer/types.ts +145 -145
- package/templates/nextblock-template/lib/custom-block-definitions.ts +87 -87
- package/templates/nextblock-template/lib/custom-block-r2-upload-shared.ts +178 -178
- package/templates/nextblock-template/lib/custom-block-r2-upload.test.ts +140 -140
- package/templates/nextblock-template/lib/custom-block-r2-upload.ts +88 -88
- package/templates/nextblock-template/lib/custom-block-relations.test.ts +227 -227
- package/templates/nextblock-template/lib/custom-block-relations.ts +279 -279
- package/templates/nextblock-template/lib/custom-block-safelist.ts +14 -14
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.test.ts +172 -172
- package/templates/nextblock-template/lib/editor/dynamic-extension-core.ts +213 -213
- package/templates/nextblock-template/lib/editor/dynamic-extension-loader.ts +22 -22
- package/templates/nextblock-template/lib/editor/dynamic-extensions.tsx +193 -193
- package/templates/nextblock-template/lib/email/branding-format.test.ts +133 -133
- package/templates/nextblock-template/lib/email/branding-format.ts +123 -123
- package/templates/nextblock-template/lib/email/branding.ts +76 -76
- package/templates/nextblock-template/lib/full-backup/manifest.test.ts +121 -121
- package/templates/nextblock-template/lib/full-backup/manifest.ts +206 -206
- package/templates/nextblock-template/lib/logos/active-logo.ts +53 -53
- package/templates/nextblock-template/lib/media/resolveMediaUrl.ts +56 -54
- package/templates/nextblock-template/lib/media/youtube.ts +99 -99
- package/templates/nextblock-template/lib/onboarding/actions.ts +31 -31
- package/templates/nextblock-template/lib/privacy/consent-client.ts +57 -57
- package/templates/nextblock-template/lib/privacy/contact-emails.ts +64 -64
- package/templates/nextblock-template/lib/privacy/settings.ts +115 -115
- package/templates/nextblock-template/lib/privacy/types.ts +69 -69
- package/templates/nextblock-template/lib/promotions/server.test.ts +74 -74
- package/templates/nextblock-template/lib/promotions/server.ts +741 -741
- package/templates/nextblock-template/lib/resolve-block-relations.test.ts +142 -142
- package/templates/nextblock-template/lib/resolve-block-relations.ts +255 -255
- package/templates/nextblock-template/lib/seo/page-document.ts +4 -4
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +42 -12
- package/templates/nextblock-template/lib/setup/provisioning.ts +59 -59
- package/templates/nextblock-template/lib/setup/schema-apply.ts +408 -408
- package/templates/nextblock-template/lib/setup/system-config.ts +105 -105
- package/templates/nextblock-template/lib/setup/types.ts +18 -18
- package/templates/nextblock-template/lib/storage/provider.ts +66 -66
- package/templates/nextblock-template/lib/storage/supabase-storage.ts +103 -103
- package/templates/nextblock-template/lib/updates/github-device.ts +206 -206
- package/templates/nextblock-template/lib/updates/repo-identity.ts +56 -56
- package/templates/nextblock-template/lib/visual-editing/draft-content.test.ts +105 -105
- package/templates/nextblock-template/lib/visual-editing/draft-route.test.ts +42 -42
- package/templates/nextblock-template/lib/visual-editing/edit-info.test.ts +143 -143
- package/templates/nextblock-template/lib/visual-editing/edit-info.ts +94 -94
- package/templates/nextblock-template/lib/visual-editing/product-drafts.test.ts +81 -81
- package/templates/nextblock-template/lib/zod-config.ts +5 -5
- package/templates/nextblock-template/next-env.d.ts +1 -0
- package/templates/nextblock-template/package.json +1 -1
- package/templates/nextblock-template/public/images/cortex_post.webp +0 -0
- package/templates/nextblock-template/public/images/update_nextblock.webp +0 -0
- package/templates/nextblock-template/scripts/docker-setup.mjs +310 -310
- package/templates/nextblock-template/scripts/validate-editor-block-schema.ts +112 -112
- package/templates/nextblock-template/scripts/verify-cortex-ai-build-widget.tsx +98 -98
- package/templates/nextblock-template/scripts/verify-cortex-ai-generate-blocks.ts +62 -62
- package/templates/nextblock-template/scripts/verify-cortex-ai-global-tools.ts +537 -537
- package/templates/nextblock-template/scripts/verify-cortex-ai-routing.ts +58 -58
- package/templates/nextblock-template/scripts/verify-custom-block-definitions.ts +188 -188
- package/templates/nextblock-template/scripts/verify-dynamic-custom-block-extensions.ts +123 -123
- package/templates/nextblock-template/scripts/verify-dynamic-layout-engine.tsx +133 -133
- package/templates/nextblock-template/scripts/verify-milestone-2-custom-blocks.ts +65 -65
- package/templates/nextblock-template/tools/deploy-supabase.js +159 -159
- 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
|
|
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
|
-
//
|
|
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:
|
|
1415
|
-
background: {
|
|
1416
|
-
type:
|
|
1417
|
-
gradient: {
|
|
1418
|
-
type:
|
|
1419
|
-
direction:
|
|
1420
|
-
stops: [
|
|
1421
|
-
{
|
|
1422
|
-
|
|
1423
|
-
|
|
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: {
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
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:
|
|
1435
|
-
content: {
|
|
1436
|
-
html_content:
|
|
1437
|
-
|
|
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:
|
|
1443
|
-
content: {
|
|
1444
|
-
text:
|
|
1445
|
-
url:
|
|
1446
|
-
variant:
|
|
1447
|
-
size:
|
|
1448
|
-
position:
|
|
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:
|
|
1455
|
-
content: {
|
|
1456
|
-
html_content:
|
|
1457
|
-
|
|
1458
|
-
|
|
1459
|
-
|
|
1460
|
-
|
|
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:
|
|
1495
|
+
// ── Section 1: Trial + contract metrics bar ──
|
|
1484
1496
|
const cortexS1En = {
|
|
1485
|
-
container_type:
|
|
1486
|
-
background: {
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
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:
|
|
1549
|
+
// ── Section 2: MCP tool cards (5 contract tools + the rest of the registry) ──
|
|
1500
1550
|
const cortexS2En = {
|
|
1501
|
-
container_type:
|
|
1502
|
-
background: {
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
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:
|
|
1511
|
-
content: {
|
|
1512
|
-
html_content:
|
|
1513
|
-
|
|
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:
|
|
1523
|
-
content: {
|
|
1524
|
-
html_content:
|
|
1525
|
-
|
|
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:
|
|
1535
|
-
content: {
|
|
1536
|
-
html_content:
|
|
1537
|
-
|
|
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:
|
|
1550
|
-
background: {
|
|
1551
|
-
type:
|
|
1552
|
-
gradient: {
|
|
1553
|
-
type:
|
|
1554
|
-
direction:
|
|
1555
|
-
stops: [
|
|
1556
|
-
{
|
|
1557
|
-
|
|
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: {
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
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:
|
|
1569
|
-
content: {
|
|
1570
|
-
html_content:
|
|
1571
|
-
|
|
1572
|
-
|
|
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:
|
|
1597
|
-
content: {
|
|
1598
|
-
html_content:
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
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:
|
|
1621
|
-
background: {
|
|
1622
|
-
type:
|
|
1623
|
-
gradient: {
|
|
1624
|
-
type:
|
|
1625
|
-
direction:
|
|
1626
|
-
stops: [
|
|
1627
|
-
{
|
|
1628
|
-
|
|
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: {
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
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:
|
|
1640
|
-
content: {
|
|
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:
|
|
1644
|
-
content: {
|
|
1645
|
-
html_content:
|
|
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:
|
|
1650
|
-
content: {
|
|
1651
|
-
text:
|
|
1652
|
-
url:
|
|
1653
|
-
variant:
|
|
1654
|
-
size:
|
|
1655
|
-
position:
|
|
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
|
|
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'
|