@nextblock-cms/db 0.17.3 → 0.17.5
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/package.json +1 -1
- package/supabase/functions/nextblock-migration-ingest/index.ts +8 -8
- package/supabase/migrations/02000_catchup_gen1.sql +5880 -5880
- package/supabase/migrations/02001_baseline_schema.sql +2734 -2734
- package/supabase/migrations/02002_baseline_constraints_and_indexes.sql +1262 -1262
- package/supabase/migrations/02003_baseline_security_and_grants.sql +1577 -1577
- package/supabase/migrations/02004_baseline_seed.sql +565 -565
- package/supabase/migrations/02005_home_live_demo_promo_cadence_15min.sql +53 -53
- package/supabase/migrations/02006_home_marketing_contrast.sql +56 -0
- package/supabase/migrations/02007_home_pillar_caption_contrast.sql +44 -0
- package/supabase/migrations/02008_home_fr_parity.sql +89 -0
- package/supabase/migrations/02009_fr_cortex_posts.sql +67 -0
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
-- 02005: home "Live Demo" promo copy -- reset cadence "daily" -> "every 15 minutes".
|
|
2
|
-
--
|
|
3
|
-
-- cms.nextblock.dev now runs on Vercel Pro and its reset cron in vercel.json is
|
|
4
|
-
-- */15 * * * * (was 0 3 * * *, daily). The promo section on the EN ('home') and FR
|
|
5
|
-
-- ('accueil') home pages still advertises a daily reset; it already shipped through
|
|
6
|
-
-- 02000 (catch-up) / 02004 (baseline) and lives on real installs, so per the append-only
|
|
7
|
-
-- rule this is a forward-only data fix instead of an edit to those files.
|
|
8
|
-
--
|
|
9
|
-
-- Targets the promo by its nb-sandbox-promo sentinel + parent page (never blocks.id:
|
|
10
|
-
-- ids drift on every install) and rewrites only the six cadence phrases (EN + FR) with
|
|
11
|
-
-- replace(), leaving the rest of the block untouched. page_revisions rows carrying the
|
|
12
|
-
-- sentinel get the same rewrite so restoring a seeded revision cannot bring the "daily"
|
|
13
|
-
-- copy back. Idempotent: a second run matches zero rows (content already equals the
|
|
14
|
-
-- rewritten text). On the sandbox the promo is still stripped afterward by
|
|
15
|
-
-- removeSandboxPromoSections in the reset-sandbox route.
|
|
16
|
-
--
|
|
17
|
-
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts
|
|
18
|
-
-- excludes any migration whose filename contains "sandbox" from the reset bundle.
|
|
19
|
-
|
|
20
|
-
CREATE OR REPLACE FUNCTION pg_temp.nb_promo_cadence_15min(src text)
|
|
21
|
-
RETURNS text
|
|
22
|
-
LANGUAGE sql
|
|
23
|
-
IMMUTABLE
|
|
24
|
-
AS $fn$
|
|
25
|
-
SELECT replace(replace(replace(replace(replace(replace(src,
|
|
26
|
-
'It resets daily, so explore',
|
|
27
|
-
'It resets every 15 minutes, so explore'),
|
|
28
|
-
'· Resets daily</p>',
|
|
29
|
-
'· Resets every 15 minutes</p>'),
|
|
30
|
-
'Wipes clean daily</strong>',
|
|
31
|
-
'Wipes clean every 15 minutes</strong>'),
|
|
32
|
-
'Il se réinitialise chaque jour :',
|
|
33
|
-
'Il se réinitialise toutes les 15 minutes :'),
|
|
34
|
-
'Réinitialisé chaque jour</p>',
|
|
35
|
-
'Réinitialisé toutes les 15 minutes</p>'),
|
|
36
|
-
'Remis à zéro chaque jour</strong>',
|
|
37
|
-
'Remis à zéro toutes les 15 minutes</strong>')
|
|
38
|
-
$fn$;
|
|
39
|
-
|
|
40
|
-
UPDATE public.blocks
|
|
41
|
-
SET content = pg_temp.nb_promo_cadence_15min(content::text)::jsonb,
|
|
42
|
-
updated_at = now()
|
|
43
|
-
WHERE block_type = 'section'
|
|
44
|
-
AND page_id IS NOT NULL
|
|
45
|
-
AND content::text LIKE '%nb-sandbox-promo%'
|
|
46
|
-
AND content::text <> pg_temp.nb_promo_cadence_15min(content::text);
|
|
47
|
-
|
|
48
|
-
UPDATE public.page_revisions
|
|
49
|
-
SET content = pg_temp.nb_promo_cadence_15min(content::text)::jsonb
|
|
50
|
-
WHERE content::text LIKE '%nb-sandbox-promo%'
|
|
51
|
-
AND content::text <> pg_temp.nb_promo_cadence_15min(content::text);
|
|
52
|
-
|
|
53
|
-
DROP FUNCTION IF EXISTS pg_temp.nb_promo_cadence_15min(text);
|
|
1
|
+
-- 02005: home "Live Demo" promo copy -- reset cadence "daily" -> "every 15 minutes".
|
|
2
|
+
--
|
|
3
|
+
-- cms.nextblock.dev now runs on Vercel Pro and its reset cron in vercel.json is
|
|
4
|
+
-- */15 * * * * (was 0 3 * * *, daily). The promo section on the EN ('home') and FR
|
|
5
|
+
-- ('accueil') home pages still advertises a daily reset; it already shipped through
|
|
6
|
+
-- 02000 (catch-up) / 02004 (baseline) and lives on real installs, so per the append-only
|
|
7
|
+
-- rule this is a forward-only data fix instead of an edit to those files.
|
|
8
|
+
--
|
|
9
|
+
-- Targets the promo by its nb-sandbox-promo sentinel + parent page (never blocks.id:
|
|
10
|
+
-- ids drift on every install) and rewrites only the six cadence phrases (EN + FR) with
|
|
11
|
+
-- replace(), leaving the rest of the block untouched. page_revisions rows carrying the
|
|
12
|
+
-- sentinel get the same rewrite so restoring a seeded revision cannot bring the "daily"
|
|
13
|
+
-- copy back. Idempotent: a second run matches zero rows (content already equals the
|
|
14
|
+
-- rewritten text). On the sandbox the promo is still stripped afterward by
|
|
15
|
+
-- removeSandboxPromoSections in the reset-sandbox route.
|
|
16
|
+
--
|
|
17
|
+
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts
|
|
18
|
+
-- excludes any migration whose filename contains "sandbox" from the reset bundle.
|
|
19
|
+
|
|
20
|
+
CREATE OR REPLACE FUNCTION pg_temp.nb_promo_cadence_15min(src text)
|
|
21
|
+
RETURNS text
|
|
22
|
+
LANGUAGE sql
|
|
23
|
+
IMMUTABLE
|
|
24
|
+
AS $fn$
|
|
25
|
+
SELECT replace(replace(replace(replace(replace(replace(src,
|
|
26
|
+
'It resets daily, so explore',
|
|
27
|
+
'It resets every 15 minutes, so explore'),
|
|
28
|
+
'· Resets daily</p>',
|
|
29
|
+
'· Resets every 15 minutes</p>'),
|
|
30
|
+
'Wipes clean daily</strong>',
|
|
31
|
+
'Wipes clean every 15 minutes</strong>'),
|
|
32
|
+
'Il se réinitialise chaque jour :',
|
|
33
|
+
'Il se réinitialise toutes les 15 minutes :'),
|
|
34
|
+
'Réinitialisé chaque jour</p>',
|
|
35
|
+
'Réinitialisé toutes les 15 minutes</p>'),
|
|
36
|
+
'Remis à zéro chaque jour</strong>',
|
|
37
|
+
'Remis à zéro toutes les 15 minutes</strong>')
|
|
38
|
+
$fn$;
|
|
39
|
+
|
|
40
|
+
UPDATE public.blocks
|
|
41
|
+
SET content = pg_temp.nb_promo_cadence_15min(content::text)::jsonb,
|
|
42
|
+
updated_at = now()
|
|
43
|
+
WHERE block_type = 'section'
|
|
44
|
+
AND page_id IS NOT NULL
|
|
45
|
+
AND content::text LIKE '%nb-sandbox-promo%'
|
|
46
|
+
AND content::text <> pg_temp.nb_promo_cadence_15min(content::text);
|
|
47
|
+
|
|
48
|
+
UPDATE public.page_revisions
|
|
49
|
+
SET content = pg_temp.nb_promo_cadence_15min(content::text)::jsonb
|
|
50
|
+
WHERE content::text LIKE '%nb-sandbox-promo%'
|
|
51
|
+
AND content::text <> pg_temp.nb_promo_cadence_15min(content::text);
|
|
52
|
+
|
|
53
|
+
DROP FUNCTION IF EXISTS pg_temp.nb_promo_cadence_15min(text);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
-- 02006: home marketing copy -- fix two WCAG AA colour-contrast failures.
|
|
2
|
+
--
|
|
3
|
+
-- Lighthouse Accessibility dropped from 100 to 97 on the home page after the
|
|
4
|
+
-- marketing revamp, on two seeded elements (EN 'home' and FR 'accueil'):
|
|
5
|
+
--
|
|
6
|
+
-- 1. The competitor column header of the comparison table
|
|
7
|
+
-- ("Lovable, Bolt, v0"): text-rose-600 (#ec003f) on the thead's bg-slate-50
|
|
8
|
+
-- (#f8fafc) is 4.32:1 at 12px; AA needs 4.5:1. text-rose-700 gives ~5.8:1.
|
|
9
|
+
-- 2. The small caption under each of the three pillar cards ("mt-10 grid ...
|
|
10
|
+
-- md:grid-cols-3"): text-slate-500 (#65758b) on the violet card's tinted
|
|
11
|
+
-- background (#f8f7ff) is 4.41:1 at 14px. text-slate-600 gives ~7:1, and is
|
|
12
|
+
-- just as legible on the emerald and sky cards, so all three move together.
|
|
13
|
+
--
|
|
14
|
+
-- Both strings already shipped through 02000 (catch-up) / 02004 (baseline) and live
|
|
15
|
+
-- on real installs, so per the append-only rule this is a forward-only data fix
|
|
16
|
+
-- instead of an edit to those files. Dark-mode classes are untouched.
|
|
17
|
+
--
|
|
18
|
+
-- Targets the blocks by content signature + parent (never blocks.id: ids drift on
|
|
19
|
+
-- every install) and rewrites only the two class strings with replace(), leaving the
|
|
20
|
+
-- rest of the block untouched. page_revisions rows carrying the same markup get the
|
|
21
|
+
-- same rewrite so restoring a seeded revision cannot bring the failures back.
|
|
22
|
+
-- Idempotent: a second run matches zero rows (content already equals the rewritten
|
|
23
|
+
-- text).
|
|
24
|
+
|
|
25
|
+
CREATE OR REPLACE FUNCTION pg_temp.nb_home_marketing_contrast(src text)
|
|
26
|
+
RETURNS text
|
|
27
|
+
LANGUAGE sql
|
|
28
|
+
IMMUTABLE
|
|
29
|
+
AS $fn$
|
|
30
|
+
SELECT replace(replace(src,
|
|
31
|
+
'tracking-[0.2em] text-rose-600 dark:text-rose-300',
|
|
32
|
+
'tracking-[0.2em] text-rose-700 dark:text-rose-300'),
|
|
33
|
+
'<p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>',
|
|
34
|
+
'<p class=''mt-3 text-sm text-slate-600 dark:text-slate-400''>')
|
|
35
|
+
$fn$;
|
|
36
|
+
|
|
37
|
+
UPDATE public.blocks
|
|
38
|
+
SET content = pg_temp.nb_home_marketing_contrast(content::text)::jsonb,
|
|
39
|
+
updated_at = now()
|
|
40
|
+
WHERE block_type IN ('section', 'text')
|
|
41
|
+
AND page_id IS NOT NULL
|
|
42
|
+
AND (
|
|
43
|
+
content::text LIKE '%tracking-[0.2em] text-rose-600 dark:text-rose-300%'
|
|
44
|
+
OR content::text LIKE '%<p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>%'
|
|
45
|
+
)
|
|
46
|
+
AND content::text <> pg_temp.nb_home_marketing_contrast(content::text);
|
|
47
|
+
|
|
48
|
+
UPDATE public.page_revisions
|
|
49
|
+
SET content = pg_temp.nb_home_marketing_contrast(content::text)::jsonb
|
|
50
|
+
WHERE (
|
|
51
|
+
content::text LIKE '%tracking-[0.2em] text-rose-600 dark:text-rose-300%'
|
|
52
|
+
OR content::text LIKE '%<p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>%'
|
|
53
|
+
)
|
|
54
|
+
AND content::text <> pg_temp.nb_home_marketing_contrast(content::text);
|
|
55
|
+
|
|
56
|
+
DROP FUNCTION IF EXISTS pg_temp.nb_home_marketing_contrast(text);
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- 02007: home pillar cards -- caption colour-contrast fix (follow-up to 02006).
|
|
2
|
+
--
|
|
3
|
+
-- 02006 targeted `text-slate-500` captions, but the three pillar cards on the home
|
|
4
|
+
-- page ("Free forever" / "No token markup" / the violet one; EN 'home' and FR 'accueil')
|
|
5
|
+
-- carry their caption as
|
|
6
|
+
-- <p class='mt-3 text-sm text-muted-foreground'>
|
|
7
|
+
-- `--muted-foreground` (hsl 215 16% 47%, #65758b) on the violet card's tinted
|
|
8
|
+
-- background (#f8f7ff) is 4.41:1 at 14px; WCAG AA needs 4.5:1, and Lighthouse
|
|
9
|
+
-- Accessibility stayed at 96 because of it. text-slate-600 is ~7:1 there and reads
|
|
10
|
+
-- the same on the emerald and sky cards; dark:text-slate-400 keeps the dark theme,
|
|
11
|
+
-- where `text-muted-foreground` was already fine, at the same lightness.
|
|
12
|
+
--
|
|
13
|
+
-- Scoped to blocks that contain the pillar-card signature (`bg-violet-50/70`) and a
|
|
14
|
+
-- parent page, never by blocks.id (ids drift on every install); the class string is
|
|
15
|
+
-- rewritten with replace() and nothing else in the block changes. page_revisions rows
|
|
16
|
+
-- carrying the same markup get the same rewrite so restoring a seeded revision cannot
|
|
17
|
+
-- bring the failure back. Idempotent: a second run matches zero rows.
|
|
18
|
+
|
|
19
|
+
CREATE OR REPLACE FUNCTION pg_temp.nb_home_pillar_caption_contrast(src text)
|
|
20
|
+
RETURNS text
|
|
21
|
+
LANGUAGE sql
|
|
22
|
+
IMMUTABLE
|
|
23
|
+
AS $fn$
|
|
24
|
+
SELECT replace(src,
|
|
25
|
+
'<p class=''mt-3 text-sm text-muted-foreground''>',
|
|
26
|
+
'<p class=''mt-3 text-sm text-slate-600 dark:text-slate-400''>')
|
|
27
|
+
$fn$;
|
|
28
|
+
|
|
29
|
+
UPDATE public.blocks
|
|
30
|
+
SET content = pg_temp.nb_home_pillar_caption_contrast(content::text)::jsonb,
|
|
31
|
+
updated_at = now()
|
|
32
|
+
WHERE block_type IN ('section', 'text')
|
|
33
|
+
AND page_id IS NOT NULL
|
|
34
|
+
AND content::text LIKE '%bg-violet-50/70%'
|
|
35
|
+
AND content::text LIKE '%<p class=''mt-3 text-sm text-muted-foreground''>%'
|
|
36
|
+
AND content::text <> pg_temp.nb_home_pillar_caption_contrast(content::text);
|
|
37
|
+
|
|
38
|
+
UPDATE public.page_revisions
|
|
39
|
+
SET content = pg_temp.nb_home_pillar_caption_contrast(content::text)::jsonb
|
|
40
|
+
WHERE content::text LIKE '%bg-violet-50/70%'
|
|
41
|
+
AND content::text LIKE '%<p class=''mt-3 text-sm text-muted-foreground''>%'
|
|
42
|
+
AND content::text <> pg_temp.nb_home_pillar_caption_contrast(content::text);
|
|
43
|
+
|
|
44
|
+
DROP FUNCTION IF EXISTS pg_temp.nb_home_pillar_caption_contrast(text);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
-- 02008: French home page ('accueil') brought to parity with the English 'home'.
|
|
2
|
+
--
|
|
3
|
+
-- The 2026-09-10 marketing revamp (retired 037-042, now folded into 02000/02004)
|
|
4
|
+
-- rewrote five sections of the English home page and left the French page on the
|
|
5
|
+
-- previous positioning: hero, "why an AI website builder CMS" (comparison table +
|
|
6
|
+
-- pillar cards), the MCP walkthrough, the commerce feature cards and the Cortex AI
|
|
7
|
+
-- CTA. Every public page, post and product must ship its French equivalent, so this
|
|
8
|
+
-- migration replaces those five French blocks with faithful translations of the
|
|
9
|
+
-- English blocks -- identical markup, classes and structure, French text -- and
|
|
10
|
+
-- mirrors the English page metadata.
|
|
11
|
+
--
|
|
12
|
+
-- Scoped by parent page + block position + a signature of the OLD French copy, never
|
|
13
|
+
-- by blocks.id (ids drift on every install). Each UPDATE therefore runs once: after
|
|
14
|
+
-- it, the signature is gone and a re-run matches zero rows. A French page that an
|
|
15
|
+
-- operator has already rewritten (signature absent) is left alone.
|
|
16
|
+
--
|
|
17
|
+
-- Links point at the French equivalents: the Cortex AI licence product (-fr slug)
|
|
18
|
+
-- and the French MCP guide created by 02009.
|
|
19
|
+
|
|
20
|
+
DO $$
|
|
21
|
+
DECLARE
|
|
22
|
+
v_fr bigint;
|
|
23
|
+
v_accueil bigint;
|
|
24
|
+
BEGIN
|
|
25
|
+
SELECT id INTO v_fr FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
26
|
+
IF v_fr IS NULL THEN
|
|
27
|
+
RAISE NOTICE '02008: no French language row; nothing to do.';
|
|
28
|
+
RETURN;
|
|
29
|
+
END IF;
|
|
30
|
+
|
|
31
|
+
SELECT id INTO v_accueil FROM public.pages WHERE slug = 'accueil' AND language_id = v_fr LIMIT 1;
|
|
32
|
+
IF v_accueil IS NULL THEN
|
|
33
|
+
RAISE NOTICE '02008: no French home page (accueil); nothing to do.';
|
|
34
|
+
RETURN;
|
|
35
|
+
END IF;
|
|
36
|
+
|
|
37
|
+
-- Block #0: replaces the section whose old copy contains 'Ultra-Rapides'.
|
|
38
|
+
UPDATE public.blocks
|
|
39
|
+
SET content = $nb${"is_hero":true,"padding":{"top":"xl","bottom":"xl"},"background":{"type":"gradient","gradient":{"type":"linear","stops":[{"color":"#020817","position":0},{"color":"#0f172a","position":50},{"color":"#1e293b","position":100}],"direction":"135deg"}},"column_gap":"xl","column_blocks":[[{"content":{"html_content":"<h1 class='text-5xl md:text-6xl font-extrabold tracking-tight text-white text-center leading-tight'>Du prompt à la <span class='relative inline-block mx-1 group'><span class='absolute inset-0 bg-gradient-to-r from-blue-600 to-cyan-400 translate-y-1 md:translate-y-2 transform -skew-x-12 rounded-sm shadow-lg group-hover:skew-x-0 transition-transform duration-300 ease-out'></span><span class='relative text-white italic px-1'>production</span></span>.<br class='md:hidden' /> Le CMS constructeur de sites web par l'IA.</h1>"},"block_type":"text"},{"content":{"html_content":"<p class='text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4 leading-relaxed'>NextBlock est le CMS constructeur de sites web par l'IA, gratuit et open source, pour les équipes qui veulent plus qu'un prototype. Ajoutez Cortex AI pour brancher Claude Code, Cursor ou ChatGPT sur votre site via MCP, gratuitement pendant 30 jours. Vous conservez un site Next.js 16 et Supabase en production, avec un éditeur visuel que votre équipe maîtrise dès le deuxième jour.</p>"},"block_type":"text"},{"content":{"url":"https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&project-name=nextblock&repository-name=nextblock&stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D","size":"lg","text":"Déployer sur Vercel en un clic","variant":"default","position":"center"},"block_type":"button"},{"content":{"url":"https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license-fr","size":"lg","text":"Commencer l'essai gratuit de Cortex AI","variant":"outline","position":"center"},"block_type":"button"},{"content":{"html_content":"<div class='flex flex-wrap justify-center gap-6 text-sm uppercase tracking-wide text-slate-400 mt-8'><a href='https://github.com/nextblock-cms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>GitHub</a><a href='https://x.com/NextBlockCMS' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>X</a><a href='https://www.linkedin.com/in/nextblock/' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>LinkedIn</a><a href='https://dev.to/nextblockcms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>Dev.to</a><a href='https://www.npmjs.com/~nextblockcms' target='_blank' rel='noopener noreferrer' class='hover:text-white transition-colors'>npm</a></div>"},"block_type":"text"}],[{"content":{"html_content":"<div class='p-10 border border-white/10 rounded-3xl bg-white/5 backdrop-blur-xl shadow-2xl relative overflow-hidden group'><div class='absolute inset-0 bg-gradient-to-br from-blue-500/10 to-purple-500/10 opacity-0 group-hover:opacity-100 transition-opacity duration-500'></div><div class='relative z-10'><p class='text-xs text-white uppercase tracking-widest font-semibold mb-2'>En ligne en 10 minutes. Gratuit pour commencer.</p><p class='text-3xl font-bold text-white mb-2'>Essayez toute la pile gratuitement.</p><p class='text-base text-slate-300 mb-6'>Le CMS est gratuit pour toujours. Cortex AI, la couche IA payante qui inclut le serveur MCP, commence par un essai de 30 jours sans carte de crédit. Un clic déploie sur Vercel, et vous promptez votre propre site en dix minutes.</p><ul class='space-y-3 text-sm text-slate-200'><li><span class='text-blue-400 mr-2'>✓</span> CMS : gratuit et open source, avec pages, éditeurs et sites illimités.</li><li><span class='text-blue-400 mr-2'>✓</span> Cortex AI : 30 jours gratuits, sans carte de crédit, puis une seule licence.</li><li><span class='text-blue-400 mr-2'>✓</span> Utilisez votre propre abonnement IA. Aucune majoration sur les jetons, jamais.</li></ul><div class='mt-6 rounded-2xl overflow-hidden border border-white/10 shadow-lg'><div class='relative w-full aspect-video'><iframe class='absolute inset-0 h-full w-full border-0' src='https://www.youtube-nocookie.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0' title='Vidéo de démonstration de NextBlock' allow='accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share' referrerpolicy='strict-origin-when-cross-origin' loading='lazy' allowfullscreen></iframe></div></div></div></div>"},"block_type":"text"}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"vertical_alignment":"center"}$nb$::jsonb,
|
|
40
|
+
updated_at = now()
|
|
41
|
+
WHERE page_id = v_accueil
|
|
42
|
+
AND "order" = 0
|
|
43
|
+
AND block_type = 'section'
|
|
44
|
+
AND content::text LIKE '%Ultra-Rapides%';
|
|
45
|
+
|
|
46
|
+
-- Block #2: replaces the section whose old copy contains 'Vitesse Extr'.
|
|
47
|
+
UPDATE public.blocks
|
|
48
|
+
SET content = $nb${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"none"},"column_gap":"lg","column_blocks":[[{"content":{"level":2,"textAlign":"center","text_content":"Pourquoi un CMS constructeur de sites par l'IA l'emporte sur le code de prototype."},"block_type":"heading"},{"content":{"html_content":"<p class='text-lg text-muted-foreground text-center max-w-3xl mx-auto mb-10'>Les constructeurs par prompt comme Lovable, Bolt et v0 excellent pour un premier jet. Ensuite, ils vous remettent du code que vous devez héberger, corriger et reconstruire à chaque changement de texte. NextBlock prend les mêmes prompts et en fait un site web que toute votre équipe peut faire vivre.</p>"},"block_type":"text"},{"content":{"html_content":"<div class='grid gap-6 md:grid-cols-3'><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>🧩</div><h3 class='text-lg font-bold text-foreground mb-2'>Du prompt au CMS, pas seulement au code.</h3><p class='text-sm text-muted-foreground leading-relaxed'>Des agents IA externes construisent de vraies mises en page sous forme de blocs typés. Les éditeurs ajustent ensuite textes, images et sections dans un éditeur de type Notion. Personne n'écrit de prompt ni ne touche au code pour changer un titre.</p></div><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>🔌</div><h3 class='text-lg font-bold text-foreground mb-2'>Votre propre abonnement IA, via MCP.</h3><p class='text-sm text-muted-foreground leading-relaxed'>Connectez Claude Code, Cursor, ChatGPT ou Gemini directement à /api/mcp. Vous payez le forfait IA que vous avez déjà, pas une majoration SaaS sur les jetons. C'est la couche Cortex AI : gratuite 30 jours, sans carte de crédit.</p></div><div class='h-full rounded-2xl border border-slate-200 bg-white p-6 shadow-sm transition-colors hover:border-blue-300 dark:border-slate-800 dark:bg-slate-900'><div class='mb-4 flex h-10 w-10 items-center justify-center rounded-xl bg-blue-50 text-xl dark:bg-blue-950'>⚡</div><h3 class='text-lg font-bold text-foreground mb-2'>Architecture JSONB sans redéploiement.</h3><p class='text-sm text-muted-foreground leading-relaxed'>Les blocs générés atterrissent dans PostgreSQL sous forme de JSONB validé. Les pages se publient en quelques secondes, avec des scores Lighthouse de 100/100 par défaut et sans reconstruction.</p></div></div>"},"block_type":"text"},{"content":{"html_content":"<div class='mt-12 overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900'><div class='flex flex-wrap items-end justify-between gap-3 px-5 pt-6 pb-4'><div><p class='text-xs font-semibold uppercase tracking-[0.22em] text-slate-500 dark:text-slate-400'>Côte à côte</p><p class='mt-1 text-xl font-semibold text-foreground'>Les outils de prototype face à NextBlock.</p></div><p class='text-xs text-slate-500 dark:text-slate-400'>Lovable, Bolt et v0 comparés sur ce qui se passe après le premier prompt.</p></div><div class='overflow-x-auto'><table class='w-full min-w-[640px] border-collapse'><thead><tr class='bg-slate-50 dark:bg-slate-950/60'><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400'>Ce que vous obtenez</th><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-rose-700 dark:text-rose-300'>Lovable, Bolt, v0</th><th scope='col' class='bg-emerald-50/60 px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-200'>NextBlock</th></tr></thead><tbody><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Jour un</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Du code de prototype que vous hébergez et corrigez vous-même.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Un site Next.js 16 et Supabase en production.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Modifier après le lancement</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un nouveau prompt ou une pull request pour chaque changement.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Un éditeur visuel de type Notion, sans code.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Brouillons et révisions</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un historique du code seulement, rien pour le contenu.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Brouillons en direct et restauration en un clic de n'importe quelle page.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Publication</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Reconstruire et redéployer.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Instantanée, directement depuis PostgreSQL.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Traductions et SEO</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Pas inclus.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Traduction bloc par bloc et SEO noté pendant que vous écrivez.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Coûts de l'IA</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Des crédits de plateforme, achetés à l'outil.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Votre propre abonnement via MCP, sans majoration.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Prix de la plateforme</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un forfait mensuel.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Gratuit et open source, pour toujours. Cortex AI est le seul module payant.</td></tr></tbody></table></div></div>"},"block_type":"text"},{"content":{"html_content":"<div class='mt-10 grid gap-4 md:grid-cols-3'><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Gratuit pour toujours</p><p class='mt-3 text-xl font-semibold text-foreground'>Le CMS ne coûte rien.</p><p class='mt-3 text-sm text-slate-600 dark:text-slate-400'>Le CMS constructeur de sites par l'IA est gratuit et open source. Pages, éditeurs et sites illimités, autohébergé ou sur Vercel, sans forfait à dépasser.</p></div><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Cortex AI : essai gratuit de 30 jours</p><p class='mt-3 text-xl font-semibold text-foreground'>Essayez la couche IA, puis décidez.</p><p class='mt-3 text-sm text-slate-600 dark:text-slate-400'>Cortex AI est la seule licence payante. Elle commence par un essai de 30 jours sans carte de crédit et débloque l'IA dans l'éditeur ainsi que le serveur MCP. Pour annuler, ne faites rien.</p></div><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 dark:border-sky-500/20 dark:bg-sky-500/10'><p class='text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200'>Aucune majoration sur les jetons</p><p class='mt-3 text-xl font-semibold text-foreground'>Votre forfait fait le travail.</p><p class='mt-3 text-sm text-slate-600 dark:text-slate-400'>Cortex AI fonctionne avec l'abonnement Claude, ChatGPT, Cursor ou Gemini que vous payez déjà. La licence achète la connexion, pas les jetons.</p></div></div>"},"block_type":"text"}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":1}}$nb$::jsonb,
|
|
49
|
+
updated_at = now()
|
|
50
|
+
WHERE page_id = v_accueil
|
|
51
|
+
AND "order" = 2
|
|
52
|
+
AND block_type = 'section'
|
|
53
|
+
AND content::text LIKE '%Vitesse Extr%';
|
|
54
|
+
|
|
55
|
+
-- Block #3: replaces the section whose old copy contains 'meilleurs outils'.
|
|
56
|
+
UPDATE public.blocks
|
|
57
|
+
SET content = $nb${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"gradient","gradient":{"type":"linear","stops":[{"color":"#0f172a","position":0},{"color":"#1e293b","position":100}],"direction":"135deg"}},"column_gap":"lg","column_blocks":[[{"content":{"html_content":"<p class='text-xs uppercase tracking-[0.3em] text-cyan-300 font-semibold text-center mb-3'>Model Context Protocol</p><h2 class='text-3xl md:text-4xl font-extrabold text-white text-center mb-4'>Comment fonctionne la connexion MCP.</h2><p class='text-lg text-slate-300 text-center max-w-3xl mx-auto mb-4'>Cortex AI expose votre CMS comme un serveur MCP à l'adresse /api/mcp. Tout agent qui parle ce standard peut lire votre schéma et écrire des pages. Le serveur fait partie de la licence Cortex AI, et l'essai de 30 jours n'exige aucune carte de crédit.</p><p class='text-base text-slate-400 text-center max-w-2xl mx-auto mb-10'>Trois étapes vous mènent d'un déploiement neuf à des pages publiées, en une dizaine de minutes.</p><div class='grid gap-6 md:grid-cols-3'><div class='rounded-2xl border border-white/10 bg-white/5 p-6 backdrop-blur'><p class='text-xs uppercase tracking-[0.25em] text-cyan-300 font-semibold mb-3'>Étape 1</p><h3 class='text-lg font-bold text-white mb-2'>Déployez et lancez l'essai.</h3><p class='text-sm text-slate-300 leading-relaxed'>Un clic vers Vercel, puis lancez l'essai gratuit de Cortex AI dans les réglages du CMS. Générez un jeton à portée limitée et collez un seul bloc JSON dans Claude Code, Cursor ou VS Code.</p></div><div class='rounded-2xl border border-white/10 bg-white/5 p-6 backdrop-blur'><p class='text-xs uppercase tracking-[0.25em] text-cyan-300 font-semibold mb-3'>Étape 2</p><h3 class='text-lg font-bold text-white mb-2'>Promptez la mise en page.</h3><p class='text-sm text-slate-300 leading-relaxed'>Demandez une page d'accueil. L'agent appelle generate_jsonb_layout et le résultat arrive sous forme de brouillon en direct composé de blocs validés.</p></div><div class='rounded-2xl border border-white/10 bg-white/5 p-6 backdrop-blur'><p class='text-xs uppercase tracking-[0.25em] text-cyan-300 font-semibold mb-3'>Étape 3</p><h3 class='text-lg font-bold text-white mb-2'>Modifiez et publiez.</h3><p class='text-sm text-slate-300 leading-relaxed'>Les éditeurs peaufinent le brouillon dans l'éditeur visuel et cliquent sur Publier. La page est en ligne depuis PostgreSQL, sans redéploiement.</p></div></div>"},"block_type":"text"},{"content":{"html_content":"<div class='mt-12 grid gap-8 md:grid-cols-2'><div class='rounded-2xl border border-white/10 bg-slate-950/60 p-6'><h3 class='text-base font-bold text-white mb-4'>Pour les rédacteurs et les éditeurs</h3><ul class='space-y-3 text-sm text-slate-300'><li><strong class='text-white'>Éditeur de type Notion.</strong> Commandes slash, glisser-déposer et IA intégrée sur chaque bloc.</li><li><strong class='text-white'>Brouillons en direct.</strong> Mettez en attente la production de l'IA en toute sécurité, puis publiez quand le texte est au point.</li><li><strong class='text-white'>Révisions.</strong> Restaurez n'importe quelle version d'une page ou d'un article en un clic.</li><li><strong class='text-white'>Vérifications SEO intégrées.</strong> Titres, mots-clés, lisibilité et métadonnées notés pendant que vous écrivez.</li></ul></div><div class='rounded-2xl border border-white/10 bg-slate-950/60 p-6'><h3 class='text-base font-bold text-white mb-4'>Pour les développeurs</h3><ul class='space-y-3 text-sm text-slate-300'><li><strong class='text-white'>Cœur Next.js 16.</strong> Server Components, ISR et cache en périphérie, prêts à l'emploi.</li><li><strong class='text-white'>Backend Supabase.</strong> Postgres, authentification, stockage et sécurité au niveau des lignes, lisibles par vous.</li><li><strong class='text-white'>Registre de blocs typés.</strong> Chaque bloc possède un schéma Zod : la production de l'IA est validée avant d'être affichée.</li><li><strong class='text-white'>Open source.</strong> Autohébergez sur Docker ou déployez sur Vercel en un clic.</li></ul></div></div><p class='mt-10 text-center text-xs uppercase tracking-[0.25em] text-slate-400'>Construit avec Next.js, React, Supabase, Stripe, Tailwind, Tiptap, Vercel et Nx.</p>"},"block_type":"text"}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":1}}$nb$::jsonb,
|
|
58
|
+
updated_at = now()
|
|
59
|
+
WHERE page_id = v_accueil
|
|
60
|
+
AND "order" = 3
|
|
61
|
+
AND block_type = 'section'
|
|
62
|
+
AND content::text LIKE '%meilleurs outils%';
|
|
63
|
+
|
|
64
|
+
-- Block #5: replaces the section whose old copy contains 'Multi-Devises'.
|
|
65
|
+
UPDATE public.blocks
|
|
66
|
+
SET content = $nb${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"none"},"column_gap":"lg","column_blocks":[[{"content":{"level":2,"textAlign":"center","text_content":"Tout ce qu'il faut pour vendre en ligne"},"block_type":"heading"},{"content":{"html_content":"<p class='text-lg text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto mb-12'>NextBlock™ Commerce livre une trousse complète de boutique en ligne pour passer du catalogue au paiement en toute simplicité.</p><div class='grid gap-6 md:grid-cols-2 lg:grid-cols-3'><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M12 8c-1.657 0-3 .895-3 2s1.343 2 3 2 3 .895 3 2-1.343 2-3 2m0-8c1.11 0 2.08.402 2.599 1M12 8V7m0 1v8m0 0v1m0-1c-1.11 0-2.08-.402-2.599-1M21 12a9 9 0 11-18 0 9 9 0 0118 0z'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Multidevises</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Taux de change en temps réel, modes d'arrondi, prix psychologiques et synchronisation automatique des prix des produits dans un nombre illimité de devises.</p></div><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 14l6-6m-5.5.5h.01m4.99 5h.01M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16l3.5-2 3.5 2 3.5-2 3.5 2z'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Taxes automatisées</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Taux de taxes manuels et cumulés (TPS + TVQ) ou calcul entièrement automatique via Stripe Tax — à vous de choisir.</p></div><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Zones d'expédition</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Tarifs par zone avec correspondance pays et province, prix par devise et seuils de livraison gratuite.</p></div><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Paiement Stripe & Freemius</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Stripe pour les produits physiques, Freemius pour les licences numériques — un paiement adapté au fournisseur, avec validation de l'inventaire.</p></div><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M20 7l-8-4-8 4m16 0l-8 4m8-4v10l-8 4m0-10L4 7m8 4v10M4 7v10l8 4'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Suivi d'inventaire</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Déduction automatique des quantités au paiement, avec voies de repli résilientes et gestion des stocks par variante.</p></div><div class='p-8 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-emerald-500/30 transition-colors duration-300'><div class='w-10 h-10 rounded-lg bg-emerald-100 dark:bg-emerald-500/10 flex items-center justify-center mb-4'><svg class='w-5 h-5 text-emerald-600 dark:text-emerald-400' fill='none' stroke='currentColor' viewBox='0 0 24 24'><path stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z'></path></svg></div><h3 class='text-lg font-bold text-slate-900 dark:text-white mb-2'>Commandes & factures</h3><p class='text-sm text-slate-600 dark:text-slate-400'>Gestion complète du cycle de vie des commandes, numérotation stable des factures, documents imprimables et rapports de commandes exportables.</p></div></div>"},"block_type":"text"}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":1}}$nb$::jsonb,
|
|
67
|
+
updated_at = now()
|
|
68
|
+
WHERE page_id = v_accueil
|
|
69
|
+
AND "order" = 5
|
|
70
|
+
AND block_type = 'section'
|
|
71
|
+
AND content::text LIKE '%Multi-Devises%';
|
|
72
|
+
|
|
73
|
+
-- Block #6: replaces the section whose old copy contains 'Boostez votre'.
|
|
74
|
+
UPDATE public.blocks
|
|
75
|
+
SET content = $nb${"padding":{"top":"xl","bottom":"xl"},"background":{"type":"gradient","gradient":{"type":"linear","stops":[{"color":"#1e1b4b","position":0},{"color":"#0f172a","position":100}],"direction":"135deg"}},"column_gap":"xl","column_blocks":[[{"content":{"html_content":"<p class='text-xs uppercase tracking-[0.3em] text-violet-400 font-semibold mb-4'>Maintenant disponible — Cortex AI</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Le CMS est gratuit.<br/>Cortex AI est la mise à niveau.</h2><p class='text-lg text-slate-300 max-w-2xl leading-relaxed mb-4'>NextBlock ne coûte rien et ne coûtera jamais rien. Cortex AI est la seule licence que nous vendons. Elle ajoute l'IA dans l'éditeur et un serveur MCP à l'extérieur, pour que Claude Code, Cursor, ChatGPT et Gemini puissent bâtir votre site.</p><p class='text-base text-slate-400 max-w-2xl leading-relaxed'>Essayez-la gratuitement pendant 30 jours, sans carte de crédit. Vous apportez l'abonnement IA que vous payez déjà. La licence achète la connexion, jamais les jetons, et rien n'est mis en ligne tant qu'un éditeur ne l'a pas publié.</p>"},"block_type":"text"},{"content":{"url":"https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license-fr","size":"lg","text":"Commencer l'essai gratuit de 30 jours →","variant":"default","position":"left"},"block_type":"button"},{"content":{"url":"/article/guide-connexion-mcp-cortex-ai","size":"lg","text":"Lire le guide de configuration MCP","variant":"outline","position":"left"},"block_type":"button"}],[{"content":{"html_content":"<div class='grid grid-cols-1 gap-4 sm:grid-cols-3 lg:grid-cols-1'><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>$0</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>Le CMS, pour toujours</p></div><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>30</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>jours de Cortex AI gratuits, sans carte</p></div><div class='rounded-2xl border border-violet-500/30 bg-white/5 p-6 text-center'><p class='text-3xl font-extrabold text-white'>0 %</p><p class='text-xs uppercase tracking-wider text-violet-200 mt-1'>de majoration sur les jetons</p></div></div>"},"block_type":"text"}]],"container_type":"container","responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"vertical_alignment":"center"}$nb$::jsonb,
|
|
76
|
+
updated_at = now()
|
|
77
|
+
WHERE page_id = v_accueil
|
|
78
|
+
AND "order" = 6
|
|
79
|
+
AND block_type = 'section'
|
|
80
|
+
AND content::text LIKE '%Boostez votre%';
|
|
81
|
+
|
|
82
|
+
-- Page metadata: mirror the English title/description.
|
|
83
|
+
UPDATE public.pages
|
|
84
|
+
SET meta_title = 'NextBlock CMS',
|
|
85
|
+
meta_description = 'NextBlock™ est le CMS Next.js open source pensé pour les développeurs, qui allie des scores Lighthouse de 100 % à un puissant éditeur visuel par blocs.',
|
|
86
|
+
updated_at = now()
|
|
87
|
+
WHERE id = v_accueil
|
|
88
|
+
AND COALESCE(meta_description, '') <> 'NextBlock™ est le CMS Next.js open source pensé pour les développeurs, qui allie des scores Lighthouse de 100 % à un puissant éditeur visuel par blocs.';
|
|
89
|
+
END $$;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
-- 02009: French versions of the two Cortex AI posts that only existed in English.
|
|
2
|
+
--
|
|
3
|
+
-- 'cortex-ai-mcp-connection-guide' (the MCP setup guide the home page links to) and
|
|
4
|
+
-- 'nextblock-cortex-ai-guide' had no row in the French translation group, so the
|
|
5
|
+
-- language switcher had nothing to offer and the French home page could only link
|
|
6
|
+
-- to English. Each post is inserted once per install, in the SAME translation group
|
|
7
|
+
-- as its English original, with the same feature image and publish date, followed by
|
|
8
|
+
-- its single text block: the English markup translated node by node (code samples and
|
|
9
|
+
-- configuration snippets untouched), links pointing at the French slugs.
|
|
10
|
+
--
|
|
11
|
+
-- Guards: runs only where the English original exists and no French row does, so a
|
|
12
|
+
-- re-run (or an install whose operator already translated the post) inserts nothing.
|
|
13
|
+
-- The identity sequences are re-synced first because the seed inserts explicit ids,
|
|
14
|
+
-- which leaves the sequence behind the table on a fresh install.
|
|
15
|
+
|
|
16
|
+
DO $$
|
|
17
|
+
DECLARE
|
|
18
|
+
v_fr bigint;
|
|
19
|
+
v_post bigint;
|
|
20
|
+
BEGIN
|
|
21
|
+
SELECT id INTO v_fr FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
22
|
+
IF v_fr IS NULL THEN
|
|
23
|
+
RAISE NOTICE '02009: no French language row; nothing to do.';
|
|
24
|
+
RETURN;
|
|
25
|
+
END IF;
|
|
26
|
+
|
|
27
|
+
PERFORM setval('public.posts_id_seq', COALESCE((SELECT MAX(id) FROM public.posts), 0) + 1, false);
|
|
28
|
+
PERFORM setval('public.blocks_id_seq', COALESCE((SELECT MAX(id) FROM public.blocks), 0) + 1, false);
|
|
29
|
+
|
|
30
|
+
-- guide-connexion-mcp-cortex-ai (translation group a7c4e2d1-3b58-4f96-9e0a-6d2c8b1f5a73)
|
|
31
|
+
IF EXISTS (SELECT 1 FROM public.posts WHERE translation_group_id = 'a7c4e2d1-3b58-4f96-9e0a-6d2c8b1f5a73'::uuid AND language_id <> v_fr)
|
|
32
|
+
AND NOT EXISTS (SELECT 1 FROM public.posts WHERE translation_group_id = 'a7c4e2d1-3b58-4f96-9e0a-6d2c8b1f5a73'::uuid AND language_id = v_fr)
|
|
33
|
+
AND NOT EXISTS (SELECT 1 FROM public.posts WHERE slug = 'guide-connexion-mcp-cortex-ai' AND language_id = v_fr) THEN
|
|
34
|
+
INSERT INTO public.posts
|
|
35
|
+
(language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at,
|
|
36
|
+
meta_title, meta_description, feature_image_id, version, translation_group_id)
|
|
37
|
+
VALUES
|
|
38
|
+
(v_fr, NULL, 'Connecter Claude à NextBlock CMS via MCP, depuis Cursor ou Claude Code', 'guide-connexion-mcp-cortex-ai', 'Cortex AI', 'Enregistrez /api/mcp dans Claude Code ou Cursor et laissez votre propre abonnement IA lire le schéma, ébaucher des mises en page et gérer les pages dans NextBlock.', 'Un guide pratique du serveur MCP de Cortex AI : ce qu''il règle, les outils qu''il expose et la configuration exacte pour localhost et la production.',
|
|
39
|
+
'published', '2026-09-10T14:20:17.461154+00:00'::timestamptz,
|
|
40
|
+
'Connecter Claude à NextBlock CMS via MCP | Guide Cursor', 'Apprenez à connecter Claude à NextBlock CMS avec le Model Context Protocol. Enregistrez /api/mcp dans Claude Code ou Cursor pour inspecter les schémas et bâtir des mises en page.',
|
|
41
|
+
(SELECT id FROM public.media WHERE id = '8b2e5d1c-9a47-4f3b-8e6d-1c7a2b9d4e50'::uuid),
|
|
42
|
+
1, 'a7c4e2d1-3b58-4f96-9e0a-6d2c8b1f5a73'::uuid)
|
|
43
|
+
RETURNING id INTO v_post;
|
|
44
|
+
|
|
45
|
+
INSERT INTO public.blocks (post_id, language_id, block_type, content, "order")
|
|
46
|
+
VALUES (v_post, v_fr, 'text', $nb${"html_content":"<p class='text-lg leading-8 text-slate-700 dark:text-slate-300'>Ce guide vous montre comment connecter Claude à NextBlock CMS avec un standard ouvert plutôt qu'un plugin propriétaire. Cortex AI transforme votre site en serveur Model Context Protocol. Claude Code, Cursor, ChatGPT et Gemini peuvent ensuite lire le schéma de votre base de données, ébaucher des mises en page et mettre à jour la navigation depuis leur propre fenêtre de clavardage. Vous payez l'abonnement IA que vous avez déjà, sans aucune majoration sur les jetons entre les deux.</p><div class='grid gap-4 md:grid-cols-3 my-10'><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 dark:border-sky-500/20 dark:bg-sky-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200'>Un seul bloc de configuration</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Configuré en quelques minutes.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Collez une seule entrée JSON dans Claude Code, Cursor ou VS Code. La carte des réglages du CMS l'écrit pour vous.</p></div><div class='rounded-3xl border border-indigo-200/70 bg-indigo-50/70 p-6 dark:border-indigo-500/20 dark:bg-indigo-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200'>Essai gratuit</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>30 jours, sans carte de crédit.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Le CMS est gratuit pour toujours. Cortex AI, qui inclut le serveur MCP, commence par un essai gratuit de 30 jours.</p></div><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Brouillons en direct</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Rien ne part par accident.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Chaque mise en page écrite par l'agent arrive sous forme de brouillon. Un éditeur la révise et clique sur Publier.</p></div></div><p>Chaque prompt devient un enregistrement structuré en base de données plutôt qu'un tas de code généré. Vos éditeurs gardent un CMS visuel, vos développeurs gardent une application Next.js 16 propre, et rien n'est mis en ligne tant que quelqu'un ne clique pas sur Publier.</p><h2>Le problème des constructeurs web IA traditionnels</h2><p>Les constructeurs par prompt comme Lovable, Bolt et v0 impressionnent le premier jour. Vous décrivez une page et obtenez une application React fonctionnelle en quelques minutes. Les ennuis commencent le deuxième jour.</p><div class='not-prose my-8 overflow-hidden rounded-3xl border border-slate-200 bg-white shadow-sm dark:border-slate-800 dark:bg-slate-900'><div class='flex flex-wrap items-end justify-between gap-3 px-5 pt-6 pb-4'><div><p class='text-xs font-semibold uppercase tracking-[0.22em] text-slate-500 dark:text-slate-400'>Côte à côte</p><p class='mt-1 text-xl font-semibold text-slate-900 dark:text-white'>Les outils de prototype face à NextBlock.</p></div><p class='text-xs text-slate-500 dark:text-slate-400'>Ce qui se passe après le premier prompt.</p></div><div class='overflow-x-auto'><table class='w-full min-w-[640px] border-collapse'><thead><tr class='bg-slate-50 dark:bg-slate-950/60'><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-slate-500 dark:text-slate-400'>Ce que vous obtenez</th><th scope='col' class='px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-rose-600 dark:text-rose-300'>Lovable, Bolt, v0</th><th scope='col' class='bg-emerald-50/60 px-5 py-3 text-left text-xs font-semibold uppercase tracking-[0.2em] text-emerald-700 dark:bg-emerald-500/10 dark:text-emerald-200'>NextBlock</th></tr></thead><tbody><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Jour un</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Du code jetable sans couche de contenu.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Un site Next.js 16 et Supabase en production, avec un CMS.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Changer un titre</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un autre prompt ou une autre pull request.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Un éditeur le tape dans un éditeur de type Notion.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Brouillons et révisions</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un historique du code seulement.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Brouillons en direct, révisions et restauration en un clic.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Traductions et SEO</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Pas inclus.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Traduction bloc par bloc et vérifications SEO pendant que vous écrivez.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Coûts de l'IA</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Des crédits de plateforme, achetés à l'outil.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>Votre propre abonnement via MCP, sans majoration.</td></tr><tr class='border-t border-slate-200 dark:border-slate-800'><th scope='row' class='px-5 py-4 text-left align-top text-sm font-semibold text-foreground'>Prix</th><td class='px-5 py-4 align-top text-sm text-muted-foreground'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-rose-100 text-xs font-bold text-rose-600 dark:bg-rose-500/20 dark:text-rose-300'>✗</span>Un forfait mensuel.</td><td class='bg-emerald-50/60 px-5 py-4 align-top text-sm text-foreground dark:bg-emerald-500/10'><span class='mr-2 inline-flex h-5 w-5 items-center justify-center rounded-full bg-emerald-100 text-xs font-bold text-emerald-700 dark:bg-emerald-500/20 dark:text-emerald-200'>✓</span>CMS gratuit. Cortex AI après un essai gratuit de 30 jours.</td></tr></tbody></table></div></div><p>NextBlock prend le contre-pied des outils de prototype. L'IA devrait ébaucher le site, et les humains devraient en être propriétaires. La connexion MCP est le point de rencontre de ces deux mondes.</p><h2>Comment Cortex AI utilise le Model Context Protocol (MCP)</h2><p>Le Model Context Protocol est un standard ouvert qui donne des outils aux agents IA. Un client comme Claude Code liste les outils offerts par un serveur, les appelle avec des arguments typés et lit des résultats typés en retour. Cortex AI embarque ce serveur dans votre installation NextBlock, à l'adresse <code>/api/mcp</code>.</p><div class='not-prose my-12 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 p-6 shadow-2xl sm:p-8'><p class='text-[0.65rem] font-semibold uppercase tracking-[0.3em] text-indigo-300'>Model Context Protocol · NextBlock Cortex AI</p><p class='mt-2 text-2xl font-extrabold text-white sm:text-3xl'>Du prompt à la production, sans redéploiement.</p><p class='mt-2 max-w-2xl text-sm text-slate-400'>Votre client IA parle au CMS via un standard ouvert. Le résultat atterrit sous forme de données, pas de code à héberger.</p><div class='mt-8 grid gap-4 md:grid-cols-2 xl:grid-cols-4'><div class='relative flex flex-col rounded-2xl border border-sky-400/40 bg-white/5 p-5'><span class='block h-1 w-12 rounded-full bg-sky-400'></span><p class='mt-4 text-[0.65rem] font-semibold uppercase tracking-[0.25em] text-sky-300'>Étape 1 · Votre client IA</p><p class='mt-2 text-lg font-bold leading-snug text-white'>Prompt</p><p class='mt-1 text-xs text-slate-400'>N'importe quel client MCP que vous payez déjà.</p><div class='mt-4 flex-1 text-sm text-slate-200'><div class='flex flex-wrap gap-2'><span class='rounded-full border border-sky-400/40 bg-sky-400/10 px-3 py-1 text-xs font-semibold text-slate-100'>Claude Code</span><span class='rounded-full border border-sky-400/40 bg-sky-400/10 px-3 py-1 text-xs font-semibold text-slate-100'>Cursor</span><span class='rounded-full border border-sky-400/40 bg-sky-400/10 px-3 py-1 text-xs font-semibold text-slate-100'>ChatGPT</span><span class='rounded-full border border-sky-400/40 bg-sky-400/10 px-3 py-1 text-xs font-semibold text-slate-100'>Gemini</span></div><p class='mt-4 text-xs text-slate-300'>Un seul bloc JSON dans la configuration de votre client enregistre le serveur. C'est toute la configuration.</p></div><p class='mt-5 rounded-lg bg-sky-400/10 px-3 py-2 text-center text-[0.7rem] font-semibold text-sky-300'>Votre abonnement · aucune majoration sur les jetons</p><span class='absolute -right-4 top-1/2 hidden -translate-y-1/2 text-xl text-slate-500 xl:block' aria-hidden='true'>→</span></div><div class='relative flex flex-col rounded-2xl border border-violet-400/40 bg-white/5 p-5'><span class='block h-1 w-12 rounded-full bg-violet-400'></span><p class='mt-4 text-[0.65rem] font-semibold uppercase tracking-[0.25em] text-violet-300'>Étape 2 · /api/mcp</p><p class='mt-2 text-lg font-bold leading-snug text-white'>Serveur MCP Cortex AI</p><p class='mt-1 text-xs text-slate-400'>Streamable HTTP · jeton bearer · à portée limitée.</p><div class='mt-4 flex-1 text-sm text-slate-200'><div class='space-y-1.5'><code class='block rounded-md bg-white/5 px-3 py-1.5 font-mono text-xs text-violet-100'>get_database_schema</code><code class='block rounded-md bg-white/5 px-3 py-1.5 font-mono text-xs text-violet-100'>generate_jsonb_layout</code><code class='block rounded-md bg-white/5 px-3 py-1.5 font-mono text-xs text-violet-100'>update_site_navigation</code><code class='block rounded-md bg-white/5 px-3 py-1.5 font-mono text-xs text-violet-100'>query_site_analytics</code><code class='block rounded-md bg-white/5 px-3 py-1.5 font-mono text-xs text-violet-100'>search_stock_media</code></div></div><p class='mt-5 rounded-lg bg-violet-400/10 px-3 py-2 text-center text-[0.7rem] font-semibold text-violet-300'>5 outils de contrat · 29 outils typés</p><span class='absolute -right-4 top-1/2 hidden -translate-y-1/2 text-xl text-slate-500 xl:block' aria-hidden='true'>→</span></div><div class='relative flex flex-col rounded-2xl border border-emerald-400/40 bg-white/5 p-5'><span class='block h-1 w-12 rounded-full bg-emerald-400'></span><p class='mt-4 text-[0.65rem] font-semibold uppercase tracking-[0.25em] text-emerald-300'>Étape 3 · PostgreSQL</p><p class='mt-2 text-lg font-bold leading-snug text-white'>Blocs JSONB validés</p><p class='mt-1 text-xs text-slate-400'>Supabase · un schéma Zod par bloc.</p><div class='mt-4 flex-1 text-sm text-slate-200'><div class='space-y-2'><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-emerald-400/20 text-[0.6rem] font-bold text-emerald-300'>✓</span><span>Mis en attente comme brouillon en direct.</span></p><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-emerald-400/20 text-[0.6rem] font-bold text-emerald-300'>✓</span><span>Les éditeurs peaufinent dans le CMS visuel.</span></p><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-emerald-400/20 text-[0.6rem] font-bold text-emerald-300'>✓</span><span>Révisions et vérifications SEO intégrées.</span></p></div></div><p class='mt-5 rounded-lg bg-emerald-400/10 px-3 py-2 text-center text-[0.7rem] font-semibold text-emerald-300'>Rien n'est en ligne avant la publication</p><span class='absolute -right-4 top-1/2 hidden -translate-y-1/2 text-xl text-slate-500 xl:block' aria-hidden='true'>→</span></div><div class='relative flex flex-col rounded-2xl border border-amber-400/40 bg-white/5 p-5'><span class='block h-1 w-12 rounded-full bg-amber-400'></span><p class='mt-4 text-[0.65rem] font-semibold uppercase tracking-[0.25em] text-amber-300'>Étape 4 · Next.js 16</p><p class='mt-2 text-lg font-bold leading-snug text-white'>Page publiée</p><p class='mt-1 text-xs text-slate-400'>Server Components · cache en périphérie.</p><div class='mt-4 flex-1 text-sm text-slate-200'><div class='space-y-2'><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-amber-400/20 text-[0.6rem] font-bold text-amber-300'>✓</span><span>Ni reconstruction, ni redéploiement.</span></p><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-amber-400/20 text-[0.6rem] font-bold text-amber-300'>✓</span><span>Scores Lighthouse de 100/100 par défaut.</span></p><p class='flex items-start gap-2 text-sm text-slate-200'><span class='mt-0.5 inline-flex h-4 w-4 flex-shrink-0 items-center justify-center rounded-full bg-amber-400/20 text-[0.6rem] font-bold text-amber-300'>✓</span><span>Le même site le deuxième jour.</span></p></div></div><p class='mt-5 rounded-lg bg-amber-400/10 px-3 py-2 text-center text-[0.7rem] font-semibold text-amber-300'>Un site web plus un CMS</p></div></div><div class='mt-6 h-1.5 rounded-full bg-gradient-to-r from-sky-400 via-violet-400 to-amber-400'></div><p class='mt-4 text-center text-sm text-slate-300'>Les éditeurs gardent un CMS visuel. Les développeurs gardent une base de code Next.js 16 propre. L'agent ne touche ni à l'un ni à l'autre.</p></div><p>Le point de terminaison parle Streamable HTTP. Votre client envoie des messages JSON-RPC dans une requête HTTPS ordinaire, et le serveur répond dans la même réponse. Aucun flux SSE de longue durée à surveiller, aucun SDK à installer côté serveur. Les mêmes 29 outils typés qui alimentent Cortex AI dans l'éditeur sont exposés sur le réseau, si bien que l'agent de votre IDE et celui de votre CMS ne divergent jamais.</p><div class='grid gap-4 md:grid-cols-2 my-8'><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Règle de sécurité no 1</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Les mises en page attendent en brouillon en direct.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Les outils de mise en page écrivent des brouillons : rien n'atteint les visiteurs tant qu'un éditeur ne publie pas.</p></div><div class='rounded-3xl border border-blue-200/70 bg-blue-50/70 p-6 dark:border-blue-500/20 dark:bg-blue-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200'>Règle de sécurité no 2</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>Chaque jeton porte une portée.</p><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Un jeton en lecture seule ne voit même pas les outils capables de modifier des données. Les outils de modification sont absents de sa liste.</p></div></div><h3>Outils MCP de base de données disponibles</h3><p>Cinq noms d'outils forment le contrat MCP public. Chacun renvoie vers un exécuteur Cortex AI testé.</p><div class='grid gap-4 md:grid-cols-2 my-8'><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>get_database_schema</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>lecture</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Retourne chaque table que l'agent peut lire ou modifier, avec colonnes, clés primaires et indicateurs de lecture seule.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>generate_jsonb_layout</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-amber-300 text-amber-700 dark:border-amber-500/40 dark:text-amber-200'>écriture</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Transforme un prompt en mise en page complète, valide chaque bloc contre le schéma NextBlock et la met en attente comme brouillon en direct.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>update_site_navigation</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-amber-300 text-amber-700 dark:border-amber-500/40 dark:text-amber-200'>écriture</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Ajoute, renomme ou réordonne les éléments du menu d'en-tête, par langue.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>query_site_analytics</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>lecture</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Lit les revenus, le nombre de commandes, la répartition par statut et les meilleurs produits sur une période.</p></div><div class='rounded-3xl border border-slate-200 bg-white p-5 shadow-sm dark:border-white/10 dark:bg-white/5'><div class='flex items-center justify-between gap-3'><code class='rounded-lg bg-violet-50 px-2.5 py-1 text-sm text-violet-700 dark:bg-violet-500/15 dark:text-violet-200'>search_stock_media</code><span class='rounded-full border px-2.5 py-0.5 text-[0.65rem] font-semibold uppercase tracking-[0.18em] border-emerald-300 text-emerald-700 dark:border-emerald-500/40 dark:text-emerald-200'>lecture</span></div><p class='mt-3 mb-0 text-sm text-slate-600 dark:text-slate-300'>Trouve des photos libres de droits avec texte alternatif et crédit photographe, prêtes pour un bloc image.</p></div><div class='rounded-3xl border border-dashed border-slate-300 p-5 dark:border-white/20'><p class='mt-0 mb-0 text-sm font-semibold text-slate-900 dark:text-white'>Et 24 autres.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Créer des articles et des produits, traduire des pages, téléverser des médias, gérer thèmes et scripts. Trois ressources exposent les schémas de la base de données, des blocs et des blocs personnalisés.</p></div></div><h2>Pas à pas : connecter Claude à NextBlock CMS dans Cursor et Claude Code</h2><p>Le serveur est désactivé par défaut, parce qu'il constitue une surface d'écriture à distance sur du contenu en ligne. L'activer prend trois étapes, et grâce à l'essai, le premier mois ne coûte rien.</p><div class='grid gap-4 md:grid-cols-3 my-8'><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-sky-500 dark:text-sky-300'>01</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Lancez l'essai gratuit.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Ouvrez <strong>Réglages du CMS → Cortex AI</strong>, lancez l'essai de 30 jours sans carte de crédit et activez la carte d'accès au serveur MCP.</p></div><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-violet-500 dark:text-violet-300'>02</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Générez un jeton.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>Choisissez la portée dont vous avez besoin. La lecture seule suffit pour la planification et les audits.</p></div><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 font-mono text-3xl font-bold text-emerald-500 dark:text-emerald-300'>03</p><p class='mt-3 mb-0 text-lg font-semibold text-slate-900 dark:text-white'>Copiez la configuration.</p><p class='mt-2 mb-0 text-sm text-slate-600 dark:text-slate-300'>La carte affiche un extrait pour chacun : Claude Code, Cursor, VS Code et Claude Desktop.</p></div></div><p>Claude Code exige <code>\"type\": \"http\"</code> dans l'entrée, sinon il ignore le serveur sans avertissement. Cursor déduit le transport à partir de l'URL et n'a pas besoin de champ type. VS Code utilise une clé <code>servers</code> de premier niveau et demande le jeton plutôt que de le stocker.</p><h3>Configuration localhost sans jeton</h3><p>Pendant le développement, activez <strong>Faire confiance à localhost sans jeton</strong> dans la même carte de réglages. Un serveur de développement sur votre machine accepte alors les appels en boucle locale sans aucun en-tête. Les installations autonomes tournent sur le port 3000, et le serveur de développement du monorepo sur le port 4200.</p><p>Ajoutez ce bloc au fichier <code>.mcp.json</code> à la racine de votre projet pour Claude Code.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>.mcp.json</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>{\n \"mcpServers\": {\n \"nextblock\": {\n \"type\": \"http\",\n \"url\": \"http://localhost:3000/api/mcp\"\n }\n }\n}</code></pre></div><p>La forme CLI fait la même chose en une ligne.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>terminal</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>claude mcp add --transport http nextblock http://localhost:3000/api/mcp</code></pre></div><div class='rounded-3xl border border-amber-200 bg-amber-50/80 p-6 my-8 dark:border-amber-500/20 dark:bg-amber-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200'>Développement seulement</p><p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>La confiance envers localhost est ignorée dans les builds de production, parce qu'un proxy peut usurper l'en-tête host. La production utilise toujours un jeton.</p></div><h3>Authentification en production par jetons bearer</h3><p>En production, chaque client envoie un jeton bearer. Les jetons commencent par <code>nbmcp_</code>, ne sont affichés qu'une seule fois à leur création et ne sont stockés que sous forme de hachage SHA-256. Révoquer un jeton se fait en un clic, et la même valeur ne peut jamais être générée de nouveau.</p><p>Ajoutez ceci à <code>.cursor/mcp.json</code> pour Cursor, ou placez la même entrée dans <code>.mcp.json</code> avec un champ type pour Claude Code.</p><div class='my-8 overflow-hidden rounded-[2rem] border border-slate-800 bg-slate-950 shadow-2xl'><div class='flex items-center gap-2 border-b border-white/10 px-5 py-3'><span class='h-3 w-3 rounded-full bg-red-400/70'></span><span class='h-3 w-3 rounded-full bg-yellow-400/70'></span><span class='h-3 w-3 rounded-full bg-green-400/70'></span><span class='ml-3 text-xs font-mono text-slate-400'>.cursor/mcp.json</span></div><pre class='m-0 overflow-x-auto rounded-none bg-transparent px-6 py-5 text-sm leading-6 text-slate-200'><code>{\n \"mcpServers\": {\n \"nextblock\": {\n \"url\": \"https://your-site.com/api/mcp\",\n \"headers\": { \"Authorization\": \"Bearer nbmcp_your_token\" }\n }\n }\n}</code></pre></div><div class='rounded-3xl border border-violet-200 bg-violet-50/80 p-6 my-8 dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Essayez</p><p class='mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200'>Une fois le client connecté, demandez quelque chose de concret. Essayez « inspecte le schéma de la base de données et ébauche une page de tarifs à trois paliers ». L'agent appelle l'outil de schéma, puis l'outil de mise en page, et votre CMS affiche un nouveau brouillon en direct prêt pour la révision.</p></div><h2>Rendu en production sans redéploiement</h2><p>Si ça fonctionne, c'est grâce à l'endroit où le résultat atterrit. Cortex AI écrit des enregistrements de blocs JSONB stricts dans PostgreSQL, pas des chaînes HTML ni des fichiers source. Chaque bloc possède un schéma Zod : un champ invalide est rejeté avant d'être stocké.</p><div class='grid gap-4 md:grid-cols-3 my-8'><div class='rounded-3xl border border-sky-200/70 bg-sky-50/70 p-6 text-center dark:border-sky-500/20 dark:bg-sky-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>0</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-sky-700 dark:text-sky-200'>reconstruction pour publier</p></div><div class='rounded-3xl border border-violet-200/70 bg-violet-50/70 p-6 text-center dark:border-violet-500/20 dark:bg-violet-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>1</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-violet-700 dark:text-violet-200'>schéma Zod par bloc</p></div><div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/70 p-6 text-center dark:border-emerald-500/20 dark:bg-emerald-500/10'><p class='mt-0 mb-0 text-4xl font-extrabold text-slate-900 dark:text-white'>100</p><p class='mt-2 mb-0 text-xs font-semibold uppercase tracking-[0.2em] text-emerald-700 dark:text-emerald-200'>Lighthouse par défaut</p></div></div><p>À la requête, Next.js 16 rend ces enregistrements avec des Server Components et met le résultat en cache en périphérie. Il n'y a aucune étape de build entre la publication et la mise en ligne, ni de coût de nettoyage HTML à chaque rendu. Les scores Lighthouse de 100/100 d'un site vide sont les mêmes après que l'agent a ébauché cinquante pages.</p><div class='rounded-3xl border border-slate-200 bg-slate-50 p-6 my-10 dark:border-white/10 dark:bg-white/5'><p class='mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-slate-600 dark:text-slate-300'>Prochaine étape</p><p class='mt-3 mb-0 text-xl font-semibold text-slate-900 dark:text-white'>En ligne en dix minutes, gratuit pendant trente jours.</p><p class='mt-3 text-sm text-slate-600 dark:text-slate-300'>Déployez le CMS gratuit sur Vercel en un clic, lancez l'essai Cortex AI sans carte de crédit et connectez Claude à NextBlock CMS dès aujourd'hui. Lisez comment le registre de blocs garde tout cela en sécurité si vous voulez le portrait complet.</p><div class='mt-5 flex flex-wrap gap-3'><a href='https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license-fr' class='inline-flex items-center rounded-full bg-slate-900 px-6 py-3 text-sm font-semibold text-white no-underline shadow-lg hover:bg-slate-700 dark:bg-white dark:text-slate-900 dark:hover:bg-slate-200'>Commencer l'essai gratuit de 30 jours</a><a href='https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fnextblock-cms%2Fnextblock&project-name=nextblock&repository-name=nextblock&stores=%5B%7B%22type%22%3A%22integration%22%2C%22integrationSlug%22%3A%22supabase%22%2C%22productSlug%22%3A%22supabase%22%7D%5D' class='inline-flex items-center rounded-full border border-slate-300 px-6 py-3 text-sm font-semibold text-slate-700 no-underline hover:border-slate-500 dark:border-white/20 dark:text-slate-200 dark:hover:border-white/50'>Déployer sur Vercel</a><a href='/article/comment-nextblock-fonctionne' class='inline-flex items-center rounded-full border border-slate-300 px-6 py-3 text-sm font-semibold text-slate-700 no-underline hover:border-slate-500 dark:border-white/20 dark:text-slate-200 dark:hover:border-white/50'>Comment fonctionne NextBlock</a></div></div>"}$nb$::jsonb, 0);
|
|
47
|
+
END IF;
|
|
48
|
+
|
|
49
|
+
-- guide-cortex-ai-nextblock (translation group dbe2a06f-1a9d-48ba-bc35-0f6ef4869156)
|
|
50
|
+
IF EXISTS (SELECT 1 FROM public.posts WHERE translation_group_id = 'dbe2a06f-1a9d-48ba-bc35-0f6ef4869156'::uuid AND language_id <> v_fr)
|
|
51
|
+
AND NOT EXISTS (SELECT 1 FROM public.posts WHERE translation_group_id = 'dbe2a06f-1a9d-48ba-bc35-0f6ef4869156'::uuid AND language_id = v_fr)
|
|
52
|
+
AND NOT EXISTS (SELECT 1 FROM public.posts WHERE slug = 'guide-cortex-ai-nextblock' AND language_id = v_fr) THEN
|
|
53
|
+
INSERT INTO public.posts
|
|
54
|
+
(language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at,
|
|
55
|
+
meta_title, meta_description, feature_image_id, version, translation_group_id)
|
|
56
|
+
VALUES
|
|
57
|
+
(v_fr, NULL, 'Guide NextBlock Cortex AI', 'guide-cortex-ai-nextblock', 'Cortex AI', 'Un guide pratique de Cortex AI, l''assistant conscient des blocs pour le routage des modèles, le contrôle BYOK et une production éditoriale plus rapide dans NextBlock.', 'Découvrez comment Cortex AI apporte la génération structurée, le choix du fournisseur et des flux de contenu plus sûrs directement dans l''éditeur NextBlock.',
|
|
58
|
+
'published', '2026-05-27T13:24:00+00:00'::timestamptz,
|
|
59
|
+
'Guide NextBlock Cortex AI', 'Découvrez comment NextBlock Cortex AI aide les équipes à générer, affiner et traduire du contenu par blocs structuré, avec routage des modèles et contrôle BYOK.',
|
|
60
|
+
(SELECT id FROM public.media WHERE id = '8414dc5a-92d7-4cbf-8ecf-2fc8ec91a0a3'::uuid),
|
|
61
|
+
1, 'dbe2a06f-1a9d-48ba-bc35-0f6ef4869156'::uuid)
|
|
62
|
+
RETURNING id INTO v_post;
|
|
63
|
+
|
|
64
|
+
INSERT INTO public.blocks (post_id, language_id, block_type, content, "order")
|
|
65
|
+
VALUES (v_post, v_fr, 'text', $nb${"html_content":"\n<p class='text-lg leading-8 text-slate-700 dark:text-slate-300'>NextBlock Cortex AI est l'outil de contenu intelligent conçu pour les pages web modernes. Il comprend les blocs de page, les mises en page de sections et les règles éditoriales, pour que vous créiez un meilleur contenu, plus vite.</p>\n\n<div class='grid gap-4 md:grid-cols-3 my-10'>\n <div class='rounded-3xl border border-violet-200/70 bg-violet-50/80 p-6 dark:border-violet-500/20 dark:bg-violet-500/10'>\n <p class='text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Routage des modèles</p>\n <h2 class='mt-3 text-xl font-semibold text-slate-900 dark:text-white'>Choisissez le bon modèle</h2>\n <p class='mt-3 text-sm text-slate-600 dark:text-slate-300'>Acheminez vos prompts via OpenRouter ou votre propre fournisseur pour équilibrer vitesse et prix.</p>\n </div>\n <div class='rounded-3xl border border-sky-200/70 bg-sky-50/80 p-6 dark:border-sky-500/20 dark:bg-sky-500/10'>\n <p class='text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200'>Contrôle BYOK</p>\n <h2 class='mt-3 text-xl font-semibold text-slate-900 dark:text-white'>Utilisez vos propres clés</h2>\n <p class='mt-3 text-sm text-slate-600 dark:text-slate-300'>Gardez les clés des fournisseurs en sécurité sur votre serveur tout en offrant aux éditeurs un écran de rédaction IA tout simple.</p>\n </div>\n <div class='rounded-3xl border border-emerald-200/70 bg-emerald-50/80 p-6 dark:border-emerald-500/20 dark:bg-emerald-500/10'>\n <p class='text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200'>Sortie typée</p>\n <h2 class='mt-3 text-xl font-semibold text-slate-900 dark:text-white'>Générez des blocs valides</h2>\n <p class='mt-3 text-sm text-slate-600 dark:text-slate-300'>Des schémas typés garantissent que le contenu IA s'insère directement dans vos pages sous forme de blocs propres et fonctionnels.</p>\n </div>\n</div>\n\n<h2>Pourquoi Cortex AI a sa place dans l'éditeur</h2>\n<p>Les outils de clavardage génériques peuvent rédiger du texte, mais ils ne font pas la différence entre une bannière héros, une grille de cartes et un article de blogue. Cortex AI vit directement dans votre écran d'édition. Il crée du contenu qui s'ajuste aux blocs de votre site en ligne.</p>\n<p>L'IA devient ainsi vraiment utile au quotidien. Vous pouvez ébaucher une nouvelle section d'accueil, peaufiner un résumé, enrichir une fiche produit ou traduire un article complet en toute simplicité.</p>\n\n<div class='rounded-[2rem] border border-slate-200/80 bg-slate-50/90 p-6 my-10 dark:border-white/10 dark:bg-slate-900/70'>\n <p class='text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200'>Flux éditorial</p>\n <div class='grid gap-5 md:grid-cols-2 mt-5'>\n <div class='rounded-2xl border border-slate-200 bg-white p-5 dark:border-white/10 dark:bg-slate-950/50'>\n <h3 class='mt-0 text-xl text-slate-900 dark:text-white'>Des premiers jets plus rapides</h3>\n <p class='text-sm text-slate-600 dark:text-slate-300'>Partez d'un prompt et obtenez une section, un brouillon d'article ou une histoire de produit qui respecte votre ton.</p>\n </div>\n <div class='rounded-2xl border border-slate-200 bg-white p-5 dark:border-white/10 dark:bg-slate-950/50'>\n <h3 class='mt-0 text-xl text-slate-900 dark:text-white'>Des révisions plus nettes</h3>\n <p class='text-sm text-slate-600 dark:text-slate-300'>Demandez un texte plus court, plus clair ou traduit, sans quitter votre écran d'édition.</p>\n </div>\n </div>\n</div>\n\n<h2>Routage des modèles et contrôle des coûts</h2>\n<p>Cortex AI vous donne le plein contrôle sur vos modèles. Choisissez des modèles rapides pour les brouillons express et des modèles plus puissants pour les articles techniques. Vous gérez vos clés d'API sur le serveur, pour que vos rédacteurs se concentrent sur le contenu.</p>\n<ul class='list-disc pl-6 space-y-2 text-sm'>\n <li>Utilisez des modèles rapides pour les réécritures, les titres et les résumés.</li>\n <li>Utilisez les meilleurs modèles pour les longs guides et les traductions difficiles.</li>\n <li>Gardez les clés des fournisseurs en sécurité dans vos réglages serveur privés.</li>\n <li>Maîtrisez les coûts sans changer l'affichage des pages pour les visiteurs.</li>\n</ul>\n\n<h2>Génération consciente des blocs</h2>\n<p>Cortex AI fait plus qu'écrire du texte brut. Il crée du contenu structuré qui correspond directement aux composants NextBlock. Vous obtenez des textes de section, des titres, des boutons et des blocs traduits prêts à l'emploi. Vous passez moins de temps à corriger les textes brouillons venus d'outils externes.</p>\n<p>Comme le contenu généré respecte vos règles de blocs, tout reste cohérent et rapide sur le web.</p>\n\n<h2>Des flux d'équipe plus sûrs</h2>\n<p>L'IA donne le meilleur d'elle-même quand les humains gardent le contrôle. Avec Cortex AI, les éditeurs révisent chaque brouillon avant publication. Les développeurs gèrent les clés des modèles, et le CMS conserve toutes les versions dans votre historique habituel.</p>\n\n<h2>Un flux de lancement concret</h2>\n<ol class='list-decimal pl-6 space-y-2 text-sm'>\n <li>Ébauchez un article, une section d'accueil ou une histoire de produit à partir d'un prompt clair.</li>\n <li>Affinez le texte pour qu'il colle à votre public et au ton de votre marque.</li>\n <li>Créez une version traduite ou un résumé plus court pour les cartes sociales et les balises de recherche.</li>\n <li>Révisez le contenu dans l'éditeur, publiez, puis suivez vos révisions au fil du temps.</li>\n</ol>\n\n<p>Cortex AI transforme votre CMS en atelier créatif plus rapide. Il ne remplace pas le goût humain, mais il vous aide à transformer de bonnes idées en pages finies en un temps record.</p>\n"}$nb$::jsonb, 0);
|
|
66
|
+
END IF;
|
|
67
|
+
END $$;
|