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.
- 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 +272 -205
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +10473 -8467
- 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/03-CMS-AND-EDITOR.md +1 -1
- package/templates/nextblock-template/docs/04-DATABASE-AND-AUTH.md +402 -282
- package/templates/nextblock-template/docs/05-DEVELOPER-GUIDE.md +15 -8
- package/templates/nextblock-template/docs/07-BLOCK-SDK-AND-EXTENSIBILITY.md +146 -146
- package/templates/nextblock-template/docs/08-NEXTBLOCK-CORTEX-AI-ARCHITECTURE.md +23 -4
- package/templates/nextblock-template/docs/10-CUSTOM-BLOCKS.md +222 -222
- package/templates/nextblock-template/docs/11-SELF-HOSTED-DOCKER.md +4 -1
- package/templates/nextblock-template/docs/13-STAYING-UP-TO-DATE.md +8 -0
- package/templates/nextblock-template/docs/14-MESSAGES-INBOX.md +2 -2
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +95 -104
- 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/seo/redirect-store.ts +3 -2
- package/templates/nextblock-template/lib/setup/actions.ts +460 -460
- package/templates/nextblock-template/lib/setup/env-status.ts +125 -125
- package/templates/nextblock-template/lib/setup/env-write.ts +111 -111
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +15 -175
- 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,305 @@ 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 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:
|
|
1415
|
-
background: {
|
|
1416
|
-
type:
|
|
1417
|
-
gradient: {
|
|
1418
|
-
type:
|
|
1419
|
-
direction:
|
|
1420
|
-
stops: [
|
|
1421
|
-
{
|
|
1422
|
-
|
|
1423
|
-
|
|
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: {
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
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:
|
|
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
|
-
},
|
|
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:
|
|
1443
|
-
content: {
|
|
1444
|
-
text:
|
|
1445
|
-
url:
|
|
1446
|
-
variant:
|
|
1447
|
-
size:
|
|
1448
|
-
position:
|
|
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:
|
|
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
|
-
],
|
|
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:
|
|
1497
|
+
// ── Section 1: Trial + contract metrics bar ──
|
|
1484
1498
|
const cortexS1En = {
|
|
1485
|
-
container_type:
|
|
1486
|
-
background: {
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
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:
|
|
1551
|
+
// ── Section 2: MCP tool cards (5 contract tools + the rest of the registry) ──
|
|
1500
1552
|
const cortexS2En = {
|
|
1501
|
-
container_type:
|
|
1502
|
-
background: {
|
|
1503
|
-
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
|
|
1507
|
-
|
|
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:
|
|
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
|
-
},
|
|
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:
|
|
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
|
-
},
|
|
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:
|
|
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
|
-
},
|
|
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:
|
|
1550
|
-
background: {
|
|
1551
|
-
type:
|
|
1552
|
-
gradient: {
|
|
1553
|
-
type:
|
|
1554
|
-
direction:
|
|
1555
|
-
stops: [
|
|
1556
|
-
{
|
|
1557
|
-
|
|
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: {
|
|
1562
|
-
|
|
1563
|
-
|
|
1564
|
-
|
|
1565
|
-
|
|
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:
|
|
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
|
-
},
|
|
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:
|
|
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
|
-
],
|
|
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:
|
|
1621
|
-
background: {
|
|
1622
|
-
type:
|
|
1623
|
-
gradient: {
|
|
1624
|
-
type:
|
|
1625
|
-
direction:
|
|
1626
|
-
stops: [
|
|
1627
|
-
{
|
|
1628
|
-
|
|
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: {
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
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:
|
|
1640
|
-
content: {
|
|
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:
|
|
1644
|
-
content: {
|
|
1645
|
-
html_content:
|
|
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:
|
|
1650
|
-
content: {
|
|
1651
|
-
text:
|
|
1652
|
-
url:
|
|
1653
|
-
variant:
|
|
1654
|
-
size:
|
|
1655
|
-
position:
|
|
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
|
|
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'
|