@lastbrain/app 2.0.31 → 2.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/analytics/registry.d.ts +7 -0
  2. package/dist/analytics/registry.d.ts.map +1 -0
  3. package/dist/analytics/registry.js +11 -0
  4. package/dist/auth/useAuthSession.d.ts.map +1 -1
  5. package/dist/auth/useAuthSession.js +85 -1
  6. package/dist/cli.js +19 -3
  7. package/dist/components/LanguageSwitcher.d.ts.map +1 -1
  8. package/dist/components/LanguageSwitcher.js +89 -5
  9. package/dist/config/version.d.ts.map +1 -1
  10. package/dist/config/version.js +30 -19
  11. package/dist/i18n/useLink.d.ts.map +1 -1
  12. package/dist/i18n/useLink.js +15 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -0
  16. package/dist/layouts/AdminLayoutWithSidebar.d.ts +3 -1
  17. package/dist/layouts/AdminLayoutWithSidebar.d.ts.map +1 -1
  18. package/dist/layouts/AdminLayoutWithSidebar.js +2 -2
  19. package/dist/layouts/AppProviders.d.ts +7 -1
  20. package/dist/layouts/AppProviders.d.ts.map +1 -1
  21. package/dist/layouts/AppProviders.js +24 -3
  22. package/dist/layouts/AuthLayout.js +1 -1
  23. package/dist/layouts/PublicLayout.js +1 -1
  24. package/dist/layouts/RootLayout.d.ts.map +1 -1
  25. package/dist/scripts/init-app.d.ts.map +1 -1
  26. package/dist/scripts/init-app.js +301 -138
  27. package/dist/scripts/module-build.d.ts.map +1 -1
  28. package/dist/scripts/module-build.js +402 -67
  29. package/dist/scripts/module-create.d.ts.map +1 -1
  30. package/dist/scripts/module-create.js +227 -10
  31. package/dist/scripts/sitemap-flat-generator.d.ts +39 -0
  32. package/dist/scripts/sitemap-flat-generator.d.ts.map +1 -0
  33. package/dist/scripts/sitemap-flat-generator.js +231 -0
  34. package/dist/scripts/sitemap-manifest-generator.d.ts +59 -0
  35. package/dist/scripts/sitemap-manifest-generator.d.ts.map +1 -0
  36. package/dist/scripts/sitemap-manifest-generator.js +290 -0
  37. package/dist/sitemap/manifest.d.ts +8 -0
  38. package/dist/sitemap/manifest.d.ts.map +1 -0
  39. package/dist/sitemap/manifest.js +6 -0
  40. package/dist/styles.css +2 -2
  41. package/dist/templates/AuthGuidePage.js +2 -0
  42. package/dist/templates/DefaultDoc.d.ts.map +1 -1
  43. package/dist/templates/DefaultDoc.js +9 -5
  44. package/dist/templates/DocPage.d.ts.map +1 -1
  45. package/dist/templates/DocPage.js +40 -0
  46. package/dist/templates/MigrationsGuidePage.js +2 -0
  47. package/dist/templates/ModuleGuidePage.d.ts.map +1 -1
  48. package/dist/templates/ModuleGuidePage.js +4 -1
  49. package/dist/templates/SimpleHomePage.js +2 -0
  50. package/package.json +11 -4
  51. package/src/analytics/registry.ts +14 -0
  52. package/src/auth/useAuthSession.ts +91 -1
  53. package/src/cli.ts +19 -3
  54. package/src/components/LanguageSwitcher.tsx +113 -23
  55. package/src/config/version.ts +30 -19
  56. package/src/i18n/useLink.ts +15 -0
  57. package/src/index.ts +17 -0
  58. package/src/layouts/AdminLayoutWithSidebar.tsx +4 -0
  59. package/src/layouts/AppProviders.tsx +66 -8
  60. package/src/layouts/AuthLayout.tsx +1 -1
  61. package/src/layouts/PublicLayout.tsx +1 -1
  62. package/src/layouts/RootLayout.tsx +0 -1
  63. package/src/scripts/init-app.ts +360 -149
  64. package/src/scripts/module-build.ts +458 -72
  65. package/src/scripts/module-create.ts +260 -10
  66. package/src/scripts/sitemap-flat-generator.ts +313 -0
  67. package/src/scripts/sitemap-manifest-generator.ts +476 -0
  68. package/src/sitemap/manifest.ts +17 -0
  69. package/src/templates/AuthGuidePage.tsx +1 -1
  70. package/src/templates/DefaultDoc.tsx +397 -6
  71. package/src/templates/DocPage.tsx +40 -0
  72. package/src/templates/MigrationsGuidePage.tsx +1 -1
  73. package/src/templates/ModuleGuidePage.tsx +3 -2
  74. package/src/templates/SimpleHomePage.tsx +1 -1
@@ -1,8 +1,12 @@
1
+ // GENERATED FILE - DO NOT EDIT MANUALLY
2
+ // This file is auto-generated from markdown files in docs/
3
+ // Run 'pnpm sync:docs' to regenerate
4
+ "use client";
1
5
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
6
  import { Card, CardBody, CardHeader, Snippet, Alert } from "@lastbrain/ui";
3
7
  import { FileText, Rocket, Building2, BookOpen, Database, User, Shield, Zap, Palette, HardDrive, Link, Package, } from "lucide-react";
4
8
  export function DefaultDocumentation() {
5
- return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "LastBrain"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "Requirements" }) }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/app?label=%40lastbrain%2Fapp", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/core?label=%40lastbrain%2Fcore", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/ui?label=%40lastbrain%2Fui", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-auth?label=%40lastbrain%2Fmodule-auth", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] })] })] }), _jsxs(Card, { id: "section-quickstart", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9marrage rapide"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("p", { className: "text-slate-600 dark:text-slate-400", children: [_jsx("strong", { children: "Note importante :" }), " LastBrain est un \u00E9cosyst\u00E8me de packages interconnect\u00E9s. L'application g\u00E9n\u00E9r\u00E9e utilise automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", et les modules comme", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-auth" }), " ", "et", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-ai" }), ". Tous ces packages sont n\u00E9cessaires pour le bon fonctionnement."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 1. Lancer Docker Desktop" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Attendre que Docker soit \u201CRunning\u201D." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 2. Installer Supabase CLI (si pas d\u00E9j\u00E0 install\u00E9)" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `brew install supabase/tap/supabase` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 3. Cr\u00E9er une nouvelle application (utilise @latest pour la version la plus r\u00E9cente)" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 4. Acc\u00E9der au dossier" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd mon-app` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 5. Initialiser Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 6. D\u00E9marrer l'application si pas d\u00E9j\u00E0 lanc\u00E9 port :3000 par default" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Explication de la commande" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpx" }) }), " ", ": Ex\u00E9cute un package npm sans l'installer globalement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app@latest" }) }), " ", ": Package CLI de LastBrain en version la plus r\u00E9cente"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "init" }) }), " ", ": Commande pour initialiser une nouvelle application"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "mon-app" }) }), " ", ": Nom du dossier de votre application"] })] })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Cette commande va :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Cr\u00E9er la structure Next.js compl\u00E8te" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Installer automatiquement tous les packages n\u00E9cessaires (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", modules...)"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Configurer Supabase et les migrations" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer les routes des modules s\u00E9lectionn\u00E9s" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer le .env.local avec les variables d'environnement Supabase" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ation du Compte Admin" }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `# Promouvoir votre compte en admin via Supabase` }), _jsx("span", { children: `update auth.users` }), _jsx("span", { children: `set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: ` '{roles}',` }), _jsx("span", { children: ` '["admin"]'::jsonb` }), _jsx("span", { children: `)` }), _jsx("span", { children: `where email = 'votre@email.com';` })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("a", { href: "http://localhost:3000", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "http://localhost:3000" }), " ", "! \uD83C\uDF89"] })] })] }), _jsxs(Card, { id: "section-architecture", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Building2, { size: 24 }), "Architecture"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/core" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/ui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/module-\\*" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Modules fonctionnels (auth, ai, etc.). Chaque module contient ses pages, APIs, composants, migrations et documentation." })] })] }), _jsxs(Card, { id: "section-create-module", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documentation des modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commande CLI" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module mon-module` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cr\u00E9e un nouveau module dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-mon-module" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4 whitespace-pre-wrap", children: `📁 module-mon-module/
9
+ return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { className: "bg-linear-to-r from-blue-50 to-indigo-50 dark:from-blue-950 dark:to-indigo-950 border-l-4 border-blue-500 sticky top-0 z-10", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-bold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24, className: "text-blue-600 dark:text-blue-400" }), "Sommaire de la Documentation"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-3", children: [_jsxs("a", { href: "#section-welcome", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(FileText, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "LastBrain" })] }), _jsxs("a", { href: "#section-quickstart", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Rocket, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "D\u00E9marrage rapide" })] }), _jsxs("a", { href: "#section-architecture", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Building2, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Architecture" })] }), _jsxs("a", { href: "#section-create-module", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(BookOpen, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Documentation des modules" })] }), _jsxs("a", { href: "#section-database", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Database, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Base de donn\u00E9es" })] }), _jsxs("a", { href: "#section-admin", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(User, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Cr\u00E9er un Compte Administrateur" })] }), _jsxs("a", { href: "#section-development", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Rocket, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "D\u00E9veloppement" })] }), _jsxs("a", { href: "#section-routes", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Shield, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Routes Prot\u00E9g\u00E9es" })] }), _jsxs("a", { href: "#section-workflow", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Zap, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Workflow de D\u00E9veloppement" })] }), _jsxs("a", { href: "#section-ui", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Palette, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Interface utilisateur" })] }), _jsxs("a", { href: "#section-storage", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(HardDrive, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Syst\u00E8me de Proxy Storage" })] }), _jsxs("a", { href: "#section-realtime", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Zap, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Syst\u00E8me Realtime" })] }), _jsxs("a", { href: "#section-module-docs", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(FileText, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Documenter ses modules" })] }), _jsxs("a", { href: "#section-links", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Link, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Liens utiles & remerciements \uD83D\uDE4F" })] }), _jsxs("a", { href: "#section-modules", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(Package, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Modules" })] }), _jsxs("a", { href: "#section-i18n", className: "flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group", children: [_jsx(FileText, { size: 16, className: "text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform" }), _jsx("span", { className: "text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors", children: "Syst\u00E8me de traduction i18n" })] })] }) })] }), _jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "LastBrain"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "Requirements" }) }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/app?label=%40lastbrain%2Fapp", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/core?label=%40lastbrain%2Fcore", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/ui?label=%40lastbrain%2Fui", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-auth?label=%40lastbrain%2Fmodule-auth", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] })] })] }), _jsxs(Card, { id: "section-quickstart", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9marrage rapide"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("p", { className: "text-slate-600 dark:text-slate-400", children: [_jsx("strong", { children: "Note importante :" }), " LastBrain est un \u00E9cosyst\u00E8me de packages interconnect\u00E9s. L'application g\u00E9n\u00E9r\u00E9e utilise automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", et les modules comme", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-auth" }), " ", "et", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-ai" }), ". Tous ces packages sont n\u00E9cessaires pour le bon fonctionnement."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 1. Lancer Docker Desktop" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Attendre que Docker soit \u201CRunning\u201D." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 2. Installer Supabase CLI (si pas d\u00E9j\u00E0 install\u00E9)" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `brew install supabase/tap/supabase` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 3. Cr\u00E9er une nouvelle application (utilise @latest pour la version la plus r\u00E9cente)" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 4. Acc\u00E9der au dossier" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd mon-app` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 5. Initialiser Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# 6. D\u00E9marrer l'application si pas d\u00E9j\u00E0 lanc\u00E9 port :3000 par default" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Explication de la commande" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpx" }) }), " ", ": Ex\u00E9cute un package npm sans l'installer globalement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app@latest" }) }), " ", ": Package CLI de LastBrain en version la plus r\u00E9cente"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "init" }) }), " ", ": Commande pour initialiser une nouvelle application"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "mon-app" }) }), " ", ": Nom du dossier de votre application"] })] })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Cette commande va :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Cr\u00E9er la structure Next.js compl\u00E8te" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Installer automatiquement tous les packages n\u00E9cessaires (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", modules...)"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Configurer Supabase et les migrations" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer les routes des modules s\u00E9lectionn\u00E9s" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer le .env.local avec les variables d'environnement Supabase" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ation du Compte Admin" }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `# Promouvoir votre compte en admin via Supabase` }), _jsx("span", { children: `update auth.users` }), _jsx("span", { children: `set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: ` '{roles}',` }), _jsx("span", { children: ` '["admin"]'::jsonb` }), _jsx("span", { children: `)` }), _jsx("span", { children: `where email = 'votre@email.com';` })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("a", { href: "http://localhost:3000", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "http://localhost:3000" }), " ", "! \uD83C\uDF89"] })] })] }), _jsxs(Card, { id: "section-architecture", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Building2, { size: 24 }), "Architecture"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/core" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/ui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/module-\\*" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Modules fonctionnels (auth, ai, etc.). Chaque module contient ses pages, APIs, composants, migrations et documentation." })] })] }), _jsxs(Card, { id: "section-create-module", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documentation des modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commande CLI" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module mon-module` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cr\u00E9e un nouveau module dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-mon-module" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4 whitespace-pre-wrap", children: `📁 module-mon-module/
6
10
  ├── 📄 package.json
7
11
  ├── 📄 mon-module.build.config.ts
8
12
  └── 📁 src/
@@ -28,7 +32,7 @@ export function DefaultDocumentation() {
28
32
  handler: "./api/mon-api",
29
33
  },
30
34
  ],
31
- };` }) })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsx("h4", { className: "font-medium mb-2", children: "D\u00E9marrer Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("h4", { className: "font-medium mb-2", children: "Synchroniser les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:migrations:sync` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er une migration" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "supabase migration new ma_migration" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Les modules peuvent avoir leurs propres migrations dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] }), _jsxs(Card, { id: "section-admin", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(User, { size: 24 }), "Cr\u00E9er un Compte Administrateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Cr\u00E9er un compte" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Promouvoir en administrateur" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `update auth.users` }), _jsx("span", { children: `set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: ` '{roles}',` }), _jsx("span", { children: ` '["admin"]'::jsonb` }), _jsx("span", { children: `)` }), _jsx("span", { children: `where email = 'votre@email.com';` })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin" })] })] })] }), _jsxs(Card, { id: "section-development", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-routes", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Shield, { size: 24 }), "Routes Prot\u00E9g\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Routes" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/*" }), " ", "\u2192 Authentification requise"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/*" }), " ", "\u2192 Superadmin uniquement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/docs/*" }), " ", "\u2192 Acc\u00E8s public"] })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "middleware.ts" })] })] })] }), _jsxs(Card, { id: "section-workflow", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "Workflow de D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-*/src" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Compiler le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd apps/my-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "supabase migration up" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-ui", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Palette, { size: 24 }), "Interface utilisateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Composants NextUI" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le package", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), " ", "r\u00E9exporte les composants NextUI avec une configuration Tailwind personnalis\u00E9e."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Th\u00E8mes" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le mode sombre/clair est g\u00E9r\u00E9 par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "next-themes" }), ". Le switch est disponible dans le header de l'application."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS v4" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le projet utilise Tailwind CSS v4 avec un preset personnalis\u00E9 partag\u00E9 via", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui/tailwind.preset" }), "."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Ajouter une page et un menu custom" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "1. Cr\u00E9e une page dans l'app cible (exemple public) :" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```tsx"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "// apps/lastbrain/app/nouvelle-page/page.tsx"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export default function NouvellePage() {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "return ", _jsx("div", { children: "Nouvelle Page" }), ";"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "}"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["2. D\u00E9clare le menu dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/config/menu-custom.ts" }), " ", "(fichier optionnel, non \u00E9cras\u00E9 par les outils) :"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```ts"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "import type { MenuCustom } from \"./menu-custom\";"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export const menuCustom: MenuCustom = {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "public: ["] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "{"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "title: \"Nouvelle Page\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "description: \"Une page custom\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "icon: \"Plus\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "path: \"/nouvelle-page\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "order: 100,"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "},"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: " ]," }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "auth: [],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "admin: [],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "};"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "3. Choisis le pr\u00E9fixe de route pour la section :" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/" }), " ", "pour les pages publiques (header + palette + AppAside public)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/..." }), " ", "pour les pages authentifi\u00E9es (header + palette + AppAside auth)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/..." }), " ", "pour les pages admin (header + palette + AppAside admin)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["4. (Optionnel) Ajoute", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "order" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "icon" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "description" }), " ", "ou", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "shortcutDisplay" }), " ", "pour contr\u00F4ler le tri, l'ic\u00F4ne Lucide et l'affichage dans la palette."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["5. Aucun rebuild sp\u00E9cial : le syst\u00E8me charge automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menu-custom.ts" }), " ", "et fusionne les menus custom avec la config existante dans le Header, le Aside et la palette (KeyboardKey)."] }), _jsx("h4", { className: "font-medium mb-2", children: "Cas d'usage rapides" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page publique custom : place ton fichier dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/app/(custom)/nouvelle-page/page.tsx" }), " ", "et ajoute l'entr\u00E9e dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.public" }), " ", "avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path: \"/nouvelle-page\"" }), "."] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page auth custom : place la page dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/app/(custom)/auth/ma-page/page.tsx" }), " ", "avec un", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path: \"/auth/ma-page\"" }), " ", "dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.auth" }), "."] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page admin custom : m\u00EAme principe avec un chemin", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/..." }), " ", "et une entr\u00E9e dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.admin" }), "."] })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Masquer des menus et bloquer les routes (menu-ignored)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["1. Cr\u00E9e", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/config/menu-ignored.ts" }), " ", "si absent :"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```ts"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export const menuIgnored = {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "public: [{ title: \"Boutique\", path: \"/shop\" }],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "auth: ["] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "{ title: \"Mes commandes\", path: \"/auth/core-order/account/orders\" },"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: " ]," }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "};"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["2. Le Header, l'AppAside et la palette excluent ces entr\u00E9es par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "title" }), "."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["3. Le middleware redirige toute route correspondante (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path" }), " ", "exact ou pr\u00E9fixe) vers", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/404" }), "."] })] })] }), _jsxs(Card, { id: "section-storage", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(HardDrive, { size: 24 }), "Syst\u00E8me de Proxy Storage"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de proxy pour les fichiers Supabase Storage qui permet d'utiliser des URLs propres avec contr\u00F4le d'acc\u00E8s granulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "URLs Proxy vs URLs Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u274C URL Supabase classique (longue)" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u2705 URL Proxy (propre)" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/avatar/user_128_123456.webp" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration des Buckets" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDCC2 avatar (Public)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Photos de profil et avatars \u2022 10MB max \u2022 Types: JPEG, PNG, WebP, GIF" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/avatar/user_128_123456.webp" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD12 app (Priv\u00E9)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Fichiers priv\u00E9s des utilisateurs \u2022 100MB max \u2022 Authentification requise" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/app/user-id/documents/file.pdf" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans le code" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Upload d'un fichier
35
+ };` }) })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsx("h4", { className: "font-medium mb-2", children: "D\u00E9marrer Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("h4", { className: "font-medium mb-2", children: "Synchroniser les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:migrations:sync` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er une migration" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "supabase migration new ma_migration" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Les modules peuvent avoir leurs propres migrations dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] }), _jsxs(Card, { id: "section-admin", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(User, { size: 24 }), "Cr\u00E9er un Compte Administrateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Cr\u00E9er un compte" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Promouvoir en administrateur" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `update auth.users` }), _jsx("span", { children: `set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: ` '{roles}',` }), _jsx("span", { children: ` '["admin"]'::jsonb` }), _jsx("span", { children: `)` }), _jsx("span", { children: `where email = 'votre@email.com';` })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin" })] })] })] }), _jsxs(Card, { id: "section-development", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "\u00C9couter les webhooks Stripe (local)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Pr\u00E9-requis:" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Avoir install\u00E9 la Stripe CLI: https://stripe.com/docs/stripe-cli" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Avoir une cl\u00E9 test dans votre", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: ".env.local" }), ":", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "STRIPE_SECRET_KEY=sk_test_..." })] })] })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Endpoint local utilis\u00E9 par la plateforme:" }), _jsx("div", { className: "space-y-2", children: _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "POST /api/public/payment/stripe/webhook" }) })] }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "1. Connexion Stripe CLI" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe login" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "2. D\u00E9marrez votre app en local (remplacez le port si besoin)" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "3. \u00C9coutez les \u00E9v\u00E9nements et transf\u00E9rez-les vers l'endpoint local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe listen --forward-to http://localhost:3000/api/public/payment/stripe/webhook" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["La commande affiche un secret de signature sous la forme", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "whsec_..." }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Exportez-le dans votre terminal pour la v\u00E9rification des signatures:" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `export STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxx` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "4. D\u00E9clencher des \u00E9v\u00E9nements de test (optionnel)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# Paiement r\u00E9ussi" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe trigger payment_intent.succeeded" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# Checkout compl\u00E9t\u00E9" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe trigger checkout.session.completed" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# Abonnement (cr\u00E9ation/mise \u00E0 jour/suppression)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe trigger customer.subscription.created" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe trigger customer.subscription.updated" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "stripe trigger customer.subscription.deleted" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Notes:" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["L'endpoint est expos\u00E9 dans les apps: voir", " ", _jsx("a", { href: "apps/lastbrain/app/api/public/payment/stripe/webhook/route.ts", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "apps/lastbrain/app/api/public/payment/stripe/webhook/route.ts" }), " ", "et", " ", _jsx("a", { href: "apps/recipe/app/api/public/payment/stripe/webhook/route.ts", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "apps/recipe/app/api/public/payment/stripe/webhook/route.ts" }), "."] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["En production (Vercel), cr\u00E9ez un endpoint de webhook dans Stripe et renseignez", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "STRIPE_WEBHOOK_SECRET" }), " ", "dans les variables d'environnement du projet."] })] })] })] })] }), _jsxs(Card, { id: "section-routes", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Shield, { size: 24 }), "Routes Prot\u00E9g\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Routes" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/*" }), " ", "\u2192 Authentification requise"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/*" }), " ", "\u2192 Superadmin uniquement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/docs/*" }), " ", "\u2192 Acc\u00E8s public"] })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "middleware.ts" })] })] })] }), _jsxs(Card, { id: "section-workflow", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "Workflow de D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-*/src" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Compiler le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd apps/my-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "supabase migration up" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-ui", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Palette, { size: 24 }), "Interface utilisateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Composants NextUI" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le package", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), " ", "r\u00E9exporte les composants NextUI avec une configuration Tailwind personnalis\u00E9e."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Th\u00E8mes" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le mode sombre/clair est g\u00E9r\u00E9 par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "next-themes" }), ". Le switch est disponible dans le header de l'application."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS v4" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le projet utilise Tailwind CSS v4 avec un preset personnalis\u00E9 partag\u00E9 via", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui/tailwind.preset" }), "."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Ajouter une page et un menu custom" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "1. Cr\u00E9e une page dans l'app cible (exemple public) :" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```tsx"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "// apps/lastbrain/app/nouvelle-page/page.tsx"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export default function NouvellePage() {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "return ", _jsx("div", { children: "Nouvelle Page" }), ";"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "}"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["2. D\u00E9clare le menu dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/config/menu-custom.ts" }), " ", "(fichier optionnel, non \u00E9cras\u00E9 par les outils) :"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```ts"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "import type { MenuCustom } from \"./menu-custom\";"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export const menuCustom: MenuCustom = {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "public: ["] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "{"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "title: \"Nouvelle Page\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "description: \"Une page custom\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "icon: \"Plus\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "path: \"/nouvelle-page\","] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "order: 100,"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "},"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: " ]," }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "auth: [],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "admin: [],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "};"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "3. Choisis le pr\u00E9fixe de route pour la section :" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/" }), " ", "pour les pages publiques (header + palette + AppAside public)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/..." }), " ", "pour les pages authentifi\u00E9es (header + palette + AppAside auth)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "-", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/..." }), " ", "pour les pages admin (header + palette + AppAside admin)."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["4. (Optionnel) Ajoute", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "order" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "icon" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "description" }), " ", "ou", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "shortcutDisplay" }), " ", "pour contr\u00F4ler le tri, l'ic\u00F4ne Lucide et l'affichage dans la palette."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["5. Aucun rebuild sp\u00E9cial : le syst\u00E8me charge automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menu-custom.ts" }), " ", "et fusionne les menus custom avec la config existante dans le Header, le Aside et la palette (KeyboardKey)."] }), _jsx("h4", { className: "font-medium mb-2", children: "Cas d'usage rapides" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page publique custom : place ton fichier dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/app/(custom)/nouvelle-page/page.tsx" }), " ", "et ajoute l'entr\u00E9e dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.public" }), " ", "avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path: \"/nouvelle-page\"" }), "."] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page auth custom : place la page dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/app/(custom)/auth/ma-page/page.tsx" }), " ", "avec un", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path: \"/auth/ma-page\"" }), " ", "dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.auth" }), "."] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Page admin custom : m\u00EAme principe avec un chemin", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/..." }), " ", "et une entr\u00E9e dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "menuCustom.admin" }), "."] })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Masquer des menus et bloquer les routes (menu-ignored)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["1. Cr\u00E9e", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "apps/lastbrain/config/menu-ignored.ts" }), " ", "si absent :"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```ts"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "export const menuIgnored = {"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "public: [{ title: \"Boutique\", path: \"/shop\" }],"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "auth: ["] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "{ title: \"Mes commandes\", path: \"/auth/core-order/account/orders\" },"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: " ]," }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "};"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [" ", "```"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["2. Le Header, l'AppAside et la palette excluent ces entr\u00E9es par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "title" }), "."] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["3. Le middleware redirige toute route correspondante (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "path" }), " ", "exact ou pr\u00E9fixe) vers", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/404" }), "."] })] })] }), _jsxs(Card, { id: "section-storage", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(HardDrive, { size: 24 }), "Syst\u00E8me de Proxy Storage"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de proxy pour les fichiers Supabase Storage qui permet d'utiliser des URLs propres avec contr\u00F4le d'acc\u00E8s granulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "URLs Proxy vs URLs Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u274C URL Supabase classique (longue)" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u2705 URL Proxy (propre)" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/avatar/user_128_123456.webp" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration des Buckets" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDCC2 avatar (Public)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Photos de profil et avatars \u2022 10MB max \u2022 Types: JPEG, PNG, WebP, GIF" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/avatar/user_128_123456.webp" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD12 app (Priv\u00E9)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Fichiers priv\u00E9s des utilisateurs \u2022 100MB max \u2022 Authentification requise" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "/api/storage/app/user-id/documents/file.pdf" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans le code" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Upload d'un fichier
32
36
  import { uploadFile } from "@/api/storage";
33
37
 
34
38
  const proxyUrl = await uploadFile(
@@ -60,7 +64,7 @@ const proxyUrl = storagePathToProxyUrl("avatar/user_128_123456.webp");
60
64
  },
61
65
  {
62
66
  schema: "public",
63
- table: "user_profiles",
67
+ table: "user_profil",
64
68
  event: "*",
65
69
  filter: "owner_id=eq.\${USER_ID}",
66
70
  broadcast: "user_profile_updated",
@@ -106,7 +110,7 @@ function MonComposant() {
106
110
  console.log("Données reçues:", payload);
107
111
  }
108
112
  }, [signal.tick]);
109
- }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Architecture du syst\u00E8me" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83C\uDFAF EventBus Global" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Syst\u00E8me central de coordination des \u00E9v\u00E9nements realtime \u00E0 travers toute l'application." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD0C RealtimeProvider" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Provider React qui \u00E9tablit les connexions Supabase Realtime bas\u00E9es sur la configuration des modules." }), _jsx("h4", { className: "font-medium mb-2", children: "\u26A1 Hooks Scalables" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Collection de hooks React pour \u00E9couter des tables ou \u00E9v\u00E9nements sp\u00E9cifiques avec auto-refresh." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDEE0\uFE0F Build int\u00E9gr\u00E9" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration TypeScript lors du build des modules." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Configuration d\u00E9clarative dans les modules" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 G\u00E9n\u00E9ration automatique de config" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Hooks React pr\u00EAts \u00E0 l'emploi" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 RLS de Supabase" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Scalable pour n'importe quelle table" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 TypeScript avec types g\u00E9n\u00E9r\u00E9s" }) })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemples d'utilisation" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDD14 Notifications" }), ": Affichage en temps r\u00E9el des nouvelles notifications avec badge et auto-refresh"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDC65 Utilisateurs en ligne" }), ": Suivi des connexions/d\u00E9connexions des utilisateurs en direct"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDCCA Donn\u00E9es collaboratives" }), ": Synchronisation automatique des modifications de donn\u00E9es entre utilisateurs"] })] })] })] })] }), _jsxs(Card, { id: "section-module-docs", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documenter ses modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Documentation auto-g\u00E9n\u00E9r\u00E9e" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Lorsque vous cr\u00E9ez un module, la documentation de base (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), ") est automatiquement g\u00E9n\u00E9r\u00E9e \u00E0 partir du fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "build.config.ts" }), ". Cette documentation inclut :"] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les pages disponibles" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les routes API" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les tables de base de donn\u00E9es" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les instructions d'installation" })] })] }), _jsx("h4", { className: "font-medium mb-2", children: "R\u00E9g\u00E9n\u00E9rer la documentation" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# ou pour un module sp\u00E9cifique" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs auth` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u26A0\uFE0F ", _jsx("strong", { children: "Important" }), " : Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), " ", "est ", _jsx("strong", { children: "\u00E9cras\u00E9" }), " \u00E0 chaque g\u00E9n\u00E9ration. Ne le modifiez pas directement !"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Personnaliser la section \"Utilisation\"" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour ajouter du contenu personnalis\u00E9 qui ne sera", " ", _jsx("strong", { children: "jamais \u00E9cras\u00E9" }), ", cr\u00E9ez un fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", ":"] }), _jsx("h4", { className: "font-medium mb-2", children: "\u00C9tape 1 : Cr\u00E9er le composant personnalis\u00E9" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/votre-module/src/components/DocUsageCustom.tsx" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `"use client";
113
+ }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Architecture du syst\u00E8me" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83C\uDFAF EventBus Global" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Syst\u00E8me central de coordination des \u00E9v\u00E9nements realtime \u00E0 travers toute l'application." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD0C RealtimeProvider" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Provider React qui \u00E9tablit les connexions Supabase Realtime bas\u00E9es sur la configuration des modules." }), _jsx("h4", { className: "font-medium mb-2", children: "\u26A1 Hooks Scalables" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Collection de hooks React pour \u00E9couter des tables ou \u00E9v\u00E9nements sp\u00E9cifiques avec auto-refresh." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDEE0\uFE0F Build int\u00E9gr\u00E9" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration TypeScript lors du build des modules." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Configuration d\u00E9clarative dans les modules" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 G\u00E9n\u00E9ration automatique de config" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Hooks React pr\u00EAts \u00E0 l'emploi" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 RLS de Supabase" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Scalable pour n'importe quelle table" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 TypeScript avec types g\u00E9n\u00E9r\u00E9s" }) })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemples d'utilisation" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDD14 Notifications" }), ": Affichage en temps r\u00E9el des nouvelles notifications avec badge et auto-refresh"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDC65 Utilisateurs en ligne" }), ": Suivi des connexions/d\u00E9connexions des utilisateurs en direct"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDCCA Donn\u00E9es collaboratives" }), ": Synchronisation automatique des modifications de donn\u00E9es entre utilisateurs"] })] })] })] })] }), _jsxs(Card, { id: "section-module-docs", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Documenter ses modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Documentation auto-g\u00E9n\u00E9r\u00E9e" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Lorsque vous cr\u00E9ez un module, la documentation de base (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), ") est automatiquement g\u00E9n\u00E9r\u00E9e \u00E0 partir du fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "build.config.ts" }), ". Cette documentation inclut :"] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les pages disponibles" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les routes API" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les tables de base de donn\u00E9es" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les instructions d'installation" })] })] }), _jsx("h4", { className: "font-medium mb-2", children: "R\u00E9g\u00E9n\u00E9rer la documentation" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "# ou pour un module sp\u00E9cifique" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs auth` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u26A0\uFE0F ", _jsx("strong", { children: "Important" }), " : Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), " ", "est ", _jsx("strong", { children: "\u00E9cras\u00E9" }), " \u00E0 chaque g\u00E9n\u00E9ration. Ne le modifiez pas directement !"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Personnaliser la section \"Utilisation\"" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour ajouter du contenu personnalis\u00E9 qui ne sera", " ", _jsx("strong", { children: "jamais \u00E9cras\u00E9" }), ", cr\u00E9ez un fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", ":"] }), _jsx("h4", { className: "font-medium mb-2", children: "\u00C9tape 1 : Cr\u00E9er le composant personnalis\u00E9" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/votre-module/src/components/DocUsageCustom.tsx" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `"use client";
110
114
 
111
115
  import { Card, CardBody, CardHeader, Alert, Tabs, Tab } from "@lastbrain/ui";
112
116
  import { Lightbulb } from "lucide-react";
@@ -236,7 +240,7 @@ export function DocUsageCustom() {
236
240
  <p>Description...</p>
237
241
  </div>
238
242
  );
239
- }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Package, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-6", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-4", children: "Modules Disponibles" }), _jsxs("div", { className: "grid grid-cols-1 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Ai" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 auth, 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module ai` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-ai", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Auth" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 3 publique(s), 4 auth, 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module auth` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-auth", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Billing Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 3 auth, 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module billing-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Cj Analyzer Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 4 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module cj-analyzer-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Cart Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 publique(s), 2 auth, 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-cart-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Commerce Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-commerce-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Order Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-order-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Payment Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-payment-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Product Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 publique(s)"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-product-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Legal" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 4 publique(s), 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module legal` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-legal", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Project Board" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module project-board` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-project-board", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Recipes Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 4 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module recipes-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Shop Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 3 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module shop-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Tasks" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 auth, 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module nom-du-module` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-tasks", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la", " ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] }), _jsxs(Card, { id: "section-i18n", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Syst\u00E8me de traduction i18n"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Vue d'ensemble" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de traduction automatique qui :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Collecte les traductions de tous les modules" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les concat\u00E8ne dans l'application" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Permet l'acc\u00E8s aux traductions c\u00F4t\u00E9 client et serveur" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E8re le changement de langue via cookies" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure" }), _jsx("h4", { className: "font-medium mb-2", children: "Dans les modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Chaque module peut d\u00E9finir ses traductions dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/i18n/" }), " ", ":"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "packages/module-auth/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "src/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "i18n/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "fr.json" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "en.json" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Exemple fr.json" }), " :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `{
243
+ }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Package, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-6", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-4", children: "Modules Disponibles" }), _jsxs("div", { className: "grid grid-cols-1 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Ai" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 auth, 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module ai` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-ai", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Audit Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 3 publique(s)"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module audit-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Auth" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 5 publique(s), 3 auth, 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module auth` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-auth", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Billing Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 publique(s), 3 auth, 5 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module billing-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Cj Analyzer Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 4 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module cj-analyzer-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Contact Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 publique(s), 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module contact-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Cart Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 publique(s), 2 auth, 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-cart-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Commerce Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-commerce-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Order Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-order-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Payment Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-payment-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Core Product Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 publique(s)"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module core-product-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Legal" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 4 publique(s), 2 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module legal` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-legal", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Project Board" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 1 publique(s), 2 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module project-board` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-project-board", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Recipes Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 5 auth"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module recipes-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-purple-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Shop Pro" }), _jsx("span", { className: "text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded", children: "PRO" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 3 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module shop-pro` }), _jsx("span", { className: "text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1", children: "\uD83D\uDD12 Documentation priv\u00E9e" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow border-l-4 border-l-blue-500", children: _jsxs(CardBody, { className: "space-y-3", children: [_jsxs("div", { className: "flex items-start justify-between", children: [_jsx("h3", { className: "text-lg font-semibold", children: "Tasks" }), _jsx("span", { className: "text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded", children: "FREE" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Module LastBrain" }), _jsxs("p", { className: "text-xs text-slate-500 dark:text-slate-500", children: [_jsx("strong", { children: "Pages:" }), " 2 auth, 1 admin"] }), _jsx(Snippet, { symbol: "\uD83D\uDCBB", hideSymbol: true, className: "text-sm", children: `pnpm lastbrain add-module nom-du-module` }), _jsx("a", { href: "https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-tasks", className: "text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation \u2192" })] }) })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la", " ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] }), _jsxs(Card, { id: "section-i18n", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Syst\u00E8me de traduction i18n"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Vue d'ensemble" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de traduction automatique qui :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Collecte les traductions de tous les modules" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les concat\u00E8ne dans l'application" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Permet l'acc\u00E8s aux traductions c\u00F4t\u00E9 client et serveur" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E8re le changement de langue via cookies" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure" }), _jsx("h4", { className: "font-medium mb-2", children: "Dans les modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Chaque module peut d\u00E9finir ses traductions dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/i18n/" }), " ", ":"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "packages/module-auth/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "src/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "i18n/" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "fr.json" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "en.json" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Exemple fr.json" }), " :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `{
240
244
  "welcome": "Bienvenue",
241
245
  "signin": "Se connecter",
242
246
  "signout": "Se déconnecter"
@@ -1 +1 @@
1
- {"version":3,"file":"DocPage.d.ts","sourceRoot":"","sources":["../../src/templates/DocPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA+FnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EACF,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAClC;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAY,EAAE,cAAc,EAAE,EAAE,YAAY,2CAiVrE"}
1
+ {"version":3,"file":"DocPage.d.ts","sourceRoot":"","sources":["../../src/templates/DocPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA+FnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EACF,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAClC;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAY,EAAE,cAAc,EAAE,EAAE,YAAY,2CAyXrE"}
@@ -28,11 +28,16 @@ export function DocPage({ modules = [], defaultContent }) {
28
28
  "default",
29
29
  "section-welcome",
30
30
  "section-quickstart",
31
+ "section-development",
32
+ "section-admin",
31
33
  "section-architecture",
32
34
  "section-create-module",
35
+ "section-routes",
36
+ "section-workflow",
33
37
  "section-database",
34
38
  "section-storage",
35
39
  "section-realtime",
40
+ "section-i18n",
36
41
  "section-ui",
37
42
  "section-module-docs",
38
43
  "section-links",
@@ -108,6 +113,13 @@ export function DocPage({ modules = [], defaultContent }) {
108
113
  icon: Rocket,
109
114
  color: "default",
110
115
  },
116
+ {
117
+ id: "section-development",
118
+ name: "Développement",
119
+ description: "",
120
+ icon: Rocket,
121
+ color: "default",
122
+ },
111
123
  {
112
124
  id: "section-architecture",
113
125
  name: "Architecture",
@@ -115,6 +127,13 @@ export function DocPage({ modules = [], defaultContent }) {
115
127
  icon: Building2,
116
128
  color: "default",
117
129
  },
130
+ {
131
+ id: "section-admin",
132
+ name: "Administration",
133
+ description: "",
134
+ icon: Building2,
135
+ color: "default",
136
+ },
118
137
  {
119
138
  id: "section-create-module",
120
139
  name: "Créer un module",
@@ -122,6 +141,20 @@ export function DocPage({ modules = [], defaultContent }) {
122
141
  icon: Package,
123
142
  color: "default",
124
143
  },
144
+ {
145
+ id: "section-routes",
146
+ name: "Routes & API",
147
+ description: "",
148
+ icon: Link,
149
+ color: "default",
150
+ },
151
+ {
152
+ id: "section-workflow",
153
+ name: "Workflow",
154
+ description: "",
155
+ icon: RotateCcw,
156
+ color: "default",
157
+ },
125
158
  {
126
159
  id: "section-database",
127
160
  name: "Base de données",
@@ -150,6 +183,13 @@ export function DocPage({ modules = [], defaultContent }) {
150
183
  icon: Palette,
151
184
  color: "default",
152
185
  },
186
+ {
187
+ id: "section-i18n",
188
+ name: "Internationalisation",
189
+ description: "",
190
+ icon: BookOpen,
191
+ color: "default",
192
+ },
153
193
  {
154
194
  id: "section-module-docs",
155
195
  name: "Doc des modules",
@@ -1,4 +1,6 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // GENERATED BY LASTBRAIN TEMPLATE (Migrations Guide)
2
4
  import { Card, Code, Divider, Chip } from "@lastbrain/ui";
3
5
  export function MigrationsGuidePage() {
4
6
  return (_jsxs("div", { className: "max-w-5xl mx-auto px-6 py-10 space-y-10", children: [_jsxs("header", { className: "space-y-3", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Guide Migrations" }), _jsx("p", { className: "text-slate-600 dark:text-slate-300 text-sm", children: "Gestion s\u00E9par\u00E9e des scripts UP et DOWN par module." }), _jsxs("div", { className: "flex gap-2 flex-wrap", children: [_jsx(Chip, { color: "primary", children: "UP" }), _jsx(Chip, { color: "secondary", children: "DOWN" }), _jsx(Chip, { color: "success", children: "Reset" }), _jsx(Chip, { color: "warning", children: "Push" })] })] }), _jsx(Divider, {}), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Emplacement" }), _jsx(Code, { className: "text-xs block", children: "supabase/migrations/ (UP)" }), _jsx(Code, { className: "text-xs block", children: "supabase/migrations-down/ (DOWN)" })] }), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Cycle" }), _jsxs("ol", { className: "list-decimal pl-5 text-sm space-y-1 text-slate-600 dark:text-slate-400", children: [_jsx("li", { children: "Ajouter fichier SQL (ex: 002_add_profiles.sql)" }), _jsx("li", { children: "Rebuild module si nouveaux scripts copi\u00E9s" }), _jsxs("li", { children: [_jsx(Code, { className: "text-xs inline", children: "supabase db push" }), " pour appliquer"] }), _jsxs("li", { children: [_jsx(Code, { className: "text-xs inline", children: "supabase db reset" }), " en dev complet"] }), _jsx("li", { children: "DOWNs ex\u00E9cut\u00E9s via remove-module (option down)" })] })] }), _jsxs(Card, { className: "p-6 space-y-2", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Exemple fichier UP" }), _jsx(Code, { className: "text-xs whitespace-pre-wrap", children: `-- 002_add_profiles.sql
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleGuidePage.d.ts","sourceRoot":"","sources":["../../src/templates/ModuleGuidePage.tsx"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,4CAkE9B"}
1
+ {"version":3,"file":"ModuleGuidePage.d.ts","sourceRoot":"","sources":["../../src/templates/ModuleGuidePage.tsx"],"names":[],"mappings":"AAKA,wBAAgB,eAAe,4CAkE9B"}
@@ -1,5 +1,8 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Card, Code, Divider, Chip } from "@lastbrain/ui";
3
+ // GENERATED BY LASTBRAIN TEMPLATE (Module Guide)
4
+ import { Code } from "@lastbrain/ui";
5
+ import { Card, Divider, Chip } from "@lastbrain/ui/ui-server";
3
6
  export function ModuleGuidePage() {
4
7
  return (_jsxs("div", { className: "max-w-5xl mx-auto px-6 py-10 space-y-10", children: [_jsxs("header", { className: "space-y-3", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Guide Modules" }), _jsx("p", { className: "text-slate-600 dark:text-slate-300 text-sm", children: "Cr\u00E9ez, enregistrez et d\u00E9ployez des modules LastBrain r\u00E9utilisables." }), _jsxs("div", { className: "flex gap-2 flex-wrap", children: [_jsx(Chip, { color: "primary", children: "Pages" }), _jsx(Chip, { color: "secondary", children: "APIs" }), _jsx(Chip, { color: "success", children: "Migrations" })] })] }), _jsx(Divider, {}), _jsxs(Card, { className: "p-6 space-y-4", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Structure d'un module" }), _jsx(Code, { className: "text-xs block", children: "packages/module-xyz/" }), _jsx(Code, { className: "text-xs block", children: "\u251C\u2500 src/" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 index.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 xyz.build.config.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 web/public/XyzPage.tsx" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u2514\u2500 api/public/info.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2514\u2500 supabase/migrations/001_xyz_init.sql" })] }), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Config de build" }), _jsx(Code, { className: "text-xs whitespace-pre-wrap", children: `const xyzBuildConfig = {
5
8
  moduleName: "@lastbrain/module-xyz",
@@ -1,4 +1,6 @@
1
+ "use client";
1
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ // SIMPLE VERSION FOR DEBUGGING
2
4
  import NextLink from "next/link";
3
5
  import { Button, Card, CardBody, CardHeader, Chip, Snippet, } from "@lastbrain/ui";
4
6
  import { Rocket, Package, Database, Code, Zap, Shield, ArrowRight, BookOpen, } from "lucide-react";