create-nextblock 0.15.4 → 0.15.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/templates/nextblock-template/app/actions/feedback.ts +1 -1
- package/templates/nextblock-template/app/actions/package-actions.ts +2 -2
- package/templates/nextblock-template/app/api/cron/reset-sandbox/route.ts +2 -2
- package/templates/nextblock-template/app/api/cron/reset-sandbox/sandboxResetSql.ts +694 -637
- package/templates/nextblock-template/app/cms/settings/packages/activation-form.tsx +2 -2
- package/templates/nextblock-template/app/cms/settings/packages/package-card.tsx +3 -3
- package/templates/nextblock-template/components/SandboxCredentialsAlert.tsx +1 -1
- package/templates/nextblock-template/docs/TECHNICAL_SPECIFICATION.md +12508 -12508
- package/templates/nextblock-template/lib/setup/migrations-bundle.ts +9 -4
- package/templates/nextblock-template/package.json +1 -1
|
@@ -4901,474 +4901,474 @@ REVOKE EXECUTE ON FUNCTION public.handle_new_user() FROM PUBLIC, anon, authentic
|
|
|
4901
4901
|
|
|
4902
4902
|
|
|
4903
4903
|
-- >>> FROM: 00000000000003_baseline_seed.sql <<<
|
|
4904
|
-
-- AUTO-GENERATED baseline (re-baseline of migrations 000..044). Idempotent; safe to replay.
|
|
4905
|
-
-- 03 · seed: canonical NextBlock demo content (no users, no secrets)
|
|
4906
|
-
-- Regenerate via tools/scripts/rebaseline-transform.mjs. Do not hand-edit.
|
|
4907
|
-
|
|
4908
|
-
INSERT INTO public.languages (id, code, name, is_default, is_active, created_at, updated_at) VALUES (1, 'en', 'English', true, true, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4909
|
-
INSERT INTO public.languages (id, code, name, is_default, is_active, created_at, updated_at) VALUES (2, 'fr', 'Français', false, true, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4910
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('ea6fdaf5-f8de-416c-9f2b-b689b7a4ed38', NULL, 'nextblock-logo-small.webp', 'images/nextblock-logo-small.webp', 'image/webp', 10000, 'NextBlock™ Site Logo', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4911
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('5bb07d4c-ca14-49ab-96bb-febbed31aded', NULL, 'NBcover.webp', 'images/NBcover.webp', 'image/webp', 180000, 'NextBlock™ architecture overview cover image', 1024, 572, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4912
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('641ddf75-5c90-41df-8b83-e7c298f30a6a', NULL, 'extensibility.webp', 'images/extensibility.webp', 'image/webp', 246808, 'NextBlock™ extensibility editorial artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4913
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('e6ed9c34-6ef6-47a8-b836-e6dbf73511fa', NULL, 'included.webp', 'images/included.webp', 'image/webp', 237478, 'NextBlock™ getting-started platform artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4914
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('77b9da47-4182-470f-9070-fa6cd11c6aea', NULL, 'programmer-upscaled.webp', 'images/programmer-upscaled.webp', 'image/webp', 780000, 'NextBlock™ setup guide cover image', 8192, 2632, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4915
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('dfa0e881-70b6-4767-b9b0-7a6293db5009', NULL, 'commerce-plan.webp', 'images/commerce-plan.webp', 'image/webp', 269854, 'NextBlock™ commerce roadmap artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4916
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', NULL, 'commerce-wide.webp', 'images/commerce-wide.webp', 'image/webp', 250584, 'NextBlock™ Commerce editorial feature image', 1024, 434, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4917
|
-
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('38ec38c2-899f-47b0-8364-56a574527078', NULL, 'cortex-ai.webp', 'images/cortex-ai.webp', 'image/webp', 298588, 'NextBlock Cortex AI editorial feature image', 1024, 571, NULL, NULL, 'images/cortex-ai.webp', 'images', '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00') ON CONFLICT DO NOTHING;
|
|
4918
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (1, 1, NULL, 'Home', 'home', 'published', NULL, NULL, 1, '0098e4f0-e5f3-4e28-acfc-bb9fdb3a4a6b', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4919
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (2, 2, NULL, 'Accueil', 'accueil', 'published', NULL, NULL, 1, '0098e4f0-e5f3-4e28-acfc-bb9fdb3a4a6b', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4920
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (3, 1, NULL, 'Articles', 'articles', 'published', NULL, NULL, 1, '50adeea5-5040-4ae7-bacd-992647920982', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4921
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (4, 2, NULL, 'Articles', 'articles', 'published', NULL, NULL, 1, '50adeea5-5040-4ae7-bacd-992647920982', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4922
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (5, 1, NULL, 'Contact Us', 'contact', 'published', NULL, NULL, 1, 'e3b28669-7e38-47bd-9189-7db2353b52dc', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4923
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (6, 2, NULL, 'Contactez-nous', 'contact', 'published', NULL, NULL, 1, 'e3b28669-7e38-47bd-9189-7db2353b52dc', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4924
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (7, 1, NULL, 'Privacy Policy', 'privacy-policy', 'published', 'Privacy Policy', 'How we collect, use, disclose, and protect your personal information under Quebec Law 25, PIPEDA, and CASL.', 1, '8cd91839-518d-4b57-87db-441e59a71a95', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4925
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (8, 2, NULL, 'Politique de confidentialité', 'politique-de-confidentialite', 'published', 'Politique de confidentialité', 'Comment nous recueillons, utilisons, communiquons et protégeons vos renseignements personnels en vertu de la Loi 25, de la LPRPDE et de la LCAP.', 1, '8cd91839-518d-4b57-87db-441e59a71a95', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4926
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (9, 1, NULL, 'Terms of Service', 'terms-of-service', 'published', 'Terms of Service', 'The terms governing your use of NextBlock™ CMS, free and open-source software licensed under the AGPL-3.0.', 1, 'b5eb82c7-95d6-4308-82d8-3ac2816f5d46', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4927
|
-
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (10, 2, NULL, 'Conditions d''utilisation', 'conditions-utilisation', 'published', 'Conditions d''utilisation', 'Les conditions régissant votre utilisation de NextBlock™ CMS, un logiciel libre sous licence AGPL-3.0.', 1, 'b5eb82c7-95d6-4308-82d8-3ac2816f5d46', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4928
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (1, 1, NULL, 'How NextBlock™ Works: A Look Under the Hood', 'how-nextblock-works', 'Architecture', 'Under the hood of the monorepo, block registry, and editor stack that power NextBlock.', 'A guided tour of the monorepo, block registry, editor stack, and open-core architecture behind NextBlock.', 'published', NULL, NULL, NULL, '5bb07d4c-ca14-49ab-96bb-febbed31aded', 1, 'de8b8593-1ef6-4e66-8d1f-8b3e7ffb811d', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4929
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (2, 2, NULL, 'Comment NextBlock™ Fonctionne : Regard Sous le Capot', 'comment-nextblock-fonctionne', 'Architecture', 'Sous le capot du monorepo, du registre de blocs et de l editeur qui propulsent NextBlock.', 'Une visite guidee du monorepo, du registre de blocs, de l editeur et de l architecture open-core de NextBlock.', 'published', NULL, NULL, NULL, '5bb07d4c-ca14-49ab-96bb-febbed31aded', 1, 'de8b8593-1ef6-4e66-8d1f-8b3e7ffb811d', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4930
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (5, 1, NULL, 'NextBlock™ Commerce: Multi-Currency, Tax Sync & Beyond', 'nextblock-commerce-guide', 'Commerce', 'Storefront architecture, checkout flows, and premium commerce capabilities inside NextBlock.', 'A closer look at the commerce module, from multi-currency and tax sync to shipping, inventory, and provider-aware checkout.', 'published', NULL, NULL, NULL, '5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', 1, '23773a34-e54b-40c6-89b5-b09ead17ae60', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4931
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (6, 2, NULL, 'NextBlock™ Commerce : Multi-Devises, Taxes Automatiques et Plus', 'guide-commerce-nextblock', 'Commerce', 'Architecture boutique, parcours de paiement et fonctions commerce premium au coeur de NextBlock.', 'Un apercu du module commerce : multi-devises, sync taxes, expedition, inventaire et paiements connectes.', 'published', NULL, NULL, NULL, '5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', 1, '23773a34-e54b-40c6-89b5-b09ead17ae60', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4932
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (7, 1, NULL, 'NextBlock Cortex AI Guide', 'nextblock-cortex-ai-guide', 'AI Copilot', 'A practical guide to Cortex AI, the block-aware assistant for model routing, BYOK controls, and faster editorial production inside NextBlock.', 'See how Cortex AI brings structured generation, provider choice, and safer content workflows directly into the NextBlock editor.', 'published', '2026-07-03 17:52:15.643901+00', 'NextBlock Cortex AI Guide', 'Learn how NextBlock Cortex AI helps teams generate, refine, and translate structured block content with model routing and BYOK controls.', '38ec38c2-899f-47b0-8364-56a574527078', 1, '669489e7-5900-496e-8b73-2aba7514a71b', '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00') ON CONFLICT DO NOTHING;
|
|
4933
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (3, 1, NULL, 'How to Install NextBlock: Every Setup Option Explained', 'how-to-setup-nextblock', 'Getting Started', 'Every way to install NextBlock — one-click cloud deploy, CLI scaffold, git clone, or self-hosted Docker — with copy-paste steps for each.', 'Four ways to launch NextBlock: a one-click Vercel deploy, npm create nextblock, git clone with the browser setup wizard, or a fully local Docker stack.', 'published', NULL, 'How to Install NextBlock CMS — Vercel, CLI, Git or Docker', 'Install NextBlock in minutes — one-click Vercel deploy, npm create nextblock, git clone, or self-hosted Docker. No config files, no manual SQL.', '77b9da47-4182-470f-9070-fa6cd11c6aea', 1, '461cde55-74cb-4112-8c3d-a25882eeedce', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.799297+00') ON CONFLICT DO NOTHING;
|
|
4934
|
-
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (4, 2, NULL, 'Installer NextBlock : toutes les options expliquées', 'comment-configurer-nextblock', 'Mise En Route', 'Toutes les façons d''installer NextBlock — cloud en un clic, CLI, git clone ou Docker auto-hébergé — avec les étapes à copier-coller.', 'Quatre façons de lancer NextBlock : déploiement Vercel en un clic, npm create nextblock, git clone avec l''assistant dans le navigateur, ou une pile Docker 100 % locale.', 'published', NULL, 'Installer NextBlock — Vercel, CLI, Git ou Docker', 'Installez NextBlock en quelques minutes : déploiement Vercel en un clic, npm create nextblock, git clone ou Docker auto-hébergé. Sans config ni SQL.', '77b9da47-4182-470f-9070-fa6cd11c6aea', 1, '461cde55-74cb-4112-8c3d-a25882eeedce', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.799297+00') ON CONFLICT DO NOTHING;
|
|
4935
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (2, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Key Features: The Three Pillars of NextBlock™"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-lg text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ is a holistic platform that unites performance, editorial experience, and developer control so every stakeholder delivers their best work.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-8 md:grid-cols-3 mt-12''><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 rounded-xl flex items-center justify-center text-black dark:text-white mb-6''><svg class=''w-6 h-6'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M13 10V3L4 14h7v7l9-11h-7z''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Built for Speed.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Architected for 100% Lighthouse scores with global delivery and near-instant FCP.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Edge Caching & ISR:</strong> Serve pages worldwide.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Critical CSS:</strong> Inline styles to eliminate blocking.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Image Opt:</strong> AVIF & blurred placeholders.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 rounded-xl flex items-center justify-center text-black dark:text-white mb-6''><svg class=''w-6 h-6'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Editor-First Experience.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>A low-code, Notion-style block editor empowers teams to ship pages without engineering help.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Notion-Style:</strong> Slash commands & drag-and-drop.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Bilingual:</strong> Manage locales from one interface.</li><li><strong class=''text-slate-800 dark:text-slate-200''>History:</strong> Restore any version with a click.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 bg-white/50 dark:bg-white/10 rounded-xl flex items-center justify-center mb-6''><svg class=''w-6 h-6 text-slate-900 dark:text-white'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Infinitely Extensible.</h3><p class=''text-sm text-slate-700 dark:text-slate-200 leading-relaxed''>Open-source control with a clean Nx monorepo and a typed SDK for limitless customization.</p><ul class=''mt-6 space-y-3 text-sm text-slate-700 dark:text-slate-200''><li><strong class=''text-slate-900 dark:text-white''>Open Source:</strong> Own the code & data forever.</li><li><strong class=''text-slate-900 dark:text-white''>Nx Monorepo:</strong> Scale confidently.</li><li><strong class=''text-slate-900 dark:text-white''>Developer SDK:</strong> Scaffold blocks in minutes.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4936
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (3, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#0f172a", "position": 0}, {"color": "#020817", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6''>Built with the Best.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-400 text-center max-w-2xl mx-auto''>Every layer of NextBlock™ leans on proven developer-first technology so the platform feels familiar, performant, and trustworthy from day one.</p><div class=''grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-4 mt-10 text-sm font-semibold text-center text-white''><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Next.js</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>React</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Supabase</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Stripe</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tailwind</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tiptap</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Vercel</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Nx</div></div>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6 mt-16''>Powerful for Developers. Intuitive for Editors.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid md:grid-cols-2 gap-8 mt-10 text-white''><div class=''p-8 rounded-3xl border border-white/10 bg-white/5 backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-blue-400''>For Content Creators</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Intuitive Block Editor</strong>Drag-and-drop layouts with a Notion-like interface.</li><li><strong class=''text-white block mb-1''>Rich Content Blocks</strong>Deploy heroes, galleries, testimonials, and more in one click.</li><li><strong class=''text-white block mb-1''>Effortless Media Management</strong>Organize assets with folders, tags, and bulk actions.</li><li><strong class=''text-white block mb-1''>Worry-Free Revisions</strong>Automatic version history with instant restore.</li></ul></div><div class=''p-8 rounded-3xl border border-white/10 bg-gradient-to-br from-white/5 to-white/[0.02] backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-purple-400''>For Developers</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Next.js 16 Core</strong>Server Components, ISR, and Edge Functions ready out of the box.</li><li><strong class=''text-white block mb-1''>Supabase Integration</strong>Postgres, auth, storage, and real-time APIs without glue code.</li><li><strong class=''text-white block mb-1''>Monorepo Ready</strong>Nx-powered dev experience for scalable architectures.</li><li><strong class=''text-white block mb-1''>Extensible Block SDK</strong>Ship fully typed custom blocks and widgets.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4937
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (4, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#022c22", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-emerald-400 font-bold mb-4''>Now Available — Premium Module</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Turn Your CMS Into<br/>a Full Storefront.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Commerce transforms your content platform into a complete e-commerce engine. Products, checkout, multi-currency, taxes, shipping, invoices — all natively integrated into the block editor you already know.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-commerce-guide", "size": "lg", "text": "Explore Commerce Features →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-commerce-pro-commerce-license", "size": "lg", "text": "Get a License", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-emerald-500/20 bg-gradient-to-br from-white/5 to-emerald-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/commerce-square.webp'' alt=''NextBlock™ Commerce dashboard showing product management'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>∞</p><p class=''text-xs text-slate-400''>Currencies</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>2</p><p class=''text-xs text-slate-400''>Providers</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>Auto</p><p class=''text-xs text-slate-400''>Tax Sync</p></div></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 3, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4938
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (5, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Everything You Need to Sell Online"}, "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 ships a complete e-commerce toolkit so you can go from catalog to checkout without third-party plugins.</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''>Multi-Currency</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Real-time FX rates, rounding modes, charm pricing, and automatic product price sync across unlimited currencies.</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''>Tax Automation</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Manual stacked tax rates (GST + PST) or fully automatic calculation via Stripe Tax — you choose.</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''>Shipping Zones</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Zone-based rate resolution with country and state matching, per-currency pricing, and free-shipping thresholds.</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''>Stripe & Freemius Checkout</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe for physical products, Freemius for digital licensing — provider-aware checkout with inventory validation.</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''>Inventory Tracking</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Automatic quantity deduction on payment with resilient fallback paths and variant-level stock management.</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''>Orders & Invoices</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Full order lifecycle management, stable invoice numbering, printable documents, and exportable order reports.</p></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 4, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4939
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (6, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#1e1b4b", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-violet-500/20 bg-gradient-to-br from-white/5 to-violet-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/cortex-ai-square.webp'' alt=''NextBlock™ Cortex AI dashboard showing block generator'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>OpenRouter</p><p class=''text-xs text-slate-400''>AI Gateway</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>BYOK</p><p class=''text-xs text-slate-400''>Cost Control</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>Zod</p><p class=''text-xs text-slate-400''>Typed Blocks</p></div></div></div>"}, "block_type": "text"}], [{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-violet-400 font-bold mb-4''>Now Available — AI Copilot</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Supercharge Your<br/>Content with AI.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Cortex AI brings native block-level intelligence directly to your editor. Generate copy, refactor structures, and automate translations in one click, built directly on our high-performance architecture.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-cortex-ai-guide", "size": "lg", "text": "Explore AI Capabilities →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license", "size": "lg", "text": "Get a License", "variant": "outline"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 5, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4940
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (7, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "More Than a CMS. An Ecosystem."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ is building a sustainable open-core roadmap so the platform grows with your business.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-6 lg:grid-cols-[0.75fr_1.25fr] mt-10 items-stretch''><div class=''overflow-hidden rounded-[2rem] border border-slate-200 dark:border-white/10 bg-slate-950 shadow-2xl''><img src=''/images/goals.webp'' alt=''Roadmap board outlining the NextBlock™ ecosystem and premium module direction'' class=''h-full w-full object-cover'' /><div class=''border-t border-white/10 bg-slate-950/95 px-6 py-5''><p class=''text-xs uppercase tracking-[0.24em] text-emerald-300 mb-2 font-bold''>Roadmap in motion</p><p class=''text-sm text-slate-300 mb-0''>Commerce ships first, then the broader ecosystem grows around plugins, blocks, and partner-built modules.</p></div></div><div class=''grid gap-6''><div class=''p-10 rounded-3xl border border-emerald-500/20 bg-gradient-to-br from-emerald-50 to-white dark:from-emerald-500/5 dark:to-white/5 hover:border-emerald-500/40 transition-colors''><p class=''text-xs uppercase tracking-wide text-emerald-600 dark:text-emerald-400 mb-2 font-bold''>Available now</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>NextBlock™ Commerce</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Transform your site into a composable storefront with products, checkout, multi-currency pricing, tax automation, and commerce blocks that live beside your editorial content.</p></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-violet-500/30 transition-colors''><p class=''text-xs uppercase tracking-wide text-violet-700 dark:text-violet-300 mb-2 font-bold''>Build the future</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Plugin and block marketplace</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>A community marketplace gives developers room to publish, sell, and distribute custom blocks, themes, integrations, and partner modules.</p></div></div></div>"}, "block_type": "text"}, {"content": {"level": 2, "textAlign": "center", "text_content": "Join Our Community."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center mx-auto''>NextBlock™ is being built in the open. Star the repo, share feedback, and help define the future of performance-first content management.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-4 md:grid-cols-3 mt-10 text-sm''><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://github.com/nextblock-cms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>GitHub</strong><span class=''text-slate-600 dark:text-slate-400''>Star the repo & contribute</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://x.com/NextBlockCMS'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>X (Twitter)</strong><span class=''text-slate-600 dark:text-slate-400''>Follow updates & announcements</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://dev.to/nextblockcms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>Dev.to</strong><span class=''text-slate-600 dark:text-slate-400''>Read technical deep dives</span></a></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4941
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (1, 1, NULL, 1, 'section', '{"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''>Build <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''>Blazing-Fast</span></span><br class=''md:hidden'' /> Websites.</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™ is the open-source, developer-first Next.js CMS that merges 100% Lighthouse scores with a powerful visual block editor.</p>"}, "block_type": "text"}, {"content": {"url": "/article/how-to-setup-nextblock", "size": "lg", "text": "Get Started", "variant": "default", "position": "center"}, "block_type": "button"}, {"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": "Deploy on Vercel", "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''>Why teams switch</p><p class=''text-3xl font-bold text-white mb-2''>100% Lighthouse</p><p class=''text-base text-slate-300 mb-6''>Edge-rendered marketing sites, launches, and docs with uncompromising performance.</p><ul class=''space-y-3 text-sm text-slate-200''><li><span class=''text-blue-400 mr-2''>✓</span> Next.js 16 with ISR and edge caching</li><li><span class=''text-blue-400 mr-2''>✓</span> Supabase auth, data, and storage</li><li><span class=''text-blue-400 mr-2''>✓</span> Notion-style block editor powered by Tiptap</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.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0'' title=''NextBlock demo video'' allow=''accelerated-motion; 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"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.851553+00', NULL) ON CONFLICT DO NOTHING;
|
|
4942
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (10, 3, NULL, 1, 'posts_grid', '{"title": "Latest Deep Dives", "columns": 3, "postsPerPage": 6, "showPagination": true}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4943
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (12, 5, NULL, 1, 'section', '{"padding": {"top": "lg", "bottom": "lg"}, "background": {"type": "none"}, "column_blocks": [[{"content": {"html_content": "<div class=''max-w-2xl mx-auto text-center''><h2 class=''text-2xl font-bold mb-4''>Open Source & Community Driven</h2><p class=''text-slate-600 dark:text-slate-400 mb-6''>NextBlock™ is built in the open. We rely on developers and editors like you to help us define the roadmap. Whether it''s a bug report, a feature request, or just a shoutout, every message helps us move faster.</p></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4944
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (15, 6, NULL, 2, 'section', '{"padding": {"top": "lg", "bottom": "lg"}, "background": {"type": "none"}, "column_blocks": [[{"content": {"html_content": "<div class=''max-w-2xl mx-auto text-center''><h2 class=''text-2xl font-bold mb-4''>Open Source & Communautaire</h2><p class=''text-slate-600 dark:text-slate-400 mb-6''>NextBlock™ est construit en public. Nous comptons sur les développeurs et éditeurs comme vous pour définir notre roadmap. Qu''il s''agisse d''un bug, d''une suggestion ou d''un simple salut, chaque message compte.</p></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4945
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (13, 5, NULL, 1, 'form', '{"fields": [{"label": "Name", "temp_id": "name", "field_type": "text", "is_required": true, "placeholder": "Your name"}, {"label": "Email", "temp_id": "email", "field_type": "email", "is_required": true, "placeholder": "your@email.com"}, {"label": "Message", "temp_id": "message", "field_type": "textarea", "is_required": true, "placeholder": "How can we help?"}], "recipient_email": "contact@example.com", "success_message": "Thank you for your feedback! We''ll get back to you soon.", "submit_button_text": "Send Message"}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4946
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (16, 6, NULL, 2, 'form', '{"fields": [{"label": "Nom", "temp_id": "nom", "field_type": "text", "is_required": true, "placeholder": "Votre nom"}, {"label": "Email", "temp_id": "email", "field_type": "email", "is_required": true, "placeholder": "votre@email.com"}, {"label": "Message", "temp_id": "message", "field_type": "textarea", "is_required": true, "placeholder": "Comment pouvons-nous vous aider ?"}], "recipient_email": "contact@example.com", "success_message": "Merci pour vos retours ! Nous vous répondrons bientôt.", "submit_button_text": "Envoyer le message"}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4947
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (17, 2, NULL, 2, 'section', '{"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-bold tracking-tight text-white text-center drop-shadow-lg''>Créez des sites <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''>Ultra-Rapides</span></span><br class=''md:hidden'' />.</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 Next.js open-source alliant scores Lighthouse parfaits et éditeur visuel puissant.</p>"}, "block_type": "text"}, {"content": {"url": "/article/comment-configurer-nextblock", "size": "lg", "text": "Commencer", "variant": "default", "position": "center"}, "block_type": "button"}, {"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", "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''>Pourquoi migrer</p><p class=''text-3xl font-bold text-white mb-2''>100% Lighthouse</p><p class=''text-base text-slate-300 mb-6''>Sites marketing et docs rendus à l''edge avec des performances irréprochables.</p><ul class=''space-y-3 text-sm text-slate-200''><li><span class=''text-blue-400 mr-2''>✓</span> Next.js 16 avec ISR et cache edge</li><li><span class=''text-blue-400 mr-2''>✓</span> Supabase pour l''auth, les données et le stockage</li><li><span class=''text-blue-400 mr-2''>✓</span> Éditeur de blocs type Notion sur Tiptap</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.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0'' title=''Vidéo de démonstration NextBlock'' allow=''accelerated-motion; 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"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.851553+00', NULL) ON CONFLICT DO NOTHING;
|
|
4948
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (18, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Fonctionnalités clés : les trois piliers de NextBlock™"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-lg text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ unifie performances, expérience éditoriale et contrôle développeur pour que chaque équipe livre son meilleur travail.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-8 md:grid-cols-3 mt-12''><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Vitesse Extrême.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Pensé pour des scores Lighthouse parfaits avec une diffusion mondiale.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Edge Caching:</strong> Servez vos pages partout.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Critical CSS:</strong> Styles en ligne pour éviter les blocages.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Images Opt:</strong> AVIF et placeholders floutés.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Expérience Éditeur.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Un éditeur façon Notion pour publier sans dépendre des développeurs.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Visuel:</strong> Héros, galeries, témoignages.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Média:</strong> Dossiers, tags et actions groupées.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Historique:</strong> Restauration complète.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Extensible à l''Infini.</h3><p class=''text-sm text-slate-700 dark:text-slate-200 leading-relaxed''>Un socle Next.js + Supabase modulaire, extensible et auto-hébergeable.</p><ul class=''mt-6 space-y-3 text-sm text-slate-700 dark:text-slate-200''><li><strong class=''text-slate-900 dark:text-white''>SDK de blocs:</strong> Composants typés.</li><li><strong class=''text-slate-900 dark:text-white''>CLI:</strong> Générez modules en minutes.</li><li><strong class=''text-slate-900 dark:text-white''>Monorepo Nx:</strong> Dépendances maintenables.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4949
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (19, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#0f172a", "position": 0}, {"color": "#020817", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6''>Conçu avec les meilleurs outils.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-400 text-center max-w-2xl mx-auto''>Chaque couche de NextBlock™ repose sur des technologies éprouvées pour une expérience familière et performante.</p><div class=''grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-4 mt-10 text-sm font-semibold text-center text-white''><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Next.js</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>React</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Supabase</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Stripe</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tailwind</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tiptap</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Vercel</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Nx</div></div>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6 mt-16''>Puissant pour les développeurs. Intuitif pour les éditeurs.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid md:grid-cols-2 gap-8 mt-10 text-white''><div class=''p-8 rounded-3xl border border-white/10 bg-white/5 backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-blue-400''>Pour les créateurs</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Éditeur de blocs</strong>Glisser-déposer façon Notion.</li><li><strong class=''text-white block mb-1''>Blocs riches</strong>Héros, galeries, témoignages.</li><li><strong class=''text-white block mb-1''>Médiathèque</strong>Dossiers, tags et actions groupées.</li><li><strong class=''text-white block mb-1''>Versions sécurisées</strong>Historique et restauration instantanée.</li></ul></div><div class=''p-8 rounded-3xl border border-white/10 bg-gradient-to-br from-white/5 to-white/[0.02] backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-purple-400''>Pour les développeurs</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Next.js 16</strong>Server Components, ISR et Edge prêts à l''emploi.</li><li><strong class=''text-white block mb-1''>Supabase</strong>Postgres, auth, stockage, temps réel.</li><li><strong class=''text-white block mb-1''>Monorepo Nx</strong>Dépendances lisibles et centrales.</li><li><strong class=''text-white block mb-1''>SDK de blocs</strong>Widgets typés et extensibles.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4950
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (20, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#022c22", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-emerald-400 font-bold mb-4''>Disponible — Module Premium</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Transformez votre CMS<br/>en vitrine complète.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Commerce transforme votre plateforme de contenu en moteur e-commerce complet. Produits, checkout, multi-devises, taxes, expédition, factures — le tout intégré nativement dans l''éditeur de blocs que vous connaissez déjà.</p>"}, "block_type": "text"}, {"content": {"url": "/article/guide-commerce-nextblock", "size": "lg", "text": "Découvrir Commerce →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-commerce-pro-commerce-license", "size": "lg", "text": "Obtenir une licence", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-emerald-500/20 bg-gradient-to-br from-white/5 to-emerald-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/commerce-square.webp'' alt=''Tableau de bord NextBlock™ Commerce'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>∞</p><p class=''text-xs text-slate-400''>Devises</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>2</p><p class=''text-xs text-slate-400''>Fournisseurs</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>Auto</p><p class=''text-xs text-slate-400''>Taxes</p></div></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 3, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4951
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (21, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Tout 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 boîte à outils e-commerce complète pour aller du catalogue au paiement sans plugins tiers.</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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>Multi-Devises</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Taux de change en temps réel, modes d''arrondi, prix charme et synchronisation automatique sur toutes les 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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>Taxes Automatiques</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Taux manuels empilés (TPS + TVQ) ou calcul 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''><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''>Résolution par pays et état, tarification 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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>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 — checkout intelligent avec validation d''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''><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 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''><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 du cycle de vie des commandes, numérotation stable des factures et rapports de commandes exportables.</p></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 4, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4952
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (22, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#1e1b4b", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-violet-500/20 bg-gradient-to-br from-white/5 to-violet-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/cortex-ai-square.webp'' alt=''Tableau de bord NextBlock™ Cortex AI montrant le générateur de blocs'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>OpenRouter</p><p class=''text-xs text-slate-400''>Passerelle IA</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>BYOK</p><p class=''text-xs text-slate-400''>Contrôle des coûts</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>Zod</p><p class=''text-xs text-slate-400''>Blocs typés</p></div></div></div>"}, "block_type": "text"}], [{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-violet-400 font-bold mb-4''>Disponible — Copilote IA</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Boostez votre<br/>contenu avec l''IA.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Cortex AI apporte une intelligence native au niveau des blocs directement dans votre éditeur. Générez du texte, restructurez vos contenus et automatisez les traductions en un clic, le tout propulsé par notre architecture haute performance.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-cortex-ai-guide", "size": "lg", "text": "Découvrir l''IA →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license", "size": "lg", "text": "Obtenir une licence", "variant": "outline"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 5, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4953
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (23, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Plus qu''un CMS. Un écosystème."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ construit une feuille de route open-core durable qui évolue avec votre activité.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-6 lg:grid-cols-[0.75fr_1.25fr] mt-10 items-stretch''><div class=''overflow-hidden rounded-[2rem] border border-slate-200 dark:border-white/10 bg-slate-950 shadow-2xl''><img src=''/images/goals.webp'' alt=''Tableau de roadmap montrant la direction de l''ecosysteme NextBlock™ et des modules premium'' class=''h-full w-full object-cover'' /><div class=''border-t border-white/10 bg-slate-950/95 px-6 py-5''><p class=''text-xs uppercase tracking-[0.24em] text-emerald-300 mb-2 font-bold''>Roadmap en mouvement</p><p class=''text-sm text-slate-300 mb-0''>Le commerce arrive en premier, puis l''ecosysteme s''etend avec des plugins, des blocs et des modules construits par les partenaires.</p></div></div><div class=''grid gap-6''><div class=''p-10 rounded-3xl border border-emerald-500/20 bg-gradient-to-br from-emerald-50 to-white dark:from-emerald-500/5 dark:to-white/5 hover:border-emerald-500/40 transition-colors''><p class=''text-xs uppercase tracking-wide text-emerald-600 dark:text-emerald-400 mb-2 font-bold''>Disponible maintenant</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>NextBlock™ Commerce</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Transformez votre site en vitrine composable avec produits, checkout, tarification multi-devise, taxes automatiques et blocs commerce relies a votre contenu editorial.</p></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-violet-500/30 transition-colors''><p class=''text-xs uppercase tracking-wide text-violet-700 dark:text-violet-300 mb-2 font-bold''>Construire la suite</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Marketplace de plugins et blocs</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Une marketplace communautaire ouvrira la voie a la publication, la vente et la distribution de blocs, themes, integrations et modules partenaires.</p></div></div></div>"}, "block_type": "text"}, {"content": {"level": 2, "textAlign": "center", "text_content": "Rejoignez la communauté."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ se construit en public. Ajoutez une étoile, partagez vos retours et façonnez l''avenir du CMS orienté performance.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-4 md:grid-cols-3 mt-10 text-sm''><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://github.com/nextblock-cms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>GitHub</strong><span class=''text-slate-600 dark:text-slate-400''>Ajoutez une étoile & contribuez</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://x.com/NextBlockCMS'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>X (Twitter)</strong><span class=''text-slate-600 dark:text-slate-400''>Suivez les annonces</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://dev.to/nextblockcms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>Dev.to</strong><span class=''text-slate-600 dark:text-slate-400''>Lisez nos articles techniques</span></a></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4954
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (26, 4, NULL, 2, 'posts_grid', '{"title": "Derniers articles", "columns": 3, "postsPerPage": 6, "showPagination": true}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4955
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (9, 3, NULL, 1, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#1e293b", "position": 100}], "direction": "135deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<p class=''text-sm uppercase tracking-[0.3em] text-blue-400 font-bold text-center md:text-left mb-4''>The Nextblock Journal</p>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-4xl md:text-5xl font-bold text-white text-center md:text-left mb-6''>Deep dives into performance, DX, and visual editing.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-300 text-lg max-w-xl mx-auto md:mx-0 text-center md:text-left leading-relaxed''>Explore architectural walkthroughs, Supabase recipes, and block editor experiments written by the Nextblock core team.</p>"}, "block_type": "text"}, {"content": {"url": "/articles#latest", "size": "lg", "text": "Explore Articles", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://github.com/nextblock-cms/nextblock/discussions", "size": "lg", "text": "Subscribe for Updates", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''h-full flex items-center justify-center rounded-3xl overflow-hidden border border-white/10 bg-white/5 shadow-2xl p-4 backdrop-blur-sm''><img src=''/images/developer.webp'' alt=''Developer working with the Nextblock stack'' class=''w-full object-cover rounded-2xl shadow-lg'' style=''max-width: 400px;'' /></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4956
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (11, 5, NULL, 1, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "135deg"}}, "column_blocks": [[{"content": {"level": 1, "textAlign": "center", "textColor": "white", "text_content": "Let''s Build the Future Together"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4''>NextBlock™ is an open-source project driven by community feedback. We''d love to hear your thoughts, ideas, or questions.</p>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4957
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (14, 6, NULL, 2, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "135deg"}}, "column_blocks": [[{"content": {"level": 1, "textAlign": "center", "textColor": "white", "text_content": "Bâtissons le futur ensemble"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4''>NextBlock™ est un projet open-source propulsé par vos retours. Nous serions ravis d''entendre vos idées ou vos questions.</p>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4958
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (24, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-center text-white mb-4''>Des questions ?</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-center text-base text-slate-300 max-w-2xl mx-auto''>NextBlock™ co-construit avec des partenaires : fonctionnalités, modules sponsorisés et direction produit.</p>"}, "block_type": "text"}, {"content": {"url": "/contact", "size": "lg", "text": "Nous contacter", "variant": "default", "position": "center"}, "block_type": "button"}, {"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", "variant": "outline", "position": "center"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 7, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.840619+00', NULL) ON CONFLICT DO NOTHING;
|
|
4959
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (25, 4, NULL, 2, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#1e293b", "position": 100}], "direction": "135deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<p class=''text-sm uppercase tracking-[0.3em] text-blue-400 font-bold text-center md:text-left mb-4''>Le journal Nextblock</p>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-4xl md:text-5xl font-bold text-white text-center md:text-left mb-6''>Plongées dans la performance, l''expérience dev et l''édition visuelle.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-lg max-w-xl mx-auto md:mx-0 text-center md:text-left text-slate-300 leading-relaxed''>Walkthroughs d''architecture, recettes Supabase et expérimentations éditeur écrits par l''équipe Nextblock.</p>"}, "block_type": "text"}, {"content": {"url": "/articles#latest", "size": "lg", "text": "Explorer les articles", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://github.com/nextblock-cms/nextblock/discussions", "size": "lg", "text": "S''abonner aux mises à jour", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-white/10 bg-white/5 shadow-2xl p-4 backdrop-blur-sm''><img src=''/images/developer.webp'' alt=''Développeur travaillant avec la stack Nextblock'' class=''w-full object-cover rounded-2xl shadow-lg'' style=''max-width: 400px;'' /></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4960
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (31, NULL, 5, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ Commerce is the first premium module in the ecosystem: a source-available storefront layer that plugs directly into the same editorial system as the CMS. It is built for teams that want content, catalog, and checkout to live inside one product surface instead of three disconnected tools.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Commerce core</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Catalog + checkout</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Products, variants, orders, shipping, and invoices all plug into the existing CMS shell.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Global selling</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Multi-currency ready</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Automatic FX sync, rounding strategies, and per-product overrides keep international pricing practical.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Operator workflow</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Provider-aware flow</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Stripe and Freemius are handled differently so the storefront can stay clean without hiding complexity.</p>\\n </div>\\n</div>\\n\\n<h2>Product Catalog</h2>\\n<p>Commerce supports physical and digital products with variants, attributes, localized product media, independent pricing, SKUs, and stock levels. Product assets stay in the same media library editors already use for marketing pages, so content and commerce teams are not working in separate silos.</p>\\n\\n<h2>Multi-Currency Engine</h2>\\n<p>The pricing engine is built for real-world stores, not just a demo checkout:</p>\\n<ul>\\n <li><strong>Unlimited currencies</strong> with ISO codes, symbols, and stored exchange rates</li>\\n <li><strong>Automatic FX sync</strong> from Frankfurter or a custom provider via <code>FX_API_BASE_URL</code></li>\\n <li><strong>Rounding modes</strong> including nearest, up, down, and charm pricing like <code>9.99</code></li>\\n <li><strong>Store-managed auto-sync</strong> so product prices convert when rates refresh</li>\\n <li><strong>Rebasing</strong> when the default currency changes</li>\\n <li><strong>Per-product overrides</strong> when a catalog item needs explicit pricing in specific markets</li>\\n</ul>\\n\\n<h2>Tax Automation</h2>\\n<p>Teams can stay manual when they need control, or delegate tax math to Stripe Tax when they want automation:</p>\\n<div class=''grid md:grid-cols-2 gap-6 my-6''>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Manual mode</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Define rates by country and optional state or province. Stacked taxes such as GST + PST are supported, and tax lines are stored in <code>orders.tax_details</code>.</p>\\n </div>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Automatic mode</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe Tax calculates the final amounts. Product and shipping tax codes travel with the line items, and the webhook resync replaces provisional values with final totals.</p>\\n </div>\\n</div>\\n\\n<h2>Shipping and Checkout</h2>\\n<p>Shipping zones match by country and state or province, support localized method names, per-currency pricing, free-shipping thresholds, and priority-based fallbacks when an exact match is not found.</p>\\n<p>The checkout layer is provider-aware:</p>\\n<ul>\\n <li><strong>Stripe</strong> handles physical goods, inventory checks, shipping calculation, tax, customer upserts, and Checkout Sessions</li>\\n <li><strong>Freemius</strong> handles digital licensing, plan resolution, and checkout URLs with sandbox support</li>\\n <li>Mixed-provider carts are rejected so the buyer journey stays understandable</li>\\n</ul>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/commerce-plan.webp'' alt=''Commerce roadmap board outlining premium module goals and future storefront capabilities for NextBlock™'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Commerce is positioned as the first premium module in a larger roadmap, which makes it feel like part of a growing platform instead of a bolt-on add-on.</figcaption>\\n</figure>\\n\\n<h2>Inventory, Orders, and Invoices</h2>\\n<p>When quantity tracking is enabled, checkout validates requested quantities against <code>inventory_items</code>. On payment confirmation, <code>apply_order_inventory_deduction()</code> reduces stock with a resilient fallback path that can use direct SQL if the RPC layer fails.</p>\\n<ul>\\n <li>Order statuses move from <code>pending</code> to <code>paid</code> to <code>shipped</code>, with cancellation and refund states available too</li>\\n <li>Invoice numbering is generated through database functions for consistency</li>\\n <li>Printable invoice documents pull from <code>invoice_settings</code></li>\\n <li>Customers can review order history and invoice access from the storefront side</li>\\n <li><strong>Coming soon:</strong> exportable order reporting and analytics dashboards</li>\\n</ul>\\n\\n<h2>Commerce Surfaces Inside the CMS</h2>\\n<p>When the ecommerce package is active, the CMS exposes product list, create, and edit views with media and variants, inventory management, order detail screens, shipping configuration, payment provider settings, tax setup, and currency management. The important part is not only that those screens exist, but that they feel native inside the same shell your content team is already using.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4961
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (32, NULL, 6, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ Commerce est le premier module premium de l''ecosysteme : une couche storefront source-available qui se branche directement sur le meme systeme editorial que le CMS. L''objectif est de rapprocher contenu, catalogue et checkout dans une seule surface produit.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Base commerce</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Catalogue + checkout</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Produits, variantes, commandes, livraison et factures vivent dans le meme shell CMS.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Vente globale</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Multi-devise</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Sync FX automatique, strategies d''arrondi et overrides par produit rendent les prix internationaux realistes.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Workflow operateur</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Par fournisseur</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Stripe et Freemius sont traites differemment pour garder un parcours d''achat propre sans cacher la complexite.</p>\\n </div>\\n</div>\\n\\n<h2>Catalogue produits</h2>\\n<p>Le module gere produits physiques et numeriques avec variantes, attributs, medias localises, prix independants, SKU et niveaux de stock. Les assets produits restent dans la meme bibliotheque media que les pages marketing, ce qui evite de separer equipes contenu et equipes commerce.</p>\\n\\n<h2>Moteur multi-devise</h2>\\n<p>Le moteur tarifaire vise un vrai usage boutique, pas seulement une demo :</p>\\n<ul>\\n <li><strong>Devises illimitees</strong> avec codes ISO, symboles et taux stockes</li>\\n <li><strong>Synchronisation FX automatique</strong> depuis Frankfurter ou un provider custom via <code>FX_API_BASE_URL</code></li>\\n <li><strong>Modes d''arrondi</strong> dont nearest, up, down et prix charme comme <code>9.99</code></li>\\n <li><strong>Auto-sync magasin</strong> pour convertir les prix quand les taux changent</li>\\n <li><strong>Rebasement</strong> lorsqu''on change la devise par defaut</li>\\n <li><strong>Overrides par produit</strong> quand un article demande un prix fixe sur certains marches</li>\\n</ul>\\n\\n<h2>Taxes automatiques</h2>\\n<p>Les equipes peuvent rester en mode manuel ou confier le calcul a Stripe Tax :</p>\\n<div class=''grid md:grid-cols-2 gap-6 my-6''>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Mode manuel</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Definition des taux par pays et eventuellement par province. Les taxes empilees comme TPS + TVQ sont supportees, avec stockage dans <code>orders.tax_details</code>.</p>\\n </div>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Mode automatique</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe Tax calcule les montants finaux. Les codes fiscaux voyagent avec les line items et le webhook remplace les valeurs provisoires par les montants definitifs.</p>\\n </div>\\n</div>\\n\\n<h2>Livraison et checkout</h2>\\n<p>Les zones de livraison correspondent par pays et etat ou province, gerent des noms localises, des prix par devise, des seuils de livraison gratuite, et des fallbacks par priorite quand aucune correspondance exacte n''est trouvee.</p>\\n<p>Le checkout est conscient du fournisseur :</p>\\n<ul>\\n <li><strong>Stripe</strong> gere les biens physiques, les verifications d''inventaire, la livraison, les taxes, les clients et les Checkout Sessions</li>\\n <li><strong>Freemius</strong> gere les licences numeriques, la resolution des plans et les URLs de checkout avec support sandbox</li>\\n <li>Les paniers melangeant plusieurs fournisseurs sont refuses pour garder un parcours plus clair</li>\\n</ul>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/commerce-plan.webp'' alt=''Tableau de roadmap commerce montrant les objectifs premium et les futures capacites storefront de NextBlock™'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Le commerce est presente comme le premier module premium d''une feuille de route plus large, ce qui renforce l''idee d''une vraie plateforme en croissance.</figcaption>\\n</figure>\\n\\n<h2>Inventaire, commandes et factures</h2>\\n<p>Quand le suivi des quantites est actif, le checkout valide les demandes contre <code>inventory_items</code>. A la confirmation du paiement, <code>apply_order_inventory_deduction()</code> retire le stock avec un chemin de repli resilient si la couche RPC echoue.</p>\\n<ul>\\n <li>Les statuts de commande passent de <code>pending</code> a <code>paid</code> puis <code>shipped</code>, avec annulation et remboursement si besoin</li>\\n <li>La numerotation des factures est geree par des fonctions SQL pour rester coherente</li>\\n <li>Les documents facture tirent leurs informations de <code>invoice_settings</code></li>\\n <li>Les clients peuvent consulter leur historique et leurs factures</li>\\n <li><strong>Bientot :</strong> exports de commandes et tableaux de bord analytiques</li>\\n</ul>\\n\\n<h2>Surfaces commerce dans le CMS</h2>\\n<p>Quand le package ecommerce est actif, le CMS expose les vues produit, edition avec medias et variantes, gestion d''inventaire, detail des commandes, configuration livraison, parametres de paiement, taxes et devises. L''enjeu principal est que tout cela paraisse natif dans le meme shell que l''equipe contenu utilise deja.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4962
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (33, NULL, 7, 1, 'text', '{"html_content": "\\n<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock Cortex AI is the AI layer built for the way NextBlock pages are actually composed. Instead of treating your site like a blank document, it understands blocks, sections, editor constraints, and the model choices your team wants to use.</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''>Model routing</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Pick the right model</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Route generation through OpenRouter or your configured provider strategy so each task can balance speed, quality, and cost.</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''>BYOK control</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Use your own keys</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Keep provider credentials under your control while still giving editors a clean, guided AI workflow in the CMS.</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''>Typed output</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Generate valid blocks</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Schema-aware generation helps AI output land as usable page structure instead of loose copy that needs a rebuild.</p>\\n </div>\\n</div>\\n\\n<h2>Why Cortex AI Belongs Inside the Editor</h2>\\n<p>Generic chat tools can draft copy, but they do not know the difference between a hero, a card grid, a product description, and a localized article. Cortex AI lives closer to the editing surface, so generation can respect the same block contracts that render on the public site.</p>\\n<p>That makes AI useful for practical production work: drafting a landing section, tightening an excerpt, expanding a product story, translating a post, or reshaping a rough idea into a block layout that already fits the system.</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''>Editorial workflow</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''>Faster first drafts</h3>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Start with a structured prompt and get a section, article outline, or product narrative that already matches the site voice.</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''>Cleaner revisions</h3>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Ask for shorter, clearer, more technical, more polished, or locale-ready output without leaving the content screen.</p>\\n </div>\\n </div>\\n</div>\\n\\n<h2>Model Routing and Cost Control</h2>\\n<p>Cortex AI is designed around provider choice. Teams can route requests through the configured AI gateway, choose task-appropriate models, and keep bring-your-own-key setups separate from the editor experience. Editors get a simple control surface while developers keep the operational knobs.</p>\\n<ul>\\n <li>Use fast, inexpensive models for drafts, variations, and rewrites</li>\\n <li>Reserve stronger models for long-form strategy, technical copy, or difficult transformations</li>\\n <li>Keep provider keys and routing defaults in the server-side configuration layer</li>\\n <li>Make cost and quality decisions without changing the public rendering system</li>\\n</ul>\\n\\n<h2>Block-Aware Generation</h2>\\n<p>The important shift is that Cortex AI is not just writing text. It is meant to produce content that can map back to NextBlock surfaces: section copy, article bodies, product descriptions, headings, calls to action, and localized variants. That reduces the cleanup step that usually happens after copying AI text from a separate tool.</p>\\n<p>Because the output is shaped around existing block contracts, the generated content feels native in the editor and predictable on the frontend.</p>\\n\\n<h2>Safer Team Workflows</h2>\\n<p>AI works best when it is helpful without becoming invisible infrastructure. Cortex AI keeps humans in the loop: editors review the output, developers control the available providers, and the CMS keeps the generated content inside the same revision and publishing flow as everything else.</p>\\n\\n<h2>A Practical Launch Flow</h2>\\n<ol>\\n <li>Draft the article, landing section, or product story from a focused prompt.</li>\\n <li>Refine the result against the brand voice and target audience.</li>\\n <li>Generate a localized version or shorter excerpt for cards and metadata.</li>\\n <li>Review the content in the NextBlock editor, publish, and keep iterating through normal revisions.</li>\\n</ol>\\n\\n<p>Cortex AI turns the CMS into a more capable production surface: not a replacement for editorial judgment, but a faster way to shape good ideas into structured pages that are ready to ship.</p>\\n"}', 0, '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00', NULL) ON CONFLICT DO NOTHING;
|
|
4963
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (34, 7, NULL, 1, 'text', '{"html_content": "\\n<h1>Privacy Policy</h1>\\n<p><em>Last updated: June 4, 2026</em></p>\\n<p>NextBlock™ CMS (\\"we\\", \\"us\\", or \\"our\\") respects your privacy and is committed to protecting your personal information in accordance with Quebec''s <em>Act respecting the protection of personal information in the private sector</em> (Law 25), the federal <em>Personal Information Protection and Electronic Documents Act</em> (PIPEDA), and Canada''s Anti-Spam Legislation (CASL).</p>\\n\\n<h2>1. Person responsible for personal information</h2>\\n<p>Our Privacy Officer is responsible for our compliance with applicable privacy laws. You may reach them at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>2. What we collect</h2>\\n<ul>\\n <li><strong>Account information</strong> — name, email address, and credentials when you register.</li>\\n <li><strong>Usage and device data</strong> — collected only with your consent through analytics technologies.</li>\\n <li><strong>Communications</strong> — messages you send us and your marketing preferences.</li>\\n</ul>\\n\\n<h2>3. Why we collect it and your consent</h2>\\n<p>We collect personal information for clearly identified purposes: to provide and secure our services, to communicate with you, and — only with your express, opt-in consent — for analytics and marketing. Consistent with Law 25, non-essential cookies and trackers remain disabled until you actively accept them, and you may withdraw your consent at any time.</p>\\n\\n<h2>4. Cookies and tracking technologies</h2>\\n<p>Strictly necessary cookies keep the site working and require no consent. Analytics and marketing technologies are loaded <strong>only after</strong> you opt in through our consent banner. Your choice is recorded so we can honour it and demonstrate accountability.</p>\\n\\n<h2>5. Disclosure and sharing</h2>\\n<p>We do not sell your personal information. We share it only with service providers who help us operate the platform under contractual confidentiality obligations, or where required by law.</p>\\n\\n<h2>6. Retention</h2>\\n<p>We keep personal information only for as long as necessary to fulfil the purposes described above or as required by law, after which it is securely destroyed or anonymized.</p>\\n\\n<h2>7. Your rights</h2>\\n<p>Subject to applicable law, you have the right to access, rectify, and delete your personal information, to withdraw consent, to data portability, and to be informed about automated processing. To exercise these rights, contact our Privacy Officer at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>8. Commercial electronic messages (CASL)</h2>\\n<p>We send commercial electronic messages only with your consent. Every message identifies us and includes a working unsubscribe mechanism that we honour promptly.</p>\\n\\n<h2>9. Safeguards</h2>\\n<p>We use appropriate physical, organizational, and technological measures — including encryption in transit and access controls — to protect personal information against loss, theft, and unauthorized access.</p>\\n\\n<h2>10. Open-source software</h2>\\n<p>NextBlock™ CMS is free, open-source software distributed under the GNU Affero General Public License v3. When you self-host NextBlock, you are the operator responsible for the personal information processed by your own deployment, and this policy serves as a starting point you may adapt to your organization.</p>\\n\\n<h2>11. Changes to this policy</h2>\\n<p>We may update this policy from time to time. Material changes will be communicated through the site, and the \\"last updated\\" date will be revised.</p>\\n\\n<h2>12. Contact us</h2>\\n<p>Questions or complaints? Contact NextBlock™ CMS at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>. You may also contact the Commission d''accès à l''information du Québec or the Office of the Privacy Commissioner of Canada.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4964
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (35, 8, NULL, 2, 'text', '{"html_content": "\\n<h1>Politique de confidentialité</h1>\\n<p><em>Dernière mise à jour : 4 juin 2026</em></p>\\n<p>NextBlock™ CMS (« nous ») respecte votre vie privée et s''engage à protéger vos renseignements personnels conformément à la <em>Loi sur la protection des renseignements personnels dans le secteur privé</em> du Québec (Loi 25), à la <em>Loi sur la protection des renseignements personnels et les documents électroniques</em> (LPRPDE) et à la Loi canadienne anti-pourriel (LCAP).</p>\\n\\n<h2>1. Responsable de la protection des renseignements personnels</h2>\\n<p>Notre responsable de la protection des renseignements personnels veille au respect des lois applicables. Vous pouvez le joindre à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>2. Renseignements que nous recueillons</h2>\\n<ul>\\n <li><strong>Renseignements de compte</strong> — nom, adresse courriel et identifiants lors de l''inscription.</li>\\n <li><strong>Données d''utilisation et d''appareil</strong> — recueillies uniquement avec votre consentement au moyen de technologies d''analyse.</li>\\n <li><strong>Communications</strong> — les messages que vous nous envoyez et vos préférences marketing.</li>\\n</ul>\\n\\n<h2>3. Finalités et consentement</h2>\\n<p>Nous recueillons des renseignements personnels à des fins clairement déterminées : fournir et sécuriser nos services, communiquer avec vous et — uniquement avec votre consentement exprès — à des fins d''analyse et de marketing. Conformément à la Loi 25, les témoins et traceurs non essentiels demeurent désactivés tant que vous ne les avez pas acceptés, et vous pouvez retirer votre consentement en tout temps.</p>\\n\\n<h2>4. Témoins et technologies de suivi</h2>\\n<p>Les témoins strictement nécessaires assurent le fonctionnement du site et ne requièrent aucun consentement. Les technologies d''analyse et de marketing ne sont chargées qu''<strong>après</strong> votre consentement explicite. Votre choix est enregistré afin de le respecter.</p>\\n\\n<h2>5. Communication à des tiers</h2>\\n<p>Nous ne vendons pas vos renseignements personnels. Nous ne les communiquons qu''à des fournisseurs qui nous aident à exploiter la plateforme, sous obligation de confidentialité, ou lorsque la loi l''exige.</p>\\n\\n<h2>6. Conservation</h2>\\n<p>Nous ne conservons les renseignements personnels que le temps nécessaire aux fins décrites ou exigé par la loi, après quoi ils sont détruits ou anonymisés de façon sécuritaire.</p>\\n\\n<h2>7. Vos droits</h2>\\n<p>Sous réserve de la loi applicable, vous avez le droit d''accéder à vos renseignements, de les rectifier et de les supprimer, de retirer votre consentement, à la portabilité de vos données et d''être informé du traitement automatisé. Pour exercer ces droits, écrivez à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>8. Messages électroniques commerciaux (LCAP)</h2>\\n<p>Nous n''envoyons des messages électroniques commerciaux qu''avec votre consentement. Chaque message nous identifie et comporte un mécanisme de désabonnement fonctionnel que nous respectons rapidement.</p>\\n\\n<h2>9. Mesures de sécurité</h2>\\n<p>Nous employons des mesures physiques, organisationnelles et technologiques appropriées — dont le chiffrement en transit et le contrôle des accès — pour protéger vos renseignements.</p>\\n\\n<h2>10. Logiciel libre</h2>\\n<p>NextBlock™ CMS est un logiciel libre et à code source ouvert distribué sous la licence publique générale GNU Affero v3. Lorsque vous hébergez NextBlock vous-même, vous êtes l''exploitant responsable des renseignements personnels traités par votre propre instance, et la présente politique vous sert de point de départ adaptable à votre organisation.</p>\\n\\n<h2>11. Modifications</h2>\\n<p>Nous pouvons mettre à jour cette politique. Les changements importants seront communiqués sur le site et la date de mise à jour sera révisée.</p>\\n\\n<h2>12. Nous joindre</h2>\\n<p>Des questions ou des plaintes ? Contactez NextBlock™ CMS à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>. Vous pouvez aussi vous adresser à la Commission d''accès à l''information du Québec.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4965
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (36, 9, NULL, 1, 'text', '{"html_content": "\\n<h1>Terms of Service</h1>\\n<p><em>Last updated: June 4, 2026</em></p>\\n\\n<h2>1. Acceptance of terms</h2>\\n<p>By accessing or using NextBlock™ CMS and the services we provide (the \\"Services\\"), you agree to be bound by these Terms of Service. If you do not agree, do not use the Services.</p>\\n\\n<h2>2. Free and open-source software</h2>\\n<p>NextBlock™ CMS is free, open-source software licensed under the <strong>GNU Affero General Public License, version 3 (AGPL-3.0)</strong> or, at your option, any later version. You are free to run, study, share, and modify the software under the terms of that license. A copy of the license is distributed with the software and is also available at <a href=\\"https://www.gnu.org/licenses/agpl-3.0.html\\">gnu.org/licenses/agpl-3.0.html</a>.</p>\\n<p>Copyright © 2025 NextBlock™ CMS.</p>\\n\\n<h2>3. Source code availability</h2>\\n<p>In accordance with section 13 of the AGPL-3.0, if you run a modified version of NextBlock™ CMS and make it available to users over a network, you must prominently offer those users access to the Corresponding Source of your modified version, free of charge, through a standard or customary means of facilitating copying of software.</p>\\n\\n<h2>4. Trademarks</h2>\\n<p>The AGPL-3.0 grants broad rights to the software''s source code but does <strong>not</strong> grant any rights to our trade names, trademarks, or service marks. \\"NextBlock™\\", the NextBlock™ CMS name, and associated logos remain our property and may not be used in a way that suggests endorsement or affiliation without our prior written permission.</p>\\n\\n<h2>5. Accounts and acceptable use</h2>\\n<p>If you create an account, you are responsible for safeguarding your credentials and for all activity under your account, and you agree to notify us promptly of any unauthorized use. You agree not to misuse the Services, including by attempting to disrupt them, access them without authorization, or use them for unlawful purposes.</p>\\n\\n<h2>6. No warranty</h2>\\n<p>As stated in section 15 of the AGPL-3.0, the software is provided \\"as is\\", without warranty of any kind, either expressed or implied, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the software is with you.</p>\\n\\n<h2>7. Limitation of liability</h2>\\n<p>As stated in section 16 of the AGPL-3.0, and to the fullest extent permitted by applicable law, in no event will any copyright holder, or any other party who modifies or conveys the software, be liable to you for damages, including any general, special, incidental, or consequential damages arising out of the use or inability to use the software.</p>\\n\\n<h2>8. Governing law</h2>\\n<p>These Terms are governed by the laws of the Province of Quebec and the federal laws of Canada applicable therein, without regard to conflict-of-law principles. Nothing in these Terms limits any mandatory consumer-protection rights you may have under those laws.</p>\\n\\n<h2>9. Changes</h2>\\n<p>We may revise these Terms from time to time. Material changes will be communicated through the Services, and continued use of the Services after changes take effect constitutes acceptance of the revised Terms.</p>\\n\\n<h2>10. Contact</h2>\\n<p>Questions about these Terms? Contact NextBlock™ CMS at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4966
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (37, 10, NULL, 2, 'text', '{"html_content": "\\n<h1>Conditions d''utilisation</h1>\\n<p><em>Dernière mise à jour : 4 juin 2026</em></p>\\n\\n<h2>1. Acceptation des conditions</h2>\\n<p>En accédant à NextBlock™ CMS et aux services que nous fournissons (les « Services ») ou en les utilisant, vous acceptez d''être lié par les présentes conditions d''utilisation. Si vous n''êtes pas d''accord, n''utilisez pas les Services.</p>\\n\\n<h2>2. Logiciel libre et à code source ouvert</h2>\\n<p>NextBlock™ CMS est un logiciel libre et à code source ouvert distribué sous la <strong>licence publique générale GNU Affero, version 3 (AGPL-3.0)</strong> ou, à votre choix, toute version ultérieure. Vous êtes libre d''exécuter, d''étudier, de partager et de modifier le logiciel selon les termes de cette licence. Une copie de la licence est fournie avec le logiciel et est aussi disponible à <a href=\\"https://www.gnu.org/licenses/agpl-3.0.html\\">gnu.org/licenses/agpl-3.0.html</a>.</p>\\n<p>Droit d''auteur © 2025 NextBlock™ CMS.</p>\\n\\n<h2>3. Disponibilité du code source</h2>\\n<p>Conformément à l''article 13 de l''AGPL-3.0, si vous exploitez une version modifiée de NextBlock™ CMS et la rendez accessible à des utilisateurs sur un réseau, vous devez offrir clairement à ces utilisateurs l''accès au code source correspondant de votre version modifiée, gratuitement, par un moyen usuel de copie de logiciels.</p>\\n\\n<h2>4. Marques de commerce</h2>\\n<p>L''AGPL-3.0 accorde de larges droits sur le code source du logiciel, mais <strong>n''accorde aucun droit</strong> sur nos noms commerciaux, marques de commerce ou marques de service. « NextBlock™ », le nom NextBlock™ CMS et les logos associés demeurent notre propriété et ne peuvent être utilisés d''une manière laissant entendre une approbation ou une affiliation sans notre autorisation écrite préalable.</p>\\n\\n<h2>5. Comptes et utilisation acceptable</h2>\\n<p>Si vous créez un compte, vous êtes responsable de la protection de vos identifiants et de toute activité effectuée à partir de votre compte, et vous vous engagez à nous aviser rapidement de toute utilisation non autorisée. Vous vous engagez à ne pas détourner les Services, notamment en tentant de les perturber, d''y accéder sans autorisation ou de les utiliser à des fins illégales.</p>\\n\\n<h2>6. Absence de garantie</h2>\\n<p>Comme l''énonce l''article 15 de l''AGPL-3.0, le logiciel est fourni « tel quel », sans garantie d''aucune sorte, expresse ou implicite, y compris, sans s''y limiter, les garanties implicites de qualité marchande et d''adéquation à un usage particulier. Vous assumez l''entièreté du risque quant à la qualité et au rendement du logiciel.</p>\\n\\n<h2>7. Limitation de responsabilité</h2>\\n<p>Comme l''énonce l''article 16 de l''AGPL-3.0, et dans toute la mesure permise par la loi applicable, en aucun cas un titulaire de droits d''auteur ou toute autre partie qui modifie ou transmet le logiciel ne saurait être tenu responsable envers vous de dommages, y compris tout dommage général, spécial, accessoire ou consécutif découlant de l''utilisation ou de l''impossibilité d''utiliser le logiciel.</p>\\n\\n<h2>8. Droit applicable</h2>\\n<p>Les présentes conditions sont régies par les lois de la province de Québec et les lois fédérales du Canada qui y sont applicables, sans égard aux règles de conflit de lois. Rien dans les présentes conditions ne limite les droits impératifs de protection du consommateur dont vous pourriez bénéficier en vertu de ces lois.</p>\\n\\n<h2>9. Modifications</h2>\\n<p>Nous pouvons réviser ces conditions de temps à autre. Les changements importants seront communiqués au moyen des Services, et l''utilisation continue des Services après leur entrée en vigueur vaut acceptation.</p>\\n\\n<h2>10. Nous joindre</h2>\\n<p>Des questions sur ces conditions ? Contactez NextBlock™ CMS à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4967
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (40, NULL, 3, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock is an open-source, AI-native Next.js CMS built on Supabase — and installing it no longer involves config files, terminal wizards, or manual SQL. There are four ways to get running, and they all end in the same place: a browser <strong>setup wizard</strong> that connects your database, configures media storage, and creates your admin account for you. Pick the path that fits, follow the steps, and you will be publishing in minutes.</p>\\n\\n<div class=''grid gap-5 md:grid-cols-2 my-10''>\\n <a href=''#one-click-vercel'' class=''block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Fastest · about 3 minutes</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>One-click deploy on Vercel</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>A live production site with a managed database. No terminal, no environment variables, nothing to copy.</p>\\n </a>\\n <a href=''#npm-create'' class=''block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Recommended for new projects</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>npm create nextblock</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Scaffold a standalone Next.js app with NextBlock built in, then finish setup in your browser.</p>\\n </a>\\n <a href=''#git-clone'' class=''block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Full source code</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Clone the repository</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Run the complete monorepo — the CMS, every package, and the docs. Made for contributors and platform teams.</p>\\n </a>\\n <a href=''#docker'' class=''block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>100% local · no accounts</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Self-hosted with Docker</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>One command boots the entire stack on your machine — database, auth, storage, and the CMS. No cloud services at all.</p>\\n </a>\\n</div>\\n\\n<p class=''text-sm text-slate-500 dark:text-slate-400''>Not sure which to pick? If you want a live website with the least effort, choose <a href=''#one-click-vercel''>Vercel</a>. If you want a local project to build on, choose <a href=''#npm-create''>npm create nextblock</a>.</p>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/included.webp'' alt=''NextBlock CMS platform overview showing the block editor, CMS dashboard, and integrations included with every installation'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Whichever path you choose, you get the same block editor, the same CMS, and the same database schema.</figcaption>\\n</figure>\\n\\n<h2 id=''one-click-vercel''>Option 1: One-Click Deploy on Vercel</h2>\\n<p>The fastest way to get a production NextBlock site. One button creates your own copy of NextBlock on GitHub, provisions a managed Supabase database, and deploys the site — you never open a terminal or copy a single key.</p>\\n<ol class=''space-y-2''>\\n <li><strong>Click Deploy to Vercel</strong> and sign in — Vercel clones NextBlock into a new repository you own.</li>\\n <li><strong>Create the Supabase database</strong> when prompted: pick a name and a region. Vercel connects it to the project and injects the keys before the first build.</li>\\n <li><strong>Open your new site</strong> once the build finishes. Every fresh instance takes you straight to the setup wizard.</li>\\n <li><strong>Create your administrator account.</strong> It is confirmed instantly — no verification email — and you land in the CMS dashboard.</li>\\n</ol>\\n<div class=''my-8''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Deploy to Vercel →</a>\\n</div>\\n<div class=''rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Zero configuration</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>There are no environment variables to fill in. Media storage automatically uses your connected Supabase project, security secrets are derived for you, and database migrations run automatically on every production build. Adding a custom domain later? Set <code>NEXT_PUBLIC_URL</code> in your Vercel project and redeploy.</p>\\n</div>\\n<p>Your site also keeps itself current: the dashboard checklist includes a one-click <strong>Connect GitHub</strong> step that installs a daily workflow syncing your copy with the latest NextBlock release.</p>\\n\\n<h2 id=''npm-create''>Option 2: Scaffold a Project with npm create nextblock</h2>\\n<p>The best starting point for building your own site. The CLI scaffolds a standalone Next.js application with NextBlock already wired in — no monorepo, no workspace tooling — and hands everything else to the browser wizard.</p>\\n<p>Before you start, install <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20 or newer</a> (it includes npm), then create a free project at <a href=''https://supabase.com'' target=''_blank'' rel=''noopener''>supabase.com</a> (or pick the CLI''s Docker mode during creation and skip cloud accounts entirely).</p>\\n<pre><code>npm create nextblock@latest my-site\\ncd my-site\\nnpm run dev</code></pre>\\n<p>Open <code>http://localhost:3000/setup</code> and let the wizard take over:</p>\\n<ol class=''space-y-2''>\\n <li><strong>Connect Supabase</strong> — paste your project URL, publishable (anon) key, secret (service role) key, and a personal access token so the wizard can apply the database schema for you.</li>\\n <li><strong>Choose media storage</strong> — plug in a Cloudflare R2 bucket for images and files, or leave it blank to use your connected Supabase project''s storage.</li>\\n <li><strong>Create your administrator</strong> — the wizard applies every migration, generates the app secrets, writes <code>.env.local</code>, creates your confirmed admin account, and signs you in. Restart <code>npm run dev</code> once afterwards so the fresh environment is baked into the app.</li>\\n</ol>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Premium modules</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Need a store? One command adds products, checkout, orders, and coupons — license-gated and ready when you are: <code>npx create-nextblock activate ecommerce</code></p>\\n</div>\\n\\n<h2 id=''git-clone''>Option 3: Clone the Repository</h2>\\n<p>Run the full Nx monorepo: the CMS application, every shared package, the CLI source, and the documentation. This is the path for contributors, plugin authors, and teams that customize the platform itself.</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpx nx serve nextblock</code></pre>\\n<p>Open <code>http://localhost:4200</code> — a fresh install redirects every page to <code>/setup</code>, where the same three-step wizard connects Supabase, configures storage, and creates your admin. It validates your keys, writes <code>.env.local</code> with generated secrets, and applies all migrations over the Supabase Management API — no Supabase CLI required.</p>\\n<div class=''rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>No terminal setup</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Configuration moved entirely to the browser — there is no interactive terminal step anymore. When the wizard finishes you are signed in as the administrator; restart the dev server once afterwards so the fresh environment is baked into the app bundle.</p>\\n</div>\\n\\n<h2 id=''docker''>Option 4: Self-Hosted with Docker</h2>\\n<p>Everything runs on your machine: Supabase''s Postgres and auth engines, a PostgREST API behind a Kong gateway, S3-compatible MinIO storage, and the CMS itself. No Supabase account, no Vercel, no email service — ideal for evaluations, air-gapped environments, and anyone who wants a fully self-hosted CMS with complete data ownership.</p>\\n<p>With <a href=''https://www.docker.com/products/docker-desktop/'' target=''_blank'' rel=''noopener''>Docker Desktop</a> installed and running:</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpm run docker:setup</code></pre>\\n<p>The command asks nothing: it generates secure keys, builds the stack, applies every migration, and starts the services. When it finishes, open <code>http://localhost:3000</code> — the setup wizard already has the database and MinIO storage wired up, so the only step left is creating your administrator (confirmed instantly, no email required).</p>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>Day-2 commands</p>\\n <pre class=''mt-4 mb-0''><code># rebuild and restart the stack\\nnpm run docker:up\\n\\n# stop the stack (your data persists in Docker volumes)\\nnpm run docker:down\\n\\n# follow the application logs\\nnpm run docker:logs</code></pre>\\n</div>\\n\\n<h2 id=''after-install''>After You Install: Your First 10 Minutes</h2>\\n<p>Every path drops you at <code>/cms/dashboard</code>, signed in as the first administrator. A built-in onboarding checklist walks you through the rest:</p>\\n<ul class=''space-y-2''>\\n <li><strong>Add your branding</strong> — upload your logo and set the site title.</li>\\n <li><strong>Set your footer</strong> — copyright line and footer navigation.</li>\\n <li><strong>Configure email (SMTP)</strong> — under Settings, so password resets and invitations can send.</li>\\n <li><strong>Optional extras</strong> — connect analytics, enable bot protection, and (on Vercel) turn on automatic updates.</li>\\n</ul>\\n<p>From there, see how the platform fits together in <a href=''/article/how-nextblock-works''>How NextBlock Works</a>, add a storefront with the <a href=''/article/nextblock-commerce-guide''>Commerce guide</a>, or meet your AI copilot in the <a href=''/article/nextblock-cortex-ai-guide''>Cortex AI guide</a>.</p>\\n\\n<h2 id=''faq''>Installation FAQ</h2>\\n<h3>What do I need installed?</h3>\\n<p>Nothing for the Vercel path — it runs entirely in the browser. For <code>npm create nextblock</code>: <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20+</a> (which includes npm). For the cloned repository: Node.js 20+ and git. For Docker: those plus Docker Desktop.</p>\\n<h3>Is NextBlock free?</h3>\\n<p>Yes — the core of NextBlock is a 100% free, open-source CMS (AGPL). Premium packages such as e-commerce and Cortex AI are optional and activate with a license key. Both Vercel and Supabase offer free tiers, so a starter site can run at no cost.</p>\\n<h3>Do I need a Supabase account?</h3>\\n<p>On Vercel, the database is created for you during the deploy. For <code>npm create nextblock</code> and the cloned repository you bring a free Supabase project. With Docker you need no cloud accounts at all.</p>\\n<h3>Do I have to run migrations or SQL by hand?</h3>\\n<p>No. The setup wizard, the Vercel build, and the Docker stack all apply the database schema automatically — and re-running is always safe.</p>\\n<h3>Can I switch paths later?</h3>\\n<p>Yes. Every path runs the same application and the same database schema, so you can prototype locally with Docker today and deploy to Vercel tomorrow. NextBlock deploys like any standard Next.js app.</p>\\n<h3>How do I update NextBlock?</h3>\\n<p>On Vercel, the Connect GitHub onboarding step enables a daily automatic sync with upstream. On a cloned repository, <code>git pull</code>, run <code>npm run db:migrate</code>, then restart (on production builds, pending migrations apply automatically). With Docker, pull the latest code and run <code>npm run docker:up</code>.</p>\\n\\n<div class=''rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5''>\\n <p class=''mt-0 text-2xl font-semibold text-slate-900 dark:text-white''>Ready to launch?</p>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Pick your path above, or jump straight to the fastest one.</p>\\n <div class=''mt-5 flex flex-wrap justify-center gap-3''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Deploy on Vercel</a>\\n <a href=''https://github.com/nextblock-cms/nextblock'' target=''_blank'' rel=''noopener'' 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''>View on GitHub</a>\\n </div>\\n</div>"}', 0, '2026-07-03 17:52:15.799297+00', '2026-07-03 17:52:15.799297+00', NULL) ON CONFLICT DO NOTHING;
|
|
4968
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (41, NULL, 4, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock est un CMS open source et natif IA, construit sur Next.js et Supabase — et son installation ne passe plus par des fichiers de configuration, des assistants en ligne de commande ou du SQL manuel. Il existe quatre façons de démarrer, et elles aboutissent toutes au même endroit : un <strong>assistant de configuration</strong> dans le navigateur qui connecte votre base de données, configure le stockage des médias et crée votre compte administrateur. Choisissez le chemin qui vous convient, suivez les étapes, et vous publierez en quelques minutes.</p>\\n\\n<div class=''grid gap-5 md:grid-cols-2 my-10''>\\n <a href=''#one-click-vercel'' class=''block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Le plus rapide · environ 3 minutes</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Déploiement Vercel en un clic</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Un site de production en ligne avec une base de données gérée. Pas de terminal, pas de variables d''environnement, rien à copier.</p>\\n </a>\\n <a href=''#npm-create'' class=''block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Recommandé pour les nouveaux projets</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>npm create nextblock</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Générez une app Next.js autonome avec NextBlock intégré, puis terminez la configuration dans votre navigateur.</p>\\n </a>\\n <a href=''#git-clone'' class=''block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Code source complet</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Cloner le dépôt</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Faites tourner le monorepo complet — le CMS, tous les packages et la documentation. Conçu pour les contributeurs et les équipes plateforme.</p>\\n </a>\\n <a href=''#docker'' class=''block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>100 % local · aucun compte</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Auto-hébergé avec Docker</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Une seule commande démarre toute la pile sur votre machine — base de données, auth, stockage et le CMS. Aucun service cloud.</p>\\n </a>\\n</div>\\n\\n<p class=''text-sm text-slate-500 dark:text-slate-400''>Vous hésitez ? Pour un site en ligne avec le minimum d''effort, choisissez <a href=''#one-click-vercel''>Vercel</a>. Pour un projet local à personnaliser, choisissez <a href=''#npm-create''>npm create nextblock</a>.</p>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/included.webp'' alt=''Aperçu de la plateforme NextBlock : éditeur de blocs, tableau de bord CMS et intégrations incluses dans chaque installation'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Quel que soit le chemin choisi, vous obtenez le même éditeur de blocs, le même CMS et le même schéma de base de données.</figcaption>\\n</figure>\\n\\n<h2 id=''one-click-vercel''>Option 1 : Déploiement Vercel en un clic</h2>\\n<p>Le moyen le plus rapide d''obtenir un site NextBlock en production. Un seul bouton crée votre propre copie de NextBlock sur GitHub, provisionne une base de données Supabase gérée et déploie le site — sans jamais ouvrir un terminal ni copier la moindre clé.</p>\\n<ol class=''space-y-2''>\\n <li><strong>Cliquez sur Deploy to Vercel</strong> et connectez-vous — Vercel clone NextBlock dans un nouveau dépôt qui vous appartient.</li>\\n <li><strong>Créez la base de données Supabase</strong> quand on vous le demande : choisissez un nom et une région. Vercel la connecte au projet et injecte les clés avant le premier build.</li>\\n <li><strong>Ouvrez votre nouveau site</strong> une fois le build terminé. Toute nouvelle instance vous amène directement à l''assistant de configuration.</li>\\n <li><strong>Créez votre compte administrateur.</strong> Il est confirmé instantanément — aucun email de vérification — et vous arrivez dans le tableau de bord du CMS.</li>\\n</ol>\\n<div class=''my-8''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Déployer sur Vercel →</a>\\n</div>\\n<div class=''rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Zéro configuration</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Aucune variable d''environnement à remplir. Le stockage des médias utilise automatiquement votre projet Supabase connecté, les secrets de sécurité sont dérivés pour vous, et les migrations de base de données s''exécutent automatiquement à chaque build de production. Un domaine personnalisé plus tard ? Définissez <code>NEXT_PUBLIC_URL</code> dans votre projet Vercel et redéployez.</p>\\n</div>\\n<p>Par ailleurs, votre site reste à jour tout seul : la checklist du tableau de bord inclut une étape <strong>Connect GitHub</strong> en un clic qui installe un workflow quotidien synchronisant votre copie avec la dernière version de NextBlock.</p>\\n\\n<h2 id=''npm-create''>Option 2 : Créer un projet avec npm create nextblock</h2>\\n<p>Le meilleur point de départ pour construire votre propre site. Le CLI génère une application Next.js autonome avec NextBlock déjà intégré — sans monorepo ni outillage de workspace — et confie tout le reste à l''assistant dans le navigateur.</p>\\n<p>Avant de commencer, installez <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20 ou plus récent</a> (npm inclus), puis créez un projet gratuit sur <a href=''https://supabase.com'' target=''_blank'' rel=''noopener''>supabase.com</a> (ou choisissez le mode Docker du CLI pendant la création et passez-vous entièrement de comptes cloud).</p>\\n<pre><code>npm create nextblock@latest mon-site\\ncd mon-site\\nnpm run dev</code></pre>\\n<p>Ouvrez <code>http://localhost:3000/setup</code> et laissez l''assistant faire le travail :</p>\\n<ol class=''space-y-2''>\\n <li><strong>Connectez Supabase</strong> — collez l''URL du projet, la clé publiable (anon), la clé secrète (service role) et un jeton d''accès personnel pour que l''assistant applique le schéma de base de données à votre place.</li>\\n <li><strong>Choisissez le stockage des médias</strong> — branchez un bucket Cloudflare R2 pour les images et les fichiers, ou laissez les champs vides pour utiliser le stockage de votre projet Supabase.</li>\\n <li><strong>Créez votre administrateur</strong> — l''assistant applique toutes les migrations, génère les secrets de l''application, écrit <code>.env.local</code>, crée votre compte admin confirmé et vous connecte. Redémarrez ensuite <code>npm run dev</code> une fois pour que le nouvel environnement soit intégré à l''application.</li>\\n</ol>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Modules premium</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Besoin d''une boutique ? Une seule commande ajoute produits, paiement, commandes et coupons — activés par clé de licence, prêts quand vous l''êtes : <code>npx create-nextblock activate ecommerce</code></p>\\n</div>\\n\\n<h2 id=''git-clone''>Option 3 : Cloner le dépôt</h2>\\n<p>Faites tourner le monorepo Nx complet : l''application CMS, tous les packages partagés, le code du CLI et la documentation. C''est le chemin des contributeurs, des auteurs de plugins et des équipes qui personnalisent la plateforme elle-même.</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpx nx serve nextblock</code></pre>\\n<p>Ouvrez <code>http://localhost:4200</code> — une nouvelle installation redirige chaque page vers <code>/setup</code>, où le même assistant en trois étapes connecte Supabase, configure le stockage et crée votre admin. Il valide vos clés, écrit <code>.env.local</code> avec des secrets générés, et applique toutes les migrations via l''API de management Supabase — sans CLI Supabase.</p>\\n<div class=''rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Zéro configuration dans le terminal</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>La configuration se fait entièrement dans le navigateur — il n''y a plus d''étape interactive en ligne de commande. Quand l''assistant termine, vous êtes connecté en administrateur ; redémarrez ensuite le serveur de développement une fois pour que le nouvel environnement soit intégré au bundle de l''application.</p>\\n</div>\\n\\n<h2 id=''docker''>Option 4 : Auto-hébergé avec Docker</h2>\\n<p>Tout tourne sur votre machine : les moteurs Postgres et auth de Supabase, une API PostgREST derrière une passerelle Kong, un stockage MinIO compatible S3 et le CMS lui-même. Pas de compte Supabase, pas de Vercel, pas de service d''email — idéal pour les évaluations, les environnements isolés et la pleine propriété de vos données.</p>\\n<p>Avec <a href=''https://www.docker.com/products/docker-desktop/'' target=''_blank'' rel=''noopener''>Docker Desktop</a> installé et démarré :</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpm run docker:setup</code></pre>\\n<p>La commande ne pose aucune question : elle génère des clés sécurisées, construit la pile, applique toutes les migrations et démarre les services. Quand elle se termine, ouvrez <code>http://localhost:3000</code> — la base de données et le stockage MinIO sont déjà connectés dans l''assistant de configuration, il ne reste qu''à créer votre administrateur (confirmé instantanément, sans email).</p>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>Commandes du quotidien</p>\\n <pre class=''mt-4 mb-0''><code># reconstruire et redémarrer la pile\\nnpm run docker:up\\n\\n# arrêter la pile (vos données persistent dans les volumes Docker)\\nnpm run docker:down\\n\\n# suivre les logs de l''application\\nnpm run docker:logs</code></pre>\\n</div>\\n\\n<h2 id=''after-install''>Après l''installation : vos 10 premières minutes</h2>\\n<p>Chaque chemin vous dépose sur <code>/cms/dashboard</code>, connecté en tant que premier administrateur. Une checklist de démarrage intégrée vous guide pour la suite :</p>\\n<ul class=''space-y-2''>\\n <li><strong>Ajoutez votre identité visuelle</strong> — téléversez votre logo et définissez le titre du site.</li>\\n <li><strong>Réglez votre pied de page</strong> — mention de copyright et navigation du pied de page.</li>\\n <li><strong>Configurez l''email (SMTP)</strong> — dans les réglages, pour que les réinitialisations de mot de passe et les invitations partent bien.</li>\\n <li><strong>Extras optionnels</strong> — connectez vos outils d''analytics, activez la protection anti-bots et (sur Vercel) les mises à jour automatiques.</li>\\n</ul>\\n<p>Ensuite, découvrez comment la plateforme s''articule dans <a href=''/article/comment-nextblock-fonctionne''>Comment NextBlock fonctionne</a>, ou ajoutez une boutique avec le <a href=''/article/guide-commerce-nextblock''>guide Commerce</a>.</p>\\n\\n<h2 id=''faq''>FAQ d''installation</h2>\\n<h3>Que dois-je installer ?</h3>\\n<p>Rien pour le chemin Vercel — tout se passe dans le navigateur. Pour <code>npm create nextblock</code> : <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20+</a> (npm inclus). Pour le dépôt cloné : Node.js 20+ et git. Pour Docker : ajoutez Docker Desktop.</p>\\n<h3>NextBlock est-il gratuit ?</h3>\\n<p>Oui — le cœur du CMS est 100 % gratuit et open source (AGPL). Les packages premium comme l''e-commerce et Cortex AI sont optionnels et s''activent avec une clé de licence. Vercel et Supabase proposent chacun une offre gratuite : un site de départ peut donc tourner sans frais.</p>\\n<h3>Ai-je besoin d''un compte Supabase ?</h3>\\n<p>Sur Vercel, la base de données est créée pour vous pendant le déploiement. Pour <code>npm create nextblock</code> et le dépôt cloné, il vous faut un projet Supabase gratuit. Avec Docker, aucun compte cloud n''est nécessaire.</p>\\n<h3>Dois-je exécuter des migrations ou du SQL à la main ?</h3>\\n<p>Non. L''assistant de configuration, le build Vercel et la pile Docker appliquent tous le schéma de base de données automatiquement — et relancer l''opération est toujours sans risque.</p>\\n<h3>Puis-je changer de chemin plus tard ?</h3>\\n<p>Oui. Chaque chemin exécute la même application et le même schéma de base de données : vous pouvez prototyper en local avec Docker aujourd''hui et déployer sur Vercel demain. NextBlock se déploie comme n''importe quelle app Next.js.</p>\\n<h3>Comment mettre à jour NextBlock ?</h3>\\n<p>Sur Vercel, l''étape Connect GitHub de la checklist active une synchronisation quotidienne automatique. Sur un dépôt cloné, <code>git pull</code>, lancez <code>npm run db:migrate</code>, puis redémarrez (lors des builds de production, les migrations en attente s''appliquent automatiquement). Avec Docker, récupérez le dernier code et lancez <code>npm run docker:up</code>.</p>\\n\\n<div class=''rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5''>\\n <p class=''mt-0 text-2xl font-semibold text-slate-900 dark:text-white''>Prêt à vous lancer ?</p>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Choisissez votre chemin ci-dessus, ou passez directement au plus rapide.</p>\\n <div class=''mt-5 flex flex-wrap justify-center gap-3''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Déployer sur Vercel</a>\\n <a href=''https://github.com/nextblock-cms/nextblock'' target=''_blank'' rel=''noopener'' 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''>Voir sur GitHub</a>\\n </div>\\n</div>"}', 0, '2026-07-03 17:52:15.799297+00', '2026-07-03 17:52:15.799297+00', NULL) ON CONFLICT DO NOTHING;
|
|
4969
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (8, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-center text-white mb-4''>Have Questions?</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-center text-lg text-slate-300 mx-auto mb-8''>NextBlock™ partners with early adopters to co-build features, sponsor modules, and shape the product direction.</p>"}, "block_type": "text"}, {"content": {"url": "/contact", "size": "lg", "text": "Get in Touch", "variant": "default", "position": "center"}, "block_type": "button"}, {"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": "Deploy on Vercel", "variant": "outline", "position": "center"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.840619+00', NULL) ON CONFLICT DO NOTHING;
|
|
4970
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (27, NULL, 1, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ is designed so the hosted CMS, the open-source starter, and the developer tooling all feel like the same product. The shared Nx workspace, typed block contracts, and reusable editor package keep product polish and developer velocity moving together.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>One codebase</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Shared foundation</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Marketing pages, CMS screens, and the starter template evolve together instead of drifting apart.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Typed content</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Blocks with guardrails</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Zod schemas, defaults, and renderer contracts make every custom block safer to ship.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Editorial UX</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Product-grade editing</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>The Tiptap layer gives editors a richer surface without hiding the underlying HTML power.</p>\\n </div>\\n</div>\\n\\n<div class=''flex flex-col md:flex-row gap-8 items-center my-12''>\\n <div class=''w-full md:w-1/2 space-y-4''>\\n <h2>Monorepo Layout and Dependency Flow</h2>\\n <p>The <code>apps/nextblock</code> directory contains the production Next.js experience, including the public site and authenticated CMS shell. The <code>apps/create-nextblock</code> CLI mirrors that foundation so teams can start from the same product decisions instead of rebuilding them from scratch.</p>\\n <ul class=''list-disc pl-6 space-y-2 text-sm''>\\n <li><strong>@nextblock-cms/ui</strong> - UI components, tokens, and shared design primitives</li>\\n <li><strong>@nextblock-cms/utils</strong> - translations, environment guards, and storage helpers</li>\\n <li><strong>@nextblock-cms/db</strong> - migrations, typed database access, and generated types</li>\\n <li><strong>@nextblock-cms/editor</strong> - the reusable Tiptap v3 editing surface</li>\\n <li><strong>@nextblock-cms/sdk</strong> - typed contracts for block authorship and validation</li>\\n <li><strong>@nextblock-cms/ecommerce</strong> - the premium commerce module when activated</li>\\n </ul>\\n <p>Run <code>nx graph</code> and you can see exactly how changes ripple through the workspace. Path aliases from <code>tsconfig.base.json</code> and the shared Tailwind setup help keep design parity between marketing pages, admin screens, and generated projects.</p>\\n </div>\\n <aside class=''w-full md:w-1/2 rounded-[2rem] border border-slate-200/80 bg-white p-4 shadow-xl dark:border-white/10 dark:bg-white/5''>\\n <div class=''relative aspect-video overflow-hidden rounded-2xl''><iframe class=''absolute inset-0 h-full w-full border-0'' src=''https://www.youtube.com/embed/DNqU8ez9qjs?si=p2oIy0f-n7wiaBmO'' title=''How NextBlock™ Works'' allow=''accelerated-motion; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'' referrerpolicy=''strict-origin-when-cross-origin'' loading=''lazy'' allowfullscreen></iframe></div>\\n <p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>Nx makes every workspace relationship visible, which is exactly why the starter, CMS, and packages stay aligned.</p>\\n </aside>\\n</div>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/extensibility.webp'' alt=''NextBlock™ extensibility artwork showing the CMS connected to reusable modules and integrations'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>A single visual system spans content modeling, editing, and future premium modules like commerce.</figcaption>\\n</figure>\\n\\n<h2>Block Registry as Product Surface</h2>\\n<p>The block registry in <code>apps/nextblock/lib/blocks/blockRegistry.ts</code> is the source of truth for available block types, Zod schemas, starter content, and editor or renderer components. Today that includes everything from <code>text</code> and <code>heading</code> to <code>section</code>, <code>posts_grid</code>, <code>checkout</code>, and <code>product_details</code>.</p>\\n<p>Sections support nested column arrays, so layouts can be composed like real pages instead of flat content lists. Helpers such as <code>getBlockDefinition()</code>, <code>getInitialContent()</code>, and <code>validateBlockContent()</code> keep that flexibility strongly typed.</p>\\n\\n<h2>The Editing Layer</h2>\\n<p>The <code>@nextblock-cms/editor</code> package wraps Tiptap v3 into a reusable editorial surface with slash commands, floating and bubble menus, drag handles, tables, task lists, character counts, and syntax-highlighted code blocks. It deliberately preserves richer HTML so advanced teams are not boxed into a simplified subset.</p>\\n\\n<h2>Inside the CMS Shell</h2>\\n<p>Within <code>apps/nextblock/app/cms</code>, each feature area follows a repeatable pattern: list pages, create and edit routes, scoped client components, and server actions that wrap Supabase mutations. The result feels consistent for editors while keeping credentials and permissions on the server side.</p>\\n\\n<h2>Open Core Without Product Drift</h2>\\n<p>The core CMS is open source under AGPL. Premium modules like <code>@nextblock-cms/ecommerce</code> remain source-available but are activated through <code>package_activations</code> and <code>verifyPackageOnline()</code>. That means the same shell can stay clean for open-source users while revealing commerce surfaces only when the license is active.</p>\\n\\n<h2>Why It Holds Together</h2>\\n<p>The Nx workspace keeps libraries honest, the Next.js app enforces UI consistency, Supabase migrations codify access rules, and the Tiptap editor gives collaborators the same authoring experience regardless of deployment. When a team runs <code>npm create nextblock</code>, they inherit the full operating model, not just a pile of files.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.859357+00', NULL) ON CONFLICT DO NOTHING;
|
|
4971
|
-
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (28, NULL, 2, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ relie le CMS hébergé, le starter open source et les outils dev dans un même socle produit. Le workspace Nx, les contrats de blocs typés et l''éditeur partagé permettent d''avancer vite sans sacrifier la cohérence.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Socle unique</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Une même base</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Le site public, le shell CMS et le starter gardent les mêmes choix produit et la même direction visuelle.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Contenu typé</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Blocs avec garde-fous</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Schémas Zod, contenus par défaut et contrats de rendu rendent les extensions plus sûres à maintenir.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Expérience éditoriale</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Edition premium</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>La couche Tiptap donne aux éditeurs une interface riche sans masquer la puissance HTML pour les cas avancés.</p>\\n </div>\\n</div>\\n\\n<div class=''flex flex-col md:flex-row gap-8 items-center my-12''>\\n <div class=''w-full md:w-1/2 space-y-4''>\\n <h2>Architecture monorepo et flux de dépendances</h2>\\n <p>Le dossier <code>apps/nextblock</code> contient l''expérience Next.js en production, incluant le site public et le shell CMS authentifié. Le CLI <code>apps/create-nextblock</code> reprend cette base pour que les nouveaux projets partent des mêmes décisions produit.</p>\\n <ul class=''list-disc pl-6 space-y-2 text-sm''>\\n <li><strong>@nextblock-cms/ui</strong> - composants UI, tokens et primitives visuelles partagées</li>\\n <li><strong>@nextblock-cms/utils</strong> - traductions, gardes d''environnement et helpers de stockage</li>\\n <li><strong>@nextblock-cms/db</strong> - migrations, accès base typé et types générés</li>\\n <li><strong>@nextblock-cms/editor</strong> - la surface d''édition Tiptap v3 réutilisable</li>\\n <li><strong>@nextblock-cms/sdk</strong> - contrats typés pour l''auteuring et la validation des blocs</li>\\n <li><strong>@nextblock-cms/ecommerce</strong> - le module commerce premium lorsqu''il est activé</li>\\n </ul>\\n <p>Lancez <code>nx graph</code> et vous voyez immédiatement comment un changement se propage. Les alias de <code>tsconfig.base.json</code> et la configuration Tailwind partagée aident à garder une vraie parité entre marketing, back-office et projets générés.</p>\\n </div>\\n <aside class=''w-full md:w-1/2 rounded-[2rem] border border-slate-200/80 bg-white p-4 shadow-xl dark:border-white/10 dark:bg-white/5''>\\n <div class=''relative aspect-video overflow-hidden rounded-2xl''><iframe class=''absolute inset-0 h-full w-full border-0'' src=''https://www.youtube.com/embed/DNqU8ez9qjs?si=p2oIy0f-n7wiaBmO'' title=''Comment NextBlock™ fonctionne'' allow=''accelerated-motion; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'' referrerpolicy=''strict-origin-when-cross-origin'' loading=''lazy'' allowfullscreen></iframe></div>\\n <p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>Nx rend visibles les relations du workspace, ce qui aide le starter, le CMS et les packages a rester alignes.</p>\\n </aside>\\n</div>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/extensibility.webp'' alt=''Visuel NextBlock™ montrant le CMS relie a des modules reutilisables et des integrations'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Un seul langage visuel relie la modelisation de contenu, l''edition et les futurs modules premium comme le commerce.</figcaption>\\n</figure>\\n\\n<h2>Le registre de blocs comme surface produit</h2>\\n<p>Le registre dans <code>apps/nextblock/lib/blocks/blockRegistry.ts</code> définit les types disponibles, les schémas Zod, les contenus de départ et les composants d''édition ou de rendu. On y trouve aujourd''hui des blocs comme <code>text</code>, <code>heading</code>, <code>section</code>, <code>posts_grid</code>, <code>checkout</code> et <code>product_details</code>.</p>\\n<p>Les sections supportent des colonnes imbriquées, ce qui permet de composer de vraies pages plutôt qu''une simple liste de contenu. Des helpers comme <code>getBlockDefinition()</code>, <code>getInitialContent()</code> and <code>validateBlockContent()</code> gardent cette flexibilité bien typée.</p>\\n\\n<h2>La couche d''edition</h2>\\n<p>Le package <code>@nextblock-cms/editor</code> enveloppe Tiptap v3 dans une surface éditoriale réutilisable avec slash commands, menus contextuels, drag handles, tableaux, listes de taches, compteurs et blocs de code. Le but est de conserver un HTML riche quand une equipe en a besoin.</p>\\n\\n<h2>A l''interieur du shell CMS</h2>\\n<p>Dans <code>apps/nextblock/app/cms</code>, chaque zone suit un motif lisible : pages de liste, routes de creation et d''edition, composants clients cibles et server actions qui encapsulent les mutations Supabase. Les editeurs y gagnent une interface coherente et les identifiants restent cote serveur.</p>\\n\\n<h2>Open core sans derive produit</h2>\\n<p>Le coeur du CMS est open source sous AGPL. Les modules premium comme <code>@nextblock-cms/ecommerce</code> restent disponibles en source mais sont actives via <code>package_activations</code> et <code>verifyPackageOnline()</code>. Le meme shell peut donc rester simple pour l''open source tout en deverrouillant les surfaces commerce au bon moment.</p>\\n\\n<h2>Pourquoi l''ensemble tient</h2>\\n<p>Le workspace Nx garde les librairies honnetes, l''app Next.js maintient la coherence UI, les migrations Supabase codifient les regles d''acces, et l''editeur Tiptap donne la meme experience de contribution quel que soit le deploiement. Quand une equipe lance <code>npm create nextblock</code>, elle recupere une facon de travailler complete, pas juste des fichiers.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.859357+00', NULL) ON CONFLICT DO NOTHING;
|
|
4972
|
-
INSERT INTO public.currencies (id, code, symbol, exchange_rate, is_default, is_active, rounding_mode, rounding_increment, rounding_charm_amount, auto_update_exchange_rate, exchange_rate_updated_at, exchange_rate_source, auto_sync_product_prices, created_at, updated_at) VALUES ('f26e8339-d3cd-46f2-b11e-12569c30d4a8', 'USD', '$', 1.0000000000, true, true, 'none', 1, NULL, false, '2026-07-03 17:52:15.444652+00', 'store-default', false, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4973
|
-
INSERT INTO public.logos (id, name, media_id, created_at) VALUES ('d45ef03d-27fc-4099-8b46-1cdf82d658d2', 'NextBlock™ Logo', 'ea6fdaf5-f8de-416c-9f2b-b689b7a4ed38', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4974
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (1, 1, 'HEADER', 'Home', '/', NULL, 0, 1, 'b6bd9818-a8d1-4a17-ac6b-d5b1f178a297', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4975
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (2, 1, 'HEADER', 'Articles', '/articles', NULL, 1, 3, '8c269d8b-db64-47ab-8ce0-29f65dbbe867', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4976
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (3, 1, 'HEADER', 'Contact', '/contact', NULL, 3, 5, 'cd630aed-aeb8-4acf-934b-9ccbbe8ee9bd', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4977
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (4, 2, 'HEADER', 'Accueil', '/accueil', NULL, 0, 2, 'aaa0c842-c996-4a07-bb3a-7562f865b6a4', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4978
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (5, 2, 'HEADER', 'Articles', '/articles', NULL, 1, 4, 'af69b017-3762-4c11-b709-37fb56081b99', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4979
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (6, 2, 'HEADER', 'Contact', '/contact', NULL, 3, 6, '21a91d4b-a494-4b3a-8d28-c21c414042cf', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4980
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (7, 1, 'FOOTER', 'Privacy Policy', '/privacy-policy', NULL, 0, 7, 'c8f2e6a3-7d28-4174-a8f7-0179226ae79a', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4981
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (8, 1, 'FOOTER', 'Terms of Service', '/terms-of-service', NULL, 1, 9, '4838ca4b-eaad-495c-ad7c-1750984bc8d9', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4982
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (9, 2, 'FOOTER', 'Politique de confidentialité', '/politique-de-confidentialite', NULL, 0, 8, 'c8f2e6a3-7d28-4174-a8f7-0179226ae79a', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4983
|
-
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (10, 2, 'FOOTER', 'Conditions d''utilisation', '/conditions-utilisation', NULL, 1, 10, '4838ca4b-eaad-495c-ad7c-1750984bc8d9', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4984
|
-
INSERT INTO public.shipping_zones (id, name, priority_order, created_at, updated_at) VALUES ('4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'North America', 10, '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4985
|
-
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('c25d8fee-f0b6-43d5-8af5-5af4a47cb123', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'US', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4986
|
-
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('3d3d4bf6-7cb1-41b9-a5e1-1eb9098e640f', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'CA', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4987
|
-
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('63d47fff-7148-48ff-8cc1-5d3ba99fa022', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'MX', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4988
|
-
INSERT INTO public.shipping_zone_methods (id, zone_id, method_type, cost_amount, cost_currency, min_order_amount, name, name_translations, currency_pricing_mode, cost_amounts, min_order_amounts, created_at, updated_at) VALUES ('ea112a82-e05c-46bc-a5e7-5bb62528aa5d', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'flat_rate', 1500, 'USD', 0, 'Standard Shipping', '{"fr": "Livraison standard"}', 'auto', '{"USD": 1500}', '{"USD": 0}', '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4989
|
-
INSERT INTO public.shipping_zone_methods (id, zone_id, method_type, cost_amount, cost_currency, min_order_amount, name, name_translations, currency_pricing_mode, cost_amounts, min_order_amounts, created_at, updated_at) VALUES ('32d473d1-e3d4-4741-a7f5-63d87a387e08', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'free_shipping', 0, 'USD', 10000, 'Free Shipping (Orders over $100)', '{"fr": "Livraison gratuite (commandes de plus de 100 $)"}', 'auto', '{"USD": 0}', '{"USD": 10000}', '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4990
|
-
INSERT INTO public.site_settings (key, value) VALUES ('footer_copyright', '{"en": "© {year} Nextblock CMS. All rights reserved.", "fr": "© {year} Nextblock CMS. Tous droits réservés."}') ON CONFLICT DO NOTHING;
|
|
4991
|
-
INSERT INTO public.site_settings (key, value) VALUES ('enabled_payment_providers', '{"stripe": false, "freemius": false}') ON CONFLICT DO NOTHING;
|
|
4992
|
-
INSERT INTO public.site_settings (key, value) VALUES ('site_title', '"NextBlock™ CMS"') ON CONFLICT DO NOTHING;
|
|
4993
|
-
INSERT INTO public.site_settings (key, value) VALUES ('site_description', '"NextBlock™ is an open-source CMS on Next.js + Supabase — a visual block editor, blazing-fast multilingual pages, and built-in e-commerce."') ON CONFLICT DO NOTHING;
|
|
4994
|
-
INSERT INTO public.site_settings (key, value) VALUES ('site_keywords', '"NextBlock, CMS, Next.js, Supabase, headless CMS, block editor, visual page builder, multilingual, e-commerce, open source"') ON CONFLICT DO NOTHING;
|
|
4995
|
-
INSERT INTO public.site_settings (key, value) VALUES ('ecommerce_inventory_settings', '{"enable_taxes": false, "track_quantities": true}') ON CONFLICT DO NOTHING;
|
|
4996
|
-
INSERT INTO public.site_settings (key, value) VALUES ('invoice_settings', '{"email": "", "phone": "", "address": {"city": "", "line1": "", "line2": "", "state": "", "postal_code": "", "country_code": "CA"}, "business_name": "", "tax_registrations": []}') ON CONFLICT DO NOTHING;
|
|
4997
|
-
INSERT INTO public.site_settings (key, value) VALUES ('privacy_settings', '{"gtm_id": "", "corporate": {"address": "", "legal_name": "", "support_email": ""}, "banner_enabled": true, "custom_scripts": "", "ga_measurement_id": ""}') ON CONFLICT DO NOTHING;
|
|
4998
|
-
INSERT INTO public.site_settings (key, value) VALUES ('email_public', '{"host": "", "port": "", "secure": true, "fromName": "", "fromEmail": ""}') ON CONFLICT DO NOTHING;
|
|
4999
|
-
INSERT INTO public.site_settings (key, value) VALUES ('payment_public', '{"stripe": {"publishableKey": ""}, "freemius": {"productId": "", "publicKey": "", "developerId": "", "sandboxEnabled": false}}') ON CONFLICT DO NOTHING;
|
|
5000
|
-
INSERT INTO public.site_settings (key, value) VALUES ('onboarding_state', '{"skipped": [], "dismissed": false}') ON CONFLICT DO NOTHING;
|
|
5001
|
-
INSERT INTO public.site_settings (key, value) VALUES ('security_settings', '{"enforce_staff_2fa": true, "trusted_device_days": 30}') ON CONFLICT DO NOTHING;
|
|
5002
|
-
INSERT INTO public.site_settings (key, value) VALUES ('is_admin_created', 'false') ON CONFLICT DO NOTHING;
|
|
5003
|
-
INSERT INTO public.system_configuration (id, auto_accept_signups, settings) VALUES (1, false, '{}'::jsonb) ON CONFLICT DO NOTHING;
|
|
5004
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('continue_with_github', '{"en": "Continue with GitHub", "es": "Continuar con GitHub", "fr": "Continuer avec GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5005
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('or_continue_with', '{"en": "Or continue with", "es": "O continuar con", "fr": "Ou continuer avec"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5006
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('customer_profile', '{"en": "Customer Profile", "es": "Perfil de Cliente", "fr": "Profil Client"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5007
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('personal_information', '{"en": "Personal Information", "es": "Información Personal", "fr": "Informations Personnelles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5008
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('full_name', '{"en": "Full Name", "es": "Nombre Completo", "fr": "Nom Complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5009
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_username', '{"en": "GitHub Username", "es": "Nombre de usuario de GitHub", "fr": "Nom d''utilisateur GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5010
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_username_help', '{"en": "Required only for purchasing developer licenses.", "es": "Requerido solo para comprar licencias de desarrollador.", "fr": "Requis uniquement pour l''achat de licences développeur."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5011
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('phone_number', '{"en": "Phone Number", "es": "Número de Teléfono", "fr": "Numéro de Téléphone"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5012
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('billing_address', '{"en": "Billing Address", "es": "Dirección de Facturación", "fr": "Adresse de Facturation"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5013
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_line_1', '{"en": "Address Line 1", "es": "Dirección Línea 1", "fr": "Adresse Ligne 1"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5014
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_line_2', '{"en": "Address Line 2 (Optional)", "es": "Dirección Línea 2 (Opcional)", "fr": "Adresse Ligne 2 (Optionnel)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5015
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('city', '{"en": "City", "es": "Ciudad", "fr": "Ville"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5016
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('state_province', '{"en": "State / Province", "es": "Estado / Provincia", "fr": "État / Province"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5017
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('postal_zip_code', '{"en": "Postal / Zip Code", "es": "Código Postal", "fr": "Code Postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5018
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('country', '{"en": "Country", "es": "País", "fr": "Pays"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5019
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('save_profile', '{"en": "Save Profile", "es": "Guardar Perfil", "fr": "Enregistrer le Profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5020
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('saving', '{"en": "Saving...", "es": "Guardando...", "fr": "Enregistrement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5021
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_updated_success', '{"en": "Profile updated successfully", "es": "Perfil actualizado con éxito", "fr": "Profil mis à jour avec succès"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5022
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_update_failed', '{"en": "Failed to update profile", "es": "Error al actualizar el perfil", "fr": "Échec de la mise à jour du profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5023
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_required', '{"en": "Address is required", "es": "La dirección es obligatoria", "fr": "L''adresse est requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5024
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('city_required', '{"en": "City is required", "es": "La ciudad es obligatoria", "fr": "La ville est requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5025
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('zip_code_required', '{"en": "Zip Code is required", "es": "El código postal es obligatorio", "fr": "Le code postal est requis"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5026
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('country_required', '{"en": "Country is required", "es": "El país es obligatorio", "fr": "Le pays est requis"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5027
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('enter_valid_json', '{"en": "Enter valid JSON for billing address.", "es": "Ingrese JSON válido para la dirección de facturación.", "fr": "Entrez un JSON valide pour l''adresse de facturation."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5028
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('public_profile', '{"en": "Public Profile", "es": "Perfil Público", "fr": "Profil Public"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5029
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('details', '{"en": "Account Details", "es": "Detalles de la Cuenta", "fr": "Détails du Compte"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5030
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('identity', '{"en": "Identity", "es": "Identidad", "fr": "Identité"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5031
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('website', '{"en": "Website", "es": "Sitio Web", "fr": "Site Web"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5032
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('avatar_url', '{"en": "Avatar URL", "es": "URL del Avatar", "fr": "URL de l''Avatar"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5033
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('connect_github', '{"en": "Connect GitHub", "es": "Conectar GitHub", "fr": "Connecter GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5034
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_link_failed', '{"en": "Failed to link GitHub account", "es": "Error al vincular cuenta de GitHub", "fr": "Échec de la liaison du compte GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5035
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('save_changes', '{"en": "Save Changes", "es": "Guardar Cambios", "fr": "Enregistrer les Modifications"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5036
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_connected', '{"en": "GitHub Connected", "es": "GitHub Conectado", "fr": "GitHub Connecté"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5037
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('linked_to', '{"en": "Linked to", "es": "Vinculado a", "fr": "Lié à"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5038
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('optional', '{"en": "Optional", "fr": "Optionnel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5039
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('shipping_address', '{"en": "Shipping Address", "fr": "Adresse de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5040
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_settings_title', '{"en": "Profile Settings", "fr": "Paramètres du profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5041
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_settings_description', '{"en": "Keep your contact details and default addresses up to date for faster checkout.", "fr": "Gardez vos coordonnées et adresses par défaut à jour pour un paiement plus rapide."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5042
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_not_found', '{"en": "Profile not found.", "fr": "Profil introuvable."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5043
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_basic_info_help', '{"en": "This information appears on your account and helps us prepare your orders.", "fr": "Ces informations apparaissent sur votre compte et nous aident à préparer vos commandes."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5044
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_address_defaults_help', '{"en": "These default addresses are prefilled during checkout and can still be edited for each order.", "fr": "Ces adresses par défaut sont préremplies au paiement et restent modifiables pour chaque commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5045
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('use_billing_for_shipping', '{"en": "Use billing address for shipping", "fr": "Utiliser l''adresse de facturation pour la livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5046
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_use_billing_for_shipping_help', '{"en": "Keep one default address unless you regularly ship somewhere else.", "fr": "Gardez une seule adresse par défaut sauf si vous faites souvent livrer ailleurs."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5047
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_complete_billing_address', '{"en": "Please complete your billing address before continuing.", "fr": "Veuillez compléter votre adresse de facturation avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5048
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_complete_shipping_address', '{"en": "Please complete your shipping address before continuing.", "fr": "Veuillez compléter votre adresse de livraison avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5049
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_prefill_notice', '{"en": "Using your saved account details for {email}. You can still adjust them for this order.", "fr": "Nous utilisons les renseignements enregistrés pour {email}. Vous pouvez toujours les ajuster pour cette commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5050
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_billing_address_help', '{"en": "We use this address for payment verification and invoicing.", "fr": "Nous utilisons cette adresse pour la vérification du paiement et la facturation."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5051
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_use_billing_for_shipping_help', '{"en": "Uncheck this if you want your order delivered to a different address.", "fr": "Décochez ceci si vous souhaitez faire livrer votre commande à une autre adresse."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5052
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_shipping_address_help', '{"en": "Choose where physical items should be delivered.", "fr": "Choisissez où les articles physiques doivent être livrés."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5053
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_payment_only_notice', '{"en": "Stripe checkout is kept focused on payment because your address details are already collected here.", "fr": "Le paiement Stripe reste centré sur le paiement puisque vos coordonnées sont déjà recueillies ici."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5054
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_existing_account_hint', '{"en": "That email may already be registered. Try signing in or resetting your password.", "fr": "Cette adresse e-mail est peut-être déjà utilisée. Essayez de vous connecter ou de réinitialiser votre mot de passe."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5055
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_check_email_profile', '{"en": "Check your email to confirm your account. We''ll bring you to your profile next so you can finish setting up your details.", "fr": "Vérifiez votre e-mail pour confirmer votre compte. Nous vous amènerons ensuite à votre profil pour terminer la configuration de vos renseignements."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5056
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.add_to_cart', '{"en": "Add to Cart", "fr": "Ajouter au panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5057
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart', '{"en": "Added to cart", "fr": "Ajouté au panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5058
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_image', '{"en": "No Image", "fr": "Pas d''image"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5059
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.view_details', '{"en": "View Details", "fr": "Voir les détails"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5060
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_added_desc', '{"en": "The item has been added to your cart.", "fr": "L''article a été ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5061
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout', '{"en": "Checkout", "fr": "Paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5062
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart', '{"en": "Cart", "fr": "Panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5063
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.subtotal', '{"en": "Subtotal", "fr": "Sous-total"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5064
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping', '{"en": "Shipping", "fr": "Livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5065
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.tax', '{"en": "Tax", "fr": "Taxes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5066
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.total', '{"en": "Total", "fr": "Total"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5067
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.order_summary', '{"en": "Order Summary", "fr": "Résumé de la commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5068
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.order_summary_desc', '{"en": "Review your items before proceeding to payment.", "fr": "Vérifiez vos articles avant de procéder au paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5069
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.payment_details', '{"en": "Payment Details", "fr": "Détails du paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5070
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_info', '{"en": "Shipping Information", "fr": "Informations de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5071
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.delivery_notice', '{"en": "Digital product - No shipping required", "fr": "Produit numérique - Aucune livraison requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5072
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.back_to_shop', '{"en": "Back to Shop", "fr": "Retour à la boutique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5073
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.empty_cart', '{"en": "Your cart is empty", "fr": "Votre panier est vide"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5074
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_products_found', '{"en": "No products found", "fr": "Aucun produit trouvé"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5075
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.featured_products', '{"en": "Featured Products", "fr": "Produits vedettes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5076
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.latest_products', '{"en": "Latest Products", "fr": "Derniers produits"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5077
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.search_products', '{"en": "Search products...", "fr": "Rechercher des produits..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5078
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price_low_to_high', '{"en": "Price: Low to High", "fr": "Prix : Croissant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5079
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price_high_to_low', '{"en": "Price: High to Low", "fr": "Prix : Décroissant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5080
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.newest', '{"en": "Newest", "fr": "Nouveautés"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5081
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.filters', '{"en": "Filters", "fr": "Filtres"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5082
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.apply_filters', '{"en": "Apply Filters", "fr": "Appliquer les filtres"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5083
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.clear_all', '{"en": "Clear All", "fr": "Tout effacer"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5084
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_notice', '{"en": "This is a digital product. You will receive access instructions via email after purchase.", "fr": "Ceci est un produit numérique. Vous recevrez les instructions d''accès par e-mail après l''achat."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5085
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shopping_cart', '{"en": "Shopping Cart", "fr": "Panier d''achat"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5086
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart_empty', '{"en": "Your cart is empty", "fr": "Votre panier est vide"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5087
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart_empty_description', '{"en": "Looks like you haven''t added anything to your cart yet.", "fr": "On dirait que vous n''avez encore rien ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5088
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.continue_shopping', '{"en": "Continue Shopping", "fr": "Continuer vos achats"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5089
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.go_to_shop', '{"en": "Go to Shop", "fr": "Aller à la boutique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5090
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_successful', '{"en": "Checkout Successful", "fr": "Paiement Réussi"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5091
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_notice', '{"en": "This is a Sandbox environment. The Freemius checkout is skipped here for demo purposes.", "fr": "Ceci est un environnement de bac à sable. Le paiement Freemius est sauté ici à des fins de démonstration."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5092
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_notice', '{"en": "To purchase a real license for your self-hosted NextBlock™ instance, visit:", "fr": "Pour acheter une vraie licence pour votre instance NextBlock™ auto-hébergée, visitez :"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5093
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.purchase_at', '{"en": "Purchase at nextblock.
|
|
5094
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.qty', '{"en": "Qty", "fr": "Qté"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5095
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.quantity', '{"en": "Quantity", "fr": "Quantité"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5096
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.product', '{"en": "Product", "fr": "Produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5097
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price', '{"en": "Price", "fr": "Prix"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5098
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_payment', '{"en": "Secure payment processing", "fr": "Traitement sécurisé du paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5099
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_notice', '{"en": "* Taxes and shipping will be calculated on the next step.", "fr": "* Les taxes et les frais de livraison seront calculés à l''étape suivante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5100
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_calculated', '{"en": "Shipping & taxes calculated at checkout.", "fr": "Livraison et taxes calculées lors du paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5101
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.email_address', '{"en": "Email Address", "fr": "Adresse e-mail"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5102
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.pay_now', '{"en": "Pay Now", "fr": "Payer maintenant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5103
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.proceed_to_checkout', '{"en": "Proceed to Checkout", "fr": "Passer à la caisse"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5104
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.processing', '{"en": "Processing...", "fr": "Traitement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5105
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.invalid_email', '{"en": "Please enter a valid email address.", "fr": "Veuillez entrer une adresse e-mail valide."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5106
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_failed', '{"en": "Checkout failed: ", "fr": "Le paiement a échoué : "}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5107
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.generic_error', '{"en": "An error occurred. Please try again.", "fr": "Une erreur est survenue. Veuillez réessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5108
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_popup_blocked', '{"en": "Checkout popup blocked or failed to load. Falling back to direct link.", "fr": "Le popup de paiement a été bloqué ou n''a pas pu être chargé. Retour au lien direct."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5109
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.view_full_cart', '{"en": "View Full Cart", "fr": "Voir le panier complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5110
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.ready_to_checkout', '{"en": "Ready to Checkout?", "fr": "Prêt à passer au paiement ?"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5111
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sale_badge', '{"en": "Sale {percent}% Off", "fr": "Solde {percent}% de rabais"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5112
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.low_stock', '{"en": "Only {count} left", "fr": "Plus que {count} en stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5113
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.instant_digital_delivery', '{"en": "Instant Digital Delivery", "fr": "Livraison numérique instantanée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5114
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.free_shipping', '{"en": "Free Shipping", "fr": "Livraison gratuite"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5115
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_checkout', '{"en": "Secure Checkout", "fr": "Paiement sécurisé"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5116
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_description', '{"en": "No description available.", "fr": "Aucune description disponible."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5117
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_overlay_title', '{"en": "Order Checkout", "fr": "Paiement de la commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5118
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.email_placeholder', '{"en": "you@example.com", "fr": "vous@exemple.com"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5119
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.contact_information', '{"en": "Contact Information", "fr": "Informations de contact"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5120
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_address', '{"en": "Shipping Address", "fr": "Adresse de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5121
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_method', '{"en": "Shipping Method", "fr": "Mode de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5122
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.available_rates', '{"en": "Available Rates", "fr": "Tarifs disponibles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5123
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculating', '{"en": "Calculating...", "fr": "Calcul en cours..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5124
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.select_rate', '{"en": "Select a shipping rate", "fr": "Sélectionnez un tarif de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5125
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.enter_postal_code', '{"en": "Enter postal code", "fr": "Entrez le code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5126
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.free', '{"en": "Free", "fr": "Gratuit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5127
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.first_last_name', '{"en": "First & Last Name", "fr": "Nom et prénom"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5128
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.address', '{"en": "Address", "fr": "Adresse"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5129
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.city', '{"en": "City", "fr": "Ville"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5130
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.state_province', '{"en": "State / Province", "fr": "État / Province"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5131
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.zip_postal', '{"en": "ZIP / Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5132
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.postal_code', '{"en": "Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5133
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.zip_postal_code', '{"en": "ZIP / Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5134
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.estimate_shipping', '{"en": "Estimate Shipping", "fr": "Estimer la livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5135
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculate', '{"en": "Calculate", "fr": "Calculer"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5136
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_rates_found', '{"en": "No shipping rates found for this region.", "fr": "Aucun tarif de livraison trouvé pour cette région."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5137
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_rates_for_region', '{"en": "No shipping rates found for this region.", "fr": "Aucun tarif de livraison trouvé pour cette région."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5138
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.enter_address_for_rates', '{"en": "Enter your address to see shipping rates.", "fr": "Entrez votre adresse pour voir les tarifs de livraison."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5139
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_checkout_guarantee', '{"en": "Secure checkout guaranteed", "fr": "Paiement sécurisé garanti"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5140
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.full_name', '{"en": "Full Name", "fr": "Nom complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5141
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.country', '{"en": "Country", "fr": "Pays"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5142
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_preference_title', '{"en": "How would you like to start your trial?", "es": "¿Cómo te gustaría comenzar tu prueba?", "fr": "Comment souhaitez-vous commencer votre essai ?"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5143
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.pricing_unavailable', '{"en": "Pricing Unavailable", "es": "Precios no disponibles", "fr": "Tarification indisponible"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5144
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.monthly', '{"en": "Monthly", "es": "Mensual", "fr": "Mensuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5145
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.annual', '{"en": "Annual", "es": "Anual", "fr": "Annuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5146
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.lifetime', '{"en": "Lifetime", "es": "De por vida", "fr": "À vie"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5147
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.year', '{"en": "year", "es": "año", "fr": "an"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5148
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.month', '{"en": "month", "es": "mes", "fr": "mois"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5149
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_no_card', '{"en": "Start Free Trial (No card required)", "es": "Comenzar prueba gratuita (Sin tarjeta)", "fr": "Commencer l''essai gratuit (Sans carte requise)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5150
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_with_card', '{"en": "Enter Payment Details Now (Still get full trial length free)", "es": "Ingresar detalles de pago ahora (Aún obtienes toda la duración de la prueba gratis)", "fr": "Entrer les détails de paiement maintenant (Vous bénéficiez toujours de toute la durée de l''essai gratuitement)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5151
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_with_card_help', '{"en": "You will not be billed until the trial ends. Cancel anytime.", "es": "No se te cobrará hasta que termine la prueba. Cancela en cualquier momento.", "fr": "Vous ne serez pas facturé avant la fin de l''essai. Annulez à tout moment."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5152
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.choose_your_options', '{"en": "Choose Your Options", "fr": "Choisissez vos options"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5153
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.variant_availability_help', '{"en": "Select a combination to resolve the exact variant price and availability.", "fr": "Selectionnez une combinaison pour afficher le prix exact et la disponibilite de la variante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5154
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.in_stock', '{"en": "{count} in stock", "fr": "{count} en stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5155
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.out_of_stock', '{"en": "Out of stock", "fr": "Rupture de stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5156
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.select_options', '{"en": "Select Options", "fr": "Choisir des options"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5157
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.variant_selection_required', '{"en": "Select one term from every dropdown to resolve a variation.", "fr": "Selectionnez une valeur dans chaque liste pour afficher la variante correspondante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5158
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.tax_calculated_on_stripe', '{"en": "Calculated on Stripe", "es": "Calculado en Stripe", "fr": "Calculé sur Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5159
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_stripe_tax_finalized_notice', '{"en": "Tax will be finalized by Stripe Tax on the payment step.", "es": "El impuesto se finalizará con Stripe Tax en el paso de pago.", "fr": "La taxe sera finalisée par Stripe Tax à l''étape du paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5160
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('branding', '{"en": "Branding", "fr": "Image de marque"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5161
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('company_name', '{"en": "Company name", "fr": "Nom de l''entreprise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5162
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice', '{"en": "Invoice", "fr": "Facture"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5163
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice_number', '{"en": "Invoice #", "fr": "Facture no"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5164
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('paid_on', '{"en": "Paid on", "fr": "Paye le"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5165
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('bill_to', '{"en": "Bill to", "fr": "Facturer a"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5166
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ship_to', '{"en": "Ship to", "fr": "Livrer a"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5167
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('print_invoice', '{"en": "Print / Save as PDF", "fr": "Imprimer / Enregistrer en PDF"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5168
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('tax_registrations', '{"en": "Tax registrations", "fr": "Inscriptions fiscales"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5169
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice_settings', '{"en": "Invoice settings", "fr": "Parametres de facture"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5170
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('business_name', '{"en": "Business name", "fr": "Nom de l''entreprise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5171
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_number', '{"en": "Order #", "fr": "Commande no"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5172
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('print_invoice_help', '{"en": "Use your browser print dialog to save this invoice as a PDF.", "fr": "Utilisez la boite de dialogue d''impression de votre navigateur pour enregistrer cette facture en PDF."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5173
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('return_home', '{"en": "Return to Home", "fr": "Retour a l''accueil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5174
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('receipt_finalizing', '{"en": "Finalizing your invoice and payment details...", "fr": "Finalisation de votre facture et des details du paiement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5175
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('receipt_not_ready', '{"en": "Your invoice will appear here once the payment sync is complete.", "fr": "Votre facture apparaitra ici une fois la synchronisation du paiement terminee."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5176
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('tax_breakdown', '{"en": "Tax breakdown", "fr": "Detail des taxes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5177
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('amount', '{"en": "Amount", "fr": "Montant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5178
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('price', '{"en": "Price", "fr": "Prix"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5179
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('from', '{"en": "From", "fr": "De"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5180
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('account_navigation', '{"en": "Account", "fr": "Compte"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5181
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('account_orders', '{"en": "Orders", "fr": "Commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5182
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('change_my_password', '{"en": "Change my password", "fr": "Changer mon mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5183
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_title', '{"en": "My orders", "fr": "Mes commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5184
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_description', '{"en": "Review your recent purchases and open printable invoices.", "fr": "Consultez vos achats récents et ouvrez vos factures imprimables."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5185
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_empty', '{"en": "You do not have any orders yet.", "fr": "Vous n''avez pas encore de commandes."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5186
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_detail_title', '{"en": "Order invoice", "fr": "Facture de commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5187
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_detail_description', '{"en": "Review and print your finalized invoice.", "fr": "Consultez et imprimez votre facture finalisée."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5188
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_invoice_pending', '{"en": "The printable invoice will appear here once this order has been finalized.", "fr": "La facture imprimable apparaîtra ici une fois que cette commande aura été finalisée."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5189
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_password_title', '{"en": "Change your password", "fr": "Changer votre mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5190
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_password_description', '{"en": "Update your account password without leaving your profile.", "fr": "Mettez à jour le mot de passe de votre compte sans quitter votre profil."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5191
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('new_password', '{"en": "New password", "fr": "Nouveau mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5192
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('confirm_new_password', '{"en": "Confirm new password", "fr": "Confirmer le nouveau mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5193
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password_updated_success', '{"en": "Password updated successfully.", "fr": "Mot de passe mis à jour avec succès."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5194
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password_update_failed', '{"en": "Password update failed.", "fr": "La mise à jour du mot de passe a échoué."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5195
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('passwords_do_not_match', '{"en": "Passwords do not match.", "fr": "Les mots de passe ne correspondent pas."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5196
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_date', '{"en": "Date", "fr": "Date"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5197
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_paid', '{"en": "Paid", "fr": "Payée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5198
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_pending', '{"en": "Pending", "fr": "En attente"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5199
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_trial', '{"en": "Trial", "fr": "Essai"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5200
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_shipped', '{"en": "Shipped", "fr": "Expédiée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5201
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_cancelled', '{"en": "Cancelled", "fr": "Annulée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5202
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_refunded', '{"en": "Refunded", "fr": "Remboursée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5203
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('back_to_orders', '{"en": "Back to orders", "fr": "Retour aux commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5204
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_trial_started', '{"en": "Trial started", "fr": "Essai demarre"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5205
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_order_pending', '{"en": "Order pending", "fr": "Commande en attente"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5206
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('select_an_option', '{"en": "Select an option", "es": "Selecciona una opcion", "fr": "Selectionnez une option"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5207
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_method_required', '{"en": "Please select a shipping method before continuing.", "es": "Selecciona un metodo de envio antes de continuar.", "fr": "Veuillez selectionner un mode de livraison avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5208
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.waiting_on_address_info', '{"en": "Complete your shipping address to view available shipping options.", "es": "Completa tu direccion de envio para ver las opciones de envio disponibles.", "fr": "Completez votre adresse de livraison pour voir les options de livraison disponibles."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5209
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculating_shipping', '{"en": "Calculating shipping...", "es": "Calculando el envio...", "fr": "Calcul de la livraison..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5210
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_checkout_stripe_description', '{"en": "This simulated step represents the Stripe checkout for physical products.", "es": "Este paso simulado representa el pago de Stripe para productos fisicos.", "fr": "Cette etape simulee represente le paiement Stripe pour les produits physiques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5211
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_checkout_freemius_description', '{"en": "This simulated step represents the Freemius checkout for digital products.", "es": "Este paso simulado representa el pago de Freemius para productos digitales.", "fr": "Cette etape simulee represente le paiement Freemius pour les produits numeriques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5212
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_label', '{"en": "Digital", "es": "Digital", "fr": "Numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5213
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_label', '{"en": "Physical", "es": "Fisico", "fr": "Physique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5214
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_products', '{"en": "Physical products", "es": "Productos fisicos", "fr": "Produits physiques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5215
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_products', '{"en": "Digital products", "es": "Productos digitales", "fr": "Produits numeriques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5216
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.estimated_total', '{"en": "Estimated total", "es": "Total estimado", "fr": "Total estime"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5217
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.stripe_checkout_title', '{"en": "Stripe Checkout", "es": "Pago con Stripe", "fr": "Paiement Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5218
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.stripe_checkout_description', '{"en": "Pay for physical products in one Stripe checkout session.", "es": "Paga los productos fisicos en una sola sesion de Stripe.", "fr": "Payez les produits physiques dans une seule session Stripe."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5219
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_count_one', '{"en": "{count} item", "es": "{count} articulo", "fr": "{count} article"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5220
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_count_other', '{"en": "{count} items", "es": "{count} articulos", "fr": "{count} articles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5221
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_subtotal', '{"en": "Physical subtotal", "es": "Subtotal fisico", "fr": "Sous-total physique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5222
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.total_on_stripe', '{"en": "Total on Stripe", "es": "Total en Stripe", "fr": "Total sur Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5223
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_physical_products', '{"en": "Checkout Physical Products", "es": "Pagar productos fisicos", "fr": "Payer les produits physiques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5224
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_collected_on_stripe', '{"en": "Shipping and taxes are only collected during the Stripe step for physical products.", "es": "El envio y los impuestos solo se cobran durante el paso de Stripe para productos fisicos.", "fr": "La livraison et les taxes sont percues uniquement a l''etape Stripe pour les produits physiques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5225
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_checkout_title', '{"en": "Freemius Checkout", "es": "Pago con Freemius", "fr": "Paiement Freemius"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5226
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_checkout_description', '{"en": "Digital products use the Freemius checkout flow.", "es": "Los productos digitales usan el flujo de pago de Freemius.", "fr": "Les produits numeriques utilisent le flux de paiement Freemius."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5227
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_count_one', '{"en": "{count} license", "es": "{count} licencia", "fr": "{count} licence"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5228
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_count_other', '{"en": "{count} licenses", "es": "{count} licencias", "fr": "{count} licences"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5229
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_monthly', '{"en": "Monthly subscription", "es": "Suscripcion mensual", "fr": "Abonnement mensuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5230
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_annual', '{"en": "Annual subscription", "es": "Suscripcion anual", "fr": "Abonnement annuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5231
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_lifetime', '{"en": "Lifetime subscription", "es": "Suscripcion de por vida", "fr": "Abonnement a vie"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5232
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_product', '{"en": "Checkout {title}", "es": "Pagar {title}", "fr": "Paiement de {title}"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5233
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_digital_product', '{"en": "Checkout Digital Product", "es": "Pagar producto digital", "fr": "Payer le produit numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5234
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_subtotal', '{"en": "Digital subtotal", "es": "Subtotal digital", "fr": "Sous-total numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5235
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_multi_checkout_notice', '{"en": "Freemius licenses are completed one at a time, so each digital product gets its own checkout action.", "es": "Las licencias de Freemius se completan una por una, por lo que cada producto digital tiene su propia accion de pago.", "fr": "Les licences Freemius se finalisent une a la fois, donc chaque produit numerique a sa propre action de paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5236
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_tax_notice', '{"en": "Taxes and compliance for digital products are handled inside the Freemius checkout.", "es": "Los impuestos y la conformidad para los productos digitales se gestionan dentro del pago de Freemius.", "fr": "Les taxes et la conformite pour les produits numeriques sont gerees dans le paiement Freemius."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5237
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('continue_checkout', '{"en": "Continue Checkout", "fr": "Continuer le paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5238
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_success_sync_failed', '{"en": "We could not finalize your invoice yet. Please refresh shortly.", "fr": "Nous n''avons pas encore pu finaliser votre facture. Veuillez rafraichir la page sous peu."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5239
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_country_required', '{"en": "Country is required to calculate shipping.", "fr": "Le pays est requis pour calculer la livraison."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5240
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_title', '{"en": "Check your inbox", "fr": "Vérifiez votre boîte de réception"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5241
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_calculation_failed', '{"en": "We couldn''t calculate shipping right now. Please try again.", "fr": "Nous n''avons pas pu calculer la livraison pour le moment. Veuillez reessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5242
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_license_inactive', '{"en": "The ecommerce module license is inactive.", "fr": "La licence du module ecommerce est inactive."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5243
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_invalid_items', '{"en": "Your checkout items could not be processed.", "fr": "Les articles de votre commande n''ont pas pu etre traites."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5244
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_provider_items_required', '{"en": "Each checkout step must include items assigned to a payment provider.", "fr": "Chaque etape de paiement doit inclure des articles associes a un fournisseur de paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5245
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_mixed_provider_steps', '{"en": "Products with different payment providers must be purchased in separate checkout steps.", "fr": "Les produits utilisant differents fournisseurs de paiement doivent etre achetes en etapes separees."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5246
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_freemius_single_item', '{"en": "Freemius products must be purchased one at a time.", "fr": "Les produits Freemius doivent etre achetes un a la fois."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5247
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_address_required', '{"en": "A billing address is required to continue checkout.", "fr": "Une adresse de facturation est requise pour continuer le paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5248
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_internal_server_error', '{"en": "Something went wrong while preparing your checkout. Please try again.", "fr": "Une erreur s''est produite lors de la preparation de votre paiement. Veuillez reessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5249
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_missing_session_id', '{"en": "We couldn''t find a checkout session to finalize.", "fr": "Nous n''avons pas trouve de session de paiement a finaliser."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5250
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_payment_pending', '{"en": "Your payment is still pending.", "fr": "Votre paiement est toujours en attente."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5251
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_order_not_found', '{"en": "We couldn''t find the order linked to this checkout.", "fr": "Nous n''avons pas trouve la commande liee a ce paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5252
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_invalid_reference', '{"en": "This checkout reference can''t be finalized from this page.", "fr": "Cette reference de paiement ne peut pas etre finalisee depuis cette page."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5253
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_inventory_update_failed', '{"en": "We couldn''t update inventory for this order.", "fr": "Nous n''avons pas pu mettre a jour l''inventaire pour cette commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5254
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_status_update_failed', '{"en": "We couldn''t update the order status.", "fr": "Nous n''avons pas pu mettre a jour le statut de la commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5255
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.unknown_error', '{"en": "Unknown error", "es": "Error desconocido", "fr": "Erreur inconnue"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5256
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.get_license', '{"en": "Get License", "es": "Obtener Licencia", "fr": "Obtenir la licence"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5257
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart_success', '{"en": "{item} added to your cart.", "es": "{item} añadido al carrito.", "fr": "{item} ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5258
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart_error', '{"en": "Could not add item to cart.", "es": "No se pudo añadir el artículo al carrito.", "fr": "Impossible d''ajouter l''article au panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5259
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_product', '{"en": "Edit Product", "fr": "Modifier le produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5260
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.trigger', '{"en": "Search", "fr": "Rechercher"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5261
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.title', '{"en": "Search", "fr": "Rechercher"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5262
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.description', '{"en": "Search published pages, posts, and products.", "fr": "Rechercher dans les pages, articles et produits publies."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5263
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.placeholder', '{"en": "Search...", "fr": "Rechercher..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5264
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_all', '{"en": "All", "fr": "Tout"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5265
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_pages', '{"en": "Pages", "fr": "Pages"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5266
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_posts', '{"en": "Posts", "fr": "Articles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5267
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_products', '{"en": "Products", "fr": "Produits"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5268
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_page', '{"en": "Page", "fr": "Page"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5269
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_post', '{"en": "Post", "fr": "Article"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5270
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_product', '{"en": "Product", "fr": "Produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5271
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.recent', '{"en": "Recent", "fr": "Recents"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5272
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.error_title', '{"en": "Search is unavailable.", "fr": "La recherche est indisponible."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5273
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.error_description', '{"en": "Please try again in a moment.", "fr": "Veuillez reessayer dans un instant."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5274
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.empty_title', '{"en": "No results found.", "fr": "Aucun resultat trouve."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5275
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.empty_description', '{"en": "Try another search term.", "fr": "Essayez un autre terme de recherche."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5276
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_in', '{"en": "Sign in", "fr": "Connexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5277
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_up', '{"en": "Sign up", "fr": "Inscription"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5278
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_out', '{"en": "Sign out", "fr": "Déconnexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5279
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('dont_have_account', '{"en": "Don''t have an account?", "fr": "Pas encore de compte ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5280
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('email', '{"en": "Email", "fr": "Email"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5281
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('you_at_example_com', '{"en": "you@example.com", "fr": "vous@example.com"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5282
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password', '{"en": "Password", "fr": "Mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5283
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('forgot_password', '{"en": "Forgot Password?", "fr": "Mot de passe oublié ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5284
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('your_password', '{"en": "Your password", "fr": "Votre mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5285
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('signing_in_pending', '{"en": "Signing In...", "fr": "Connexion en cours..."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5286
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('already_have_account', '{"en": "Already have an account?", "fr": "Déjà un compte ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5287
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('signing_up_pending', '{"en": "Signing up...", "fr": "Inscription en cours..."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5288
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reset_password', '{"en": "Reset Password", "fr": "Réinitialiser le mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5289
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_form_description', '{"en": "Create your account in one quick step. We''ll email you a confirmation link before you finish your profile.", "fr": "Créez votre compte en une étape rapide. Nous vous enverrons un lien de confirmation avant de terminer votre profil."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5290
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_badge', '{"en": "Signup received", "fr": "Inscription reçue"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5291
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_confirm', '{"en": "Open the email we sent and confirm your address.", "fr": "Ouvrez l''e-mail envoyé et confirmez votre adresse."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5292
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_profile', '{"en": "After confirmation, we''ll bring you to your profile to finish setup.", "fr": "Après confirmation, nous vous amènerons à votre profil pour terminer la configuration."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5293
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_spam', '{"en": "If it doesn''t arrive soon, check spam, junk, or promotions.", "fr": "S''il n''arrive pas bientôt, vérifiez les dossiers spam, indésirables ou promotions."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5294
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_use_different_email', '{"en": "Use a different email", "fr": "Utiliser une autre adresse e-mail"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5295
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.back_to_sign_in', '{"en": "Back to sign in", "fr": "Retour à la connexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5296
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_rate_limit', '{"en": "You''re trying too quickly. Please wait a moment before requesting another confirmation email.", "fr": "Vous allez trop vite. Veuillez attendre un instant avant de demander un nouvel e-mail de confirmation."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5297
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('blog_prefix', '{"en": "article", "fr": "article"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5298
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_page', '{"en": "Edit Page", "fr": "Éditer la page"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5299
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_post', '{"en": "Edit Post", "fr": "Éditer l''article"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5300
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('open_main_menu', '{"en": "Open main menu", "fr": "Ouvrir le menu principal"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5301
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('mobile_navigation_menu', '{"en": "Mobile navigation menu", "fr": "Menu de navigation mobile"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5302
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('cms_dashboard', '{"en": "CMS Dashboard", "fr": "Tableau de bord CMS"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5303
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('update_env_file_warning', '{"en": "Please update .env.local file with anon key and url", "fr": "Veuillez mettre à jour .env.local avec l''anon key et l''URL"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5304
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('greeting', '{"en": "Hey, {username}!", "fr": "Salut, {username} !"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5305
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_switcher', '{"en": "Theme Switcher", "fr": "Sélecteur de thème"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5306
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_light', '{"en": "Light", "fr": "Clair"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5307
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_dark', '{"en": "Dark", "fr": "Sombre"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5308
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_system', '{"en": "System", "fr": "Système"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5309
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_vibrant', '{"en": "Vibrant", "fr": "Vibrant"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5310
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sandbox_mode_banner', '{"en": "Sandbox Mode: Data is public and resets every 15 minutes.", "fr": "Mode Sandbox : Les données sont publiques et réinitialisées toutes les 15 minutes."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5311
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_access_title', '{"en": "Demo Access", "fr": "Accès Démo"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5312
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_access_desc', '{"en": "This is a demo site. You may use the following credentials to access the admin section:", "fr": "Ceci est un site de démonstration. Vous pouvez utiliser les identifiants suivants pour accéder à l''administration :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5313
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_user_label', '{"en": "User:", "fr": "Utilisateur :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5314
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_password_label', '{"en": "Password:", "fr": "Mot de passe :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5315
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.on_sale', '{"en": "On Sale", "es": "En oferta", "fr": "En solde"}', '2026-07-03 17:52:15.69428+00', '2026-07-03 17:52:15.69428+00') ON CONFLICT DO NOTHING;
|
|
5316
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('remember_this_device', '{"en": "Remember this device", "fr": "Se souvenir de cet appareil"}', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00') ON CONFLICT DO NOTHING;
|
|
5317
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.aria_label', '{"en": "Privacy consent", "fr": "Consentement à la confidentialité"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5318
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.title', '{"en": "We value your privacy", "fr": "Nous respectons votre vie privée"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5319
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.description_before_policy_link', '{"en": "We use only essential cookies by default. With your consent we also use analytics to improve the site. See our", "fr": "Nous utilisons seulement les témoins essentiels par défaut. Avec votre consentement, nous utilisons aussi l''analytique pour améliorer le site. Consultez notre"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5320
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.privacy_policy_link', '{"en": "Privacy Policy", "fr": "politique de confidentialité"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5321
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.description_after_policy_link', '{"en": ".", "fr": "."}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5322
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.privacy_policy_href', '{"en": "/privacy-policy", "fr": "/politique-de-confidentialite"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5323
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.necessary_label', '{"en": "Necessary", "fr": "Nécessaires"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5324
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.necessary_help', '{"en": "Always on", "fr": "Toujours actifs"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5325
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.analytics_label', '{"en": "Analytics", "fr": "Analytique"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5326
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.analytics_help', '{"en": "Usage insights", "fr": "Statistiques d''utilisation"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5327
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.marketing_label', '{"en": "Marketing", "fr": "Marketing"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5328
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.marketing_help', '{"en": "Personalized content", "fr": "Contenu personnalisé"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5329
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.save_choices', '{"en": "Save choices", "fr": "Enregistrer mes choix"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5330
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.accept_all', '{"en": "Accept all", "fr": "Tout accepter"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5331
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.reject_all', '{"en": "Reject all", "fr": "Tout refuser"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5332
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.hide_options', '{"en": "Hide options", "fr": "Masquer les options"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5333
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.manage_options', '{"en": "Manage options", "fr": "Gérer les options"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5334
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.customer_reviews', '{"en": "Customer Reviews", "fr": "Avis clients"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5335
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.share_thoughts', '{"en": "Share your thoughts and experience with this product.", "fr": "Partagez vos impressions et votre expérience avec ce produit."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5336
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.write_review', '{"en": "Write a Review", "fr": "Rédiger un avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5337
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.cancel_review', '{"en": "Cancel Review", "fr": "Annuler l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5338
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.login_to_write', '{"en": "Please log in to write a review.", "fr": "Veuillez vous connecter pour rédiger un avis."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5339
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.write_your_review', '{"en": "Write your review", "fr": "Rédigez votre avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5340
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.rating', '{"en": "Rating", "fr": "Note"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5341
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.description', '{"en": "Review Description", "fr": "Description de l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5342
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.description_placeholder', '{"en": "What did you like or dislike? How does it perform?", "fr": "Qu''avez-vous aimé ou déploré ? Comment se comporte-t-il ?"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5343
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.submit_review', '{"en": "Submit Review", "fr": "Soumettre l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5344
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.submitting', '{"en": "Submitting...", "fr": "Envoi en cours..."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5345
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.success_pending', '{"en": "Your review has been submitted successfully and is pending moderation.", "fr": "Votre avis a été soumis avec succès et est en attente de modération."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5346
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.cancel', '{"en": "Cancel", "fr": "Annuler"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5347
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.helpful', '{"en": "Helpful", "fr": "Utile"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5348
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.no_reviews', '{"en": "No reviews yet", "fr": "Aucun avis pour le moment"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5349
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.be_the_first', '{"en": "There are no reviews for this product yet. Be the first to write one!", "fr": "Il n''y a pas encore d''avis sur ce produit. Soyez le premier à en rédiger un !"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5350
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.load_more', '{"en": "Load More Reviews", "fr": "Charger plus d''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5351
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.review_count_one', '{"en": "{count} review", "fr": "{count} avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5352
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.review_count_other', '{"en": "{count} reviews", "fr": "{count} avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5353
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.discussion', '{"en": "Discussion & Comments", "fr": "Discussion & Commentaires"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5354
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.join_conversation', '{"en": "Join the conversation and express your thoughts.", "fr": "Rejoignez la conversation et exprimez vos pensées."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5355
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.write_comment', '{"en": "Write a Comment", "fr": "Écrire un commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5356
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.cancel_comment', '{"en": "Cancel Comment", "fr": "Annuler le commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5357
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.login_to_write', '{"en": "Please log in to write a comment.", "fr": "Veuillez vous connecter pour écrire un commentaire."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5358
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.join_discussion', '{"en": "Join the Discussion", "fr": "Rejoindre la discussion"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5359
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.your_message', '{"en": "Your Message", "fr": "Votre message"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5360
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.message_placeholder', '{"en": "What are your thoughts on this article?", "fr": "Quelles sont vos pensées sur cet article ?"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5361
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.post_comment', '{"en": "Post Comment", "fr": "Publier le commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5362
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.success_pending', '{"en": "Your comment has been submitted successfully and is pending moderation.", "fr": "Votre commentaire a été soumis avec succès et est en attente de modération."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5363
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.like', '{"en": "Like", "fr": "J''aime"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5364
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.no_comments', '{"en": "No comments yet", "fr": "Aucun commentaire pour le moment"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5365
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.be_the_first', '{"en": "Be the first to share your thoughts!", "fr": "Soyez le premier à partager vos pensées !"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5366
|
-
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.load_more', '{"en": "Load More Comments", "fr": "Charger plus de commentaires"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5367
|
-
SELECT pg_catalog.setval('public.blocks_id_seq', COALESCE((SELECT MAX(id) FROM public.blocks), 1), true);
|
|
5368
|
-
SELECT pg_catalog.setval('public.languages_id_seq', COALESCE((SELECT MAX(id) FROM public.languages), 1), true);
|
|
5369
|
-
SELECT pg_catalog.setval('public.navigation_items_id_seq', COALESCE((SELECT MAX(id) FROM public.navigation_items), 1), true);
|
|
5370
|
-
SELECT pg_catalog.setval('public.pages_id_seq', COALESCE((SELECT MAX(id) FROM public.pages), 1), true);
|
|
5371
|
-
SELECT pg_catalog.setval('public.posts_id_seq', COALESCE((SELECT MAX(id) FROM public.posts), 1), true);
|
|
4904
|
+
-- AUTO-GENERATED baseline (re-baseline of migrations 000..044). Idempotent; safe to replay.
|
|
4905
|
+
-- 03 · seed: canonical NextBlock demo content (no users, no secrets)
|
|
4906
|
+
-- Regenerate via tools/scripts/rebaseline-transform.mjs. Do not hand-edit.
|
|
4907
|
+
|
|
4908
|
+
INSERT INTO public.languages (id, code, name, is_default, is_active, created_at, updated_at) VALUES (1, 'en', 'English', true, true, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4909
|
+
INSERT INTO public.languages (id, code, name, is_default, is_active, created_at, updated_at) VALUES (2, 'fr', 'Français', false, true, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4910
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('ea6fdaf5-f8de-416c-9f2b-b689b7a4ed38', NULL, 'nextblock-logo-small.webp', 'images/nextblock-logo-small.webp', 'image/webp', 10000, 'NextBlock™ Site Logo', NULL, NULL, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4911
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('5bb07d4c-ca14-49ab-96bb-febbed31aded', NULL, 'NBcover.webp', 'images/NBcover.webp', 'image/webp', 180000, 'NextBlock™ architecture overview cover image', 1024, 572, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4912
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('641ddf75-5c90-41df-8b83-e7c298f30a6a', NULL, 'extensibility.webp', 'images/extensibility.webp', 'image/webp', 246808, 'NextBlock™ extensibility editorial artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4913
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('e6ed9c34-6ef6-47a8-b836-e6dbf73511fa', NULL, 'included.webp', 'images/included.webp', 'image/webp', 237478, 'NextBlock™ getting-started platform artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4914
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('77b9da47-4182-470f-9070-fa6cd11c6aea', NULL, 'programmer-upscaled.webp', 'images/programmer-upscaled.webp', 'image/webp', 780000, 'NextBlock™ setup guide cover image', 8192, 2632, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4915
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('dfa0e881-70b6-4767-b9b0-7a6293db5009', NULL, 'commerce-plan.webp', 'images/commerce-plan.webp', 'image/webp', 269854, 'NextBlock™ commerce roadmap artwork', 1024, 559, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4916
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', NULL, 'commerce-wide.webp', 'images/commerce-wide.webp', 'image/webp', 250584, 'NextBlock™ Commerce editorial feature image', 1024, 434, NULL, NULL, NULL, NULL, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4917
|
+
INSERT INTO public.media (id, uploader_id, file_name, object_key, file_type, size_bytes, description, width, height, blur_data_url, variants, file_path, folder, created_at, updated_at) VALUES ('38ec38c2-899f-47b0-8364-56a574527078', NULL, 'cortex-ai.webp', 'images/cortex-ai.webp', 'image/webp', 298588, 'NextBlock Cortex AI editorial feature image', 1024, 571, NULL, NULL, 'images/cortex-ai.webp', 'images', '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00') ON CONFLICT DO NOTHING;
|
|
4918
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (1, 1, NULL, 'Home', 'home', 'published', NULL, NULL, 1, '0098e4f0-e5f3-4e28-acfc-bb9fdb3a4a6b', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4919
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (2, 2, NULL, 'Accueil', 'accueil', 'published', NULL, NULL, 1, '0098e4f0-e5f3-4e28-acfc-bb9fdb3a4a6b', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4920
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (3, 1, NULL, 'Articles', 'articles', 'published', NULL, NULL, 1, '50adeea5-5040-4ae7-bacd-992647920982', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4921
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (4, 2, NULL, 'Articles', 'articles', 'published', NULL, NULL, 1, '50adeea5-5040-4ae7-bacd-992647920982', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4922
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (5, 1, NULL, 'Contact Us', 'contact', 'published', NULL, NULL, 1, 'e3b28669-7e38-47bd-9189-7db2353b52dc', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4923
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (6, 2, NULL, 'Contactez-nous', 'contact', 'published', NULL, NULL, 1, 'e3b28669-7e38-47bd-9189-7db2353b52dc', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4924
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (7, 1, NULL, 'Privacy Policy', 'privacy-policy', 'published', 'Privacy Policy', 'How we collect, use, disclose, and protect your personal information under Quebec Law 25, PIPEDA, and CASL.', 1, '8cd91839-518d-4b57-87db-441e59a71a95', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4925
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (8, 2, NULL, 'Politique de confidentialité', 'politique-de-confidentialite', 'published', 'Politique de confidentialité', 'Comment nous recueillons, utilisons, communiquons et protégeons vos renseignements personnels en vertu de la Loi 25, de la LPRPDE et de la LCAP.', 1, '8cd91839-518d-4b57-87db-441e59a71a95', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4926
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (9, 1, NULL, 'Terms of Service', 'terms-of-service', 'published', 'Terms of Service', 'The terms governing your use of NextBlock™ CMS, free and open-source software licensed under the AGPL-3.0.', 1, 'b5eb82c7-95d6-4308-82d8-3ac2816f5d46', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4927
|
+
INSERT INTO public.pages (id, language_id, author_id, title, slug, status, meta_title, meta_description, version, translation_group_id, created_at, updated_at, feature_image_id) VALUES (10, 2, NULL, 'Conditions d''utilisation', 'conditions-utilisation', 'published', 'Conditions d''utilisation', 'Les conditions régissant votre utilisation de NextBlock™ CMS, un logiciel libre sous licence AGPL-3.0.', 1, 'b5eb82c7-95d6-4308-82d8-3ac2816f5d46', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00', NULL) ON CONFLICT DO NOTHING;
|
|
4928
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (1, 1, NULL, 'How NextBlock™ Works: A Look Under the Hood', 'how-nextblock-works', 'Architecture', 'Under the hood of the monorepo, block registry, and editor stack that power NextBlock.', 'A guided tour of the monorepo, block registry, editor stack, and open-core architecture behind NextBlock.', 'published', NULL, NULL, NULL, '5bb07d4c-ca14-49ab-96bb-febbed31aded', 1, 'de8b8593-1ef6-4e66-8d1f-8b3e7ffb811d', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4929
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (2, 2, NULL, 'Comment NextBlock™ Fonctionne : Regard Sous le Capot', 'comment-nextblock-fonctionne', 'Architecture', 'Sous le capot du monorepo, du registre de blocs et de l editeur qui propulsent NextBlock.', 'Une visite guidee du monorepo, du registre de blocs, de l editeur et de l architecture open-core de NextBlock.', 'published', NULL, NULL, NULL, '5bb07d4c-ca14-49ab-96bb-febbed31aded', 1, 'de8b8593-1ef6-4e66-8d1f-8b3e7ffb811d', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4930
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (5, 1, NULL, 'NextBlock™ Commerce: Multi-Currency, Tax Sync & Beyond', 'nextblock-commerce-guide', 'Commerce', 'Storefront architecture, checkout flows, and premium commerce capabilities inside NextBlock.', 'A closer look at the commerce module, from multi-currency and tax sync to shipping, inventory, and provider-aware checkout.', 'published', NULL, NULL, NULL, '5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', 1, '23773a34-e54b-40c6-89b5-b09ead17ae60', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4931
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (6, 2, NULL, 'NextBlock™ Commerce : Multi-Devises, Taxes Automatiques et Plus', 'guide-commerce-nextblock', 'Commerce', 'Architecture boutique, parcours de paiement et fonctions commerce premium au coeur de NextBlock.', 'Un apercu du module commerce : multi-devises, sync taxes, expedition, inventaire et paiements connectes.', 'published', NULL, NULL, NULL, '5f5a0d6d-aed4-4b6f-b966-ea5d5b17b7a6', 1, '23773a34-e54b-40c6-89b5-b09ead17ae60', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4932
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (7, 1, NULL, 'NextBlock Cortex AI Guide', 'nextblock-cortex-ai-guide', 'AI Copilot', 'A practical guide to Cortex AI, the block-aware assistant for model routing, BYOK controls, and faster editorial production inside NextBlock.', 'See how Cortex AI brings structured generation, provider choice, and safer content workflows directly into the NextBlock editor.', 'published', '2026-07-03 17:52:15.643901+00', 'NextBlock Cortex AI Guide', 'Learn how NextBlock Cortex AI helps teams generate, refine, and translate structured block content with model routing and BYOK controls.', '38ec38c2-899f-47b0-8364-56a574527078', 1, '669489e7-5900-496e-8b73-2aba7514a71b', '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00') ON CONFLICT DO NOTHING;
|
|
4933
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (3, 1, NULL, 'How to Install NextBlock: Every Setup Option Explained', 'how-to-setup-nextblock', 'Getting Started', 'Every way to install NextBlock — one-click cloud deploy, CLI scaffold, git clone, or self-hosted Docker — with copy-paste steps for each.', 'Four ways to launch NextBlock: a one-click Vercel deploy, npm create nextblock, git clone with the browser setup wizard, or a fully local Docker stack.', 'published', NULL, 'How to Install NextBlock CMS — Vercel, CLI, Git or Docker', 'Install NextBlock in minutes — one-click Vercel deploy, npm create nextblock, git clone, or self-hosted Docker. No config files, no manual SQL.', '77b9da47-4182-470f-9070-fa6cd11c6aea', 1, '461cde55-74cb-4112-8c3d-a25882eeedce', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.799297+00') ON CONFLICT DO NOTHING;
|
|
4934
|
+
INSERT INTO public.posts (id, language_id, author_id, title, slug, label, excerpt, subtitle, status, published_at, meta_title, meta_description, feature_image_id, version, translation_group_id, created_at, updated_at) VALUES (4, 2, NULL, 'Installer NextBlock : toutes les options expliquées', 'comment-configurer-nextblock', 'Mise En Route', 'Toutes les façons d''installer NextBlock — cloud en un clic, CLI, git clone ou Docker auto-hébergé — avec les étapes à copier-coller.', 'Quatre façons de lancer NextBlock : déploiement Vercel en un clic, npm create nextblock, git clone avec l''assistant dans le navigateur, ou une pile Docker 100 % locale.', 'published', NULL, 'Installer NextBlock — Vercel, CLI, Git ou Docker', 'Installez NextBlock en quelques minutes : déploiement Vercel en un clic, npm create nextblock, git clone ou Docker auto-hébergé. Sans config ni SQL.', '77b9da47-4182-470f-9070-fa6cd11c6aea', 1, '461cde55-74cb-4112-8c3d-a25882eeedce', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.799297+00') ON CONFLICT DO NOTHING;
|
|
4935
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (2, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Key Features: The Three Pillars of NextBlock™"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-lg text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ is a holistic platform that unites performance, editorial experience, and developer control so every stakeholder delivers their best work.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-8 md:grid-cols-3 mt-12''><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 rounded-xl flex items-center justify-center text-black dark:text-white mb-6''><svg class=''w-6 h-6'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M13 10V3L4 14h7v7l9-11h-7z''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Built for Speed.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Architected for 100% Lighthouse scores with global delivery and near-instant FCP.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Edge Caching & ISR:</strong> Serve pages worldwide.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Critical CSS:</strong> Inline styles to eliminate blocking.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Image Opt:</strong> AVIF & blurred placeholders.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 rounded-xl flex items-center justify-center text-black dark:text-white mb-6''><svg class=''w-6 h-6'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Editor-First Experience.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>A low-code, Notion-style block editor empowers teams to ship pages without engineering help.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Notion-Style:</strong> Slash commands & drag-and-drop.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Bilingual:</strong> Manage locales from one interface.</li><li><strong class=''text-slate-800 dark:text-slate-200''>History:</strong> Restore any version with a click.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><div class=''w-12 h-12 bg-white/50 dark:bg-white/10 rounded-xl flex items-center justify-center mb-6''><svg class=''w-6 h-6 text-slate-900 dark:text-white'' fill=''none'' stroke=''currentColor'' viewBox=''0 0 24 24''><path stroke-linecap=''round'' stroke-linejoin=''round'' stroke-width=''2'' d=''M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10''></path></svg></div><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Infinitely Extensible.</h3><p class=''text-sm text-slate-700 dark:text-slate-200 leading-relaxed''>Open-source control with a clean Nx monorepo and a typed SDK for limitless customization.</p><ul class=''mt-6 space-y-3 text-sm text-slate-700 dark:text-slate-200''><li><strong class=''text-slate-900 dark:text-white''>Open Source:</strong> Own the code & data forever.</li><li><strong class=''text-slate-900 dark:text-white''>Nx Monorepo:</strong> Scale confidently.</li><li><strong class=''text-slate-900 dark:text-white''>Developer SDK:</strong> Scaffold blocks in minutes.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4936
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (3, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#0f172a", "position": 0}, {"color": "#020817", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6''>Built with the Best.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-400 text-center max-w-2xl mx-auto''>Every layer of NextBlock™ leans on proven developer-first technology so the platform feels familiar, performant, and trustworthy from day one.</p><div class=''grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-4 mt-10 text-sm font-semibold text-center text-white''><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Next.js</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>React</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Supabase</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Stripe</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tailwind</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tiptap</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Vercel</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Nx</div></div>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6 mt-16''>Powerful for Developers. Intuitive for Editors.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid md:grid-cols-2 gap-8 mt-10 text-white''><div class=''p-8 rounded-3xl border border-white/10 bg-white/5 backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-blue-400''>For Content Creators</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Intuitive Block Editor</strong>Drag-and-drop layouts with a Notion-like interface.</li><li><strong class=''text-white block mb-1''>Rich Content Blocks</strong>Deploy heroes, galleries, testimonials, and more in one click.</li><li><strong class=''text-white block mb-1''>Effortless Media Management</strong>Organize assets with folders, tags, and bulk actions.</li><li><strong class=''text-white block mb-1''>Worry-Free Revisions</strong>Automatic version history with instant restore.</li></ul></div><div class=''p-8 rounded-3xl border border-white/10 bg-gradient-to-br from-white/5 to-white/[0.02] backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-purple-400''>For Developers</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Next.js 16 Core</strong>Server Components, ISR, and Edge Functions ready out of the box.</li><li><strong class=''text-white block mb-1''>Supabase Integration</strong>Postgres, auth, storage, and real-time APIs without glue code.</li><li><strong class=''text-white block mb-1''>Monorepo Ready</strong>Nx-powered dev experience for scalable architectures.</li><li><strong class=''text-white block mb-1''>Extensible Block SDK</strong>Ship fully typed custom blocks and widgets.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4937
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (4, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#022c22", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-emerald-400 font-bold mb-4''>Now Available — Premium Module</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Turn Your CMS Into<br/>a Full Storefront.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Commerce transforms your content platform into a complete e-commerce engine. Products, checkout, multi-currency, taxes, shipping, invoices — all natively integrated into the block editor you already know.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-commerce-guide", "size": "lg", "text": "Explore Commerce Features →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-commerce-pro-commerce-license", "size": "lg", "text": "Get a License", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-emerald-500/20 bg-gradient-to-br from-white/5 to-emerald-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/commerce-square.webp'' alt=''NextBlock™ Commerce dashboard showing product management'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>∞</p><p class=''text-xs text-slate-400''>Currencies</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>2</p><p class=''text-xs text-slate-400''>Providers</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>Auto</p><p class=''text-xs text-slate-400''>Tax Sync</p></div></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 3, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4938
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (5, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Everything You Need to Sell Online"}, "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 ships a complete e-commerce toolkit so you can go from catalog to checkout without third-party plugins.</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''>Multi-Currency</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Real-time FX rates, rounding modes, charm pricing, and automatic product price sync across unlimited currencies.</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''>Tax Automation</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Manual stacked tax rates (GST + PST) or fully automatic calculation via Stripe Tax — you choose.</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''>Shipping Zones</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Zone-based rate resolution with country and state matching, per-currency pricing, and free-shipping thresholds.</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''>Stripe & Freemius Checkout</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe for physical products, Freemius for digital licensing — provider-aware checkout with inventory validation.</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''>Inventory Tracking</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Automatic quantity deduction on payment with resilient fallback paths and variant-level stock management.</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''>Orders & Invoices</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Full order lifecycle management, stable invoice numbering, printable documents, and exportable order reports.</p></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 4, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4939
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (6, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#1e1b4b", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-violet-500/20 bg-gradient-to-br from-white/5 to-violet-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/cortex-ai-square.webp'' alt=''NextBlock™ Cortex AI dashboard showing block generator'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>OpenRouter</p><p class=''text-xs text-slate-400''>AI Gateway</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>BYOK</p><p class=''text-xs text-slate-400''>Cost Control</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>Zod</p><p class=''text-xs text-slate-400''>Typed Blocks</p></div></div></div>"}, "block_type": "text"}], [{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-violet-400 font-bold mb-4''>Now Available — AI Copilot</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Supercharge Your<br/>Content with AI.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Cortex AI brings native block-level intelligence directly to your editor. Generate copy, refactor structures, and automate translations in one click, built directly on our high-performance architecture.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-cortex-ai-guide", "size": "lg", "text": "Explore AI Capabilities →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license", "size": "lg", "text": "Get a License", "variant": "outline"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 5, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4940
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (7, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "More Than a CMS. An Ecosystem."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ is building a sustainable open-core roadmap so the platform grows with your business.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-6 lg:grid-cols-[0.75fr_1.25fr] mt-10 items-stretch''><div class=''overflow-hidden rounded-[2rem] border border-slate-200 dark:border-white/10 bg-slate-950 shadow-2xl''><img src=''/images/goals.webp'' alt=''Roadmap board outlining the NextBlock™ ecosystem and premium module direction'' class=''h-full w-full object-cover'' /><div class=''border-t border-white/10 bg-slate-950/95 px-6 py-5''><p class=''text-xs uppercase tracking-[0.24em] text-emerald-300 mb-2 font-bold''>Roadmap in motion</p><p class=''text-sm text-slate-300 mb-0''>Commerce ships first, then the broader ecosystem grows around plugins, blocks, and partner-built modules.</p></div></div><div class=''grid gap-6''><div class=''p-10 rounded-3xl border border-emerald-500/20 bg-gradient-to-br from-emerald-50 to-white dark:from-emerald-500/5 dark:to-white/5 hover:border-emerald-500/40 transition-colors''><p class=''text-xs uppercase tracking-wide text-emerald-600 dark:text-emerald-400 mb-2 font-bold''>Available now</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>NextBlock™ Commerce</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Transform your site into a composable storefront with products, checkout, multi-currency pricing, tax automation, and commerce blocks that live beside your editorial content.</p></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-violet-500/30 transition-colors''><p class=''text-xs uppercase tracking-wide text-violet-700 dark:text-violet-300 mb-2 font-bold''>Build the future</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Plugin and block marketplace</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>A community marketplace gives developers room to publish, sell, and distribute custom blocks, themes, integrations, and partner modules.</p></div></div></div>"}, "block_type": "text"}, {"content": {"level": 2, "textAlign": "center", "text_content": "Join Our Community."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center mx-auto''>NextBlock™ is being built in the open. Star the repo, share feedback, and help define the future of performance-first content management.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-4 md:grid-cols-3 mt-10 text-sm''><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://github.com/nextblock-cms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>GitHub</strong><span class=''text-slate-600 dark:text-slate-400''>Star the repo & contribute</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://x.com/NextBlockCMS'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>X (Twitter)</strong><span class=''text-slate-600 dark:text-slate-400''>Follow updates & announcements</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://dev.to/nextblockcms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>Dev.to</strong><span class=''text-slate-600 dark:text-slate-400''>Read technical deep dives</span></a></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4941
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (1, 1, NULL, 1, 'section', '{"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''>Build <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''>Blazing-Fast</span></span><br class=''md:hidden'' /> Websites.</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™ is the open-source, developer-first Next.js CMS that merges 100% Lighthouse scores with a powerful visual block editor.</p>"}, "block_type": "text"}, {"content": {"url": "/article/how-to-setup-nextblock", "size": "lg", "text": "Get Started", "variant": "default", "position": "center"}, "block_type": "button"}, {"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": "Deploy on Vercel", "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''>Why teams switch</p><p class=''text-3xl font-bold text-white mb-2''>100% Lighthouse</p><p class=''text-base text-slate-300 mb-6''>Edge-rendered marketing sites, launches, and docs with uncompromising performance.</p><ul class=''space-y-3 text-sm text-slate-200''><li><span class=''text-blue-400 mr-2''>✓</span> Next.js 16 with ISR and edge caching</li><li><span class=''text-blue-400 mr-2''>✓</span> Supabase auth, data, and storage</li><li><span class=''text-blue-400 mr-2''>✓</span> Notion-style block editor powered by Tiptap</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.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0'' title=''NextBlock demo video'' allow=''accelerated-motion; 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"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.851553+00', NULL) ON CONFLICT DO NOTHING;
|
|
4942
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (10, 3, NULL, 1, 'posts_grid', '{"title": "Latest Deep Dives", "columns": 3, "postsPerPage": 6, "showPagination": true}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4943
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (12, 5, NULL, 1, 'section', '{"padding": {"top": "lg", "bottom": "lg"}, "background": {"type": "none"}, "column_blocks": [[{"content": {"html_content": "<div class=''max-w-2xl mx-auto text-center''><h2 class=''text-2xl font-bold mb-4''>Open Source & Community Driven</h2><p class=''text-slate-600 dark:text-slate-400 mb-6''>NextBlock™ is built in the open. We rely on developers and editors like you to help us define the roadmap. Whether it''s a bug report, a feature request, or just a shoutout, every message helps us move faster.</p></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4944
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (15, 6, NULL, 2, 'section', '{"padding": {"top": "lg", "bottom": "lg"}, "background": {"type": "none"}, "column_blocks": [[{"content": {"html_content": "<div class=''max-w-2xl mx-auto text-center''><h2 class=''text-2xl font-bold mb-4''>Open Source & Communautaire</h2><p class=''text-slate-600 dark:text-slate-400 mb-6''>NextBlock™ est construit en public. Nous comptons sur les développeurs et éditeurs comme vous pour définir notre roadmap. Qu''il s''agisse d''un bug, d''une suggestion ou d''un simple salut, chaque message compte.</p></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4945
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (13, 5, NULL, 1, 'form', '{"fields": [{"label": "Name", "temp_id": "name", "field_type": "text", "is_required": true, "placeholder": "Your name"}, {"label": "Email", "temp_id": "email", "field_type": "email", "is_required": true, "placeholder": "your@email.com"}, {"label": "Message", "temp_id": "message", "field_type": "textarea", "is_required": true, "placeholder": "How can we help?"}], "recipient_email": "contact@example.com", "success_message": "Thank you for your feedback! We''ll get back to you soon.", "submit_button_text": "Send Message"}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4946
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (16, 6, NULL, 2, 'form', '{"fields": [{"label": "Nom", "temp_id": "nom", "field_type": "text", "is_required": true, "placeholder": "Votre nom"}, {"label": "Email", "temp_id": "email", "field_type": "email", "is_required": true, "placeholder": "votre@email.com"}, {"label": "Message", "temp_id": "message", "field_type": "textarea", "is_required": true, "placeholder": "Comment pouvons-nous vous aider ?"}], "recipient_email": "contact@example.com", "success_message": "Merci pour vos retours ! Nous vous répondrons bientôt.", "submit_button_text": "Envoyer le message"}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4947
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (17, 2, NULL, 2, 'section', '{"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-bold tracking-tight text-white text-center drop-shadow-lg''>Créez des sites <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''>Ultra-Rapides</span></span><br class=''md:hidden'' />.</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 Next.js open-source alliant scores Lighthouse parfaits et éditeur visuel puissant.</p>"}, "block_type": "text"}, {"content": {"url": "/article/comment-configurer-nextblock", "size": "lg", "text": "Commencer", "variant": "default", "position": "center"}, "block_type": "button"}, {"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", "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''>Pourquoi migrer</p><p class=''text-3xl font-bold text-white mb-2''>100% Lighthouse</p><p class=''text-base text-slate-300 mb-6''>Sites marketing et docs rendus à l''edge avec des performances irréprochables.</p><ul class=''space-y-3 text-sm text-slate-200''><li><span class=''text-blue-400 mr-2''>✓</span> Next.js 16 avec ISR et cache edge</li><li><span class=''text-blue-400 mr-2''>✓</span> Supabase pour l''auth, les données et le stockage</li><li><span class=''text-blue-400 mr-2''>✓</span> Éditeur de blocs type Notion sur Tiptap</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.com/embed/71MyfoL4YVM?si=jtlDXV6cSC8rDgz0'' title=''Vidéo de démonstration NextBlock'' allow=''accelerated-motion; 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"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.851553+00', NULL) ON CONFLICT DO NOTHING;
|
|
4948
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (18, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Fonctionnalités clés : les trois piliers de NextBlock™"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-lg text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ unifie performances, expérience éditoriale et contrôle développeur pour que chaque équipe livre son meilleur travail.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-8 md:grid-cols-3 mt-12''><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Vitesse Extrême.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Pensé pour des scores Lighthouse parfaits avec une diffusion mondiale.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Edge Caching:</strong> Servez vos pages partout.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Critical CSS:</strong> Styles en ligne pour éviter les blocages.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Images Opt:</strong> AVIF et placeholders floutés.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Expérience Éditeur.</h3><p class=''text-sm text-slate-600 dark:text-slate-400 leading-relaxed''>Un éditeur façon Notion pour publier sans dépendre des développeurs.</p><ul class=''mt-6 space-y-3 text-sm text-slate-600 dark:text-slate-400''><li><strong class=''text-slate-800 dark:text-slate-200''>Visuel:</strong> Héros, galeries, témoignages.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Média:</strong> Dossiers, tags et actions groupées.</li><li><strong class=''text-slate-800 dark:text-slate-200''>Historique:</strong> Restauration complète.</li></ul></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 backdrop-blur-sm hover:bg-slate-100 dark:hover:bg-white/10 transition-colors duration-300''><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Extensible à l''Infini.</h3><p class=''text-sm text-slate-700 dark:text-slate-200 leading-relaxed''>Un socle Next.js + Supabase modulaire, extensible et auto-hébergeable.</p><ul class=''mt-6 space-y-3 text-sm text-slate-700 dark:text-slate-200''><li><strong class=''text-slate-900 dark:text-white''>SDK de blocs:</strong> Composants typés.</li><li><strong class=''text-slate-900 dark:text-white''>CLI:</strong> Générez modules en minutes.</li><li><strong class=''text-slate-900 dark:text-white''>Monorepo Nx:</strong> Dépendances maintenables.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4949
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (19, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#0f172a", "position": 0}, {"color": "#020817", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6''>Conçu avec les meilleurs outils.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-400 text-center max-w-2xl mx-auto''>Chaque couche de NextBlock™ repose sur des technologies éprouvées pour une expérience familière et performante.</p><div class=''grid grid-cols-2 sm:grid-cols-4 lg:grid-cols-8 gap-4 mt-10 text-sm font-semibold text-center text-white''><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Next.js</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>React</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Supabase</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Stripe</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tailwind</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Tiptap</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Vercel</div><div class=''p-4 rounded-2xl border border-white/10 bg-white/5 hover:bg-white/10 transition-colors''>Nx</div></div>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-white text-center mb-6 mt-16''>Puissant pour les développeurs. Intuitif pour les éditeurs.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid md:grid-cols-2 gap-8 mt-10 text-white''><div class=''p-8 rounded-3xl border border-white/10 bg-white/5 backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-blue-400''>Pour les créateurs</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Éditeur de blocs</strong>Glisser-déposer façon Notion.</li><li><strong class=''text-white block mb-1''>Blocs riches</strong>Héros, galeries, témoignages.</li><li><strong class=''text-white block mb-1''>Médiathèque</strong>Dossiers, tags et actions groupées.</li><li><strong class=''text-white block mb-1''>Versions sécurisées</strong>Historique et restauration instantanée.</li></ul></div><div class=''p-8 rounded-3xl border border-white/10 bg-gradient-to-br from-white/5 to-white/[0.02] backdrop-blur-sm''><h3 class=''text-xl font-bold mb-6 text-purple-400''>Pour les développeurs</h3><ul class=''space-y-4 text-sm text-slate-300''><li><strong class=''text-white block mb-1''>Next.js 16</strong>Server Components, ISR et Edge prêts à l''emploi.</li><li><strong class=''text-white block mb-1''>Supabase</strong>Postgres, auth, stockage, temps réel.</li><li><strong class=''text-white block mb-1''>Monorepo Nx</strong>Dépendances lisibles et centrales.</li><li><strong class=''text-white block mb-1''>SDK de blocs</strong>Widgets typés et extensibles.</li></ul></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 2, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4950
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (20, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#022c22", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-emerald-400 font-bold mb-4''>Disponible — Module Premium</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Transformez votre CMS<br/>en vitrine complète.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Commerce transforme votre plateforme de contenu en moteur e-commerce complet. Produits, checkout, multi-devises, taxes, expédition, factures — le tout intégré nativement dans l''éditeur de blocs que vous connaissez déjà.</p>"}, "block_type": "text"}, {"content": {"url": "/article/guide-commerce-nextblock", "size": "lg", "text": "Découvrir Commerce →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-commerce-pro-commerce-license", "size": "lg", "text": "Obtenir une licence", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-emerald-500/20 bg-gradient-to-br from-white/5 to-emerald-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/commerce-square.webp'' alt=''Tableau de bord NextBlock™ Commerce'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>∞</p><p class=''text-xs text-slate-400''>Devises</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>2</p><p class=''text-xs text-slate-400''>Fournisseurs</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-emerald-400''>Auto</p><p class=''text-xs text-slate-400''>Taxes</p></div></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 3, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4951
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (21, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Tout 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 boîte à outils e-commerce complète pour aller du catalogue au paiement sans plugins tiers.</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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>Multi-Devises</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Taux de change en temps réel, modes d''arrondi, prix charme et synchronisation automatique sur toutes les 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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>Taxes Automatiques</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Taux manuels empilés (TPS + TVQ) ou calcul 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''><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''>Résolution par pays et état, tarification 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''><h3 class=''text-lg font-bold text-slate-900 dark:text-white mb-2''>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 — checkout intelligent avec validation d''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''><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 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''><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 du cycle de vie des commandes, numérotation stable des factures et rapports de commandes exportables.</p></div></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 4, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4952
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (22, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#1e1b4b", "position": 0}, {"color": "#0f172a", "position": 50}, {"color": "#020817", "position": 100}], "direction": "135deg"}}, "column_gap": "xl", "column_blocks": [[{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-violet-500/20 bg-gradient-to-br from-white/5 to-violet-500/5 shadow-2xl p-6 backdrop-blur-sm''><img src=''/images/cortex-ai-square.webp'' alt=''Tableau de bord NextBlock™ Cortex AI montrant le générateur de blocs'' class=''w-full h-auto rounded-2xl shadow-lg'' /><div class=''mt-4 grid grid-cols-3 gap-3 text-center''><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>OpenRouter</p><p class=''text-xs text-slate-400''>Passerelle IA</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>BYOK</p><p class=''text-xs text-slate-400''>Contrôle des coûts</p></div><div class=''p-3 rounded-xl bg-white/5 border border-white/10''><p class=''text-lg font-bold text-violet-400''>Zod</p><p class=''text-xs text-slate-400''>Blocs typés</p></div></div></div>"}, "block_type": "text"}], [{"content": {"html_content": "<p class=''text-xs uppercase tracking-[0.25em] text-violet-400 font-bold mb-4''>Disponible — Copilote IA</p><h2 class=''text-4xl md:text-5xl font-bold text-white mb-6 leading-tight''>Boostez votre<br/>contenu avec l''IA.</h2><p class=''text-lg text-slate-300 max-w-2xl leading-relaxed mb-8''>NextBlock™ Cortex AI apporte une intelligence native au niveau des blocs directement dans votre éditeur. Générez du texte, restructurez vos contenus et automatisez les traductions en un clic, le tout propulsé par notre architecture haute performance.</p>"}, "block_type": "text"}, {"content": {"url": "/article/nextblock-cortex-ai-guide", "size": "lg", "text": "Découvrir l''IA →", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://nextblock.dev/product/nextblock-cortex-ai-cortex-ai-license", "size": "lg", "text": "Obtenir une licence", "variant": "outline"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}, "vertical_alignment": "center"}', 5, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4953
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (23, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "none"}, "column_gap": "lg", "column_blocks": [[{"content": {"level": 2, "textAlign": "center", "text_content": "Plus qu''un CMS. Un écosystème."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ construit une feuille de route open-core durable qui évolue avec votre activité.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-6 lg:grid-cols-[0.75fr_1.25fr] mt-10 items-stretch''><div class=''overflow-hidden rounded-[2rem] border border-slate-200 dark:border-white/10 bg-slate-950 shadow-2xl''><img src=''/images/goals.webp'' alt=''Tableau de roadmap montrant la direction de l''ecosysteme NextBlock™ et des modules premium'' class=''h-full w-full object-cover'' /><div class=''border-t border-white/10 bg-slate-950/95 px-6 py-5''><p class=''text-xs uppercase tracking-[0.24em] text-emerald-300 mb-2 font-bold''>Roadmap en mouvement</p><p class=''text-sm text-slate-300 mb-0''>Le commerce arrive en premier, puis l''ecosysteme s''etend avec des plugins, des blocs et des modules construits par les partenaires.</p></div></div><div class=''grid gap-6''><div class=''p-10 rounded-3xl border border-emerald-500/20 bg-gradient-to-br from-emerald-50 to-white dark:from-emerald-500/5 dark:to-white/5 hover:border-emerald-500/40 transition-colors''><p class=''text-xs uppercase tracking-wide text-emerald-600 dark:text-emerald-400 mb-2 font-bold''>Disponible maintenant</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>NextBlock™ Commerce</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Transformez votre site en vitrine composable avec produits, checkout, tarification multi-devise, taxes automatiques et blocs commerce relies a votre contenu editorial.</p></div><div class=''p-10 rounded-3xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:border-violet-500/30 transition-colors''><p class=''text-xs uppercase tracking-wide text-violet-700 dark:text-violet-300 mb-2 font-bold''>Construire la suite</p><h3 class=''text-xl font-bold text-slate-900 dark:text-white mb-3''>Marketplace de plugins et blocs</h3><p class=''text-sm text-slate-600 dark:text-slate-400''>Une marketplace communautaire ouvrira la voie a la publication, la vente et la distribution de blocs, themes, integrations et modules partenaires.</p></div></div></div>"}, "block_type": "text"}, {"content": {"level": 2, "textAlign": "center", "text_content": "Rejoignez la communauté."}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-slate-600 dark:text-slate-400 text-center max-w-3xl mx-auto''>NextBlock™ se construit en public. Ajoutez une étoile, partagez vos retours et façonnez l''avenir du CMS orienté performance.</p>"}, "block_type": "text"}, {"content": {"html_content": "<div class=''grid gap-4 md:grid-cols-3 mt-10 text-sm''><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://github.com/nextblock-cms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>GitHub</strong><span class=''text-slate-600 dark:text-slate-400''>Ajoutez une étoile & contribuez</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://x.com/NextBlockCMS'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>X (Twitter)</strong><span class=''text-slate-600 dark:text-slate-400''>Suivez les annonces</span></a><a class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5 hover:bg-slate-100 dark:hover:bg-white/10 transition-all hover:scale-[1.02]'' href=''https://dev.to/nextblockcms'' target=''_blank'' rel=''noopener noreferrer''><strong class=''block text-base text-slate-900 dark:text-white mb-1''>Dev.to</strong><span class=''text-slate-600 dark:text-slate-400''>Lisez nos articles techniques</span></a></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4954
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (26, 4, NULL, 2, 'posts_grid', '{"title": "Derniers articles", "columns": 3, "postsPerPage": 6, "showPagination": true}', 1, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4955
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (9, 3, NULL, 1, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#1e293b", "position": 100}], "direction": "135deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<p class=''text-sm uppercase tracking-[0.3em] text-blue-400 font-bold text-center md:text-left mb-4''>The Nextblock Journal</p>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-4xl md:text-5xl font-bold text-white text-center md:text-left mb-6''>Deep dives into performance, DX, and visual editing.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-slate-300 text-lg max-w-xl mx-auto md:mx-0 text-center md:text-left leading-relaxed''>Explore architectural walkthroughs, Supabase recipes, and block editor experiments written by the Nextblock core team.</p>"}, "block_type": "text"}, {"content": {"url": "/articles#latest", "size": "lg", "text": "Explore Articles", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://github.com/nextblock-cms/nextblock/discussions", "size": "lg", "text": "Subscribe for Updates", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''h-full flex items-center justify-center rounded-3xl overflow-hidden border border-white/10 bg-white/5 shadow-2xl p-4 backdrop-blur-sm''><img src=''/images/developer.webp'' alt=''Developer working with the Nextblock stack'' class=''w-full object-cover rounded-2xl shadow-lg'' style=''max-width: 400px;'' /></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4956
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (11, 5, NULL, 1, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "135deg"}}, "column_blocks": [[{"content": {"level": 1, "textAlign": "center", "textColor": "white", "text_content": "Let''s Build the Future Together"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4''>NextBlock™ is an open-source project driven by community feedback. We''d love to hear your thoughts, ideas, or questions.</p>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4957
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (14, 6, NULL, 2, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "135deg"}}, "column_blocks": [[{"content": {"level": 1, "textAlign": "center", "textColor": "white", "text_content": "Bâtissons le futur ensemble"}, "block_type": "heading"}, {"content": {"html_content": "<p class=''text-xl text-slate-300 text-center max-w-3xl mx-auto mt-4''>NextBlock™ est un projet open-source propulsé par vos retours. Nous serions ravis d''entendre vos idées ou vos questions.</p>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4958
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (24, 2, NULL, 2, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-center text-white mb-4''>Des questions ?</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-center text-base text-slate-300 max-w-2xl mx-auto''>NextBlock™ co-construit avec des partenaires : fonctionnalités, modules sponsorisés et direction produit.</p>"}, "block_type": "text"}, {"content": {"url": "/contact", "size": "lg", "text": "Nous contacter", "variant": "default", "position": "center"}, "block_type": "button"}, {"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", "variant": "outline", "position": "center"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 7, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.840619+00', NULL) ON CONFLICT DO NOTHING;
|
|
4959
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (25, 4, NULL, 2, 'section', '{"is_hero": true, "padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#1e293b", "position": 100}], "direction": "135deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<p class=''text-sm uppercase tracking-[0.3em] text-blue-400 font-bold text-center md:text-left mb-4''>Le journal Nextblock</p>"}, "block_type": "text"}, {"content": {"html_content": "<h2 class=''text-4xl md:text-5xl font-bold text-white text-center md:text-left mb-6''>Plongées dans la performance, l''expérience dev et l''édition visuelle.</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-lg max-w-xl mx-auto md:mx-0 text-center md:text-left text-slate-300 leading-relaxed''>Walkthroughs d''architecture, recettes Supabase et expérimentations éditeur écrits par l''équipe Nextblock.</p>"}, "block_type": "text"}, {"content": {"url": "/articles#latest", "size": "lg", "text": "Explorer les articles", "variant": "default"}, "block_type": "button"}, {"content": {"url": "https://github.com/nextblock-cms/nextblock/discussions", "size": "lg", "text": "S''abonner aux mises à jour", "variant": "outline"}, "block_type": "button"}], [{"content": {"html_content": "<div class=''rounded-3xl overflow-hidden border border-white/10 bg-white/5 shadow-2xl p-4 backdrop-blur-sm''><img src=''/images/developer.webp'' alt=''Développeur travaillant avec la stack Nextblock'' class=''w-full object-cover rounded-2xl shadow-lg'' style=''max-width: 400px;'' /></div>"}, "block_type": "text"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 2}}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4960
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (31, NULL, 5, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ Commerce is the first premium module in the ecosystem: a source-available storefront layer that plugs directly into the same editorial system as the CMS. It is built for teams that want content, catalog, and checkout to live inside one product surface instead of three disconnected tools.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Commerce core</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Catalog + checkout</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Products, variants, orders, shipping, and invoices all plug into the existing CMS shell.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Global selling</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Multi-currency ready</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Automatic FX sync, rounding strategies, and per-product overrides keep international pricing practical.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Operator workflow</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Provider-aware flow</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Stripe and Freemius are handled differently so the storefront can stay clean without hiding complexity.</p>\\n </div>\\n</div>\\n\\n<h2>Product Catalog</h2>\\n<p>Commerce supports physical and digital products with variants, attributes, localized product media, independent pricing, SKUs, and stock levels. Product assets stay in the same media library editors already use for marketing pages, so content and commerce teams are not working in separate silos.</p>\\n\\n<h2>Multi-Currency Engine</h2>\\n<p>The pricing engine is built for real-world stores, not just a demo checkout:</p>\\n<ul>\\n <li><strong>Unlimited currencies</strong> with ISO codes, symbols, and stored exchange rates</li>\\n <li><strong>Automatic FX sync</strong> from Frankfurter or a custom provider via <code>FX_API_BASE_URL</code></li>\\n <li><strong>Rounding modes</strong> including nearest, up, down, and charm pricing like <code>9.99</code></li>\\n <li><strong>Store-managed auto-sync</strong> so product prices convert when rates refresh</li>\\n <li><strong>Rebasing</strong> when the default currency changes</li>\\n <li><strong>Per-product overrides</strong> when a catalog item needs explicit pricing in specific markets</li>\\n</ul>\\n\\n<h2>Tax Automation</h2>\\n<p>Teams can stay manual when they need control, or delegate tax math to Stripe Tax when they want automation:</p>\\n<div class=''grid md:grid-cols-2 gap-6 my-6''>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Manual mode</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Define rates by country and optional state or province. Stacked taxes such as GST + PST are supported, and tax lines are stored in <code>orders.tax_details</code>.</p>\\n </div>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Automatic mode</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe Tax calculates the final amounts. Product and shipping tax codes travel with the line items, and the webhook resync replaces provisional values with final totals.</p>\\n </div>\\n</div>\\n\\n<h2>Shipping and Checkout</h2>\\n<p>Shipping zones match by country and state or province, support localized method names, per-currency pricing, free-shipping thresholds, and priority-based fallbacks when an exact match is not found.</p>\\n<p>The checkout layer is provider-aware:</p>\\n<ul>\\n <li><strong>Stripe</strong> handles physical goods, inventory checks, shipping calculation, tax, customer upserts, and Checkout Sessions</li>\\n <li><strong>Freemius</strong> handles digital licensing, plan resolution, and checkout URLs with sandbox support</li>\\n <li>Mixed-provider carts are rejected so the buyer journey stays understandable</li>\\n</ul>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/commerce-plan.webp'' alt=''Commerce roadmap board outlining premium module goals and future storefront capabilities for NextBlock™'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Commerce is positioned as the first premium module in a larger roadmap, which makes it feel like part of a growing platform instead of a bolt-on add-on.</figcaption>\\n</figure>\\n\\n<h2>Inventory, Orders, and Invoices</h2>\\n<p>When quantity tracking is enabled, checkout validates requested quantities against <code>inventory_items</code>. On payment confirmation, <code>apply_order_inventory_deduction()</code> reduces stock with a resilient fallback path that can use direct SQL if the RPC layer fails.</p>\\n<ul>\\n <li>Order statuses move from <code>pending</code> to <code>paid</code> to <code>shipped</code>, with cancellation and refund states available too</li>\\n <li>Invoice numbering is generated through database functions for consistency</li>\\n <li>Printable invoice documents pull from <code>invoice_settings</code></li>\\n <li>Customers can review order history and invoice access from the storefront side</li>\\n <li><strong>Coming soon:</strong> exportable order reporting and analytics dashboards</li>\\n</ul>\\n\\n<h2>Commerce Surfaces Inside the CMS</h2>\\n<p>When the ecommerce package is active, the CMS exposes product list, create, and edit views with media and variants, inventory management, order detail screens, shipping configuration, payment provider settings, tax setup, and currency management. The important part is not only that those screens exist, but that they feel native inside the same shell your content team is already using.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4961
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (32, NULL, 6, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ Commerce est le premier module premium de l''ecosysteme : une couche storefront source-available qui se branche directement sur le meme systeme editorial que le CMS. L''objectif est de rapprocher contenu, catalogue et checkout dans une seule surface produit.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Base commerce</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Catalogue + checkout</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Produits, variantes, commandes, livraison et factures vivent dans le meme shell CMS.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Vente globale</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Multi-devise</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Sync FX automatique, strategies d''arrondi et overrides par produit rendent les prix internationaux realistes.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Workflow operateur</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Par fournisseur</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Stripe et Freemius sont traites differemment pour garder un parcours d''achat propre sans cacher la complexite.</p>\\n </div>\\n</div>\\n\\n<h2>Catalogue produits</h2>\\n<p>Le module gere produits physiques et numeriques avec variantes, attributs, medias localises, prix independants, SKU et niveaux de stock. Les assets produits restent dans la meme bibliotheque media que les pages marketing, ce qui evite de separer equipes contenu et equipes commerce.</p>\\n\\n<h2>Moteur multi-devise</h2>\\n<p>Le moteur tarifaire vise un vrai usage boutique, pas seulement une demo :</p>\\n<ul>\\n <li><strong>Devises illimitees</strong> avec codes ISO, symboles et taux stockes</li>\\n <li><strong>Synchronisation FX automatique</strong> depuis Frankfurter ou un provider custom via <code>FX_API_BASE_URL</code></li>\\n <li><strong>Modes d''arrondi</strong> dont nearest, up, down et prix charme comme <code>9.99</code></li>\\n <li><strong>Auto-sync magasin</strong> pour convertir les prix quand les taux changent</li>\\n <li><strong>Rebasement</strong> lorsqu''on change la devise par defaut</li>\\n <li><strong>Overrides par produit</strong> quand un article demande un prix fixe sur certains marches</li>\\n</ul>\\n\\n<h2>Taxes automatiques</h2>\\n<p>Les equipes peuvent rester en mode manuel ou confier le calcul a Stripe Tax :</p>\\n<div class=''grid md:grid-cols-2 gap-6 my-6''>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Mode manuel</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Definition des taux par pays et eventuellement par province. Les taxes empilees comme TPS + TVQ sont supportees, avec stockage dans <code>orders.tax_details</code>.</p>\\n </div>\\n <div class=''p-6 rounded-2xl border border-slate-200 dark:border-white/10 bg-slate-50 dark:bg-white/5''>\\n <h4 class=''font-bold text-slate-900 dark:text-white mb-2''>Mode automatique</h4>\\n <p class=''text-sm text-slate-600 dark:text-slate-400''>Stripe Tax calcule les montants finaux. Les codes fiscaux voyagent avec les line items et le webhook remplace les valeurs provisoires par les montants definitifs.</p>\\n </div>\\n</div>\\n\\n<h2>Livraison et checkout</h2>\\n<p>Les zones de livraison correspondent par pays et etat ou province, gerent des noms localises, des prix par devise, des seuils de livraison gratuite, et des fallbacks par priorite quand aucune correspondance exacte n''est trouvee.</p>\\n<p>Le checkout est conscient du fournisseur :</p>\\n<ul>\\n <li><strong>Stripe</strong> gere les biens physiques, les verifications d''inventaire, la livraison, les taxes, les clients et les Checkout Sessions</li>\\n <li><strong>Freemius</strong> gere les licences numeriques, la resolution des plans et les URLs de checkout avec support sandbox</li>\\n <li>Les paniers melangeant plusieurs fournisseurs sont refuses pour garder un parcours plus clair</li>\\n</ul>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/commerce-plan.webp'' alt=''Tableau de roadmap commerce montrant les objectifs premium et les futures capacites storefront de NextBlock™'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Le commerce est presente comme le premier module premium d''une feuille de route plus large, ce qui renforce l''idee d''une vraie plateforme en croissance.</figcaption>\\n</figure>\\n\\n<h2>Inventaire, commandes et factures</h2>\\n<p>Quand le suivi des quantites est actif, le checkout valide les demandes contre <code>inventory_items</code>. A la confirmation du paiement, <code>apply_order_inventory_deduction()</code> retire le stock avec un chemin de repli resilient si la couche RPC echoue.</p>\\n<ul>\\n <li>Les statuts de commande passent de <code>pending</code> a <code>paid</code> puis <code>shipped</code>, avec annulation et remboursement si besoin</li>\\n <li>La numerotation des factures est geree par des fonctions SQL pour rester coherente</li>\\n <li>Les documents facture tirent leurs informations de <code>invoice_settings</code></li>\\n <li>Les clients peuvent consulter leur historique et leurs factures</li>\\n <li><strong>Bientot :</strong> exports de commandes et tableaux de bord analytiques</li>\\n</ul>\\n\\n<h2>Surfaces commerce dans le CMS</h2>\\n<p>Quand le package ecommerce est actif, le CMS expose les vues produit, edition avec medias et variantes, gestion d''inventaire, detail des commandes, configuration livraison, parametres de paiement, taxes et devises. L''enjeu principal est que tout cela paraisse natif dans le meme shell que l''equipe contenu utilise deja.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00', NULL) ON CONFLICT DO NOTHING;
|
|
4962
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (33, NULL, 7, 1, 'text', '{"html_content": "\\n<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock Cortex AI is the AI layer built for the way NextBlock pages are actually composed. Instead of treating your site like a blank document, it understands blocks, sections, editor constraints, and the model choices your team wants to use.</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''>Model routing</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Pick the right model</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Route generation through OpenRouter or your configured provider strategy so each task can balance speed, quality, and cost.</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''>BYOK control</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Use your own keys</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Keep provider credentials under your control while still giving editors a clean, guided AI workflow in the CMS.</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''>Typed output</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Generate valid blocks</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Schema-aware generation helps AI output land as usable page structure instead of loose copy that needs a rebuild.</p>\\n </div>\\n</div>\\n\\n<h2>Why Cortex AI Belongs Inside the Editor</h2>\\n<p>Generic chat tools can draft copy, but they do not know the difference between a hero, a card grid, a product description, and a localized article. Cortex AI lives closer to the editing surface, so generation can respect the same block contracts that render on the public site.</p>\\n<p>That makes AI useful for practical production work: drafting a landing section, tightening an excerpt, expanding a product story, translating a post, or reshaping a rough idea into a block layout that already fits the system.</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''>Editorial workflow</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''>Faster first drafts</h3>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Start with a structured prompt and get a section, article outline, or product narrative that already matches the site voice.</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''>Cleaner revisions</h3>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Ask for shorter, clearer, more technical, more polished, or locale-ready output without leaving the content screen.</p>\\n </div>\\n </div>\\n</div>\\n\\n<h2>Model Routing and Cost Control</h2>\\n<p>Cortex AI is designed around provider choice. Teams can route requests through the configured AI gateway, choose task-appropriate models, and keep bring-your-own-key setups separate from the editor experience. Editors get a simple control surface while developers keep the operational knobs.</p>\\n<ul>\\n <li>Use fast, inexpensive models for drafts, variations, and rewrites</li>\\n <li>Reserve stronger models for long-form strategy, technical copy, or difficult transformations</li>\\n <li>Keep provider keys and routing defaults in the server-side configuration layer</li>\\n <li>Make cost and quality decisions without changing the public rendering system</li>\\n</ul>\\n\\n<h2>Block-Aware Generation</h2>\\n<p>The important shift is that Cortex AI is not just writing text. It is meant to produce content that can map back to NextBlock surfaces: section copy, article bodies, product descriptions, headings, calls to action, and localized variants. That reduces the cleanup step that usually happens after copying AI text from a separate tool.</p>\\n<p>Because the output is shaped around existing block contracts, the generated content feels native in the editor and predictable on the frontend.</p>\\n\\n<h2>Safer Team Workflows</h2>\\n<p>AI works best when it is helpful without becoming invisible infrastructure. Cortex AI keeps humans in the loop: editors review the output, developers control the available providers, and the CMS keeps the generated content inside the same revision and publishing flow as everything else.</p>\\n\\n<h2>A Practical Launch Flow</h2>\\n<ol>\\n <li>Draft the article, landing section, or product story from a focused prompt.</li>\\n <li>Refine the result against the brand voice and target audience.</li>\\n <li>Generate a localized version or shorter excerpt for cards and metadata.</li>\\n <li>Review the content in the NextBlock editor, publish, and keep iterating through normal revisions.</li>\\n</ol>\\n\\n<p>Cortex AI turns the CMS into a more capable production surface: not a replacement for editorial judgment, but a faster way to shape good ideas into structured pages that are ready to ship.</p>\\n"}', 0, '2026-07-03 17:52:15.643901+00', '2026-07-03 17:52:15.643901+00', NULL) ON CONFLICT DO NOTHING;
|
|
4963
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (34, 7, NULL, 1, 'text', '{"html_content": "\\n<h1>Privacy Policy</h1>\\n<p><em>Last updated: June 4, 2026</em></p>\\n<p>NextBlock™ CMS (\\"we\\", \\"us\\", or \\"our\\") respects your privacy and is committed to protecting your personal information in accordance with Quebec''s <em>Act respecting the protection of personal information in the private sector</em> (Law 25), the federal <em>Personal Information Protection and Electronic Documents Act</em> (PIPEDA), and Canada''s Anti-Spam Legislation (CASL).</p>\\n\\n<h2>1. Person responsible for personal information</h2>\\n<p>Our Privacy Officer is responsible for our compliance with applicable privacy laws. You may reach them at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>2. What we collect</h2>\\n<ul>\\n <li><strong>Account information</strong> — name, email address, and credentials when you register.</li>\\n <li><strong>Usage and device data</strong> — collected only with your consent through analytics technologies.</li>\\n <li><strong>Communications</strong> — messages you send us and your marketing preferences.</li>\\n</ul>\\n\\n<h2>3. Why we collect it and your consent</h2>\\n<p>We collect personal information for clearly identified purposes: to provide and secure our services, to communicate with you, and — only with your express, opt-in consent — for analytics and marketing. Consistent with Law 25, non-essential cookies and trackers remain disabled until you actively accept them, and you may withdraw your consent at any time.</p>\\n\\n<h2>4. Cookies and tracking technologies</h2>\\n<p>Strictly necessary cookies keep the site working and require no consent. Analytics and marketing technologies are loaded <strong>only after</strong> you opt in through our consent banner. Your choice is recorded so we can honour it and demonstrate accountability.</p>\\n\\n<h2>5. Disclosure and sharing</h2>\\n<p>We do not sell your personal information. We share it only with service providers who help us operate the platform under contractual confidentiality obligations, or where required by law.</p>\\n\\n<h2>6. Retention</h2>\\n<p>We keep personal information only for as long as necessary to fulfil the purposes described above or as required by law, after which it is securely destroyed or anonymized.</p>\\n\\n<h2>7. Your rights</h2>\\n<p>Subject to applicable law, you have the right to access, rectify, and delete your personal information, to withdraw consent, to data portability, and to be informed about automated processing. To exercise these rights, contact our Privacy Officer at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>8. Commercial electronic messages (CASL)</h2>\\n<p>We send commercial electronic messages only with your consent. Every message identifies us and includes a working unsubscribe mechanism that we honour promptly.</p>\\n\\n<h2>9. Safeguards</h2>\\n<p>We use appropriate physical, organizational, and technological measures — including encryption in transit and access controls — to protect personal information against loss, theft, and unauthorized access.</p>\\n\\n<h2>10. Open-source software</h2>\\n<p>NextBlock™ CMS is free, open-source software distributed under the GNU Affero General Public License v3. When you self-host NextBlock, you are the operator responsible for the personal information processed by your own deployment, and this policy serves as a starting point you may adapt to your organization.</p>\\n\\n<h2>11. Changes to this policy</h2>\\n<p>We may update this policy from time to time. Material changes will be communicated through the site, and the \\"last updated\\" date will be revised.</p>\\n\\n<h2>12. Contact us</h2>\\n<p>Questions or complaints? Contact NextBlock™ CMS at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>. You may also contact the Commission d''accès à l''information du Québec or the Office of the Privacy Commissioner of Canada.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4964
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (35, 8, NULL, 2, 'text', '{"html_content": "\\n<h1>Politique de confidentialité</h1>\\n<p><em>Dernière mise à jour : 4 juin 2026</em></p>\\n<p>NextBlock™ CMS (« nous ») respecte votre vie privée et s''engage à protéger vos renseignements personnels conformément à la <em>Loi sur la protection des renseignements personnels dans le secteur privé</em> du Québec (Loi 25), à la <em>Loi sur la protection des renseignements personnels et les documents électroniques</em> (LPRPDE) et à la Loi canadienne anti-pourriel (LCAP).</p>\\n\\n<h2>1. Responsable de la protection des renseignements personnels</h2>\\n<p>Notre responsable de la protection des renseignements personnels veille au respect des lois applicables. Vous pouvez le joindre à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>2. Renseignements que nous recueillons</h2>\\n<ul>\\n <li><strong>Renseignements de compte</strong> — nom, adresse courriel et identifiants lors de l''inscription.</li>\\n <li><strong>Données d''utilisation et d''appareil</strong> — recueillies uniquement avec votre consentement au moyen de technologies d''analyse.</li>\\n <li><strong>Communications</strong> — les messages que vous nous envoyez et vos préférences marketing.</li>\\n</ul>\\n\\n<h2>3. Finalités et consentement</h2>\\n<p>Nous recueillons des renseignements personnels à des fins clairement déterminées : fournir et sécuriser nos services, communiquer avec vous et — uniquement avec votre consentement exprès — à des fins d''analyse et de marketing. Conformément à la Loi 25, les témoins et traceurs non essentiels demeurent désactivés tant que vous ne les avez pas acceptés, et vous pouvez retirer votre consentement en tout temps.</p>\\n\\n<h2>4. Témoins et technologies de suivi</h2>\\n<p>Les témoins strictement nécessaires assurent le fonctionnement du site et ne requièrent aucun consentement. Les technologies d''analyse et de marketing ne sont chargées qu''<strong>après</strong> votre consentement explicite. Votre choix est enregistré afin de le respecter.</p>\\n\\n<h2>5. Communication à des tiers</h2>\\n<p>Nous ne vendons pas vos renseignements personnels. Nous ne les communiquons qu''à des fournisseurs qui nous aident à exploiter la plateforme, sous obligation de confidentialité, ou lorsque la loi l''exige.</p>\\n\\n<h2>6. Conservation</h2>\\n<p>Nous ne conservons les renseignements personnels que le temps nécessaire aux fins décrites ou exigé par la loi, après quoi ils sont détruits ou anonymisés de façon sécuritaire.</p>\\n\\n<h2>7. Vos droits</h2>\\n<p>Sous réserve de la loi applicable, vous avez le droit d''accéder à vos renseignements, de les rectifier et de les supprimer, de retirer votre consentement, à la portabilité de vos données et d''être informé du traitement automatisé. Pour exercer ces droits, écrivez à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n\\n<h2>8. Messages électroniques commerciaux (LCAP)</h2>\\n<p>Nous n''envoyons des messages électroniques commerciaux qu''avec votre consentement. Chaque message nous identifie et comporte un mécanisme de désabonnement fonctionnel que nous respectons rapidement.</p>\\n\\n<h2>9. Mesures de sécurité</h2>\\n<p>Nous employons des mesures physiques, organisationnelles et technologiques appropriées — dont le chiffrement en transit et le contrôle des accès — pour protéger vos renseignements.</p>\\n\\n<h2>10. Logiciel libre</h2>\\n<p>NextBlock™ CMS est un logiciel libre et à code source ouvert distribué sous la licence publique générale GNU Affero v3. Lorsque vous hébergez NextBlock vous-même, vous êtes l''exploitant responsable des renseignements personnels traités par votre propre instance, et la présente politique vous sert de point de départ adaptable à votre organisation.</p>\\n\\n<h2>11. Modifications</h2>\\n<p>Nous pouvons mettre à jour cette politique. Les changements importants seront communiqués sur le site et la date de mise à jour sera révisée.</p>\\n\\n<h2>12. Nous joindre</h2>\\n<p>Des questions ou des plaintes ? Contactez NextBlock™ CMS à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>. Vous pouvez aussi vous adresser à la Commission d''accès à l''information du Québec.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4965
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (36, 9, NULL, 1, 'text', '{"html_content": "\\n<h1>Terms of Service</h1>\\n<p><em>Last updated: June 4, 2026</em></p>\\n\\n<h2>1. Acceptance of terms</h2>\\n<p>By accessing or using NextBlock™ CMS and the services we provide (the \\"Services\\"), you agree to be bound by these Terms of Service. If you do not agree, do not use the Services.</p>\\n\\n<h2>2. Free and open-source software</h2>\\n<p>NextBlock™ CMS is free, open-source software licensed under the <strong>GNU Affero General Public License, version 3 (AGPL-3.0)</strong> or, at your option, any later version. You are free to run, study, share, and modify the software under the terms of that license. A copy of the license is distributed with the software and is also available at <a href=\\"https://www.gnu.org/licenses/agpl-3.0.html\\">gnu.org/licenses/agpl-3.0.html</a>.</p>\\n<p>Copyright © 2025 NextBlock™ CMS.</p>\\n\\n<h2>3. Source code availability</h2>\\n<p>In accordance with section 13 of the AGPL-3.0, if you run a modified version of NextBlock™ CMS and make it available to users over a network, you must prominently offer those users access to the Corresponding Source of your modified version, free of charge, through a standard or customary means of facilitating copying of software.</p>\\n\\n<h2>4. Trademarks</h2>\\n<p>The AGPL-3.0 grants broad rights to the software''s source code but does <strong>not</strong> grant any rights to our trade names, trademarks, or service marks. \\"NextBlock™\\", the NextBlock™ CMS name, and associated logos remain our property and may not be used in a way that suggests endorsement or affiliation without our prior written permission.</p>\\n\\n<h2>5. Accounts and acceptable use</h2>\\n<p>If you create an account, you are responsible for safeguarding your credentials and for all activity under your account, and you agree to notify us promptly of any unauthorized use. You agree not to misuse the Services, including by attempting to disrupt them, access them without authorization, or use them for unlawful purposes.</p>\\n\\n<h2>6. No warranty</h2>\\n<p>As stated in section 15 of the AGPL-3.0, the software is provided \\"as is\\", without warranty of any kind, either expressed or implied, including, without limitation, the implied warranties of merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the software is with you.</p>\\n\\n<h2>7. Limitation of liability</h2>\\n<p>As stated in section 16 of the AGPL-3.0, and to the fullest extent permitted by applicable law, in no event will any copyright holder, or any other party who modifies or conveys the software, be liable to you for damages, including any general, special, incidental, or consequential damages arising out of the use or inability to use the software.</p>\\n\\n<h2>8. Governing law</h2>\\n<p>These Terms are governed by the laws of the Province of Quebec and the federal laws of Canada applicable therein, without regard to conflict-of-law principles. Nothing in these Terms limits any mandatory consumer-protection rights you may have under those laws.</p>\\n\\n<h2>9. Changes</h2>\\n<p>We may revise these Terms from time to time. Material changes will be communicated through the Services, and continued use of the Services after changes take effect constitutes acceptance of the revised Terms.</p>\\n\\n<h2>10. Contact</h2>\\n<p>Questions about these Terms? Contact NextBlock™ CMS at <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4966
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (37, 10, NULL, 2, 'text', '{"html_content": "\\n<h1>Conditions d''utilisation</h1>\\n<p><em>Dernière mise à jour : 4 juin 2026</em></p>\\n\\n<h2>1. Acceptation des conditions</h2>\\n<p>En accédant à NextBlock™ CMS et aux services que nous fournissons (les « Services ») ou en les utilisant, vous acceptez d''être lié par les présentes conditions d''utilisation. Si vous n''êtes pas d''accord, n''utilisez pas les Services.</p>\\n\\n<h2>2. Logiciel libre et à code source ouvert</h2>\\n<p>NextBlock™ CMS est un logiciel libre et à code source ouvert distribué sous la <strong>licence publique générale GNU Affero, version 3 (AGPL-3.0)</strong> ou, à votre choix, toute version ultérieure. Vous êtes libre d''exécuter, d''étudier, de partager et de modifier le logiciel selon les termes de cette licence. Une copie de la licence est fournie avec le logiciel et est aussi disponible à <a href=\\"https://www.gnu.org/licenses/agpl-3.0.html\\">gnu.org/licenses/agpl-3.0.html</a>.</p>\\n<p>Droit d''auteur © 2025 NextBlock™ CMS.</p>\\n\\n<h2>3. Disponibilité du code source</h2>\\n<p>Conformément à l''article 13 de l''AGPL-3.0, si vous exploitez une version modifiée de NextBlock™ CMS et la rendez accessible à des utilisateurs sur un réseau, vous devez offrir clairement à ces utilisateurs l''accès au code source correspondant de votre version modifiée, gratuitement, par un moyen usuel de copie de logiciels.</p>\\n\\n<h2>4. Marques de commerce</h2>\\n<p>L''AGPL-3.0 accorde de larges droits sur le code source du logiciel, mais <strong>n''accorde aucun droit</strong> sur nos noms commerciaux, marques de commerce ou marques de service. « NextBlock™ », le nom NextBlock™ CMS et les logos associés demeurent notre propriété et ne peuvent être utilisés d''une manière laissant entendre une approbation ou une affiliation sans notre autorisation écrite préalable.</p>\\n\\n<h2>5. Comptes et utilisation acceptable</h2>\\n<p>Si vous créez un compte, vous êtes responsable de la protection de vos identifiants et de toute activité effectuée à partir de votre compte, et vous vous engagez à nous aviser rapidement de toute utilisation non autorisée. Vous vous engagez à ne pas détourner les Services, notamment en tentant de les perturber, d''y accéder sans autorisation ou de les utiliser à des fins illégales.</p>\\n\\n<h2>6. Absence de garantie</h2>\\n<p>Comme l''énonce l''article 15 de l''AGPL-3.0, le logiciel est fourni « tel quel », sans garantie d''aucune sorte, expresse ou implicite, y compris, sans s''y limiter, les garanties implicites de qualité marchande et d''adéquation à un usage particulier. Vous assumez l''entièreté du risque quant à la qualité et au rendement du logiciel.</p>\\n\\n<h2>7. Limitation de responsabilité</h2>\\n<p>Comme l''énonce l''article 16 de l''AGPL-3.0, et dans toute la mesure permise par la loi applicable, en aucun cas un titulaire de droits d''auteur ou toute autre partie qui modifie ou transmet le logiciel ne saurait être tenu responsable envers vous de dommages, y compris tout dommage général, spécial, accessoire ou consécutif découlant de l''utilisation ou de l''impossibilité d''utiliser le logiciel.</p>\\n\\n<h2>8. Droit applicable</h2>\\n<p>Les présentes conditions sont régies par les lois de la province de Québec et les lois fédérales du Canada qui y sont applicables, sans égard aux règles de conflit de lois. Rien dans les présentes conditions ne limite les droits impératifs de protection du consommateur dont vous pourriez bénéficier en vertu de ces lois.</p>\\n\\n<h2>9. Modifications</h2>\\n<p>Nous pouvons réviser ces conditions de temps à autre. Les changements importants seront communiqués au moyen des Services, et l''utilisation continue des Services après leur entrée en vigueur vaut acceptation.</p>\\n\\n<h2>10. Nous joindre</h2>\\n<p>Des questions sur ces conditions ? Contactez NextBlock™ CMS à <a href=\\"mailto:{{privacy_email}}\\">{{privacy_email}}</a>.</p>\\n"}', 0, '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.760236+00', NULL) ON CONFLICT DO NOTHING;
|
|
4967
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (40, NULL, 3, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock is an open-source, AI-native Next.js CMS built on Supabase — and installing it no longer involves config files, terminal wizards, or manual SQL. There are four ways to get running, and they all end in the same place: a browser <strong>setup wizard</strong> that connects your database, configures media storage, and creates your admin account for you. Pick the path that fits, follow the steps, and you will be publishing in minutes.</p>\\n\\n<div class=''grid gap-5 md:grid-cols-2 my-10''>\\n <a href=''#one-click-vercel'' class=''block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Fastest · about 3 minutes</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>One-click deploy on Vercel</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>A live production site with a managed database. No terminal, no environment variables, nothing to copy.</p>\\n </a>\\n <a href=''#npm-create'' class=''block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Recommended for new projects</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>npm create nextblock</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Scaffold a standalone Next.js app with NextBlock built in, then finish setup in your browser.</p>\\n </a>\\n <a href=''#git-clone'' class=''block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Full source code</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Clone the repository</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Run the complete monorepo — the CMS, every package, and the docs. Made for contributors and platform teams.</p>\\n </a>\\n <a href=''#docker'' class=''block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>100% local · no accounts</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Self-hosted with Docker</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>One command boots the entire stack on your machine — database, auth, storage, and the CMS. No cloud services at all.</p>\\n </a>\\n</div>\\n\\n<p class=''text-sm text-slate-500 dark:text-slate-400''>Not sure which to pick? If you want a live website with the least effort, choose <a href=''#one-click-vercel''>Vercel</a>. If you want a local project to build on, choose <a href=''#npm-create''>npm create nextblock</a>.</p>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/included.webp'' alt=''NextBlock CMS platform overview showing the block editor, CMS dashboard, and integrations included with every installation'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Whichever path you choose, you get the same block editor, the same CMS, and the same database schema.</figcaption>\\n</figure>\\n\\n<h2 id=''one-click-vercel''>Option 1: One-Click Deploy on Vercel</h2>\\n<p>The fastest way to get a production NextBlock site. One button creates your own copy of NextBlock on GitHub, provisions a managed Supabase database, and deploys the site — you never open a terminal or copy a single key.</p>\\n<ol class=''space-y-2''>\\n <li><strong>Click Deploy to Vercel</strong> and sign in — Vercel clones NextBlock into a new repository you own.</li>\\n <li><strong>Create the Supabase database</strong> when prompted: pick a name and a region. Vercel connects it to the project and injects the keys before the first build.</li>\\n <li><strong>Open your new site</strong> once the build finishes. Every fresh instance takes you straight to the setup wizard.</li>\\n <li><strong>Create your administrator account.</strong> It is confirmed instantly — no verification email — and you land in the CMS dashboard.</li>\\n</ol>\\n<div class=''my-8''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Deploy to Vercel →</a>\\n</div>\\n<div class=''rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Zero configuration</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>There are no environment variables to fill in. Media storage automatically uses your connected Supabase project, security secrets are derived for you, and database migrations run automatically on every production build. Adding a custom domain later? Set <code>NEXT_PUBLIC_URL</code> in your Vercel project and redeploy.</p>\\n</div>\\n<p>Your site also keeps itself current: the dashboard checklist includes a one-click <strong>Connect GitHub</strong> step that installs a daily workflow syncing your copy with the latest NextBlock release.</p>\\n\\n<h2 id=''npm-create''>Option 2: Scaffold a Project with npm create nextblock</h2>\\n<p>The best starting point for building your own site. The CLI scaffolds a standalone Next.js application with NextBlock already wired in — no monorepo, no workspace tooling — and hands everything else to the browser wizard.</p>\\n<p>Before you start, install <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20 or newer</a> (it includes npm), then create a free project at <a href=''https://supabase.com'' target=''_blank'' rel=''noopener''>supabase.com</a> (or pick the CLI''s Docker mode during creation and skip cloud accounts entirely).</p>\\n<pre><code>npm create nextblock@latest my-site\\ncd my-site\\nnpm run dev</code></pre>\\n<p>Open <code>http://localhost:3000/setup</code> and let the wizard take over:</p>\\n<ol class=''space-y-2''>\\n <li><strong>Connect Supabase</strong> — paste your project URL, publishable (anon) key, secret (service role) key, and a personal access token so the wizard can apply the database schema for you.</li>\\n <li><strong>Choose media storage</strong> — plug in a Cloudflare R2 bucket for images and files, or leave it blank to use your connected Supabase project''s storage.</li>\\n <li><strong>Create your administrator</strong> — the wizard applies every migration, generates the app secrets, writes <code>.env.local</code>, creates your confirmed admin account, and signs you in. Restart <code>npm run dev</code> once afterwards so the fresh environment is baked into the app.</li>\\n</ol>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Premium modules</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Need a store? One command adds products, checkout, orders, and coupons — license-gated and ready when you are: <code>npx create-nextblock activate ecommerce</code></p>\\n</div>\\n\\n<h2 id=''git-clone''>Option 3: Clone the Repository</h2>\\n<p>Run the full Nx monorepo: the CMS application, every shared package, the CLI source, and the documentation. This is the path for contributors, plugin authors, and teams that customize the platform itself.</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpx nx serve nextblock</code></pre>\\n<p>Open <code>http://localhost:4200</code> — a fresh install redirects every page to <code>/setup</code>, where the same three-step wizard connects Supabase, configures storage, and creates your admin. It validates your keys, writes <code>.env.local</code> with generated secrets, and applies all migrations over the Supabase Management API — no Supabase CLI required.</p>\\n<div class=''rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>No terminal setup</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Configuration moved entirely to the browser — there is no interactive terminal step anymore. When the wizard finishes you are signed in as the administrator; restart the dev server once afterwards so the fresh environment is baked into the app bundle.</p>\\n</div>\\n\\n<h2 id=''docker''>Option 4: Self-Hosted with Docker</h2>\\n<p>Everything runs on your machine: Supabase''s Postgres and auth engines, a PostgREST API behind a Kong gateway, S3-compatible MinIO storage, and the CMS itself. No Supabase account, no Vercel, no email service — ideal for evaluations, air-gapped environments, and anyone who wants a fully self-hosted CMS with complete data ownership.</p>\\n<p>With <a href=''https://www.docker.com/products/docker-desktop/'' target=''_blank'' rel=''noopener''>Docker Desktop</a> installed and running:</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpm run docker:setup</code></pre>\\n<p>The command asks nothing: it generates secure keys, builds the stack, applies every migration, and starts the services. When it finishes, open <code>http://localhost:3000</code> — the setup wizard already has the database and MinIO storage wired up, so the only step left is creating your administrator (confirmed instantly, no email required).</p>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>Day-2 commands</p>\\n <pre class=''mt-4 mb-0''><code># rebuild and restart the stack\\nnpm run docker:up\\n\\n# stop the stack (your data persists in Docker volumes)\\nnpm run docker:down\\n\\n# follow the application logs\\nnpm run docker:logs</code></pre>\\n</div>\\n\\n<h2 id=''after-install''>After You Install: Your First 10 Minutes</h2>\\n<p>Every path drops you at <code>/cms/dashboard</code>, signed in as the first administrator. A built-in onboarding checklist walks you through the rest:</p>\\n<ul class=''space-y-2''>\\n <li><strong>Add your branding</strong> — upload your logo and set the site title.</li>\\n <li><strong>Set your footer</strong> — copyright line and footer navigation.</li>\\n <li><strong>Configure email (SMTP)</strong> — under Settings, so password resets and invitations can send.</li>\\n <li><strong>Optional extras</strong> — connect analytics, enable bot protection, and (on Vercel) turn on automatic updates.</li>\\n</ul>\\n<p>From there, see how the platform fits together in <a href=''/article/how-nextblock-works''>How NextBlock Works</a>, add a storefront with the <a href=''/article/nextblock-commerce-guide''>Commerce guide</a>, or meet your AI copilot in the <a href=''/article/nextblock-cortex-ai-guide''>Cortex AI guide</a>.</p>\\n\\n<h2 id=''faq''>Installation FAQ</h2>\\n<h3>What do I need installed?</h3>\\n<p>Nothing for the Vercel path — it runs entirely in the browser. For <code>npm create nextblock</code>: <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20+</a> (which includes npm). For the cloned repository: Node.js 20+ and git. For Docker: those plus Docker Desktop.</p>\\n<h3>Is NextBlock free?</h3>\\n<p>Yes — the core of NextBlock is a 100% free, open-source CMS (AGPL). Premium packages such as e-commerce and Cortex AI are optional and activate with a license key. Both Vercel and Supabase offer free tiers, so a starter site can run at no cost.</p>\\n<h3>Do I need a Supabase account?</h3>\\n<p>On Vercel, the database is created for you during the deploy. For <code>npm create nextblock</code> and the cloned repository you bring a free Supabase project. With Docker you need no cloud accounts at all.</p>\\n<h3>Do I have to run migrations or SQL by hand?</h3>\\n<p>No. The setup wizard, the Vercel build, and the Docker stack all apply the database schema automatically — and re-running is always safe.</p>\\n<h3>Can I switch paths later?</h3>\\n<p>Yes. Every path runs the same application and the same database schema, so you can prototype locally with Docker today and deploy to Vercel tomorrow. NextBlock deploys like any standard Next.js app.</p>\\n<h3>How do I update NextBlock?</h3>\\n<p>On Vercel, the Connect GitHub onboarding step enables a daily automatic sync with upstream. On a cloned repository, <code>git pull</code>, run <code>npm run db:migrate</code>, then restart (on production builds, pending migrations apply automatically). With Docker, pull the latest code and run <code>npm run docker:up</code>.</p>\\n\\n<div class=''rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5''>\\n <p class=''mt-0 text-2xl font-semibold text-slate-900 dark:text-white''>Ready to launch?</p>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Pick your path above, or jump straight to the fastest one.</p>\\n <div class=''mt-5 flex flex-wrap justify-center gap-3''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Deploy on Vercel</a>\\n <a href=''https://github.com/nextblock-cms/nextblock'' target=''_blank'' rel=''noopener'' 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''>View on GitHub</a>\\n </div>\\n</div>"}', 0, '2026-07-03 17:52:15.799297+00', '2026-07-03 17:52:15.799297+00', NULL) ON CONFLICT DO NOTHING;
|
|
4968
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (41, NULL, 4, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock est un CMS open source et natif IA, construit sur Next.js et Supabase — et son installation ne passe plus par des fichiers de configuration, des assistants en ligne de commande ou du SQL manuel. Il existe quatre façons de démarrer, et elles aboutissent toutes au même endroit : un <strong>assistant de configuration</strong> dans le navigateur qui connecte votre base de données, configure le stockage des médias et crée votre compte administrateur. Choisissez le chemin qui vous convient, suivez les étapes, et vous publierez en quelques minutes.</p>\\n\\n<div class=''grid gap-5 md:grid-cols-2 my-10''>\\n <a href=''#one-click-vercel'' class=''block rounded-[1.75rem] border border-blue-200 bg-blue-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Le plus rapide · environ 3 minutes</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Déploiement Vercel en un clic</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Un site de production en ligne avec une base de données gérée. Pas de terminal, pas de variables d''environnement, rien à copier.</p>\\n </a>\\n <a href=''#npm-create'' class=''block rounded-[1.75rem] border border-violet-200 bg-violet-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-violet-500/20 dark:bg-violet-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Recommandé pour les nouveaux projets</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>npm create nextblock</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Générez une app Next.js autonome avec NextBlock intégré, puis terminez la configuration dans votre navigateur.</p>\\n </a>\\n <a href=''#git-clone'' class=''block rounded-[1.75rem] border border-emerald-200 bg-emerald-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Code source complet</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Cloner le dépôt</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Faites tourner le monorepo complet — le CMS, tous les packages et la documentation. Conçu pour les contributeurs et les équipes plateforme.</p>\\n </a>\\n <a href=''#docker'' class=''block rounded-[1.75rem] border border-amber-200 bg-amber-50/70 p-6 no-underline transition-shadow hover:shadow-lg dark:border-amber-500/20 dark:bg-amber-500/10''>\\n <p class=''mt-0 mb-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>100 % local · aucun compte</p>\\n <h3 class=''mt-3 mb-2 text-xl font-semibold text-slate-900 dark:text-white''>Auto-hébergé avec Docker</h3>\\n <p class=''mb-0 text-sm leading-6 text-slate-600 dark:text-slate-300''>Une seule commande démarre toute la pile sur votre machine — base de données, auth, stockage et le CMS. Aucun service cloud.</p>\\n </a>\\n</div>\\n\\n<p class=''text-sm text-slate-500 dark:text-slate-400''>Vous hésitez ? Pour un site en ligne avec le minimum d''effort, choisissez <a href=''#one-click-vercel''>Vercel</a>. Pour un projet local à personnaliser, choisissez <a href=''#npm-create''>npm create nextblock</a>.</p>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/included.webp'' alt=''Aperçu de la plateforme NextBlock : éditeur de blocs, tableau de bord CMS et intégrations incluses dans chaque installation'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Quel que soit le chemin choisi, vous obtenez le même éditeur de blocs, le même CMS et le même schéma de base de données.</figcaption>\\n</figure>\\n\\n<h2 id=''one-click-vercel''>Option 1 : Déploiement Vercel en un clic</h2>\\n<p>Le moyen le plus rapide d''obtenir un site NextBlock en production. Un seul bouton crée votre propre copie de NextBlock sur GitHub, provisionne une base de données Supabase gérée et déploie le site — sans jamais ouvrir un terminal ni copier la moindre clé.</p>\\n<ol class=''space-y-2''>\\n <li><strong>Cliquez sur Deploy to Vercel</strong> et connectez-vous — Vercel clone NextBlock dans un nouveau dépôt qui vous appartient.</li>\\n <li><strong>Créez la base de données Supabase</strong> quand on vous le demande : choisissez un nom et une région. Vercel la connecte au projet et injecte les clés avant le premier build.</li>\\n <li><strong>Ouvrez votre nouveau site</strong> une fois le build terminé. Toute nouvelle instance vous amène directement à l''assistant de configuration.</li>\\n <li><strong>Créez votre compte administrateur.</strong> Il est confirmé instantanément — aucun email de vérification — et vous arrivez dans le tableau de bord du CMS.</li>\\n</ol>\\n<div class=''my-8''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Déployer sur Vercel →</a>\\n</div>\\n<div class=''rounded-3xl border border-blue-200 bg-blue-50/80 p-6 my-8 dark:border-blue-500/20 dark:bg-blue-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-blue-700 dark:text-blue-200''>Zéro configuration</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Aucune variable d''environnement à remplir. Le stockage des médias utilise automatiquement votre projet Supabase connecté, les secrets de sécurité sont dérivés pour vous, et les migrations de base de données s''exécutent automatiquement à chaque build de production. Un domaine personnalisé plus tard ? Définissez <code>NEXT_PUBLIC_URL</code> dans votre projet Vercel et redéployez.</p>\\n</div>\\n<p>Par ailleurs, votre site reste à jour tout seul : la checklist du tableau de bord inclut une étape <strong>Connect GitHub</strong> en un clic qui installe un workflow quotidien synchronisant votre copie avec la dernière version de NextBlock.</p>\\n\\n<h2 id=''npm-create''>Option 2 : Créer un projet avec npm create nextblock</h2>\\n<p>Le meilleur point de départ pour construire votre propre site. Le CLI génère une application Next.js autonome avec NextBlock déjà intégré — sans monorepo ni outillage de workspace — et confie tout le reste à l''assistant dans le navigateur.</p>\\n<p>Avant de commencer, installez <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20 ou plus récent</a> (npm inclus), puis créez un projet gratuit sur <a href=''https://supabase.com'' target=''_blank'' rel=''noopener''>supabase.com</a> (ou choisissez le mode Docker du CLI pendant la création et passez-vous entièrement de comptes cloud).</p>\\n<pre><code>npm create nextblock@latest mon-site\\ncd mon-site\\nnpm run dev</code></pre>\\n<p>Ouvrez <code>http://localhost:3000/setup</code> et laissez l''assistant faire le travail :</p>\\n<ol class=''space-y-2''>\\n <li><strong>Connectez Supabase</strong> — collez l''URL du projet, la clé publiable (anon), la clé secrète (service role) et un jeton d''accès personnel pour que l''assistant applique le schéma de base de données à votre place.</li>\\n <li><strong>Choisissez le stockage des médias</strong> — branchez un bucket Cloudflare R2 pour les images et les fichiers, ou laissez les champs vides pour utiliser le stockage de votre projet Supabase.</li>\\n <li><strong>Créez votre administrateur</strong> — l''assistant applique toutes les migrations, génère les secrets de l''application, écrit <code>.env.local</code>, crée votre compte admin confirmé et vous connecte. Redémarrez ensuite <code>npm run dev</code> une fois pour que le nouvel environnement soit intégré à l''application.</li>\\n</ol>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-violet-700 dark:text-violet-200''>Modules premium</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>Besoin d''une boutique ? Une seule commande ajoute produits, paiement, commandes et coupons — activés par clé de licence, prêts quand vous l''êtes : <code>npx create-nextblock activate ecommerce</code></p>\\n</div>\\n\\n<h2 id=''git-clone''>Option 3 : Cloner le dépôt</h2>\\n<p>Faites tourner le monorepo Nx complet : l''application CMS, tous les packages partagés, le code du CLI et la documentation. C''est le chemin des contributeurs, des auteurs de plugins et des équipes qui personnalisent la plateforme elle-même.</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpx nx serve nextblock</code></pre>\\n<p>Ouvrez <code>http://localhost:4200</code> — une nouvelle installation redirige chaque page vers <code>/setup</code>, où le même assistant en trois étapes connecte Supabase, configure le stockage et crée votre admin. Il valide vos clés, écrit <code>.env.local</code> avec des secrets générés, et applique toutes les migrations via l''API de management Supabase — sans CLI Supabase.</p>\\n<div class=''rounded-3xl border border-emerald-200 bg-emerald-50/80 p-6 my-8 dark:border-emerald-500/20 dark:bg-emerald-500/10''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Zéro configuration dans le terminal</p>\\n <p class=''mt-3 mb-0 text-sm text-slate-700 dark:text-slate-200''>La configuration se fait entièrement dans le navigateur — il n''y a plus d''étape interactive en ligne de commande. Quand l''assistant termine, vous êtes connecté en administrateur ; redémarrez ensuite le serveur de développement une fois pour que le nouvel environnement soit intégré au bundle de l''application.</p>\\n</div>\\n\\n<h2 id=''docker''>Option 4 : Auto-hébergé avec Docker</h2>\\n<p>Tout tourne sur votre machine : les moteurs Postgres et auth de Supabase, une API PostgREST derrière une passerelle Kong, un stockage MinIO compatible S3 et le CMS lui-même. Pas de compte Supabase, pas de Vercel, pas de service d''email — idéal pour les évaluations, les environnements isolés et la pleine propriété de vos données.</p>\\n<p>Avec <a href=''https://www.docker.com/products/docker-desktop/'' target=''_blank'' rel=''noopener''>Docker Desktop</a> installé et démarré :</p>\\n<pre><code>git clone https://github.com/nextblock-cms/nextblock.git\\ncd nextblock\\nnpm install\\nnpm run docker:setup</code></pre>\\n<p>La commande ne pose aucune question : elle génère des clés sécurisées, construit la pile, applique toutes les migrations et démarre les services. Quand elle se termine, ouvrez <code>http://localhost:3000</code> — la base de données et le stockage MinIO sont déjà connectés dans l''assistant de configuration, il ne reste qu''à créer votre administrateur (confirmé instantanément, sans email).</p>\\n<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''>\\n <p class=''mt-0 text-xs font-semibold uppercase tracking-[0.22em] text-amber-700 dark:text-amber-200''>Commandes du quotidien</p>\\n <pre class=''mt-4 mb-0''><code># reconstruire et redémarrer la pile\\nnpm run docker:up\\n\\n# arrêter la pile (vos données persistent dans les volumes Docker)\\nnpm run docker:down\\n\\n# suivre les logs de l''application\\nnpm run docker:logs</code></pre>\\n</div>\\n\\n<h2 id=''after-install''>Après l''installation : vos 10 premières minutes</h2>\\n<p>Chaque chemin vous dépose sur <code>/cms/dashboard</code>, connecté en tant que premier administrateur. Une checklist de démarrage intégrée vous guide pour la suite :</p>\\n<ul class=''space-y-2''>\\n <li><strong>Ajoutez votre identité visuelle</strong> — téléversez votre logo et définissez le titre du site.</li>\\n <li><strong>Réglez votre pied de page</strong> — mention de copyright et navigation du pied de page.</li>\\n <li><strong>Configurez l''email (SMTP)</strong> — dans les réglages, pour que les réinitialisations de mot de passe et les invitations partent bien.</li>\\n <li><strong>Extras optionnels</strong> — connectez vos outils d''analytics, activez la protection anti-bots et (sur Vercel) les mises à jour automatiques.</li>\\n</ul>\\n<p>Ensuite, découvrez comment la plateforme s''articule dans <a href=''/article/comment-nextblock-fonctionne''>Comment NextBlock fonctionne</a>, ou ajoutez une boutique avec le <a href=''/article/guide-commerce-nextblock''>guide Commerce</a>.</p>\\n\\n<h2 id=''faq''>FAQ d''installation</h2>\\n<h3>Que dois-je installer ?</h3>\\n<p>Rien pour le chemin Vercel — tout se passe dans le navigateur. Pour <code>npm create nextblock</code> : <a href=''https://nodejs.org'' target=''_blank'' rel=''noopener''>Node.js 20+</a> (npm inclus). Pour le dépôt cloné : Node.js 20+ et git. Pour Docker : ajoutez Docker Desktop.</p>\\n<h3>NextBlock est-il gratuit ?</h3>\\n<p>Oui — le cœur du CMS est 100 % gratuit et open source (AGPL). Les packages premium comme l''e-commerce et Cortex AI sont optionnels et s''activent avec une clé de licence. Vercel et Supabase proposent chacun une offre gratuite : un site de départ peut donc tourner sans frais.</p>\\n<h3>Ai-je besoin d''un compte Supabase ?</h3>\\n<p>Sur Vercel, la base de données est créée pour vous pendant le déploiement. Pour <code>npm create nextblock</code> et le dépôt cloné, il vous faut un projet Supabase gratuit. Avec Docker, aucun compte cloud n''est nécessaire.</p>\\n<h3>Dois-je exécuter des migrations ou du SQL à la main ?</h3>\\n<p>Non. L''assistant de configuration, le build Vercel et la pile Docker appliquent tous le schéma de base de données automatiquement — et relancer l''opération est toujours sans risque.</p>\\n<h3>Puis-je changer de chemin plus tard ?</h3>\\n<p>Oui. Chaque chemin exécute la même application et le même schéma de base de données : vous pouvez prototyper en local avec Docker aujourd''hui et déployer sur Vercel demain. NextBlock se déploie comme n''importe quelle app Next.js.</p>\\n<h3>Comment mettre à jour NextBlock ?</h3>\\n<p>Sur Vercel, l''étape Connect GitHub de la checklist active une synchronisation quotidienne automatique. Sur un dépôt cloné, <code>git pull</code>, lancez <code>npm run db:migrate</code>, puis redémarrez (lors des builds de production, les migrations en attente s''appliquent automatiquement). Avec Docker, récupérez le dernier code et lancez <code>npm run docker:up</code>.</p>\\n\\n<div class=''rounded-[2rem] border border-slate-200/80 bg-slate-50 p-8 my-12 text-center dark:border-white/10 dark:bg-white/5''>\\n <p class=''mt-0 text-2xl font-semibold text-slate-900 dark:text-white''>Prêt à vous lancer ?</p>\\n <p class=''text-sm text-slate-600 dark:text-slate-300''>Choisissez votre chemin ci-dessus, ou passez directement au plus rapide.</p>\\n <div class=''mt-5 flex flex-wrap justify-center gap-3''>\\n <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'' target=''_blank'' rel=''noopener'' 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''>Déployer sur Vercel</a>\\n <a href=''https://github.com/nextblock-cms/nextblock'' target=''_blank'' rel=''noopener'' 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''>Voir sur GitHub</a>\\n </div>\\n</div>"}', 0, '2026-07-03 17:52:15.799297+00', '2026-07-03 17:52:15.799297+00', NULL) ON CONFLICT DO NOTHING;
|
|
4969
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (8, 1, NULL, 1, 'section', '{"padding": {"top": "xl", "bottom": "xl"}, "background": {"type": "gradient", "gradient": {"type": "linear", "stops": [{"color": "#020817", "position": 0}, {"color": "#0f172a", "position": 100}], "direction": "180deg"}}, "column_gap": "lg", "column_blocks": [[{"content": {"html_content": "<h2 class=''text-3xl md:text-4xl font-bold text-center text-white mb-4''>Have Questions?</h2>"}, "block_type": "text"}, {"content": {"html_content": "<p class=''text-center text-lg text-slate-300 mx-auto mb-8''>NextBlock™ partners with early adopters to co-build features, sponsor modules, and shape the product direction.</p>"}, "block_type": "text"}, {"content": {"url": "/contact", "size": "lg", "text": "Get in Touch", "variant": "default", "position": "center"}, "block_type": "button"}, {"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": "Deploy on Vercel", "variant": "outline", "position": "center"}, "block_type": "button"}]], "container_type": "container", "responsive_columns": {"mobile": 1, "tablet": 1, "desktop": 1}}', 6, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.840619+00', NULL) ON CONFLICT DO NOTHING;
|
|
4970
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (27, NULL, 1, 1, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ is designed so the hosted CMS, the open-source starter, and the developer tooling all feel like the same product. The shared Nx workspace, typed block contracts, and reusable editor package keep product polish and developer velocity moving together.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>One codebase</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Shared foundation</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Marketing pages, CMS screens, and the starter template evolve together instead of drifting apart.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Typed content</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Blocks with guardrails</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Zod schemas, defaults, and renderer contracts make every custom block safer to ship.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Editorial UX</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Product-grade editing</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>The Tiptap layer gives editors a richer surface without hiding the underlying HTML power.</p>\\n </div>\\n</div>\\n\\n<div class=''flex flex-col md:flex-row gap-8 items-center my-12''>\\n <div class=''w-full md:w-1/2 space-y-4''>\\n <h2>Monorepo Layout and Dependency Flow</h2>\\n <p>The <code>apps/nextblock</code> directory contains the production Next.js experience, including the public site and authenticated CMS shell. The <code>apps/create-nextblock</code> CLI mirrors that foundation so teams can start from the same product decisions instead of rebuilding them from scratch.</p>\\n <ul class=''list-disc pl-6 space-y-2 text-sm''>\\n <li><strong>@nextblock-cms/ui</strong> - UI components, tokens, and shared design primitives</li>\\n <li><strong>@nextblock-cms/utils</strong> - translations, environment guards, and storage helpers</li>\\n <li><strong>@nextblock-cms/db</strong> - migrations, typed database access, and generated types</li>\\n <li><strong>@nextblock-cms/editor</strong> - the reusable Tiptap v3 editing surface</li>\\n <li><strong>@nextblock-cms/sdk</strong> - typed contracts for block authorship and validation</li>\\n <li><strong>@nextblock-cms/ecommerce</strong> - the premium commerce module when activated</li>\\n </ul>\\n <p>Run <code>nx graph</code> and you can see exactly how changes ripple through the workspace. Path aliases from <code>tsconfig.base.json</code> and the shared Tailwind setup help keep design parity between marketing pages, admin screens, and generated projects.</p>\\n </div>\\n <aside class=''w-full md:w-1/2 rounded-[2rem] border border-slate-200/80 bg-white p-4 shadow-xl dark:border-white/10 dark:bg-white/5''>\\n <div class=''relative aspect-video overflow-hidden rounded-2xl''><iframe class=''absolute inset-0 h-full w-full border-0'' src=''https://www.youtube.com/embed/DNqU8ez9qjs?si=p2oIy0f-n7wiaBmO'' title=''How NextBlock™ Works'' allow=''accelerated-motion; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'' referrerpolicy=''strict-origin-when-cross-origin'' loading=''lazy'' allowfullscreen></iframe></div>\\n <p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>Nx makes every workspace relationship visible, which is exactly why the starter, CMS, and packages stay aligned.</p>\\n </aside>\\n</div>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/extensibility.webp'' alt=''NextBlock™ extensibility artwork showing the CMS connected to reusable modules and integrations'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>A single visual system spans content modeling, editing, and future premium modules like commerce.</figcaption>\\n</figure>\\n\\n<h2>Block Registry as Product Surface</h2>\\n<p>The block registry in <code>apps/nextblock/lib/blocks/blockRegistry.ts</code> is the source of truth for available block types, Zod schemas, starter content, and editor or renderer components. Today that includes everything from <code>text</code> and <code>heading</code> to <code>section</code>, <code>posts_grid</code>, <code>checkout</code>, and <code>product_details</code>.</p>\\n<p>Sections support nested column arrays, so layouts can be composed like real pages instead of flat content lists. Helpers such as <code>getBlockDefinition()</code>, <code>getInitialContent()</code>, and <code>validateBlockContent()</code> keep that flexibility strongly typed.</p>\\n\\n<h2>The Editing Layer</h2>\\n<p>The <code>@nextblock-cms/editor</code> package wraps Tiptap v3 into a reusable editorial surface with slash commands, floating and bubble menus, drag handles, tables, task lists, character counts, and syntax-highlighted code blocks. It deliberately preserves richer HTML so advanced teams are not boxed into a simplified subset.</p>\\n\\n<h2>Inside the CMS Shell</h2>\\n<p>Within <code>apps/nextblock/app/cms</code>, each feature area follows a repeatable pattern: list pages, create and edit routes, scoped client components, and server actions that wrap Supabase mutations. The result feels consistent for editors while keeping credentials and permissions on the server side.</p>\\n\\n<h2>Open Core Without Product Drift</h2>\\n<p>The core CMS is open source under AGPL. Premium modules like <code>@nextblock-cms/ecommerce</code> remain source-available but are activated through <code>package_activations</code> and <code>verifyPackageOnline()</code>. That means the same shell can stay clean for open-source users while revealing commerce surfaces only when the license is active.</p>\\n\\n<h2>Why It Holds Together</h2>\\n<p>The Nx workspace keeps libraries honest, the Next.js app enforces UI consistency, Supabase migrations codify access rules, and the Tiptap editor gives collaborators the same authoring experience regardless of deployment. When a team runs <code>npm create nextblock</code>, they inherit the full operating model, not just a pile of files.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.859357+00', NULL) ON CONFLICT DO NOTHING;
|
|
4971
|
+
INSERT INTO public.blocks (id, page_id, post_id, language_id, block_type, content, "order", created_at, updated_at, product_id) VALUES (28, NULL, 2, 2, 'text', '{"html_content": "<p class=''text-lg leading-8 text-slate-700 dark:text-slate-300''>NextBlock™ relie le CMS hébergé, le starter open source et les outils dev dans un même socle produit. Le workspace Nx, les contrats de blocs typés et l''éditeur partagé permettent d''avancer vite sans sacrifier la cohérence.</p>\\n\\n<div class=''grid gap-4 md:grid-cols-3 my-10''>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-sky-700 dark:text-sky-200''>Socle unique</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Une même base</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Le site public, le shell CMS et le starter gardent les mêmes choix produit et la même direction visuelle.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-indigo-700 dark:text-indigo-200''>Contenu typé</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Blocs avec garde-fous</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>Schémas Zod, contenus par défaut et contrats de rendu rendent les extensions plus sûres à maintenir.</p>\\n </div>\\n <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''>\\n <p class=''text-xs font-semibold uppercase tracking-[0.22em] text-emerald-700 dark:text-emerald-200''>Expérience éditoriale</p>\\n <h3 class=''mt-3 text-xl font-semibold text-slate-900 dark:text-white''>Edition premium</h3>\\n <p class=''mt-3 text-sm text-slate-600 dark:text-slate-300''>La couche Tiptap donne aux éditeurs une interface riche sans masquer la puissance HTML pour les cas avancés.</p>\\n </div>\\n</div>\\n\\n<div class=''flex flex-col md:flex-row gap-8 items-center my-12''>\\n <div class=''w-full md:w-1/2 space-y-4''>\\n <h2>Architecture monorepo et flux de dépendances</h2>\\n <p>Le dossier <code>apps/nextblock</code> contient l''expérience Next.js en production, incluant le site public et le shell CMS authentifié. Le CLI <code>apps/create-nextblock</code> reprend cette base pour que les nouveaux projets partent des mêmes décisions produit.</p>\\n <ul class=''list-disc pl-6 space-y-2 text-sm''>\\n <li><strong>@nextblock-cms/ui</strong> - composants UI, tokens et primitives visuelles partagées</li>\\n <li><strong>@nextblock-cms/utils</strong> - traductions, gardes d''environnement et helpers de stockage</li>\\n <li><strong>@nextblock-cms/db</strong> - migrations, accès base typé et types générés</li>\\n <li><strong>@nextblock-cms/editor</strong> - la surface d''édition Tiptap v3 réutilisable</li>\\n <li><strong>@nextblock-cms/sdk</strong> - contrats typés pour l''auteuring et la validation des blocs</li>\\n <li><strong>@nextblock-cms/ecommerce</strong> - le module commerce premium lorsqu''il est activé</li>\\n </ul>\\n <p>Lancez <code>nx graph</code> et vous voyez immédiatement comment un changement se propage. Les alias de <code>tsconfig.base.json</code> et la configuration Tailwind partagée aident à garder une vraie parité entre marketing, back-office et projets générés.</p>\\n </div>\\n <aside class=''w-full md:w-1/2 rounded-[2rem] border border-slate-200/80 bg-white p-4 shadow-xl dark:border-white/10 dark:bg-white/5''>\\n <div class=''relative aspect-video overflow-hidden rounded-2xl''><iframe class=''absolute inset-0 h-full w-full border-0'' src=''https://www.youtube.com/embed/DNqU8ez9qjs?si=p2oIy0f-n7wiaBmO'' title=''Comment NextBlock™ fonctionne'' allow=''accelerated-motion; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share'' referrerpolicy=''strict-origin-when-cross-origin'' loading=''lazy'' allowfullscreen></iframe></div>\\n <p class=''mt-3 text-sm text-slate-500 dark:text-slate-400''>Nx rend visibles les relations du workspace, ce qui aide le starter, le CMS et les packages a rester alignes.</p>\\n </aside>\\n</div>\\n\\n<figure class=''my-12 overflow-hidden rounded-[2rem] border border-slate-200/80 bg-slate-950 shadow-2xl dark:border-white/10''>\\n <img src=''/images/extensibility.webp'' alt=''Visuel NextBlock™ montrant le CMS relie a des modules reutilisables et des integrations'' class=''w-full h-auto object-cover'' />\\n <figcaption class=''border-t border-white/10 px-6 py-4 text-sm text-slate-300''>Un seul langage visuel relie la modelisation de contenu, l''edition et les futurs modules premium comme le commerce.</figcaption>\\n</figure>\\n\\n<h2>Le registre de blocs comme surface produit</h2>\\n<p>Le registre dans <code>apps/nextblock/lib/blocks/blockRegistry.ts</code> définit les types disponibles, les schémas Zod, les contenus de départ et les composants d''édition ou de rendu. On y trouve aujourd''hui des blocs comme <code>text</code>, <code>heading</code>, <code>section</code>, <code>posts_grid</code>, <code>checkout</code> et <code>product_details</code>.</p>\\n<p>Les sections supportent des colonnes imbriquées, ce qui permet de composer de vraies pages plutôt qu''une simple liste de contenu. Des helpers comme <code>getBlockDefinition()</code>, <code>getInitialContent()</code> and <code>validateBlockContent()</code> gardent cette flexibilité bien typée.</p>\\n\\n<h2>La couche d''edition</h2>\\n<p>Le package <code>@nextblock-cms/editor</code> enveloppe Tiptap v3 dans une surface éditoriale réutilisable avec slash commands, menus contextuels, drag handles, tableaux, listes de taches, compteurs et blocs de code. Le but est de conserver un HTML riche quand une equipe en a besoin.</p>\\n\\n<h2>A l''interieur du shell CMS</h2>\\n<p>Dans <code>apps/nextblock/app/cms</code>, chaque zone suit un motif lisible : pages de liste, routes de creation et d''edition, composants clients cibles et server actions qui encapsulent les mutations Supabase. Les editeurs y gagnent une interface coherente et les identifiants restent cote serveur.</p>\\n\\n<h2>Open core sans derive produit</h2>\\n<p>Le coeur du CMS est open source sous AGPL. Les modules premium comme <code>@nextblock-cms/ecommerce</code> restent disponibles en source mais sont actives via <code>package_activations</code> et <code>verifyPackageOnline()</code>. Le meme shell peut donc rester simple pour l''open source tout en deverrouillant les surfaces commerce au bon moment.</p>\\n\\n<h2>Pourquoi l''ensemble tient</h2>\\n<p>Le workspace Nx garde les librairies honnetes, l''app Next.js maintient la coherence UI, les migrations Supabase codifient les regles d''acces, et l''editeur Tiptap donne la meme experience de contribution quel que soit le deploiement. Quand une equipe lance <code>npm create nextblock</code>, elle recupere une facon de travailler complete, pas juste des fichiers.</p>"}', 0, '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.859357+00', NULL) ON CONFLICT DO NOTHING;
|
|
4972
|
+
INSERT INTO public.currencies (id, code, symbol, exchange_rate, is_default, is_active, rounding_mode, rounding_increment, rounding_charm_amount, auto_update_exchange_rate, exchange_rate_updated_at, exchange_rate_source, auto_sync_product_prices, created_at, updated_at) VALUES ('f26e8339-d3cd-46f2-b11e-12569c30d4a8', 'USD', '$', 1.0000000000, true, true, 'none', 1, NULL, false, '2026-07-03 17:52:15.444652+00', 'store-default', false, '2026-07-03 17:52:15.444652+00', '2026-07-03 17:52:15.444652+00') ON CONFLICT DO NOTHING;
|
|
4973
|
+
INSERT INTO public.logos (id, name, media_id, created_at) VALUES ('d45ef03d-27fc-4099-8b46-1cdf82d658d2', 'NextBlock™ Logo', 'ea6fdaf5-f8de-416c-9f2b-b689b7a4ed38', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4974
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (1, 1, 'HEADER', 'Home', '/', NULL, 0, 1, 'b6bd9818-a8d1-4a17-ac6b-d5b1f178a297', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4975
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (2, 1, 'HEADER', 'Articles', '/articles', NULL, 1, 3, '8c269d8b-db64-47ab-8ce0-29f65dbbe867', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4976
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (3, 1, 'HEADER', 'Contact', '/contact', NULL, 3, 5, 'cd630aed-aeb8-4acf-934b-9ccbbe8ee9bd', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4977
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (4, 2, 'HEADER', 'Accueil', '/accueil', NULL, 0, 2, 'aaa0c842-c996-4a07-bb3a-7562f865b6a4', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4978
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (5, 2, 'HEADER', 'Articles', '/articles', NULL, 1, 4, 'af69b017-3762-4c11-b709-37fb56081b99', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4979
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (6, 2, 'HEADER', 'Contact', '/contact', NULL, 3, 6, '21a91d4b-a494-4b3a-8d28-c21c414042cf', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
4980
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (7, 1, 'FOOTER', 'Privacy Policy', '/privacy-policy', NULL, 0, 7, 'c8f2e6a3-7d28-4174-a8f7-0179226ae79a', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4981
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (8, 1, 'FOOTER', 'Terms of Service', '/terms-of-service', NULL, 1, 9, '4838ca4b-eaad-495c-ad7c-1750984bc8d9', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4982
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (9, 2, 'FOOTER', 'Politique de confidentialité', '/politique-de-confidentialite', NULL, 0, 8, 'c8f2e6a3-7d28-4174-a8f7-0179226ae79a', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4983
|
+
INSERT INTO public.navigation_items (id, language_id, menu_key, label, url, parent_id, "order", page_id, translation_group_id, created_at, updated_at) VALUES (10, 2, 'FOOTER', 'Conditions d''utilisation', '/conditions-utilisation', NULL, 1, 10, '4838ca4b-eaad-495c-ad7c-1750984bc8d9', '2026-07-03 17:52:15.753698+00', '2026-07-03 17:52:15.753698+00') ON CONFLICT DO NOTHING;
|
|
4984
|
+
INSERT INTO public.shipping_zones (id, name, priority_order, created_at, updated_at) VALUES ('4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'North America', 10, '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4985
|
+
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('c25d8fee-f0b6-43d5-8af5-5af4a47cb123', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'US', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4986
|
+
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('3d3d4bf6-7cb1-41b9-a5e1-1eb9098e640f', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'CA', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4987
|
+
INSERT INTO public.shipping_zone_locations (id, zone_id, country_code, state_code, postal_code, created_at) VALUES ('63d47fff-7148-48ff-8cc1-5d3ba99fa022', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'MX', NULL, NULL, '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4988
|
+
INSERT INTO public.shipping_zone_methods (id, zone_id, method_type, cost_amount, cost_currency, min_order_amount, name, name_translations, currency_pricing_mode, cost_amounts, min_order_amounts, created_at, updated_at) VALUES ('ea112a82-e05c-46bc-a5e7-5bb62528aa5d', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'flat_rate', 1500, 'USD', 0, 'Standard Shipping', '{"fr": "Livraison standard"}', 'auto', '{"USD": 1500}', '{"USD": 0}', '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4989
|
+
INSERT INTO public.shipping_zone_methods (id, zone_id, method_type, cost_amount, cost_currency, min_order_amount, name, name_translations, currency_pricing_mode, cost_amounts, min_order_amounts, created_at, updated_at) VALUES ('32d473d1-e3d4-4741-a7f5-63d87a387e08', '4026af0e-5752-44fb-b7f7-ba5ac722cadc', 'free_shipping', 0, 'USD', 10000, 'Free Shipping (Orders over $100)', '{"fr": "Livraison gratuite (commandes de plus de 100 $)"}', 'auto', '{"USD": 0}', '{"USD": 10000}', '2026-07-03 17:52:15.25122+00', '2026-07-03 17:52:15.25122+00') ON CONFLICT DO NOTHING;
|
|
4990
|
+
INSERT INTO public.site_settings (key, value) VALUES ('footer_copyright', '{"en": "© {year} Nextblock CMS. All rights reserved.", "fr": "© {year} Nextblock CMS. Tous droits réservés."}') ON CONFLICT DO NOTHING;
|
|
4991
|
+
INSERT INTO public.site_settings (key, value) VALUES ('enabled_payment_providers', '{"stripe": false, "freemius": false}') ON CONFLICT DO NOTHING;
|
|
4992
|
+
INSERT INTO public.site_settings (key, value) VALUES ('site_title', '"NextBlock™ CMS"') ON CONFLICT DO NOTHING;
|
|
4993
|
+
INSERT INTO public.site_settings (key, value) VALUES ('site_description', '"NextBlock™ is an open-source CMS on Next.js + Supabase — a visual block editor, blazing-fast multilingual pages, and built-in e-commerce."') ON CONFLICT DO NOTHING;
|
|
4994
|
+
INSERT INTO public.site_settings (key, value) VALUES ('site_keywords', '"NextBlock, CMS, Next.js, Supabase, headless CMS, block editor, visual page builder, multilingual, e-commerce, open source"') ON CONFLICT DO NOTHING;
|
|
4995
|
+
INSERT INTO public.site_settings (key, value) VALUES ('ecommerce_inventory_settings', '{"enable_taxes": false, "track_quantities": true}') ON CONFLICT DO NOTHING;
|
|
4996
|
+
INSERT INTO public.site_settings (key, value) VALUES ('invoice_settings', '{"email": "", "phone": "", "address": {"city": "", "line1": "", "line2": "", "state": "", "postal_code": "", "country_code": "CA"}, "business_name": "", "tax_registrations": []}') ON CONFLICT DO NOTHING;
|
|
4997
|
+
INSERT INTO public.site_settings (key, value) VALUES ('privacy_settings', '{"gtm_id": "", "corporate": {"address": "", "legal_name": "", "support_email": ""}, "banner_enabled": true, "custom_scripts": "", "ga_measurement_id": ""}') ON CONFLICT DO NOTHING;
|
|
4998
|
+
INSERT INTO public.site_settings (key, value) VALUES ('email_public', '{"host": "", "port": "", "secure": true, "fromName": "", "fromEmail": ""}') ON CONFLICT DO NOTHING;
|
|
4999
|
+
INSERT INTO public.site_settings (key, value) VALUES ('payment_public', '{"stripe": {"publishableKey": ""}, "freemius": {"productId": "", "publicKey": "", "developerId": "", "sandboxEnabled": false}}') ON CONFLICT DO NOTHING;
|
|
5000
|
+
INSERT INTO public.site_settings (key, value) VALUES ('onboarding_state', '{"skipped": [], "dismissed": false}') ON CONFLICT DO NOTHING;
|
|
5001
|
+
INSERT INTO public.site_settings (key, value) VALUES ('security_settings', '{"enforce_staff_2fa": true, "trusted_device_days": 30}') ON CONFLICT DO NOTHING;
|
|
5002
|
+
INSERT INTO public.site_settings (key, value) VALUES ('is_admin_created', 'false') ON CONFLICT DO NOTHING;
|
|
5003
|
+
INSERT INTO public.system_configuration (id, auto_accept_signups, settings) VALUES (1, false, '{}'::jsonb) ON CONFLICT DO NOTHING;
|
|
5004
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('continue_with_github', '{"en": "Continue with GitHub", "es": "Continuar con GitHub", "fr": "Continuer avec GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5005
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('or_continue_with', '{"en": "Or continue with", "es": "O continuar con", "fr": "Ou continuer avec"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5006
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('customer_profile', '{"en": "Customer Profile", "es": "Perfil de Cliente", "fr": "Profil Client"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5007
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('personal_information', '{"en": "Personal Information", "es": "Información Personal", "fr": "Informations Personnelles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5008
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('full_name', '{"en": "Full Name", "es": "Nombre Completo", "fr": "Nom Complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5009
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_username', '{"en": "GitHub Username", "es": "Nombre de usuario de GitHub", "fr": "Nom d''utilisateur GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5010
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_username_help', '{"en": "Required only for purchasing developer licenses.", "es": "Requerido solo para comprar licencias de desarrollador.", "fr": "Requis uniquement pour l''achat de licences développeur."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5011
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('phone_number', '{"en": "Phone Number", "es": "Número de Teléfono", "fr": "Numéro de Téléphone"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5012
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('billing_address', '{"en": "Billing Address", "es": "Dirección de Facturación", "fr": "Adresse de Facturation"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5013
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_line_1', '{"en": "Address Line 1", "es": "Dirección Línea 1", "fr": "Adresse Ligne 1"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5014
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_line_2', '{"en": "Address Line 2 (Optional)", "es": "Dirección Línea 2 (Opcional)", "fr": "Adresse Ligne 2 (Optionnel)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5015
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('city', '{"en": "City", "es": "Ciudad", "fr": "Ville"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5016
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('state_province', '{"en": "State / Province", "es": "Estado / Provincia", "fr": "État / Province"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5017
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('postal_zip_code', '{"en": "Postal / Zip Code", "es": "Código Postal", "fr": "Code Postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5018
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('country', '{"en": "Country", "es": "País", "fr": "Pays"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5019
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('save_profile', '{"en": "Save Profile", "es": "Guardar Perfil", "fr": "Enregistrer le Profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5020
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('saving', '{"en": "Saving...", "es": "Guardando...", "fr": "Enregistrement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5021
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_updated_success', '{"en": "Profile updated successfully", "es": "Perfil actualizado con éxito", "fr": "Profil mis à jour avec succès"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5022
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_update_failed', '{"en": "Failed to update profile", "es": "Error al actualizar el perfil", "fr": "Échec de la mise à jour du profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5023
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('address_required', '{"en": "Address is required", "es": "La dirección es obligatoria", "fr": "L''adresse est requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5024
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('city_required', '{"en": "City is required", "es": "La ciudad es obligatoria", "fr": "La ville est requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5025
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('zip_code_required', '{"en": "Zip Code is required", "es": "El código postal es obligatorio", "fr": "Le code postal est requis"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5026
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('country_required', '{"en": "Country is required", "es": "El país es obligatorio", "fr": "Le pays est requis"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5027
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('enter_valid_json', '{"en": "Enter valid JSON for billing address.", "es": "Ingrese JSON válido para la dirección de facturación.", "fr": "Entrez un JSON valide pour l''adresse de facturation."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5028
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('public_profile', '{"en": "Public Profile", "es": "Perfil Público", "fr": "Profil Public"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5029
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('details', '{"en": "Account Details", "es": "Detalles de la Cuenta", "fr": "Détails du Compte"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5030
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('identity', '{"en": "Identity", "es": "Identidad", "fr": "Identité"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5031
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('website', '{"en": "Website", "es": "Sitio Web", "fr": "Site Web"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5032
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('avatar_url', '{"en": "Avatar URL", "es": "URL del Avatar", "fr": "URL de l''Avatar"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5033
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('connect_github', '{"en": "Connect GitHub", "es": "Conectar GitHub", "fr": "Connecter GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5034
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_link_failed', '{"en": "Failed to link GitHub account", "es": "Error al vincular cuenta de GitHub", "fr": "Échec de la liaison du compte GitHub"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5035
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('save_changes', '{"en": "Save Changes", "es": "Guardar Cambios", "fr": "Enregistrer les Modifications"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5036
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('github_connected', '{"en": "GitHub Connected", "es": "GitHub Conectado", "fr": "GitHub Connecté"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5037
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('linked_to', '{"en": "Linked to", "es": "Vinculado a", "fr": "Lié à"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5038
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('optional', '{"en": "Optional", "fr": "Optionnel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5039
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('shipping_address', '{"en": "Shipping Address", "fr": "Adresse de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5040
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_settings_title', '{"en": "Profile Settings", "fr": "Paramètres du profil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5041
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_settings_description', '{"en": "Keep your contact details and default addresses up to date for faster checkout.", "fr": "Gardez vos coordonnées et adresses par défaut à jour pour un paiement plus rapide."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5042
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_not_found', '{"en": "Profile not found.", "fr": "Profil introuvable."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5043
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_basic_info_help', '{"en": "This information appears on your account and helps us prepare your orders.", "fr": "Ces informations apparaissent sur votre compte et nous aident à préparer vos commandes."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5044
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_address_defaults_help', '{"en": "These default addresses are prefilled during checkout and can still be edited for each order.", "fr": "Ces adresses par défaut sont préremplies au paiement et restent modifiables pour chaque commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5045
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('use_billing_for_shipping', '{"en": "Use billing address for shipping", "fr": "Utiliser l''adresse de facturation pour la livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5046
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_use_billing_for_shipping_help', '{"en": "Keep one default address unless you regularly ship somewhere else.", "fr": "Gardez une seule adresse par défaut sauf si vous faites souvent livrer ailleurs."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5047
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_complete_billing_address', '{"en": "Please complete your billing address before continuing.", "fr": "Veuillez compléter votre adresse de facturation avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5048
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_complete_shipping_address', '{"en": "Please complete your shipping address before continuing.", "fr": "Veuillez compléter votre adresse de livraison avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5049
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_prefill_notice', '{"en": "Using your saved account details for {email}. You can still adjust them for this order.", "fr": "Nous utilisons les renseignements enregistrés pour {email}. Vous pouvez toujours les ajuster pour cette commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5050
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_billing_address_help', '{"en": "We use this address for payment verification and invoicing.", "fr": "Nous utilisons cette adresse pour la vérification du paiement et la facturation."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5051
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_use_billing_for_shipping_help', '{"en": "Uncheck this if you want your order delivered to a different address.", "fr": "Décochez ceci si vous souhaitez faire livrer votre commande à une autre adresse."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5052
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_shipping_address_help', '{"en": "Choose where physical items should be delivered.", "fr": "Choisissez où les articles physiques doivent être livrés."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5053
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_payment_only_notice', '{"en": "Stripe checkout is kept focused on payment because your address details are already collected here.", "fr": "Le paiement Stripe reste centré sur le paiement puisque vos coordonnées sont déjà recueillies ici."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5054
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_existing_account_hint', '{"en": "That email may already be registered. Try signing in or resetting your password.", "fr": "Cette adresse e-mail est peut-être déjà utilisée. Essayez de vous connecter ou de réinitialiser votre mot de passe."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5055
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_check_email_profile', '{"en": "Check your email to confirm your account. We''ll bring you to your profile next so you can finish setting up your details.", "fr": "Vérifiez votre e-mail pour confirmer votre compte. Nous vous amènerons ensuite à votre profil pour terminer la configuration de vos renseignements."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5056
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.add_to_cart', '{"en": "Add to Cart", "fr": "Ajouter au panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5057
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart', '{"en": "Added to cart", "fr": "Ajouté au panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5058
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_image', '{"en": "No Image", "fr": "Pas d''image"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5059
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.view_details', '{"en": "View Details", "fr": "Voir les détails"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5060
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_added_desc', '{"en": "The item has been added to your cart.", "fr": "L''article a été ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5061
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout', '{"en": "Checkout", "fr": "Paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5062
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart', '{"en": "Cart", "fr": "Panier"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5063
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.subtotal', '{"en": "Subtotal", "fr": "Sous-total"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5064
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping', '{"en": "Shipping", "fr": "Livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5065
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.tax', '{"en": "Tax", "fr": "Taxes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5066
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.total', '{"en": "Total", "fr": "Total"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5067
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.order_summary', '{"en": "Order Summary", "fr": "Résumé de la commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5068
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.order_summary_desc', '{"en": "Review your items before proceeding to payment.", "fr": "Vérifiez vos articles avant de procéder au paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5069
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.payment_details', '{"en": "Payment Details", "fr": "Détails du paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5070
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_info', '{"en": "Shipping Information", "fr": "Informations de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5071
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.delivery_notice', '{"en": "Digital product - No shipping required", "fr": "Produit numérique - Aucune livraison requise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5072
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.back_to_shop', '{"en": "Back to Shop", "fr": "Retour à la boutique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5073
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.empty_cart', '{"en": "Your cart is empty", "fr": "Votre panier est vide"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5074
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_products_found', '{"en": "No products found", "fr": "Aucun produit trouvé"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5075
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.featured_products', '{"en": "Featured Products", "fr": "Produits vedettes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5076
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.latest_products', '{"en": "Latest Products", "fr": "Derniers produits"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5077
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.search_products', '{"en": "Search products...", "fr": "Rechercher des produits..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5078
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price_low_to_high', '{"en": "Price: Low to High", "fr": "Prix : Croissant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5079
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price_high_to_low', '{"en": "Price: High to Low", "fr": "Prix : Décroissant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5080
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.newest', '{"en": "Newest", "fr": "Nouveautés"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5081
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.filters', '{"en": "Filters", "fr": "Filtres"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5082
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.apply_filters', '{"en": "Apply Filters", "fr": "Appliquer les filtres"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5083
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.clear_all', '{"en": "Clear All", "fr": "Tout effacer"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5084
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_notice', '{"en": "This is a digital product. You will receive access instructions via email after purchase.", "fr": "Ceci est un produit numérique. Vous recevrez les instructions d''accès par e-mail après l''achat."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5085
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shopping_cart', '{"en": "Shopping Cart", "fr": "Panier d''achat"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5086
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart_empty', '{"en": "Your cart is empty", "fr": "Votre panier est vide"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5087
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.cart_empty_description', '{"en": "Looks like you haven''t added anything to your cart yet.", "fr": "On dirait que vous n''avez encore rien ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5088
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.continue_shopping', '{"en": "Continue Shopping", "fr": "Continuer vos achats"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5089
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.go_to_shop', '{"en": "Go to Shop", "fr": "Aller à la boutique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5090
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_successful', '{"en": "Checkout Successful", "fr": "Paiement Réussi"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5091
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_notice', '{"en": "This is a Sandbox environment. The Freemius checkout is skipped here for demo purposes.", "fr": "Ceci est un environnement de bac à sable. Le paiement Freemius est sauté ici à des fins de démonstration."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5092
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_notice', '{"en": "To purchase a real license for your self-hosted NextBlock™ instance, visit:", "fr": "Pour acheter une vraie licence pour votre instance NextBlock™ auto-hébergée, visitez :"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5093
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.purchase_at', '{"en": "Purchase at nextblock.dev", "fr": "Acheter sur nextblock.dev"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5094
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.qty', '{"en": "Qty", "fr": "Qté"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5095
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.quantity', '{"en": "Quantity", "fr": "Quantité"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5096
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.product', '{"en": "Product", "fr": "Produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5097
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.price', '{"en": "Price", "fr": "Prix"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5098
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_payment', '{"en": "Secure payment processing", "fr": "Traitement sécurisé du paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5099
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_notice', '{"en": "* Taxes and shipping will be calculated on the next step.", "fr": "* Les taxes et les frais de livraison seront calculés à l''étape suivante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5100
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_calculated', '{"en": "Shipping & taxes calculated at checkout.", "fr": "Livraison et taxes calculées lors du paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5101
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.email_address', '{"en": "Email Address", "fr": "Adresse e-mail"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5102
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.pay_now', '{"en": "Pay Now", "fr": "Payer maintenant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5103
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.proceed_to_checkout', '{"en": "Proceed to Checkout", "fr": "Passer à la caisse"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5104
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.processing', '{"en": "Processing...", "fr": "Traitement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5105
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.invalid_email', '{"en": "Please enter a valid email address.", "fr": "Veuillez entrer une adresse e-mail valide."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5106
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_failed', '{"en": "Checkout failed: ", "fr": "Le paiement a échoué : "}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5107
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.generic_error', '{"en": "An error occurred. Please try again.", "fr": "Une erreur est survenue. Veuillez réessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5108
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_popup_blocked', '{"en": "Checkout popup blocked or failed to load. Falling back to direct link.", "fr": "Le popup de paiement a été bloqué ou n''a pas pu être chargé. Retour au lien direct."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5109
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.view_full_cart', '{"en": "View Full Cart", "fr": "Voir le panier complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5110
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.ready_to_checkout', '{"en": "Ready to Checkout?", "fr": "Prêt à passer au paiement ?"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5111
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sale_badge', '{"en": "Sale {percent}% Off", "fr": "Solde {percent}% de rabais"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5112
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.low_stock', '{"en": "Only {count} left", "fr": "Plus que {count} en stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5113
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.instant_digital_delivery', '{"en": "Instant Digital Delivery", "fr": "Livraison numérique instantanée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5114
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.free_shipping', '{"en": "Free Shipping", "fr": "Livraison gratuite"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5115
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_checkout', '{"en": "Secure Checkout", "fr": "Paiement sécurisé"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5116
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_description', '{"en": "No description available.", "fr": "Aucune description disponible."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5117
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_overlay_title', '{"en": "Order Checkout", "fr": "Paiement de la commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5118
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.email_placeholder', '{"en": "you@example.com", "fr": "vous@exemple.com"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5119
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.contact_information', '{"en": "Contact Information", "fr": "Informations de contact"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5120
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_address', '{"en": "Shipping Address", "fr": "Adresse de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5121
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_method', '{"en": "Shipping Method", "fr": "Mode de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5122
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.available_rates', '{"en": "Available Rates", "fr": "Tarifs disponibles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5123
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculating', '{"en": "Calculating...", "fr": "Calcul en cours..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5124
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.select_rate', '{"en": "Select a shipping rate", "fr": "Sélectionnez un tarif de livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5125
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.enter_postal_code', '{"en": "Enter postal code", "fr": "Entrez le code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5126
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.free', '{"en": "Free", "fr": "Gratuit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5127
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.first_last_name', '{"en": "First & Last Name", "fr": "Nom et prénom"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5128
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.address', '{"en": "Address", "fr": "Adresse"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5129
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.city', '{"en": "City", "fr": "Ville"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5130
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.state_province', '{"en": "State / Province", "fr": "État / Province"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5131
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.zip_postal', '{"en": "ZIP / Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5132
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.postal_code', '{"en": "Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5133
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.zip_postal_code', '{"en": "ZIP / Postal Code", "fr": "Code postal"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5134
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.estimate_shipping', '{"en": "Estimate Shipping", "fr": "Estimer la livraison"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5135
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculate', '{"en": "Calculate", "fr": "Calculer"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5136
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_rates_found', '{"en": "No shipping rates found for this region.", "fr": "Aucun tarif de livraison trouvé pour cette région."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5137
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.no_rates_for_region', '{"en": "No shipping rates found for this region.", "fr": "Aucun tarif de livraison trouvé pour cette région."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5138
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.enter_address_for_rates', '{"en": "Enter your address to see shipping rates.", "fr": "Entrez votre adresse pour voir les tarifs de livraison."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5139
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.secure_checkout_guarantee', '{"en": "Secure checkout guaranteed", "fr": "Paiement sécurisé garanti"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5140
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.full_name', '{"en": "Full Name", "fr": "Nom complet"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5141
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.country', '{"en": "Country", "fr": "Pays"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5142
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_preference_title', '{"en": "How would you like to start your trial?", "es": "¿Cómo te gustaría comenzar tu prueba?", "fr": "Comment souhaitez-vous commencer votre essai ?"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5143
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.pricing_unavailable', '{"en": "Pricing Unavailable", "es": "Precios no disponibles", "fr": "Tarification indisponible"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5144
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.monthly', '{"en": "Monthly", "es": "Mensual", "fr": "Mensuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5145
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.annual', '{"en": "Annual", "es": "Anual", "fr": "Annuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5146
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.lifetime', '{"en": "Lifetime", "es": "De por vida", "fr": "À vie"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5147
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.year', '{"en": "year", "es": "año", "fr": "an"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5148
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.month', '{"en": "month", "es": "mes", "fr": "mois"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5149
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_no_card', '{"en": "Start Free Trial (No card required)", "es": "Comenzar prueba gratuita (Sin tarjeta)", "fr": "Commencer l''essai gratuit (Sans carte requise)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5150
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_with_card', '{"en": "Enter Payment Details Now (Still get full trial length free)", "es": "Ingresar detalles de pago ahora (Aún obtienes toda la duración de la prueba gratis)", "fr": "Entrer les détails de paiement maintenant (Vous bénéficiez toujours de toute la durée de l''essai gratuitement)"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5151
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_trial_with_card_help', '{"en": "You will not be billed until the trial ends. Cancel anytime.", "es": "No se te cobrará hasta que termine la prueba. Cancela en cualquier momento.", "fr": "Vous ne serez pas facturé avant la fin de l''essai. Annulez à tout moment."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5152
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.choose_your_options', '{"en": "Choose Your Options", "fr": "Choisissez vos options"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5153
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.variant_availability_help', '{"en": "Select a combination to resolve the exact variant price and availability.", "fr": "Selectionnez une combinaison pour afficher le prix exact et la disponibilite de la variante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5154
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.in_stock', '{"en": "{count} in stock", "fr": "{count} en stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5155
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.out_of_stock', '{"en": "Out of stock", "fr": "Rupture de stock"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5156
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.select_options', '{"en": "Select Options", "fr": "Choisir des options"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5157
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.variant_selection_required', '{"en": "Select one term from every dropdown to resolve a variation.", "fr": "Selectionnez une valeur dans chaque liste pour afficher la variante correspondante."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5158
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.tax_calculated_on_stripe', '{"en": "Calculated on Stripe", "es": "Calculado en Stripe", "fr": "Calculé sur Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5159
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_stripe_tax_finalized_notice', '{"en": "Tax will be finalized by Stripe Tax on the payment step.", "es": "El impuesto se finalizará con Stripe Tax en el paso de pago.", "fr": "La taxe sera finalisée par Stripe Tax à l''étape du paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5160
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('branding', '{"en": "Branding", "fr": "Image de marque"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5161
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('company_name', '{"en": "Company name", "fr": "Nom de l''entreprise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5162
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice', '{"en": "Invoice", "fr": "Facture"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5163
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice_number', '{"en": "Invoice #", "fr": "Facture no"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5164
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('paid_on', '{"en": "Paid on", "fr": "Paye le"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5165
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('bill_to', '{"en": "Bill to", "fr": "Facturer a"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5166
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ship_to', '{"en": "Ship to", "fr": "Livrer a"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5167
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('print_invoice', '{"en": "Print / Save as PDF", "fr": "Imprimer / Enregistrer en PDF"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5168
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('tax_registrations', '{"en": "Tax registrations", "fr": "Inscriptions fiscales"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5169
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('invoice_settings', '{"en": "Invoice settings", "fr": "Parametres de facture"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5170
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('business_name', '{"en": "Business name", "fr": "Nom de l''entreprise"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5171
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_number', '{"en": "Order #", "fr": "Commande no"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5172
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('print_invoice_help', '{"en": "Use your browser print dialog to save this invoice as a PDF.", "fr": "Utilisez la boite de dialogue d''impression de votre navigateur pour enregistrer cette facture en PDF."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5173
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('return_home', '{"en": "Return to Home", "fr": "Retour a l''accueil"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5174
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('receipt_finalizing', '{"en": "Finalizing your invoice and payment details...", "fr": "Finalisation de votre facture et des details du paiement..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5175
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('receipt_not_ready', '{"en": "Your invoice will appear here once the payment sync is complete.", "fr": "Votre facture apparaitra ici une fois la synchronisation du paiement terminee."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5176
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('tax_breakdown', '{"en": "Tax breakdown", "fr": "Detail des taxes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5177
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('amount', '{"en": "Amount", "fr": "Montant"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5178
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('price', '{"en": "Price", "fr": "Prix"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5179
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('from', '{"en": "From", "fr": "De"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5180
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('account_navigation', '{"en": "Account", "fr": "Compte"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5181
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('account_orders', '{"en": "Orders", "fr": "Commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5182
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('change_my_password', '{"en": "Change my password", "fr": "Changer mon mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5183
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_title', '{"en": "My orders", "fr": "Mes commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5184
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_description', '{"en": "Review your recent purchases and open printable invoices.", "fr": "Consultez vos achats récents et ouvrez vos factures imprimables."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5185
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_orders_empty', '{"en": "You do not have any orders yet.", "fr": "Vous n''avez pas encore de commandes."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5186
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_detail_title', '{"en": "Order invoice", "fr": "Facture de commande"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5187
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_detail_description', '{"en": "Review and print your finalized invoice.", "fr": "Consultez et imprimez votre facture finalisée."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5188
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_order_invoice_pending', '{"en": "The printable invoice will appear here once this order has been finalized.", "fr": "La facture imprimable apparaîtra ici une fois que cette commande aura été finalisée."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5189
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_password_title', '{"en": "Change your password", "fr": "Changer votre mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5190
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('profile_password_description', '{"en": "Update your account password without leaving your profile.", "fr": "Mettez à jour le mot de passe de votre compte sans quitter votre profil."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5191
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('new_password', '{"en": "New password", "fr": "Nouveau mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5192
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('confirm_new_password', '{"en": "Confirm new password", "fr": "Confirmer le nouveau mot de passe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5193
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password_updated_success', '{"en": "Password updated successfully.", "fr": "Mot de passe mis à jour avec succès."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5194
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password_update_failed', '{"en": "Password update failed.", "fr": "La mise à jour du mot de passe a échoué."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5195
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('passwords_do_not_match', '{"en": "Passwords do not match.", "fr": "Les mots de passe ne correspondent pas."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5196
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_date', '{"en": "Date", "fr": "Date"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5197
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_paid', '{"en": "Paid", "fr": "Payée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5198
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_pending', '{"en": "Pending", "fr": "En attente"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5199
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_trial', '{"en": "Trial", "fr": "Essai"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5200
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_shipped', '{"en": "Shipped", "fr": "Expédiée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5201
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_cancelled', '{"en": "Cancelled", "fr": "Annulée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5202
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('order_status_refunded', '{"en": "Refunded", "fr": "Remboursée"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5203
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('back_to_orders', '{"en": "Back to orders", "fr": "Retour aux commandes"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5204
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_trial_started', '{"en": "Trial started", "fr": "Essai demarre"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5205
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_order_pending', '{"en": "Order pending", "fr": "Commande en attente"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5206
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('select_an_option', '{"en": "Select an option", "es": "Selecciona una opcion", "fr": "Selectionnez une option"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5207
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_method_required', '{"en": "Please select a shipping method before continuing.", "es": "Selecciona un metodo de envio antes de continuar.", "fr": "Veuillez selectionner un mode de livraison avant de continuer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5208
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.waiting_on_address_info', '{"en": "Complete your shipping address to view available shipping options.", "es": "Completa tu direccion de envio para ver las opciones de envio disponibles.", "fr": "Completez votre adresse de livraison pour voir les options de livraison disponibles."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5209
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.calculating_shipping', '{"en": "Calculating shipping...", "es": "Calculando el envio...", "fr": "Calcul de la livraison..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5210
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_checkout_stripe_description', '{"en": "This simulated step represents the Stripe checkout for physical products.", "es": "Este paso simulado representa el pago de Stripe para productos fisicos.", "fr": "Cette etape simulee represente le paiement Stripe pour les produits physiques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5211
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.sandbox_checkout_freemius_description', '{"en": "This simulated step represents the Freemius checkout for digital products.", "es": "Este paso simulado representa el pago de Freemius para productos digitales.", "fr": "Cette etape simulee represente le paiement Freemius pour les produits numeriques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5212
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_label', '{"en": "Digital", "es": "Digital", "fr": "Numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5213
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_label', '{"en": "Physical", "es": "Fisico", "fr": "Physique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5214
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_products', '{"en": "Physical products", "es": "Productos fisicos", "fr": "Produits physiques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5215
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_products', '{"en": "Digital products", "es": "Productos digitales", "fr": "Produits numeriques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5216
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.estimated_total', '{"en": "Estimated total", "es": "Total estimado", "fr": "Total estime"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5217
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.stripe_checkout_title', '{"en": "Stripe Checkout", "es": "Pago con Stripe", "fr": "Paiement Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5218
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.stripe_checkout_description', '{"en": "Pay for physical products in one Stripe checkout session.", "es": "Paga los productos fisicos en una sola sesion de Stripe.", "fr": "Payez les produits physiques dans une seule session Stripe."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5219
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_count_one', '{"en": "{count} item", "es": "{count} articulo", "fr": "{count} article"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5220
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.item_count_other', '{"en": "{count} items", "es": "{count} articulos", "fr": "{count} articles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5221
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.physical_subtotal', '{"en": "Physical subtotal", "es": "Subtotal fisico", "fr": "Sous-total physique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5222
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.total_on_stripe', '{"en": "Total on Stripe", "es": "Total en Stripe", "fr": "Total sur Stripe"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5223
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_physical_products', '{"en": "Checkout Physical Products", "es": "Pagar productos fisicos", "fr": "Payer les produits physiques"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5224
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_taxes_collected_on_stripe', '{"en": "Shipping and taxes are only collected during the Stripe step for physical products.", "es": "El envio y los impuestos solo se cobran durante el paso de Stripe para productos fisicos.", "fr": "La livraison et les taxes sont percues uniquement a l''etape Stripe pour les produits physiques."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5225
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_checkout_title', '{"en": "Freemius Checkout", "es": "Pago con Freemius", "fr": "Paiement Freemius"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5226
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_checkout_description', '{"en": "Digital products use the Freemius checkout flow.", "es": "Los productos digitales usan el flujo de pago de Freemius.", "fr": "Les produits numeriques utilisent le flux de paiement Freemius."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5227
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_count_one', '{"en": "{count} license", "es": "{count} licencia", "fr": "{count} licence"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5228
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.license_count_other', '{"en": "{count} licenses", "es": "{count} licencias", "fr": "{count} licences"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5229
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_monthly', '{"en": "Monthly subscription", "es": "Suscripcion mensual", "fr": "Abonnement mensuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5230
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_annual', '{"en": "Annual subscription", "es": "Suscripcion anual", "fr": "Abonnement annuel"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5231
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_cycle_lifetime', '{"en": "Lifetime subscription", "es": "Suscripcion de por vida", "fr": "Abonnement a vie"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5232
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_product', '{"en": "Checkout {title}", "es": "Pagar {title}", "fr": "Paiement de {title}"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5233
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_digital_product', '{"en": "Checkout Digital Product", "es": "Pagar producto digital", "fr": "Payer le produit numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5234
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.digital_subtotal', '{"en": "Digital subtotal", "es": "Subtotal digital", "fr": "Sous-total numerique"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5235
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_multi_checkout_notice', '{"en": "Freemius licenses are completed one at a time, so each digital product gets its own checkout action.", "es": "Las licencias de Freemius se completan una por una, por lo que cada producto digital tiene su propia accion de pago.", "fr": "Les licences Freemius se finalisent une a la fois, donc chaque produit numerique a sa propre action de paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5236
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.freemius_tax_notice', '{"en": "Taxes and compliance for digital products are handled inside the Freemius checkout.", "es": "Los impuestos y la conformidad para los productos digitales se gestionan dentro del pago de Freemius.", "fr": "Les taxes et la conformite pour les produits numeriques sont gerees dans le paiement Freemius."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5237
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('continue_checkout', '{"en": "Continue Checkout", "fr": "Continuer le paiement"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5238
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('checkout_success_sync_failed', '{"en": "We could not finalize your invoice yet. Please refresh shortly.", "fr": "Nous n''avons pas encore pu finaliser votre facture. Veuillez rafraichir la page sous peu."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5239
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_country_required', '{"en": "Country is required to calculate shipping.", "fr": "Le pays est requis pour calculer la livraison."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5240
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_title', '{"en": "Check your inbox", "fr": "Vérifiez votre boîte de réception"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5241
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.shipping_calculation_failed', '{"en": "We couldn''t calculate shipping right now. Please try again.", "fr": "Nous n''avons pas pu calculer la livraison pour le moment. Veuillez reessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5242
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_license_inactive', '{"en": "The ecommerce module license is inactive.", "fr": "La licence du module ecommerce est inactive."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5243
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_invalid_items', '{"en": "Your checkout items could not be processed.", "fr": "Les articles de votre commande n''ont pas pu etre traites."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5244
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_provider_items_required', '{"en": "Each checkout step must include items assigned to a payment provider.", "fr": "Chaque etape de paiement doit inclure des articles associes a un fournisseur de paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5245
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_mixed_provider_steps', '{"en": "Products with different payment providers must be purchased in separate checkout steps.", "fr": "Les produits utilisant differents fournisseurs de paiement doivent etre achetes en etapes separees."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5246
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_freemius_single_item', '{"en": "Freemius products must be purchased one at a time.", "fr": "Les produits Freemius doivent etre achetes un a la fois."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5247
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_billing_address_required', '{"en": "A billing address is required to continue checkout.", "fr": "Une adresse de facturation est requise pour continuer le paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5248
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_internal_server_error', '{"en": "Something went wrong while preparing your checkout. Please try again.", "fr": "Une erreur s''est produite lors de la preparation de votre paiement. Veuillez reessayer."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5249
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_missing_session_id', '{"en": "We couldn''t find a checkout session to finalize.", "fr": "Nous n''avons pas trouve de session de paiement a finaliser."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5250
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_payment_pending', '{"en": "Your payment is still pending.", "fr": "Votre paiement est toujours en attente."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5251
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_order_not_found', '{"en": "We couldn''t find the order linked to this checkout.", "fr": "Nous n''avons pas trouve la commande liee a ce paiement."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5252
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_invalid_reference', '{"en": "This checkout reference can''t be finalized from this page.", "fr": "Cette reference de paiement ne peut pas etre finalisee depuis cette page."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5253
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_inventory_update_failed', '{"en": "We couldn''t update inventory for this order.", "fr": "Nous n''avons pas pu mettre a jour l''inventaire pour cette commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5254
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.checkout_success_status_update_failed', '{"en": "We couldn''t update the order status.", "fr": "Nous n''avons pas pu mettre a jour le statut de la commande."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5255
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.unknown_error', '{"en": "Unknown error", "es": "Error desconocido", "fr": "Erreur inconnue"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5256
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.get_license', '{"en": "Get License", "es": "Obtener Licencia", "fr": "Obtenir la licence"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5257
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart_success', '{"en": "{item} added to your cart.", "es": "{item} añadido al carrito.", "fr": "{item} ajouté à votre panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5258
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.added_to_cart_error', '{"en": "Could not add item to cart.", "es": "No se pudo añadir el artículo al carrito.", "fr": "Impossible d''ajouter l''article au panier."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5259
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_product', '{"en": "Edit Product", "fr": "Modifier le produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5260
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.trigger', '{"en": "Search", "fr": "Rechercher"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5261
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.title', '{"en": "Search", "fr": "Rechercher"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5262
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.description', '{"en": "Search published pages, posts, and products.", "fr": "Rechercher dans les pages, articles et produits publies."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5263
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.placeholder', '{"en": "Search...", "fr": "Rechercher..."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5264
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_all', '{"en": "All", "fr": "Tout"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5265
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_pages', '{"en": "Pages", "fr": "Pages"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5266
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_posts', '{"en": "Posts", "fr": "Articles"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5267
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.filter_products', '{"en": "Products", "fr": "Produits"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5268
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_page', '{"en": "Page", "fr": "Page"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5269
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_post', '{"en": "Post", "fr": "Article"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5270
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.result_product', '{"en": "Product", "fr": "Produit"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5271
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.recent', '{"en": "Recent", "fr": "Recents"}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5272
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.error_title', '{"en": "Search is unavailable.", "fr": "La recherche est indisponible."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5273
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.error_description', '{"en": "Please try again in a moment.", "fr": "Veuillez reessayer dans un instant."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5274
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.empty_title', '{"en": "No results found.", "fr": "Aucun resultat trouve."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5275
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('global_search.empty_description', '{"en": "Try another search term.", "fr": "Essayez un autre terme de recherche."}', '2026-07-03 17:52:15.459858+00', '2026-07-03 17:52:15.459858+00') ON CONFLICT DO NOTHING;
|
|
5276
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_in', '{"en": "Sign in", "fr": "Connexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5277
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_up', '{"en": "Sign up", "fr": "Inscription"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5278
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sign_out', '{"en": "Sign out", "fr": "Déconnexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5279
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('dont_have_account', '{"en": "Don''t have an account?", "fr": "Pas encore de compte ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5280
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('email', '{"en": "Email", "fr": "Email"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5281
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('you_at_example_com', '{"en": "you@example.com", "fr": "vous@example.com"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5282
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('password', '{"en": "Password", "fr": "Mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5283
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('forgot_password', '{"en": "Forgot Password?", "fr": "Mot de passe oublié ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5284
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('your_password', '{"en": "Your password", "fr": "Votre mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5285
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('signing_in_pending', '{"en": "Signing In...", "fr": "Connexion en cours..."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5286
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('already_have_account', '{"en": "Already have an account?", "fr": "Déjà un compte ?"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5287
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('signing_up_pending', '{"en": "Signing up...", "fr": "Inscription en cours..."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5288
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reset_password', '{"en": "Reset Password", "fr": "Réinitialiser le mot de passe"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5289
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_form_description', '{"en": "Create your account in one quick step. We''ll email you a confirmation link before you finish your profile.", "fr": "Créez votre compte en une étape rapide. Nous vous enverrons un lien de confirmation avant de terminer votre profil."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5290
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_badge', '{"en": "Signup received", "fr": "Inscription reçue"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5291
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_confirm', '{"en": "Open the email we sent and confirm your address.", "fr": "Ouvrez l''e-mail envoyé et confirmez votre adresse."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5292
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_profile', '{"en": "After confirmation, we''ll bring you to your profile to finish setup.", "fr": "Après confirmation, nous vous amènerons à votre profil pour terminer la configuration."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5293
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_success_step_spam', '{"en": "If it doesn''t arrive soon, check spam, junk, or promotions.", "fr": "S''il n''arrive pas bientôt, vérifiez les dossiers spam, indésirables ou promotions."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5294
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_use_different_email', '{"en": "Use a different email", "fr": "Utiliser une autre adresse e-mail"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5295
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.back_to_sign_in', '{"en": "Back to sign in", "fr": "Retour à la connexion"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5296
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('auth.signup_rate_limit', '{"en": "You''re trying too quickly. Please wait a moment before requesting another confirmation email.", "fr": "Vous allez trop vite. Veuillez attendre un instant avant de demander un nouvel e-mail de confirmation."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5297
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('blog_prefix', '{"en": "article", "fr": "article"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5298
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_page', '{"en": "Edit Page", "fr": "Éditer la page"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5299
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('edit_post', '{"en": "Edit Post", "fr": "Éditer l''article"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5300
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('open_main_menu', '{"en": "Open main menu", "fr": "Ouvrir le menu principal"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5301
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('mobile_navigation_menu', '{"en": "Mobile navigation menu", "fr": "Menu de navigation mobile"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5302
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('cms_dashboard', '{"en": "CMS Dashboard", "fr": "Tableau de bord CMS"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5303
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('update_env_file_warning', '{"en": "Please update .env.local file with anon key and url", "fr": "Veuillez mettre à jour .env.local avec l''anon key et l''URL"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5304
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('greeting', '{"en": "Hey, {username}!", "fr": "Salut, {username} !"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5305
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_switcher', '{"en": "Theme Switcher", "fr": "Sélecteur de thème"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5306
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_light', '{"en": "Light", "fr": "Clair"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5307
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_dark', '{"en": "Dark", "fr": "Sombre"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5308
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_system', '{"en": "System", "fr": "Système"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5309
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('theme_vibrant', '{"en": "Vibrant", "fr": "Vibrant"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5310
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('sandbox_mode_banner', '{"en": "Sandbox Mode: Data is public and resets every 15 minutes.", "fr": "Mode Sandbox : Les données sont publiques et réinitialisées toutes les 15 minutes."}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5311
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_access_title', '{"en": "Demo Access", "fr": "Accès Démo"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5312
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_access_desc', '{"en": "This is a demo site. You may use the following credentials to access the admin section:", "fr": "Ceci est un site de démonstration. Vous pouvez utiliser les identifiants suivants pour accéder à l''administration :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5313
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_user_label', '{"en": "User:", "fr": "Utilisateur :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5314
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('demo_password_label', '{"en": "Password:", "fr": "Mot de passe :"}', '2026-07-03 17:52:15.479414+00', '2026-07-03 17:52:15.479414+00') ON CONFLICT DO NOTHING;
|
|
5315
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('ecommerce.on_sale', '{"en": "On Sale", "es": "En oferta", "fr": "En solde"}', '2026-07-03 17:52:15.69428+00', '2026-07-03 17:52:15.69428+00') ON CONFLICT DO NOTHING;
|
|
5316
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('remember_this_device', '{"en": "Remember this device", "fr": "Se souvenir de cet appareil"}', '2026-07-03 17:52:15.699946+00', '2026-07-03 17:52:15.699946+00') ON CONFLICT DO NOTHING;
|
|
5317
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.aria_label', '{"en": "Privacy consent", "fr": "Consentement à la confidentialité"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5318
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.title', '{"en": "We value your privacy", "fr": "Nous respectons votre vie privée"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5319
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.description_before_policy_link', '{"en": "We use only essential cookies by default. With your consent we also use analytics to improve the site. See our", "fr": "Nous utilisons seulement les témoins essentiels par défaut. Avec votre consentement, nous utilisons aussi l''analytique pour améliorer le site. Consultez notre"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5320
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.privacy_policy_link', '{"en": "Privacy Policy", "fr": "politique de confidentialité"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5321
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.description_after_policy_link', '{"en": ".", "fr": "."}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5322
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.privacy_policy_href', '{"en": "/privacy-policy", "fr": "/politique-de-confidentialite"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5323
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.necessary_label', '{"en": "Necessary", "fr": "Nécessaires"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5324
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.necessary_help', '{"en": "Always on", "fr": "Toujours actifs"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5325
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.analytics_label', '{"en": "Analytics", "fr": "Analytique"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5326
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.analytics_help', '{"en": "Usage insights", "fr": "Statistiques d''utilisation"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5327
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.marketing_label', '{"en": "Marketing", "fr": "Marketing"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5328
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.marketing_help', '{"en": "Personalized content", "fr": "Contenu personnalisé"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5329
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.save_choices', '{"en": "Save choices", "fr": "Enregistrer mes choix"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5330
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.accept_all', '{"en": "Accept all", "fr": "Tout accepter"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5331
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.reject_all', '{"en": "Reject all", "fr": "Tout refuser"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5332
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.hide_options', '{"en": "Hide options", "fr": "Masquer les options"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5333
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('privacy.consent.manage_options', '{"en": "Manage options", "fr": "Gérer les options"}', '2026-07-03 17:52:15.805991+00', '2026-07-03 17:52:15.805991+00') ON CONFLICT DO NOTHING;
|
|
5334
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.customer_reviews', '{"en": "Customer Reviews", "fr": "Avis clients"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5335
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.share_thoughts', '{"en": "Share your thoughts and experience with this product.", "fr": "Partagez vos impressions et votre expérience avec ce produit."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5336
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.write_review', '{"en": "Write a Review", "fr": "Rédiger un avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5337
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.cancel_review', '{"en": "Cancel Review", "fr": "Annuler l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5338
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.login_to_write', '{"en": "Please log in to write a review.", "fr": "Veuillez vous connecter pour rédiger un avis."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5339
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.write_your_review', '{"en": "Write your review", "fr": "Rédigez votre avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5340
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.rating', '{"en": "Rating", "fr": "Note"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5341
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.description', '{"en": "Review Description", "fr": "Description de l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5342
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.description_placeholder', '{"en": "What did you like or dislike? How does it perform?", "fr": "Qu''avez-vous aimé ou déploré ? Comment se comporte-t-il ?"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5343
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.submit_review', '{"en": "Submit Review", "fr": "Soumettre l''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5344
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.submitting', '{"en": "Submitting...", "fr": "Envoi en cours..."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5345
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.success_pending', '{"en": "Your review has been submitted successfully and is pending moderation.", "fr": "Votre avis a été soumis avec succès et est en attente de modération."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5346
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.cancel', '{"en": "Cancel", "fr": "Annuler"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5347
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.helpful', '{"en": "Helpful", "fr": "Utile"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5348
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.no_reviews', '{"en": "No reviews yet", "fr": "Aucun avis pour le moment"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5349
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.be_the_first', '{"en": "There are no reviews for this product yet. Be the first to write one!", "fr": "Il n''y a pas encore d''avis sur ce produit. Soyez le premier à en rédiger un !"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5350
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.load_more', '{"en": "Load More Reviews", "fr": "Charger plus d''avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5351
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.review_count_one', '{"en": "{count} review", "fr": "{count} avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5352
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('reviews.review_count_other', '{"en": "{count} reviews", "fr": "{count} avis"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5353
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.discussion', '{"en": "Discussion & Comments", "fr": "Discussion & Commentaires"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5354
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.join_conversation', '{"en": "Join the conversation and express your thoughts.", "fr": "Rejoignez la conversation et exprimez vos pensées."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5355
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.write_comment', '{"en": "Write a Comment", "fr": "Écrire un commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5356
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.cancel_comment', '{"en": "Cancel Comment", "fr": "Annuler le commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5357
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.login_to_write', '{"en": "Please log in to write a comment.", "fr": "Veuillez vous connecter pour écrire un commentaire."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5358
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.join_discussion', '{"en": "Join the Discussion", "fr": "Rejoindre la discussion"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5359
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.your_message', '{"en": "Your Message", "fr": "Votre message"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5360
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.message_placeholder', '{"en": "What are your thoughts on this article?", "fr": "Quelles sont vos pensées sur cet article ?"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5361
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.post_comment', '{"en": "Post Comment", "fr": "Publier le commentaire"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5362
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.success_pending', '{"en": "Your comment has been submitted successfully and is pending moderation.", "fr": "Votre commentaire a été soumis avec succès et est en attente de modération."}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5363
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.like', '{"en": "Like", "fr": "J''aime"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5364
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.no_comments', '{"en": "No comments yet", "fr": "Aucun commentaire pour le moment"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5365
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.be_the_first', '{"en": "Be the first to share your thoughts!", "fr": "Soyez le premier à partager vos pensées !"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5366
|
+
INSERT INTO public.translations (key, translations, created_at, updated_at) VALUES ('comments.load_more', '{"en": "Load More Comments", "fr": "Charger plus de commentaires"}', '2026-07-03 17:52:15.834477+00', '2026-07-03 17:52:15.834477+00') ON CONFLICT DO NOTHING;
|
|
5367
|
+
SELECT pg_catalog.setval('public.blocks_id_seq', COALESCE((SELECT MAX(id) FROM public.blocks), 1), true);
|
|
5368
|
+
SELECT pg_catalog.setval('public.languages_id_seq', COALESCE((SELECT MAX(id) FROM public.languages), 1), true);
|
|
5369
|
+
SELECT pg_catalog.setval('public.navigation_items_id_seq', COALESCE((SELECT MAX(id) FROM public.navigation_items), 1), true);
|
|
5370
|
+
SELECT pg_catalog.setval('public.pages_id_seq', COALESCE((SELECT MAX(id) FROM public.pages), 1), true);
|
|
5371
|
+
SELECT pg_catalog.setval('public.posts_id_seq', COALESCE((SELECT MAX(id) FROM public.posts), 1), true);
|
|
5372
5372
|
|
|
5373
5373
|
|
|
5374
5374
|
-- >>> FROM: 00000000000004_default_logo_email_safe.sql <<<
|
|
@@ -5415,125 +5415,125 @@ ALTER TABLE public.products ADD COLUMN IF NOT EXISTS custom_canonical text;
|
|
|
5415
5415
|
|
|
5416
5416
|
|
|
5417
5417
|
-- >>> FROM: 00000000000006_home_live_demo_promo.sql <<<
|
|
5418
|
-
-- 00000000000006_home_sandbox_promo.sql
|
|
5419
|
-
-- Adds a "Live Demo" promo section to the English (slug 'home') and French
|
|
5420
|
-
-- (slug 'accueil') home pages that drives visitors to the public sandbox at
|
|
5421
|
-
-- https://cms.nextblock.dev -- production (nextblock.dev) never mentioned it before.
|
|
5422
|
-
--
|
|
5423
|
-
-- The section is inserted right after the hero (order 1); existing home-page blocks
|
|
5424
|
-
-- shift down by one so relative order is preserved. Each block carries a sentinel
|
|
5425
|
-
-- comment (nb-sandbox-promo) inside its HTML so the sandbox reset route can strip it
|
|
5426
|
-
-- there: a CTA pointing at the sandbox is pointless *inside* the sandbox itself.
|
|
5427
|
-
--
|
|
5428
|
-
-- Forward-only and idempotent: the NOT EXISTS sentinel guard makes a re-run a no-op,
|
|
5429
|
-
-- and page lookups are by (language code, slug) so explicit IDs never collide with
|
|
5430
|
-
-- user-created blocks on a live database.
|
|
5431
|
-
|
|
5432
|
-
DO $body$
|
|
5433
|
-
DECLARE
|
|
5434
|
-
v_en_lang integer;
|
|
5435
|
-
v_fr_lang integer;
|
|
5436
|
-
v_en_page integer;
|
|
5437
|
-
v_fr_page integer;
|
|
5438
|
-
BEGIN
|
|
5439
|
-
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5440
|
-
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5441
|
-
|
|
5442
|
-
-- English home page
|
|
5443
|
-
SELECT id INTO v_en_page
|
|
5444
|
-
FROM public.pages
|
|
5445
|
-
WHERE slug = 'home' AND language_id = v_en_lang
|
|
5446
|
-
ORDER BY id
|
|
5447
|
-
LIMIT 1;
|
|
5448
|
-
|
|
5449
|
-
IF v_en_page IS NOT NULL AND NOT EXISTS (
|
|
5450
|
-
SELECT 1 FROM public.blocks
|
|
5451
|
-
WHERE page_id = v_en_page AND content::text LIKE '%nb-sandbox-promo%'
|
|
5452
|
-
) THEN
|
|
5453
|
-
UPDATE public.blocks
|
|
5454
|
-
SET "order" = "order" + 1
|
|
5455
|
-
WHERE page_id = v_en_page AND "order" >= 1;
|
|
5456
|
-
|
|
5457
|
-
INSERT INTO public.blocks (page_id, language_id, block_type, content, "order")
|
|
5458
|
-
VALUES (v_en_page, v_en_lang, 'section', $en$
|
|
5459
|
-
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets every hour, so explore freely and break whatever you like.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-gradient-to-r from-blue-600 to-cyan-500 hover:from-blue-500 hover:to-cyan-400 shadow-lg shadow-blue-500/25 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-300'>demo@nextblock.
|
|
5460
|
-
$en$::jsonb, 1);
|
|
5461
|
-
END IF;
|
|
5462
|
-
|
|
5463
|
-
-- French home page
|
|
5464
|
-
SELECT id INTO v_fr_page
|
|
5465
|
-
FROM public.pages
|
|
5466
|
-
WHERE slug = 'accueil' AND language_id = v_fr_lang
|
|
5467
|
-
ORDER BY id
|
|
5468
|
-
LIMIT 1;
|
|
5469
|
-
|
|
5470
|
-
IF v_fr_page IS NOT NULL AND NOT EXISTS (
|
|
5471
|
-
SELECT 1 FROM public.blocks
|
|
5472
|
-
WHERE page_id = v_fr_page AND content::text LIKE '%nb-sandbox-promo%'
|
|
5473
|
-
) THEN
|
|
5474
|
-
UPDATE public.blocks
|
|
5475
|
-
SET "order" = "order" + 1
|
|
5476
|
-
WHERE page_id = v_fr_page AND "order" >= 1;
|
|
5477
|
-
|
|
5478
|
-
INSERT INTO public.blocks (page_id, language_id, block_type, content, "order")
|
|
5479
|
-
VALUES (v_fr_page, v_fr_lang, 'section', $fr$
|
|
5480
|
-
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire à propos de NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque heure : explorez librement et cassez tout ce que vous voulez.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-gradient-to-r from-blue-600 to-cyan-500 hover:from-blue-500 hover:to-cyan-400 shadow-lg shadow-blue-500/25 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-300'>demo@nextblock.
|
|
5481
|
-
$fr$::jsonb, 1);
|
|
5482
|
-
END IF;
|
|
5483
|
-
END
|
|
5484
|
-
$body$;
|
|
5418
|
+
-- 00000000000006_home_sandbox_promo.sql
|
|
5419
|
+
-- Adds a "Live Demo" promo section to the English (slug 'home') and French
|
|
5420
|
+
-- (slug 'accueil') home pages that drives visitors to the public sandbox at
|
|
5421
|
+
-- https://cms.nextblock.dev -- production (nextblock.dev) never mentioned it before.
|
|
5422
|
+
--
|
|
5423
|
+
-- The section is inserted right after the hero (order 1); existing home-page blocks
|
|
5424
|
+
-- shift down by one so relative order is preserved. Each block carries a sentinel
|
|
5425
|
+
-- comment (nb-sandbox-promo) inside its HTML so the sandbox reset route can strip it
|
|
5426
|
+
-- there: a CTA pointing at the sandbox is pointless *inside* the sandbox itself.
|
|
5427
|
+
--
|
|
5428
|
+
-- Forward-only and idempotent: the NOT EXISTS sentinel guard makes a re-run a no-op,
|
|
5429
|
+
-- and page lookups are by (language code, slug) so explicit IDs never collide with
|
|
5430
|
+
-- user-created blocks on a live database.
|
|
5431
|
+
|
|
5432
|
+
DO $body$
|
|
5433
|
+
DECLARE
|
|
5434
|
+
v_en_lang integer;
|
|
5435
|
+
v_fr_lang integer;
|
|
5436
|
+
v_en_page integer;
|
|
5437
|
+
v_fr_page integer;
|
|
5438
|
+
BEGIN
|
|
5439
|
+
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5440
|
+
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5441
|
+
|
|
5442
|
+
-- English home page
|
|
5443
|
+
SELECT id INTO v_en_page
|
|
5444
|
+
FROM public.pages
|
|
5445
|
+
WHERE slug = 'home' AND language_id = v_en_lang
|
|
5446
|
+
ORDER BY id
|
|
5447
|
+
LIMIT 1;
|
|
5448
|
+
|
|
5449
|
+
IF v_en_page IS NOT NULL AND NOT EXISTS (
|
|
5450
|
+
SELECT 1 FROM public.blocks
|
|
5451
|
+
WHERE page_id = v_en_page AND content::text LIKE '%nb-sandbox-promo%'
|
|
5452
|
+
) THEN
|
|
5453
|
+
UPDATE public.blocks
|
|
5454
|
+
SET "order" = "order" + 1
|
|
5455
|
+
WHERE page_id = v_en_page AND "order" >= 1;
|
|
5456
|
+
|
|
5457
|
+
INSERT INTO public.blocks (page_id, language_id, block_type, content, "order")
|
|
5458
|
+
VALUES (v_en_page, v_en_lang, 'section', $en$
|
|
5459
|
+
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets every hour, so explore freely and break whatever you like.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-gradient-to-r from-blue-600 to-cyan-500 hover:from-blue-500 hover:to-cyan-400 shadow-lg shadow-blue-500/25 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-300'>password</span> · Resets hourly</p>"}}],[{"block_type":"text","content":{"html_content":"<div class='rounded-3xl overflow-hidden border border-white/10 bg-white/5 backdrop-blur-xl shadow-2xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>A living NextBlock™ install — everything here is real and clickable:</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Full block editor</strong> with slash commands & drag-and-drop.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Bilingual</strong> English / French content management.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>A complete demo storefront</strong> with live checkout.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Wipes clean every hour</strong> — always a fresh start.</span></li></ul></div></div>"}}]]}
|
|
5460
|
+
$en$::jsonb, 1);
|
|
5461
|
+
END IF;
|
|
5462
|
+
|
|
5463
|
+
-- French home page
|
|
5464
|
+
SELECT id INTO v_fr_page
|
|
5465
|
+
FROM public.pages
|
|
5466
|
+
WHERE slug = 'accueil' AND language_id = v_fr_lang
|
|
5467
|
+
ORDER BY id
|
|
5468
|
+
LIMIT 1;
|
|
5469
|
+
|
|
5470
|
+
IF v_fr_page IS NOT NULL AND NOT EXISTS (
|
|
5471
|
+
SELECT 1 FROM public.blocks
|
|
5472
|
+
WHERE page_id = v_fr_page AND content::text LIKE '%nb-sandbox-promo%'
|
|
5473
|
+
) THEN
|
|
5474
|
+
UPDATE public.blocks
|
|
5475
|
+
SET "order" = "order" + 1
|
|
5476
|
+
WHERE page_id = v_fr_page AND "order" >= 1;
|
|
5477
|
+
|
|
5478
|
+
INSERT INTO public.blocks (page_id, language_id, block_type, content, "order")
|
|
5479
|
+
VALUES (v_fr_page, v_fr_lang, 'section', $fr$
|
|
5480
|
+
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire à propos de NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque heure : explorez librement et cassez tout ce que vous voulez.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-gradient-to-r from-blue-600 to-cyan-500 hover:from-blue-500 hover:to-cyan-400 shadow-lg shadow-blue-500/25 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-300'>password</span> · Réinitialisé chaque heure</p>"}}],[{"block_type":"text","content":{"html_content":"<div class='rounded-3xl overflow-hidden border border-white/10 bg-white/5 backdrop-blur-xl shadow-2xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>Une installation NextBlock™ bien vivante — tout ici est réel et cliquable :</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Éditeur de blocs complet</strong> : commandes slash et glisser-déposer.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Gestion bilingue</strong> du contenu français / anglais.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Une boutique de démonstration complète</strong> avec paiement réel.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Remis à zéro chaque heure</strong> — toujours un nouveau départ.</span></li></ul></div></div>"}}]]}
|
|
5481
|
+
$fr$::jsonb, 1);
|
|
5482
|
+
END IF;
|
|
5483
|
+
END
|
|
5484
|
+
$body$;
|
|
5485
5485
|
|
|
5486
5486
|
|
|
5487
5487
|
-- >>> FROM: 00000000000007_home_live_demo_promo_copy_fix.sql <<<
|
|
5488
|
-
-- 00000000000007_home_live_demo_promo_copy_fix.sql
|
|
5489
|
-
-- Corrects the "Live Demo" promo that migration 006 seeded on the EN (slug 'home')
|
|
5490
|
-
-- and FR (slug 'accueil') home pages. 006 was already applied to production and the
|
|
5491
|
-
-- sandbox, so per the append-only rule this ships the corrections as a forward-only
|
|
5492
|
-
-- UPDATE instead of editing 006 (which would never re-run and would desync the file
|
|
5493
|
-
-- from what was actually applied).
|
|
5494
|
-
--
|
|
5495
|
-
-- Fixes: reset cadence "hourly" -> "daily" (the reset cron in vercel.json is daily,
|
|
5496
|
-
-- 0 3 * * *, not hourly); FR "avec paiement reel" -> "un parcours de paiement complet"
|
|
5497
|
-
-- (sandbox checkout is simulated); FR anglicism "lire a propos de" -> "lire des
|
|
5498
|
-
-- articles sur"; and an accessible WCAG-AA primary CTA (solid blue-600, was white on
|
|
5499
|
-
-- a low-contrast cyan gradient).
|
|
5500
|
-
--
|
|
5501
|
-
-- Idempotent: re-running sets identical content. Targets exactly the promo blocks via
|
|
5502
|
-
-- the nb-sandbox-promo sentinel, scoped by language. On the sandbox the promo is still
|
|
5503
|
-
-- stripped afterward by removeSandboxPromoSections in the reset-sandbox route.
|
|
5504
|
-
--
|
|
5505
|
-
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts
|
|
5506
|
-
-- excludes any migration whose filename contains "sandbox" from the reset bundle.
|
|
5507
|
-
|
|
5508
|
-
DO $body$
|
|
5509
|
-
DECLARE
|
|
5510
|
-
v_en_lang integer;
|
|
5511
|
-
v_fr_lang integer;
|
|
5512
|
-
BEGIN
|
|
5513
|
-
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5514
|
-
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5515
|
-
|
|
5516
|
-
UPDATE public.blocks
|
|
5517
|
-
SET content = $en$
|
|
5518
|
-
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets daily, so explore freely and break whatever you like.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-cyan-500/20 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-300'>demo@nextblock.
|
|
5519
|
-
$en$::jsonb,
|
|
5520
|
-
updated_at = now()
|
|
5521
|
-
WHERE block_type = 'section'
|
|
5522
|
-
AND page_id IS NOT NULL
|
|
5523
|
-
AND language_id = v_en_lang
|
|
5524
|
-
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5525
|
-
|
|
5526
|
-
UPDATE public.blocks
|
|
5527
|
-
SET content = $fr$
|
|
5528
|
-
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire des articles sur NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque jour : explorez librement et cassez tout ce que vous voulez.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-cyan-500/20 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-300'>demo@nextblock.
|
|
5529
|
-
$fr$::jsonb,
|
|
5530
|
-
updated_at = now()
|
|
5531
|
-
WHERE block_type = 'section'
|
|
5532
|
-
AND page_id IS NOT NULL
|
|
5533
|
-
AND language_id = v_fr_lang
|
|
5534
|
-
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5535
|
-
END
|
|
5536
|
-
$body$;
|
|
5488
|
+
-- 00000000000007_home_live_demo_promo_copy_fix.sql
|
|
5489
|
+
-- Corrects the "Live Demo" promo that migration 006 seeded on the EN (slug 'home')
|
|
5490
|
+
-- and FR (slug 'accueil') home pages. 006 was already applied to production and the
|
|
5491
|
+
-- sandbox, so per the append-only rule this ships the corrections as a forward-only
|
|
5492
|
+
-- UPDATE instead of editing 006 (which would never re-run and would desync the file
|
|
5493
|
+
-- from what was actually applied).
|
|
5494
|
+
--
|
|
5495
|
+
-- Fixes: reset cadence "hourly" -> "daily" (the reset cron in vercel.json is daily,
|
|
5496
|
+
-- 0 3 * * *, not hourly); FR "avec paiement reel" -> "un parcours de paiement complet"
|
|
5497
|
+
-- (sandbox checkout is simulated); FR anglicism "lire a propos de" -> "lire des
|
|
5498
|
+
-- articles sur"; and an accessible WCAG-AA primary CTA (solid blue-600, was white on
|
|
5499
|
+
-- a low-contrast cyan gradient).
|
|
5500
|
+
--
|
|
5501
|
+
-- Idempotent: re-running sets identical content. Targets exactly the promo blocks via
|
|
5502
|
+
-- the nb-sandbox-promo sentinel, scoped by language. On the sandbox the promo is still
|
|
5503
|
+
-- stripped afterward by removeSandboxPromoSections in the reset-sandbox route.
|
|
5504
|
+
--
|
|
5505
|
+
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts
|
|
5506
|
+
-- excludes any migration whose filename contains "sandbox" from the reset bundle.
|
|
5507
|
+
|
|
5508
|
+
DO $body$
|
|
5509
|
+
DECLARE
|
|
5510
|
+
v_en_lang integer;
|
|
5511
|
+
v_fr_lang integer;
|
|
5512
|
+
BEGIN
|
|
5513
|
+
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5514
|
+
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5515
|
+
|
|
5516
|
+
UPDATE public.blocks
|
|
5517
|
+
SET content = $en$
|
|
5518
|
+
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets daily, so explore freely and break whatever you like.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-cyan-500/20 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-300'>password</span> · Resets daily</p>"}}],[{"block_type":"text","content":{"html_content":"<div class='rounded-3xl overflow-hidden border border-white/10 bg-white/5 backdrop-blur-xl shadow-2xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>A living NextBlock™ install — everything here is real and clickable:</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Full block editor</strong> with slash commands & drag-and-drop.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Bilingual</strong> English / French content management.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>A complete demo storefront</strong> with a full checkout flow.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Wipes clean daily</strong> — always a fresh start.</span></li></ul></div></div>"}}]]}
|
|
5519
|
+
$en$::jsonb,
|
|
5520
|
+
updated_at = now()
|
|
5521
|
+
WHERE block_type = 'section'
|
|
5522
|
+
AND page_id IS NOT NULL
|
|
5523
|
+
AND language_id = v_en_lang
|
|
5524
|
+
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5525
|
+
|
|
5526
|
+
UPDATE public.blocks
|
|
5527
|
+
SET content = $fr$
|
|
5528
|
+
{"container_type":"container","background":{"type":"gradient","gradient":{"type":"linear","direction":"135deg","stops":[{"color":"#020817","position":0},{"color":"#0b1e3d","position":50},{"color":"#0e2a4d","position":100}]}},"responsive_columns":{"mobile":1,"tablet":1,"desktop":2},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><p class='text-xs uppercase tracking-[0.25em] text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire des articles sur NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque jour : explorez librement et cassez tout ce que vous voulez.</p>"}},{"block_type":"text","content":{"html_content":"<div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-cyan-500/20 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white border border-white/20 hover:bg-white/10 backdrop-blur-sm transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-300'>password</span> · Réinitialisé chaque jour</p>"}}],[{"block_type":"text","content":{"html_content":"<div class='rounded-3xl overflow-hidden border border-white/10 bg-white/5 backdrop-blur-xl shadow-2xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>Une installation NextBlock™ bien vivante — tout ici est réel et cliquable :</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Éditeur de blocs complet</strong> : commandes slash et glisser-déposer.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Gestion bilingue</strong> du contenu français / anglais.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Une boutique de démonstration complète</strong> avec un parcours de paiement complet.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Remis à zéro chaque jour</strong> — toujours un nouveau départ.</span></li></ul></div></div>"}}]]}
|
|
5529
|
+
$fr$::jsonb,
|
|
5530
|
+
updated_at = now()
|
|
5531
|
+
WHERE block_type = 'section'
|
|
5532
|
+
AND page_id IS NOT NULL
|
|
5533
|
+
AND language_id = v_fr_lang
|
|
5534
|
+
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5535
|
+
END
|
|
5536
|
+
$body$;
|
|
5537
5537
|
|
|
5538
5538
|
|
|
5539
5539
|
-- >>> FROM: 00000000000008_setup_article_reorder.sql <<<
|
|
@@ -5570,58 +5570,58 @@ $nbfr$::jsonb,
|
|
|
5570
5570
|
|
|
5571
5571
|
|
|
5572
5572
|
-- >>> FROM: 00000000000009_home_live_demo_promo_contrast.sql <<<
|
|
5573
|
-
-- 00000000000009_home_live_demo_promo_contrast.sql
|
|
5574
|
-
-- Restyles the "Live Demo" promo that migrations 006/007 seeded on the EN (slug 'home')
|
|
5575
|
-
-- and FR (slug 'accueil') home pages. 006/007 gave it a fixed dark-navy GRADIENT section
|
|
5576
|
-
-- background -- and a gradient background is an inline style, so it renders identically
|
|
5577
|
-
-- in light and dark theme. Sitting directly under the (also dark) hero, that made the
|
|
5578
|
-
-- first two sections both dark in light mode and killed the old dark-hero -> white-second
|
|
5579
|
-
-- contrast rhythm.
|
|
5580
|
-
--
|
|
5581
|
-
-- Fix (append-only, do NOT edit 006/007 -- both already applied to prod + sandbox):
|
|
5582
|
-
-- switch the section background to "none" (transparent -> inherits the theme-aware page
|
|
5583
|
-
-- background: light in light theme, dark in dark theme) and render the promo as a single
|
|
5584
|
-
-- self-contained ELEVATED PANEL. The panel is a soft light card in light theme and keeps
|
|
5585
|
-
-- the rich navy look in dark theme (dark: gradient), with the browser mockup deliberately
|
|
5586
|
-
-- kept dark in both themes as a "product screenshot" focal point. The <!--nb-sandbox-promo-->
|
|
5587
|
-
-- sentinel is preserved so the reset-sandbox route still strips it on cms.nextblock.dev.
|
|
5588
|
-
--
|
|
5589
|
-
-- Idempotent: re-running sets identical content. Targets exactly the promo blocks via the
|
|
5590
|
-
-- nb-sandbox-promo sentinel, scoped by language (mirrors 00000000000007). blocks.content is
|
|
5591
|
-
-- JSONB, written with dollar-quoting.
|
|
5592
|
-
--
|
|
5593
|
-
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts excludes
|
|
5594
|
-
-- any migration whose filename contains "sandbox" from the sandbox reset bundle.
|
|
5595
|
-
|
|
5596
|
-
DO $body$
|
|
5597
|
-
DECLARE
|
|
5598
|
-
v_en_lang integer;
|
|
5599
|
-
v_fr_lang integer;
|
|
5600
|
-
BEGIN
|
|
5601
|
-
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5602
|
-
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5603
|
-
|
|
5604
|
-
UPDATE public.blocks
|
|
5605
|
-
SET content = $en$
|
|
5606
|
-
{"container_type":"container","background":{"type":"none"},"responsive_columns":{"mobile":1,"tablet":1,"desktop":1},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><div class='relative overflow-hidden rounded-[2.5rem] border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-blue-50 shadow-2xl shadow-slate-900/10 dark:border-white/10 dark:from-slate-900 dark:via-slate-900 dark:to-blue-950 dark:shadow-black/40'><div class='grid gap-10 p-8 sm:p-12 lg:grid-cols-2 lg:items-center'><div><p class='text-xs uppercase tracking-[0.25em] text-cyan-600 dark:text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-600 dark:text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets daily, so explore freely and break whatever you like.</p><div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-blue-500/25 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-slate-700 dark:text-white border border-slate-300 dark:border-white/20 hover:bg-slate-100 dark:hover:bg-white/10 transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-500 dark:text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-700 dark:text-slate-300'>demo@nextblock.
|
|
5607
|
-
$en$::jsonb,
|
|
5608
|
-
updated_at = now()
|
|
5609
|
-
WHERE block_type = 'section'
|
|
5610
|
-
AND page_id IS NOT NULL
|
|
5611
|
-
AND language_id = v_en_lang
|
|
5612
|
-
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5613
|
-
|
|
5614
|
-
UPDATE public.blocks
|
|
5615
|
-
SET content = $fr$
|
|
5616
|
-
{"container_type":"container","background":{"type":"none"},"responsive_columns":{"mobile":1,"tablet":1,"desktop":1},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><div class='relative overflow-hidden rounded-[2.5rem] border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-blue-50 shadow-2xl shadow-slate-900/10 dark:border-white/10 dark:from-slate-900 dark:via-slate-900 dark:to-blue-950 dark:shadow-black/40'><div class='grid gap-10 p-8 sm:p-12 lg:grid-cols-2 lg:items-center'><div><p class='text-xs uppercase tracking-[0.25em] text-cyan-600 dark:text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-600 dark:text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire des articles sur NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque jour : explorez librement et cassez tout ce que vous voulez.</p><div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-blue-500/25 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-slate-700 dark:text-white border border-slate-300 dark:border-white/20 hover:bg-slate-100 dark:hover:bg-white/10 transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-500 dark:text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-700 dark:text-slate-300'>demo@nextblock.
|
|
5617
|
-
$fr$::jsonb,
|
|
5618
|
-
updated_at = now()
|
|
5619
|
-
WHERE block_type = 'section'
|
|
5620
|
-
AND page_id IS NOT NULL
|
|
5621
|
-
AND language_id = v_fr_lang
|
|
5622
|
-
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5623
|
-
END
|
|
5624
|
-
$body$;
|
|
5573
|
+
-- 00000000000009_home_live_demo_promo_contrast.sql
|
|
5574
|
+
-- Restyles the "Live Demo" promo that migrations 006/007 seeded on the EN (slug 'home')
|
|
5575
|
+
-- and FR (slug 'accueil') home pages. 006/007 gave it a fixed dark-navy GRADIENT section
|
|
5576
|
+
-- background -- and a gradient background is an inline style, so it renders identically
|
|
5577
|
+
-- in light and dark theme. Sitting directly under the (also dark) hero, that made the
|
|
5578
|
+
-- first two sections both dark in light mode and killed the old dark-hero -> white-second
|
|
5579
|
+
-- contrast rhythm.
|
|
5580
|
+
--
|
|
5581
|
+
-- Fix (append-only, do NOT edit 006/007 -- both already applied to prod + sandbox):
|
|
5582
|
+
-- switch the section background to "none" (transparent -> inherits the theme-aware page
|
|
5583
|
+
-- background: light in light theme, dark in dark theme) and render the promo as a single
|
|
5584
|
+
-- self-contained ELEVATED PANEL. The panel is a soft light card in light theme and keeps
|
|
5585
|
+
-- the rich navy look in dark theme (dark: gradient), with the browser mockup deliberately
|
|
5586
|
+
-- kept dark in both themes as a "product screenshot" focal point. The <!--nb-sandbox-promo-->
|
|
5587
|
+
-- sentinel is preserved so the reset-sandbox route still strips it on cms.nextblock.dev.
|
|
5588
|
+
--
|
|
5589
|
+
-- Idempotent: re-running sets identical content. Targets exactly the promo blocks via the
|
|
5590
|
+
-- nb-sandbox-promo sentinel, scoped by language (mirrors 00000000000007). blocks.content is
|
|
5591
|
+
-- JSONB, written with dollar-quoting.
|
|
5592
|
+
--
|
|
5593
|
+
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts excludes
|
|
5594
|
+
-- any migration whose filename contains "sandbox" from the sandbox reset bundle.
|
|
5595
|
+
|
|
5596
|
+
DO $body$
|
|
5597
|
+
DECLARE
|
|
5598
|
+
v_en_lang integer;
|
|
5599
|
+
v_fr_lang integer;
|
|
5600
|
+
BEGIN
|
|
5601
|
+
SELECT id INTO v_en_lang FROM public.languages WHERE code = 'en' LIMIT 1;
|
|
5602
|
+
SELECT id INTO v_fr_lang FROM public.languages WHERE code = 'fr' LIMIT 1;
|
|
5603
|
+
|
|
5604
|
+
UPDATE public.blocks
|
|
5605
|
+
SET content = $en$
|
|
5606
|
+
{"container_type":"container","background":{"type":"none"},"responsive_columns":{"mobile":1,"tablet":1,"desktop":1},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><div class='relative overflow-hidden rounded-[2.5rem] border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-blue-50 shadow-2xl shadow-slate-900/10 dark:border-white/10 dark:from-slate-900 dark:via-slate-900 dark:to-blue-950 dark:shadow-black/40'><div class='grid gap-10 p-8 sm:p-12 lg:grid-cols-2 lg:items-center'><div><p class='text-xs uppercase tracking-[0.25em] text-cyan-600 dark:text-cyan-400 font-bold mb-4'>Live Demo · No Signup</p><h2 class='text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-6 leading-tight'>Try the full CMS,<br/>live right now.</h2><p class='text-lg text-slate-600 dark:text-slate-300 max-w-xl leading-relaxed mb-8'>Don't just read about NextBlock™ — take the wheel. Our public sandbox is a complete, pre-loaded install where you can build pages with the block editor, manage bilingual content, and browse a working demo store. It resets daily, so explore freely and break whatever you like.</p><div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-blue-500/25 transition-all no-underline'>Explore the Live Demo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-slate-700 dark:text-white border border-slate-300 dark:border-white/20 hover:bg-slate-100 dark:hover:bg-white/10 transition-all no-underline'>Open the CMS Dashboard →</a></div><p class='text-xs text-slate-500 dark:text-slate-400 mt-4'>Demo login <span class='font-mono text-slate-700 dark:text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-700 dark:text-slate-300'>password</span> · Resets daily</p></div><div class='rounded-3xl overflow-hidden border border-slate-800 bg-slate-900 shadow-xl shadow-slate-900/20 dark:border-white/10 dark:bg-white/5 dark:backdrop-blur-xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>A living NextBlock™ install — everything here is real and clickable:</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Full block editor</strong> with slash commands & drag-and-drop.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Bilingual</strong> English / French content management.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>A complete demo storefront</strong> with a full checkout flow.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Wipes clean daily</strong> — always a fresh start.</span></li></ul></div></div></div></div>"}}]]}
|
|
5607
|
+
$en$::jsonb,
|
|
5608
|
+
updated_at = now()
|
|
5609
|
+
WHERE block_type = 'section'
|
|
5610
|
+
AND page_id IS NOT NULL
|
|
5611
|
+
AND language_id = v_en_lang
|
|
5612
|
+
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5613
|
+
|
|
5614
|
+
UPDATE public.blocks
|
|
5615
|
+
SET content = $fr$
|
|
5616
|
+
{"container_type":"container","background":{"type":"none"},"responsive_columns":{"mobile":1,"tablet":1,"desktop":1},"column_gap":"xl","vertical_alignment":"center","padding":{"top":"xl","bottom":"xl"},"column_blocks":[[{"block_type":"text","content":{"html_content":"<!--nb-sandbox-promo--><div class='relative overflow-hidden rounded-[2.5rem] border border-slate-200 bg-gradient-to-br from-white via-slate-50 to-blue-50 shadow-2xl shadow-slate-900/10 dark:border-white/10 dark:from-slate-900 dark:via-slate-900 dark:to-blue-950 dark:shadow-black/40'><div class='grid gap-10 p-8 sm:p-12 lg:grid-cols-2 lg:items-center'><div><p class='text-xs uppercase tracking-[0.25em] text-cyan-600 dark:text-cyan-400 font-bold mb-4'>Démo en direct · Sans inscription</p><h2 class='text-4xl md:text-5xl font-bold text-slate-900 dark:text-white mb-6 leading-tight'>Essayez le CMS complet,<br/>en direct dès maintenant.</h2><p class='text-lg text-slate-600 dark:text-slate-300 max-w-xl leading-relaxed mb-8'>Ne vous contentez pas de lire des articles sur NextBlock™ — prenez les commandes. Notre bac à sable public est une installation complète et préchargée où vous pouvez créer des pages avec l'éditeur de blocs, gérer du contenu bilingue et parcourir une vraie boutique de démonstration. Il se réinitialise chaque jour : explorez librement et cassez tout ce que vous voulez.</p><div class='flex flex-col sm:flex-row gap-4'><a href='https://cms.nextblock.dev' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-white bg-blue-600 hover:bg-blue-700 shadow-lg shadow-blue-500/25 transition-all no-underline'>Découvrir la démo →</a><a href='https://cms.nextblock.dev/sign-in' target='_blank' rel='noopener noreferrer' class='inline-flex items-center justify-center gap-2 rounded-xl px-7 h-12 text-sm font-semibold text-slate-700 dark:text-white border border-slate-300 dark:border-white/20 hover:bg-slate-100 dark:hover:bg-white/10 transition-all no-underline'>Ouvrir le tableau de bord →</a></div><p class='text-xs text-slate-500 dark:text-slate-400 mt-4'>Identifiants démo <span class='font-mono text-slate-700 dark:text-slate-300'>demo@nextblock.dev</span> / <span class='font-mono text-slate-700 dark:text-slate-300'>password</span> · Réinitialisé chaque jour</p></div><div class='rounded-3xl overflow-hidden border border-slate-800 bg-slate-900 shadow-xl shadow-slate-900/20 dark:border-white/10 dark:bg-white/5 dark:backdrop-blur-xl'><div class='flex items-center gap-2 px-4 py-3 border-b border-white/10 bg-white/5'><span class='w-3 h-3 rounded-full bg-red-400/70'></span><span class='w-3 h-3 rounded-full bg-yellow-400/70'></span><span class='w-3 h-3 rounded-full bg-green-400/70'></span><span class='ml-3 flex-1 truncate rounded-md bg-black/30 px-3 py-1 text-xs font-mono text-slate-300'>cms.nextblock.dev</span></div><div class='p-6 sm:p-8'><p class='text-sm text-slate-300 mb-5'>Une installation NextBlock™ bien vivante — tout ici est réel et cliquable :</p><ul class='space-y-4 text-sm text-slate-200'><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Éditeur de blocs complet</strong> : commandes slash et glisser-déposer.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Gestion bilingue</strong> du contenu français / anglais.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Une boutique de démonstration complète</strong> avec un parcours de paiement complet.</span></li><li class='flex items-start gap-3'><span class='mt-0.5 flex h-6 w-6 flex-shrink-0 items-center justify-center rounded-full bg-cyan-500/15 text-cyan-300 text-xs'>✓</span><span><strong class='text-white'>Remis à zéro chaque jour</strong> — toujours un nouveau départ.</span></li></ul></div></div></div></div>"}}]]}
|
|
5617
|
+
$fr$::jsonb,
|
|
5618
|
+
updated_at = now()
|
|
5619
|
+
WHERE block_type = 'section'
|
|
5620
|
+
AND page_id IS NOT NULL
|
|
5621
|
+
AND language_id = v_fr_lang
|
|
5622
|
+
AND content::text LIKE '%nb-sandbox-promo%';
|
|
5623
|
+
END
|
|
5624
|
+
$body$;
|
|
5625
5625
|
|
|
5626
5626
|
|
|
5627
5627
|
-- >>> FROM: 00000000000010_drop_github_username.sql <<<
|
|
@@ -7313,6 +7313,62 @@ END
|
|
|
7313
7313
|
$body$;
|
|
7314
7314
|
|
|
7315
7315
|
|
|
7316
|
+
-- >>> FROM: 00000000000025_rebrand_nextblock_dev.sql <<<
|
|
7317
|
+
-- 00000000000025_rebrand_nextblock_dev.sql
|
|
7318
|
+
-- Domain rebrand: the retired .ca domain -> nextblock.dev.
|
|
7319
|
+
--
|
|
7320
|
+
-- Two halves to this change, because two populations need different treatment:
|
|
7321
|
+
--
|
|
7322
|
+
-- Fresh installs -- migrations 00000000000003_baseline_seed and
|
|
7323
|
+
-- 00000000000006/007/009_home_live_demo_promo* were rewritten in place
|
|
7324
|
+
-- to seed nextblock.dev directly. Safe to edit despite the append-only
|
|
7325
|
+
-- rule: Supabase tracks migration history by version string with no
|
|
7326
|
+
-- checksum, so an already-applied file is never re-read or replayed.
|
|
7327
|
+
-- Those four are seed/content only -- no schema, no constraints.
|
|
7328
|
+
--
|
|
7329
|
+
-- Existing installs -- prod, sandbox, and any deployed fork already seeded the old domain
|
|
7330
|
+
-- from the pre-rewrite versions of those files. They never replay, so
|
|
7331
|
+
-- this migration corrects their data forward.
|
|
7332
|
+
--
|
|
7333
|
+
-- Both paths converge on nextblock.dev. On a fresh install this migration matches nothing
|
|
7334
|
+
-- and is a no-op, which is also what makes it safe to re-run.
|
|
7335
|
+
--
|
|
7336
|
+
-- Also flips the sandbox demo account address. The account itself is created by
|
|
7337
|
+
-- apps/nextblock/app/api/cron/reset-sandbox/route.ts (now 'demo@nextblock.dev'); the legacy
|
|
7338
|
+
-- demo account is NOT removed here -- the reset route never deletes auth users and never
|
|
7339
|
+
-- truncates public.profiles, so it must be deleted by hand in the Supabase Auth dashboard
|
|
7340
|
+
-- or it survives as a working ADMIN.
|
|
7341
|
+
--
|
|
7342
|
+
-- NOTE: keep the word "sandbox" OUT of this filename -- generate-sandbox-reset.ts excludes any
|
|
7343
|
+
-- migration whose filename contains "sandbox" from the sandbox reset bundle.
|
|
7344
|
+
|
|
7345
|
+
DO $body$
|
|
7346
|
+
DECLARE
|
|
7347
|
+
-- Assembled from two halves on purpose: it is the one string this rebrand is meant to
|
|
7348
|
+
-- erase, and spelling it out here would leave the repo-wide grep with a permanent hit
|
|
7349
|
+
-- inside the very migration that removes it. Resolves to the retired domain at runtime.
|
|
7350
|
+
legacy_domain constant text := 'nextblock' || '.ca';
|
|
7351
|
+
BEGIN
|
|
7352
|
+
-- 1. Seeded UI strings (e.g. the "Purchase at ..." link on the sandbox checkout panel).
|
|
7353
|
+
UPDATE public.translations
|
|
7354
|
+
SET translations = replace(translations::text, legacy_domain, 'nextblock.dev')::jsonb,
|
|
7355
|
+
updated_at = now()
|
|
7356
|
+
WHERE translations::text LIKE '%' || legacy_domain || '%';
|
|
7357
|
+
|
|
7358
|
+
-- 2. Page/post content -- the home-page "Live Demo" promo carries the demo login address.
|
|
7359
|
+
UPDATE public.blocks
|
|
7360
|
+
SET content = replace(content::text, legacy_domain, 'nextblock.dev')::jsonb,
|
|
7361
|
+
updated_at = now()
|
|
7362
|
+
WHERE content::text LIKE '%' || legacy_domain || '%';
|
|
7363
|
+
|
|
7364
|
+
-- 3. Site settings -- invoice branding on the sandbox carries the billing address.
|
|
7365
|
+
UPDATE public.site_settings
|
|
7366
|
+
SET value = replace(value::text, legacy_domain, 'nextblock.dev')::jsonb
|
|
7367
|
+
WHERE value::text LIKE '%' || legacy_domain || '%';
|
|
7368
|
+
END
|
|
7369
|
+
$body$;
|
|
7370
|
+
|
|
7371
|
+
|
|
7316
7372
|
-- Step D: Record the applied migrations in history (truncated in Step B) so
|
|
7317
7373
|
-- \`npm run db:migrate:check\` reports up to date instead of listing every file as pending.
|
|
7318
7374
|
INSERT INTO supabase_migrations.schema_migrations (version, name) VALUES
|
|
@@ -7340,7 +7396,8 @@ $body$;
|
|
|
7340
7396
|
('00000000000021', 'updating_article_git_merge'),
|
|
7341
7397
|
('00000000000022', 'updating_article_accuracy'),
|
|
7342
7398
|
('00000000000023', 'updating_article_layout_not_host'),
|
|
7343
|
-
('00000000000024', 'updating_article_newline_fix')
|
|
7399
|
+
('00000000000024', 'updating_article_newline_fix'),
|
|
7400
|
+
('00000000000025', 'rebrand_nextblock_dev')
|
|
7344
7401
|
ON CONFLICT (version) DO NOTHING;
|
|
7345
7402
|
|
|
7346
7403
|
-- Step E: Anchor preserved profiles
|