@lastbrain/app 0.1.13 → 0.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"AAWA,wBAAgB,oBAAoB,4CAkcnC"}
1
+ {"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"AAaA,wBAAgB,oBAAoB,4CAioBnC"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Card, CardBody, CardHeader, Chip, Snippet } from "@lastbrain/ui";
3
- import { Rocket, Building2, BookOpen, Database, Palette, Link as LinkIcon, } from "lucide-react";
3
+ import { Rocket, Building2, BookOpen, Database, Palette, Link as LinkIcon, Shield, Zap, } from "lucide-react";
4
4
  export function DefaultDocumentation() {
5
5
  return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("div", { className: "flex items-center justify-between w-full", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Documentation LastBrain" }), _jsx(Chip, { color: "primary", variant: "flat", children: "v1.0.0" })] }) }), _jsx(CardBody, { className: "space-y-6", children: _jsx("div", { children: _jsx("p", { className: "text-slate-600 dark:text-slate-400 text-lg", children: "LastBrain est un framework modulaire pour cr\u00E9er des applications Next.js avec une architecture bas\u00E9e sur des modules r\u00E9utilisables." }) }) })] }), _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("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Installation" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm install" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Initialiser la base de donn\u00E9es" }), _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", children: "D\u00E9marre Supabase en local et applique les migrations" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Ajouter des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain list-modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm lastbrain add-module auth" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Modules disponibles : ", _jsx("strong", { children: "auth" }), " (authentification),", " ", _jsx("strong", { children: "ai" }), " (g\u00E9n\u00E9ration IA)"] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Construire les modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: "pnpm build:modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "G\u00E9n\u00E8re les pages et routes \u00E0 partir des modules install\u00E9s" })] }), _jsxs("div", { 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" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: ["Ouvre l'application sur", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:3000" })] })] })] })] }), _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-slate-600 dark:text-slate-400", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "border-l-4 border-blue-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." })] }), _jsxs("div", { className: "border-l-4 border-green-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." })] }), _jsxs("div", { className: "border-l-4 border-purple-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." })] }), _jsxs("div", { className: "border-l-4 border-orange-500 pl-4", children: [_jsx("h3", { className: "font-semibold text-lg mb-1", children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-*" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400", 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: [_jsxs("div", { 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-4", 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" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono", children: _jsxs("div", { className: "space-y-1", children: [_jsx("div", { children: "\uD83D\uDCC1 module-mon-module/" }), _jsx("div", { className: "ml-4", children: "\u251C\u2500\u2500 \uD83D\uDCC4 package.json" }), _jsx("div", { className: "ml-4", children: "\u251C\u2500\u2500 \uD83D\uDCC4 mon-module.build.config.ts" }), _jsx("div", { className: "ml-4", children: "\u2514\u2500\u2500 \uD83D\uDCC1 src/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC4 index.ts" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC4 server.ts" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 web/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 api/" }), _jsx("div", { className: "ml-8", children: "\u251C\u2500\u2500 \uD83D\uDCC1 components/" }), _jsx("div", { className: "ml-8", children: "\u2514\u2500\u2500 \uD83D\uDCC1 supabase/" }), _jsx("div", { className: "ml-12", children: "\u2514\u2500\u2500 \uD83D\uDCC1 migrations/" })] }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration du module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le fichier", " ", _jsxs("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: ["{slug}", ".build.config.ts"] }), " ", "d\u00E9finit les pages et APIs :"] }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono overflow-x-auto", children: _jsx("pre", { children: `export default {
6
6
  name: "Mon Module",
@@ -18,7 +18,13 @@ export function DefaultDocumentation() {
18
18
  handler: "./api/mon-api"
19
19
  }
20
20
  ]
21
- }` }) })] })] })] }), _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: [_jsxs("div", { 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-3", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "D\u00E9marrer Supabase :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:init" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Synchroniser les migrations :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:migrations:sync" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Cr\u00E9er une migration :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration new ma_migration" })] })] })] }), _jsxs("div", { children: [_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", 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-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: [_jsxs("div", { 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-3", 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."] })] }), _jsxs("div", { children: [_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."] })] }), _jsxs("div", { children: [_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", 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" }), "."] })] })] })] }), _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-slate-600 dark:text-slate-400", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9er une documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans votre module, cr\u00E9ez", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/components/Doc.tsx" }), " ", ":"] }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono overflow-x-auto", children: _jsx("pre", { children: `export function MonModuleDoc() {
21
+ }` }) })] })] })] }), _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: [_jsxs("div", { 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-3", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsxs("div", { className: "space-y-3", children: [_jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "D\u00E9marrer Supabase :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:init" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Synchroniser les migrations :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm db:migrations:sync" })] }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium mb-1", children: "Cr\u00E9er une migration :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration new ma_migration" })] })] })] }), _jsxs("div", { children: [_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", 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: _jsx("h2", { className: "text-2xl font-semibold", children: "\uD83D\uDC64 Cr\u00E9er un Compte Administrateur" }) }), _jsx(CardBody, { className: "space-y-4", children: _jsxs("ol", { className: "list-decimal list-inside space-y-4", children: [_jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Cr\u00E9er un compte" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Promouvoir en administrateur" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsx("div", { className: "ml-6", children: _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: `update auth.users
22
+ set raw_app_meta_data = jsonb_set(
23
+ coalesce(raw_app_meta_data, '{}'::jsonb),
24
+ '{roles}',
25
+ '["admin"]'::jsonb
26
+ )
27
+ where email = 'votre@email.com';` }) })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 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: [_jsxs("div", { 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", children: "pnpm dev" })] }), _jsxs("div", { children: [_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", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "pnpm build" })] }), _jsxs("div", { children: [_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", 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-slate-600 dark:text-slate-400 mb-4", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-blue-600 dark:text-blue-400", children: "/auth/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Authentification requise" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-purple-600 dark:text-purple-400", children: "/admin/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Superadmin uniquement" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-green-600 dark:text-green-400", children: "/docs/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Acc\u00E8s public" })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-4", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 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: [_jsxs("div", { 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: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "packages/module-*/src" })] })] }), _jsxs("div", { children: [_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", children: "pnpm build" })] }), _jsxs("div", { children: [_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", children: "pnpm build:modules" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", children: "supabase migration up" })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm", 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: [_jsxs("div", { 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-3", 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."] })] }), _jsxs("div", { children: [_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."] })] }), _jsxs("div", { children: [_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", 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" }), "."] })] })] })] }), _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-slate-600 dark:text-slate-400", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsxs("div", { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9er une documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans votre module, cr\u00E9ez", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/components/Doc.tsx" }), " ", ":"] }), _jsx("div", { className: "bg-slate-50 dark:bg-slate-900 p-4 rounded-lg text-sm font-mono overflow-x-auto", children: _jsx("pre", { children: `export function MonModuleDoc() {
22
28
  return (
23
29
  <div>
24
30
  <h1>Mon Module</h1>
@@ -18,11 +18,11 @@ export function SimpleDocPage() {
18
18
  const key = Array.from(keys)[0];
19
19
  if (key)
20
20
  scrollToSection(key);
21
- }, children: [_jsx(ListboxItem, { children: "Introduction" }, "intro"), _jsx(ListboxItem, { children: "D\u00E9marrage Rapide" }, "quickstart"), _jsx(ListboxItem, { children: "Modules" }, "modules"), _jsx(ListboxItem, { children: "Base de Donn\u00E9es" }, "database"), _jsx(ListboxItem, { children: "D\u00E9veloppement" }, "development"), _jsx(ListboxItem, { children: "Routes Prot\u00E9g\u00E9es" }, "routes"), _jsx(ListboxItem, { children: "Compte Admin" }, "admin"), _jsx(ListboxItem, { children: "Commandes CLI" }, "cli"), _jsx(ListboxItem, { children: "Workflow" }, "workflow")] }) })] }) }), _jsxs("main", { className: "flex-1 space-y-8", children: [_jsxs("section", { id: "intro", children: [_jsx("h1", { className: "text-4xl font-bold mb-4 bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent", children: "Documentation LastBrain" }), _jsx("p", { className: "text-xl text-slate-600 dark:text-slate-400 mb-6", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx(Card, { children: _jsx(CardBody, { children: _jsxs("ul", { className: "space-y-2 text-slate-700 dark:text-slate-300", children: [_jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "CLI int\u00E9gr\u00E9" }), " - Cr\u00E9ez et g\u00E9rez vos applications en ligne de commande"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Syst\u00E8me de modules" }), " - Architecture modulaire extensible"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "HeroUI" }), " - 58 composants UI modernes et accessibles"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "TypeScript" }), " - Typage strict pour une meilleure DX"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Supabase" }), " - Base de donn\u00E9es et authentification int\u00E9gr\u00E9es"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Hot reload" }), " - D\u00E9veloppement avec rechargement automatique"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Migrations" }), " - Gestion UP/DOWN des migrations SQL"] })] }) }) })] }), _jsx("section", { id: "quickstart", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9marrage Rapide" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Installation" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. D\u00E9marrer" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm db:init" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:3000" })] })] })] })] }) }), _jsx("section", { id: "modules", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCE6 Modules Disponibles" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "Authentification compl\u00E8te avec gestion des profils utilisateur, adresses et notifications." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module auth" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-ai" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "G\u00E9n\u00E9ration IA (texte et images) avec syst\u00E8me de tokens et gestion des co\u00FBts." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module ai" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module auth" }) })] })] })] }) }), _jsx("section", { id: "database", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDDC4\uFE0F Base de Donn\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Initialiser Supabase" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:init" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9marrer Supabase local" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase start" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Synchroniser les migrations des modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:migrations:sync" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Acc\u00E9der au Studio Supabase" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["Une fois Supabase d\u00E9marr\u00E9, acc\u00E9dez au Studio sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:54323" })] })] })] })] }) }), _jsx("section", { id: "development", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "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: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build:modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] })] })] })] }) }), _jsx("section", { id: "routes", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDD Routes Prot\u00E9g\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-blue-600 dark:text-blue-400", children: "/auth/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Authentification requise" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-purple-600 dark:text-purple-400", children: "/admin/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Superadmin uniquement" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-green-600 dark:text-green-400", children: "/docs/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Acc\u00E8s public" })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-4", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "middleware.ts" })] })] })] }) }), _jsx("section", { id: "admin", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDC64 Cr\u00E9er un Compte Administrateur" }) }), _jsx(CardBody, { className: "pt-4 space-y-4", children: _jsxs("ol", { className: "list-decimal list-inside space-y-4", children: [_jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Cr\u00E9er un compte" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Promouvoir en administrateur" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: "Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase ou via psql :" }), _jsx("div", { className: "ml-6", children: _jsxs(Snippet, { symbol: "", color: "default", size: "sm", children: [_jsx("span", { children: `update auth.users` }), _jsx("span", { children: `
21
+ }, children: [_jsx(ListboxItem, { children: "Introduction" }, "intro"), _jsx(ListboxItem, { children: "D\u00E9marrage Rapide" }, "quickstart"), _jsx(ListboxItem, { children: "Modules" }, "modules"), _jsx(ListboxItem, { children: "Base de Donn\u00E9es" }, "database"), _jsx(ListboxItem, { children: "D\u00E9veloppement" }, "development"), _jsx(ListboxItem, { children: "Routes Prot\u00E9g\u00E9es" }, "routes"), _jsx(ListboxItem, { children: "Compte Admin" }, "admin"), _jsx(ListboxItem, { children: "Commandes CLI" }, "cli"), _jsx(ListboxItem, { children: "Workflow" }, "workflow")] }) })] }) }), _jsxs("main", { className: "flex-1 space-y-8", children: [_jsxs("section", { id: "intro", children: [_jsx("h1", { className: "text-4xl font-bold mb-4 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent", children: "Documentation LastBrain" }), _jsx("p", { className: "text-xl text-slate-600 dark:text-slate-400 mb-6", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx(Card, { children: _jsx(CardBody, { children: _jsxs("ul", { className: "space-y-2 text-slate-700 dark:text-slate-300", children: [_jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "CLI int\u00E9gr\u00E9" }), " - Cr\u00E9ez et g\u00E9rez vos applications en ligne de commande"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Syst\u00E8me de modules" }), " - Architecture modulaire extensible"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "HeroUI" }), " - 58 composants UI modernes et accessibles"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "TypeScript" }), " - Typage strict pour une meilleure DX"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Supabase" }), " - Base de donn\u00E9es et authentification int\u00E9gr\u00E9es"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Hot reload" }), " - D\u00E9veloppement avec rechargement automatique"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Migrations" }), " - Gestion UP/DOWN des migrations SQL"] })] }) }) })] }), _jsx("section", { id: "quickstart", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9marrage Rapide" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Installation" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. D\u00E9marrer" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm db:init" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:3000" })] })] })] })] }) }), _jsx("section", { id: "modules", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCE6 Modules Disponibles" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "Authentification compl\u00E8te avec gestion des profils utilisateur, adresses et notifications." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module auth" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-ai" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "G\u00E9n\u00E9ration IA (texte et images) avec syst\u00E8me de tokens et gestion des co\u00FBts." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module ai" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module auth" }) })] })] })] }) }), _jsx("section", { id: "database", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDDC4\uFE0F Base de Donn\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Initialiser Supabase" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:init" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9marrer Supabase local" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase start" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Synchroniser les migrations des modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:migrations:sync" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Acc\u00E9der au Studio Supabase" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["Une fois Supabase d\u00E9marr\u00E9, acc\u00E9dez au Studio sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:54323" })] })] })] })] }) }), _jsx("section", { id: "development", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "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: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build:modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] })] })] })] }) }), _jsx("section", { id: "routes", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDD Routes Prot\u00E9g\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-blue-600 dark:text-blue-400", children: "/auth/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Authentification requise" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-purple-600 dark:text-purple-400", children: "/admin/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Superadmin uniquement" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-green-600 dark:text-green-400", children: "/docs/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Acc\u00E8s public" })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-4", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "middleware.ts" })] })] })] }) }), _jsx("section", { id: "admin", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDC64 Cr\u00E9er un Compte Administrateur" }) }), _jsx(CardBody, { className: "pt-4 space-y-4", children: _jsxs("ol", { className: "list-decimal list-inside space-y-4", children: [_jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Cr\u00E9er un compte" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Promouvoir en administrateur" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: "Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase ou via psql :" }), _jsx("div", { className: "ml-6", children: _jsxs(Snippet, { symbol: "", color: "default", size: "sm", children: [_jsx("span", { children: `update auth.users` }), _jsx("span", { children: `
22
22
  set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: `
23
23
  coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: `
24
24
  '{roles}',` }), _jsx("span", { children: `
25
25
  '["admin"]'::jsonb` }), _jsx("span", { children: `
26
26
  )` }), _jsx("span", { children: `
27
- where email = 'votre@email.com';` })] }) })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/admin" })] })] })] }) })] }) }), _jsx("section", { id: "cli", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDD27 Commandes CLI" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Ajouter un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain create-module my-module" }) })] })] })] }) }), _jsx("section", { id: "workflow", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\u26A1 Workflow de D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "packages/module-*/src" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Compiler le module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] })] })] }) }), _jsx("section", { id: "resources", children: _jsxs(Card, { className: "bg-linear-to-r from-blue-50 to-purple-50 dark:from-blue-950/30 dark:to-purple-950/30 border-blue-200 dark:border-blue-800", children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDA Resources Suppl\u00E9mentaires" }) }), _jsx(CardBody, { className: "pt-4", children: _jsxs("ul", { className: "space-y-2", children: [_jsxs("li", { children: ["\uD83D\uDCD6", " ", _jsx("a", { href: "/docs/CLI.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Documentation CLI compl\u00E8te" })] }), _jsxs("li", { children: ["\uD83D\uDD27", " ", _jsx("a", { href: "/docs/MODULES.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Guide de cr\u00E9ation de modules" })] }), _jsxs("li", { children: ["\uD83D\uDDC4\uFE0F", " ", _jsx("a", { href: "/docs/MIGRATIONS.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Syst\u00E8me de migrations" })] }), _jsxs("li", { children: ["\uD83C\uDFD7\uFE0F", " ", _jsx("a", { href: "/docs/MONOREPO_CLI_USAGE.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Architecture du monorepo" })] })] }) })] }) })] })] }) }));
27
+ where email = 'votre@email.com';` })] }) })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/admin" })] })] })] }) })] }) }), _jsx("section", { id: "cli", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDD27 Commandes CLI" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Ajouter un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain create-module my-module" }) })] })] })] }) }), _jsx("section", { id: "workflow", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\u26A1 Workflow de D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "packages/module-*/src" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Compiler le module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] })] })] }) }), _jsx("section", { id: "resources", children: _jsxs(Card, { className: "bg-gradient-to-r from-blue-50 to-purple-50 dark:from-blue-950/30 dark:to-purple-950/30 border-blue-200 dark:border-blue-800", children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDA Resources Suppl\u00E9mentaires" }) }), _jsx(CardBody, { className: "pt-4", children: _jsxs("ul", { className: "space-y-2", children: [_jsxs("li", { children: ["\uD83D\uDCD6", " ", _jsx("a", { href: "/docs/CLI.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Documentation CLI compl\u00E8te" })] }), _jsxs("li", { children: ["\uD83D\uDD27", " ", _jsx("a", { href: "/docs/MODULES.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Guide de cr\u00E9ation de modules" })] }), _jsxs("li", { children: ["\uD83D\uDDC4\uFE0F", " ", _jsx("a", { href: "/docs/MIGRATIONS.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Syst\u00E8me de migrations" })] }), _jsxs("li", { children: ["\uD83C\uDFD7\uFE0F", " ", _jsx("a", { href: "/docs/MONOREPO_CLI_USAGE.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Architecture du monorepo" })] })] }) })] }) })] })] }) }));
28
28
  }
@@ -3,5 +3,5 @@ import NextLink from "next/link";
3
3
  import { Button, Card, CardBody, CardHeader, Chip, Snippet, } from "@lastbrain/ui";
4
4
  import { Rocket, Package, Database, Code, Zap, Shield, ArrowRight, BookOpen, } from "lucide-react";
5
5
  export function SimpleHomePage({ showAuth }) {
6
- return (_jsxs("div", { className: "min-h-screen", children: [_jsxs("section", { className: "relative overflow-hidden bg-linear-to-br from-blue-50 via-purple-50 to-pink-50 dark:from-slate-900 dark:via-purple-900/20 dark:to-blue-900/20", children: [_jsx("div", { className: "absolute inset-0 bg-grid-slate-200/50 dark:bg-grid-slate-700/25 mask-[radial-gradient(ellipse_at_center,transparent_20%,black)]" }), _jsx("div", { className: "relative container mx-auto px-4 py-24 md:py-32", children: _jsxs("div", { className: "max-w-4xl mx-auto text-center", children: [_jsxs("div", { className: "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 mb-8", children: [_jsx(Zap, { size: 16 }), _jsx("span", { className: "text-sm font-medium", children: "Framework modulaire Next.js" })] }), _jsx("h1", { className: "text-5xl md:text-7xl font-bold mb-6 bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent", children: "Bienvenue sur LastBrain" }), _jsx("p", { className: "text-xl md:text-2xl text-slate-600 dark:text-slate-300 mb-12 max-w-2xl mx-auto", children: "Cr\u00E9ez des applications modernes avec une architecture modulaire, puissante et \u00E9volutive." }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-4 justify-center", children: [_jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", color: "primary", endContent: _jsx(ArrowRight, { size: 20 }), className: "text-base font-medium", children: "Voir la documentation" }) }), showAuth && (_jsx(NextLink, { href: "/signup", children: _jsx(Button, { size: "lg", variant: "bordered", className: "text-base font-medium", children: "Cr\u00E9er un compte" }) }))] })] }) })] }), _jsx("section", { className: "py-20 bg-white dark:bg-slate-950", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-6xl mx-auto", children: [_jsxs("div", { className: "text-center mb-16", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Tout ce dont vous avez besoin" }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Une stack moderne pour d\u00E9marrer rapidement" })] }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3", children: [_jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Modulaire" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Architecture bas\u00E9e sur des modules r\u00E9utilisables. Ajoutez ou retirez des fonctionnalit\u00E9s en une commande." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-purple-100 dark:bg-purple-900/30", children: _jsx(Database, { className: "text-purple-600 dark:text-purple-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Supabase" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Base de donn\u00E9es PostgreSQL, authentification et migrations automatiques. Tout en local pour le d\u00E9veloppement." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-green-100 dark:bg-green-900/30", children: _jsx(Zap, { className: "text-green-600 dark:text-green-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Rapide" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Next.js 15, React 19, Tailwind CSS v4. Hot reload et g\u00E9n\u00E9ration automatique des routes." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-orange-100 dark:bg-orange-900/30", children: _jsx(Code, { className: "text-orange-600 dark:text-orange-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "TypeScript" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "100% TypeScript avec types partag\u00E9s entre frontend et backend. Monorepo pnpm pour une gestion optimale." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-pink-100 dark:bg-pink-900/30", children: _jsx(Shield, { className: "text-pink-600 dark:text-pink-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "S\u00E9curis\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Middleware d'authentification automatique. Routes prot\u00E9g\u00E9es pour /auth et /admin configur\u00E9es par d\u00E9faut." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-cyan-100 dark:bg-cyan-900/30", children: _jsx(BookOpen, { className: "text-cyan-600 dark:text-cyan-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Document\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Documentation compl\u00E8te et interactive. Chaque module documente automatiquement ses pages et APIs." }) })] })] })] }) }) }), _jsx("section", { className: "py-20 bg-slate-50 dark:bg-slate-900/50", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-4xl mx-auto", children: [_jsxs("div", { className: "text-center mb-12", children: [_jsxs("div", { className: "inline-flex items-center gap-2 mb-4", children: [_jsx(Rocket, { size: 24, className: "text-blue-600" }), _jsx("h2", { className: "text-3xl md:text-4xl font-bold", children: "D\u00E9marrez en 4 \u00E9tapes" })] }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Votre application pr\u00EAte en quelques minutes" })] }), _jsxs("div", { className: "space-y-6", children: [_jsx(Card, { className: "border-l-4 border-l-blue-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center font-bold text-blue-600 dark:text-blue-400", children: "1" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ez votre application" }), _jsx(Snippet, { className: "w-full", children: "pnpx @lastbrain/create-app mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "L'assistant interactif vous guidera pour :" }), _jsxs("ul", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2 ml-4 space-y-1", children: [_jsx("li", { children: "\u2022 Choisir les modules \u00E0 installer (auth, ai...)" }), _jsx("li", { children: "\u2022 Cr\u00E9er la structure compl\u00E8te du projet" }), _jsx("li", { children: "\u2022 Installer automatiquement les d\u00E9pendances" }), _jsx("li", { children: "\u2022 G\u00E9n\u00E9rer les routes des modules" })] })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-purple-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center font-bold text-purple-600 dark:text-purple-400", children: "2" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Acc\u00E9dez au dossier" }), _jsx(Snippet, { className: "w-full", children: "cd mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "Entrez dans le dossier de votre nouvelle application" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-orange-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-orange-100 dark:bg-orange-900/30 flex items-center justify-center font-bold text-orange-600 dark:text-orange-400", children: "3" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Initialisez Supabase" }), _jsx(Snippet, { className: "w-full", children: "pnpm db:init" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "D\u00E9marre Supabase en local et applique toutes les migrations (base + modules)" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-green-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center font-bold text-green-600 dark:text-green-400", children: "4" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancez le serveur" }), _jsx(Snippet, { className: "w-full", children: "pnpm dev" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Ouvre l'application sur", " ", _jsx("strong", { children: "http://localhost:3000" })] })] })] }) }) }), _jsx(Card, { className: "bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30 shrink-0", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 20 }) }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2 text-blue-900 dark:text-blue-100", children: "Ajouter des modules plus tard" }), _jsxs("div", { className: "space-y-2", children: [_jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm build:modules" })] }), _jsxs("div", { className: "text-sm text-blue-700 dark:text-blue-300 mt-2", children: ["Modules disponibles :", " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "auth" }), " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "ai" })] })] })] }) }) })] })] }) }) }), _jsx("section", { className: "py-20 bg-linear-to-r from-blue-600 to-purple-600 text-white", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-3xl mx-auto text-center", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Pr\u00EAt \u00E0 commencer ?" }), _jsx("p", { className: "text-lg text-blue-100 mb-8", children: "Explorez la documentation compl\u00E8te pour d\u00E9couvrir toutes les fonctionnalit\u00E9s" }), _jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", className: "bg-white text-blue-600 hover:bg-blue-50 font-medium", endContent: _jsx(BookOpen, { size: 20 }), children: "Consulter la documentation" }) })] }) }) })] }));
6
+ return (_jsxs("div", { className: "min-h-screen", children: [_jsxs("section", { className: "relative overflow-hidden bg-gradient-to-br from-blue-50 via-purple-50 to-pink-50 dark:from-slate-900 dark:via-purple-900/20 dark:to-blue-900/20", children: [_jsx("div", { className: "absolute inset-0 bg-grid-slate-200/50 dark:bg-grid-slate-700/25 mask-[radial-gradient(ellipse_at_center,transparent_20%,black)]" }), _jsx("div", { className: "relative container mx-auto px-4 py-24 md:py-32", children: _jsxs("div", { className: "max-w-4xl mx-auto text-center", children: [_jsxs("div", { className: "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 mb-8", children: [_jsx(Zap, { size: 16 }), _jsx("span", { className: "text-sm font-medium", children: "Framework modulaire Next.js" })] }), _jsx("h1", { className: "text-5xl md:text-7xl font-bold mb-6 bg-gradient-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent", children: "Bienvenue sur LastBrain" }), _jsx("p", { className: "text-xl md:text-2xl text-slate-600 dark:text-slate-300 mb-12 max-w-2xl mx-auto", children: "Cr\u00E9ez des applications modernes avec une architecture modulaire, puissante et \u00E9volutive." }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-4 justify-center", children: [_jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", color: "primary", endContent: _jsx(ArrowRight, { size: 20 }), className: "text-base font-medium", children: "Voir la documentation" }) }), showAuth && (_jsx(NextLink, { href: "/signup", children: _jsx(Button, { size: "lg", variant: "bordered", className: "text-base font-medium", children: "Cr\u00E9er un compte" }) }))] })] }) })] }), _jsx("section", { className: "py-20 bg-white dark:bg-slate-950", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-6xl mx-auto", children: [_jsxs("div", { className: "text-center mb-16", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Tout ce dont vous avez besoin" }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Une stack moderne pour d\u00E9marrer rapidement" })] }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3", children: [_jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Modulaire" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Architecture bas\u00E9e sur des modules r\u00E9utilisables. Ajoutez ou retirez des fonctionnalit\u00E9s en une commande." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-purple-100 dark:bg-purple-900/30", children: _jsx(Database, { className: "text-purple-600 dark:text-purple-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Supabase" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Base de donn\u00E9es PostgreSQL, authentification et migrations automatiques. Tout en local pour le d\u00E9veloppement." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-green-100 dark:bg-green-900/30", children: _jsx(Zap, { className: "text-green-600 dark:text-green-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Rapide" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Next.js 15, React 19, Tailwind CSS v4. Hot reload et g\u00E9n\u00E9ration automatique des routes." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-orange-100 dark:bg-orange-900/30", children: _jsx(Code, { className: "text-orange-600 dark:text-orange-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "TypeScript" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "100% TypeScript avec types partag\u00E9s entre frontend et backend. Monorepo pnpm pour une gestion optimale." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-pink-100 dark:bg-pink-900/30", children: _jsx(Shield, { className: "text-pink-600 dark:text-pink-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "S\u00E9curis\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Middleware d'authentification automatique. Routes prot\u00E9g\u00E9es pour /auth et /admin configur\u00E9es par d\u00E9faut." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-cyan-100 dark:bg-cyan-900/30", children: _jsx(BookOpen, { className: "text-cyan-600 dark:text-cyan-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Document\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Documentation compl\u00E8te et interactive. Chaque module documente automatiquement ses pages et APIs." }) })] })] })] }) }) }), _jsx("section", { className: "py-20 bg-slate-50 dark:bg-slate-900/50", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-4xl mx-auto", children: [_jsxs("div", { className: "text-center mb-12", children: [_jsxs("div", { className: "inline-flex items-center gap-2 mb-4", children: [_jsx(Rocket, { size: 24, className: "text-blue-600" }), _jsx("h2", { className: "text-3xl md:text-4xl font-bold", children: "D\u00E9marrez en 4 \u00E9tapes" })] }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Votre application pr\u00EAte en quelques minutes" })] }), _jsxs("div", { className: "space-y-6", children: [_jsx(Card, { className: "border-l-4 border-l-blue-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center font-bold text-blue-600 dark:text-blue-400", children: "1" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ez votre application" }), _jsx(Snippet, { className: "w-full", children: "pnpx @lastbrain/create-app mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "L'assistant interactif vous guidera pour :" }), _jsxs("ul", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2 ml-4 space-y-1", children: [_jsx("li", { children: "\u2022 Choisir les modules \u00E0 installer (auth, ai...)" }), _jsx("li", { children: "\u2022 Cr\u00E9er la structure compl\u00E8te du projet" }), _jsx("li", { children: "\u2022 Installer automatiquement les d\u00E9pendances" }), _jsx("li", { children: "\u2022 G\u00E9n\u00E9rer les routes des modules" })] })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-purple-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center font-bold text-purple-600 dark:text-purple-400", children: "2" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Acc\u00E9dez au dossier" }), _jsx(Snippet, { className: "w-full", children: "cd mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "Entrez dans le dossier de votre nouvelle application" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-orange-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-orange-100 dark:bg-orange-900/30 flex items-center justify-center font-bold text-orange-600 dark:text-orange-400", children: "3" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Initialisez Supabase" }), _jsx(Snippet, { className: "w-full", children: "pnpm db:init" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "D\u00E9marre Supabase en local et applique toutes les migrations (base + modules)" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-green-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center font-bold text-green-600 dark:text-green-400", children: "4" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancez le serveur" }), _jsx(Snippet, { className: "w-full", children: "pnpm dev" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Ouvre l'application sur", " ", _jsx("strong", { children: "http://localhost:3000" })] })] })] }) }) }), _jsx(Card, { className: "bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30 shrink-0", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 20 }) }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2 text-blue-900 dark:text-blue-100", children: "Ajouter des modules plus tard" }), _jsxs("div", { className: "space-y-2", children: [_jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm build:modules" })] }), _jsxs("div", { className: "text-sm text-blue-700 dark:text-blue-300 mt-2", children: ["Modules disponibles :", " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "auth" }), " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "ai" })] })] })] }) }) })] })] }) }) }), _jsx("section", { className: "py-20 bg-gradient-to-r from-blue-600 to-purple-600 text-white", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-3xl mx-auto text-center", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Pr\u00EAt \u00E0 commencer ?" }), _jsx("p", { className: "text-lg text-blue-100 mb-8", children: "Explorez la documentation compl\u00E8te pour d\u00E9couvrir toutes les fonctionnalit\u00E9s" }), _jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", className: "bg-white text-blue-600 hover:bg-blue-50 font-medium", endContent: _jsx(BookOpen, { size: 20 }), children: "Consulter la documentation" }) })] }) }) })] }));
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/app",
3
- "version": "0.1.13",
3
+ "version": "0.1.15",
4
4
  "description": "Framework modulaire Next.js avec CLI et système de modules",
5
5
  "private": false,
6
6
  "type": "module",
@@ -31,9 +31,6 @@
31
31
  "src"
32
32
  ],
33
33
  "dependencies": {
34
- "@lastbrain/core": "0.1.0",
35
- "@lastbrain/module-auth": "0.1.0",
36
- "@lastbrain/ui": "0.1.0",
37
34
  "@supabase/supabase-js": "^2.36.0",
38
35
  "chalk": "^5.3.0",
39
36
  "commander": "^12.1.0",
@@ -42,14 +39,16 @@
42
39
  "lucide-react": "^0.554.0",
43
40
  "next-themes": "^0.4.6",
44
41
  "react": "^19.0.0",
45
- "react-dom": "^19.0.0"
42
+ "react-dom": "^19.0.0",
43
+ "@lastbrain/core": "0.1.0",
44
+ "@lastbrain/module-auth": "0.1.1",
45
+ "@lastbrain/ui": "0.1.3"
46
46
  },
47
47
  "peerDependencies": {
48
48
  "next": ">=15.0.0"
49
49
  },
50
50
  "devDependencies": {
51
51
  "@heroui/theme": "^2.4.23",
52
- "@tailwindcss/postcss": "^4.0.0",
53
52
  "@types/fs-extra": "^11.0.4",
54
53
  "@types/inquirer": "^9.0.9",
55
54
  "@types/node": "^20.0.0",
@@ -57,7 +56,7 @@
57
56
  "inquirer": "^13.0.1",
58
57
  "postcss": "^8.4.0",
59
58
  "postcss-cli": "^11.0.0",
60
- "tailwindcss": "^4.0.0",
59
+ "tailwindcss": "^3.4.0",
61
60
  "typescript": "^5.4.0"
62
61
  },
63
62
  "scripts": {
@@ -306,8 +306,8 @@ async function addDependencies(
306
306
 
307
307
  // DevDependencies
308
308
  const requiredDevDeps = {
309
- "@tailwindcss/postcss": "^4.0.0",
310
- tailwindcss: "^4.0.0",
309
+ tailwindcss: "^3.4.0",
310
+ postcss: "^8.4.0",
311
311
  autoprefixer: "^10.4.20",
312
312
  typescript: "^5.4.0",
313
313
  "@types/node": "^20.0.0",
@@ -430,7 +430,9 @@ export default function RootLayout({ children }: PropsWithChildren<{}>) {
430
430
  // Créer globals.css
431
431
  const globalsPath = path.join(stylesDir, "globals.css");
432
432
  if (!fs.existsSync(globalsPath) || force) {
433
- const globalsContent = `@import "tailwindcss";
433
+ const globalsContent = `@tailwind base;
434
+ @tailwind components;
435
+ @tailwind utilities;
434
436
  `;
435
437
  await fs.writeFile(globalsPath, globalsContent);
436
438
  console.log(chalk.green("✓ styles/globals.css créé"));
@@ -741,14 +743,8 @@ const config = {
741
743
  content: [
742
744
  "./app/**/*.{js,ts,jsx,tsx,mdx}",
743
745
  "./components/**/*.{js,ts,jsx,tsx,mdx}",
744
- {
745
- raw: "",
746
- files: [
747
- "./node_modules/@lastbrain/*/src/**/*.{js,jsx,ts,tsx}",
748
- "./node_modules/@heroui/*/src/**/*.{js,jsx,ts,tsx}"
749
- ],
750
- relative: true
751
- }
746
+ "./node_modules/@lastbrain/*/src/**/*.{js,jsx,ts,tsx}",
747
+ "./node_modules/@heroui/*/src/**/*.{js,jsx,ts,tsx}"
752
748
  ],
753
749
  theme: {
754
750
  extend: {},
@@ -766,13 +762,7 @@ const config = {
766
762
  content: [
767
763
  "./app/**/*.{js,ts,jsx,tsx,mdx}",
768
764
  "./components/**/*.{js,ts,jsx,tsx,mdx}",
769
- {
770
- raw: "",
771
- files: [
772
- "./node_modules/@lastbrain/*/src/**/*.{js,jsx,ts,tsx}",
773
- ],
774
- relative: true
775
- }
765
+ "./node_modules/@lastbrain/*/src/**/*.{js,jsx,ts,tsx}",
776
766
  ],
777
767
  theme: {
778
768
  extend: {
@@ -809,7 +799,8 @@ export default config;
809
799
  if (!fs.existsSync(postcssConfigPath) || force) {
810
800
  const postcssConfig = `export default {
811
801
  plugins: {
812
- '@tailwindcss/postcss': {},
802
+ tailwindcss: {},
803
+ autoprefixer: {},
813
804
  },
814
805
  };
815
806
  `;
package/src/styles.css CHANGED
@@ -1,3 +1,5 @@
1
- @import "tailwindcss";
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
2
4
 
3
5
  /* Styles pour les composants @lastbrain/app */
@@ -7,6 +7,8 @@ import {
7
7
  Database,
8
8
  Palette,
9
9
  Link as LinkIcon,
10
+ Shield,
11
+ Zap,
10
12
  } from "lucide-react";
11
13
 
12
14
  export function DefaultDocumentation() {
@@ -299,6 +301,197 @@ export function DefaultDocumentation() {
299
301
  </CardBody>
300
302
  </Card>
301
303
 
304
+ <Card id="section-admin" className="scroll-mt-32">
305
+ <CardHeader>
306
+ <h2 className="text-2xl font-semibold">
307
+ 👤 Créer un Compte Administrateur
308
+ </h2>
309
+ </CardHeader>
310
+ <CardBody className="space-y-4">
311
+ <ol className="list-decimal list-inside space-y-4">
312
+ <li className="text-lg">
313
+ <strong>Créer un compte</strong>
314
+ <p className="text-slate-600 dark:text-slate-400 ml-6 mb-2">
315
+ Allez sur{" "}
316
+ <code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
317
+ /signup
318
+ </code>{" "}
319
+ et créez votre compte
320
+ </p>
321
+ </li>
322
+ <li className="text-lg">
323
+ <strong>Promouvoir en administrateur</strong>
324
+ <p className="text-slate-600 dark:text-slate-400 ml-6 mb-2">
325
+ Exécutez cette requête SQL dans le Studio Supabase (
326
+ <code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
327
+ http://localhost:54323
328
+ </code>
329
+ ) ou via psql :
330
+ </p>
331
+ <div className="ml-6">
332
+ <Snippet symbol="" hideSymbol className="text-sm">
333
+ {`update auth.users
334
+ set raw_app_meta_data = jsonb_set(
335
+ coalesce(raw_app_meta_data, '{}'::jsonb),
336
+ '{roles}',
337
+ '["admin"]'::jsonb
338
+ )
339
+ where email = 'votre@email.com';`}
340
+ </Snippet>
341
+ </div>
342
+ </li>
343
+ <li className="text-lg">
344
+ <strong>Accéder à l'interface admin</strong>
345
+ <p className="text-slate-600 dark:text-slate-400 ml-6">
346
+ Vous pouvez maintenant accéder à{" "}
347
+ <code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
348
+ /admin
349
+ </code>
350
+ </p>
351
+ </li>
352
+ </ol>
353
+ </CardBody>
354
+ </Card>
355
+
356
+ <Card id="section-development" className="scroll-mt-32">
357
+ <CardHeader>
358
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
359
+ <Rocket size={24} />
360
+ Développement
361
+ </h2>
362
+ </CardHeader>
363
+ <CardBody className="space-y-4">
364
+ <div>
365
+ <h3 className="text-lg font-semibold mb-2">
366
+ Lancer le serveur de développement
367
+ </h3>
368
+ <Snippet symbol="" hideSymbol className="text-sm">
369
+ pnpm dev
370
+ </Snippet>
371
+ </div>
372
+ <div>
373
+ <h3 className="text-lg font-semibold mb-2">
374
+ Générer les routes des modules
375
+ </h3>
376
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
377
+ À exécuter après avoir ajouté ou modifié des modules
378
+ </p>
379
+ <Snippet symbol="" hideSymbol className="text-sm">
380
+ pnpm build:modules
381
+ </Snippet>
382
+ </div>
383
+ <div>
384
+ <h3 className="text-lg font-semibold mb-2">
385
+ Build de production
386
+ </h3>
387
+ <Snippet symbol="" hideSymbol className="text-sm">
388
+ pnpm build
389
+ </Snippet>
390
+ </div>
391
+ <div>
392
+ <h3 className="text-lg font-semibold mb-2">
393
+ Développer un module
394
+ </h3>
395
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
396
+ cd packages/module-auth
397
+ </Snippet>
398
+ <Snippet symbol="" hideSymbol className="text-sm">
399
+ pnpm dev
400
+ </Snippet>
401
+ </div>
402
+ </CardBody>
403
+ </Card>
404
+
405
+ <Card id="section-routes" className="scroll-mt-32">
406
+ <CardHeader>
407
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
408
+ <Shield size={24} />
409
+ Routes Protégées
410
+ </h2>
411
+ </CardHeader>
412
+ <CardBody className="space-y-4">
413
+ <p className="text-slate-600 dark:text-slate-400 mb-4">
414
+ Le middleware protège automatiquement vos routes selon ces règles :
415
+ </p>
416
+ <div className="space-y-2">
417
+ <div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
418
+ <code className="text-blue-600 dark:text-blue-400">/auth/*</code>
419
+ <span className="ml-2">→ Authentification requise</span>
420
+ </div>
421
+ <div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
422
+ <code className="text-purple-600 dark:text-purple-400">
423
+ /admin/*
424
+ </code>
425
+ <span className="ml-2">→ Superadmin uniquement</span>
426
+ </div>
427
+ <div className="p-3 bg-slate-50 dark:bg-slate-900 rounded">
428
+ <code className="text-green-600 dark:text-green-400">
429
+ /docs/*
430
+ </code>
431
+ <span className="ml-2">→ Accès public</span>
432
+ </div>
433
+ </div>
434
+ <p className="text-sm text-slate-600 dark:text-slate-400 mt-4">
435
+ Le middleware se trouve dans{" "}
436
+ <code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
437
+ middleware.ts
438
+ </code>
439
+ </p>
440
+ </CardBody>
441
+ </Card>
442
+
443
+ <Card id="section-workflow" className="scroll-mt-32">
444
+ <CardHeader>
445
+ <h2 className="text-2xl font-semibold flex items-center gap-2">
446
+ <Zap size={24} />
447
+ Workflow de Développement
448
+ </h2>
449
+ </CardHeader>
450
+ <CardBody className="space-y-4">
451
+ <div>
452
+ <h3 className="text-lg font-semibold mb-2">1. Modifier un module</h3>
453
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
454
+ Éditez les fichiers dans{" "}
455
+ <code className="px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded">
456
+ packages/module-*/src
457
+ </code>
458
+ </p>
459
+ </div>
460
+ <div>
461
+ <h3 className="text-lg font-semibold mb-2">2. Compiler le module</h3>
462
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
463
+ cd packages/module-auth
464
+ </Snippet>
465
+ <Snippet symbol="" hideSymbol className="text-sm">
466
+ pnpm build
467
+ </Snippet>
468
+ </div>
469
+ <div>
470
+ <h3 className="text-lg font-semibold mb-2">3. Régénérer les pages</h3>
471
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
472
+ cd apps/my-app
473
+ </Snippet>
474
+ <Snippet symbol="" hideSymbol className="text-sm">
475
+ pnpm build:modules
476
+ </Snippet>
477
+ </div>
478
+ <div>
479
+ <h3 className="text-lg font-semibold mb-2">
480
+ 4. Appliquer les migrations
481
+ </h3>
482
+ <Snippet symbol="" hideSymbol className="text-sm">
483
+ supabase migration up
484
+ </Snippet>
485
+ </div>
486
+ <div>
487
+ <h3 className="text-lg font-semibold mb-2">5. Tester</h3>
488
+ <Snippet symbol="" hideSymbol className="text-sm">
489
+ pnpm dev
490
+ </Snippet>
491
+ </div>
492
+ </CardBody>
493
+ </Card>
494
+
302
495
  <Card id="section-ui" className="scroll-mt-32">
303
496
  <CardHeader>
304
497
  <h2 className="text-2xl font-semibold flex items-center gap-2">
@@ -61,7 +61,7 @@ export function SimpleDocPage() {
61
61
  <main className="flex-1 space-y-8">
62
62
  {/* Introduction */}
63
63
  <section id="intro">
64
- <h1 className="text-4xl font-bold mb-4 bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
64
+ <h1 className="text-4xl font-bold mb-4 bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">
65
65
  Documentation LastBrain
66
66
  </h1>
67
67
  <p className="text-xl text-slate-600 dark:text-slate-400 mb-6">
@@ -532,7 +532,7 @@ where email = 'votre@email.com';`}</span>
532
532
 
533
533
  {/* Resources supplémentaires */}
534
534
  <section id="resources">
535
- <Card className="bg-linear-to-r from-blue-50 to-purple-50 dark:from-blue-950/30 dark:to-purple-950/30 border-blue-200 dark:border-blue-800">
535
+ <Card className="bg-gradient-to-r from-blue-50 to-purple-50 dark:from-blue-950/30 dark:to-purple-950/30 border-blue-200 dark:border-blue-800">
536
536
  <CardHeader className="pb-0">
537
537
  <h2 className="text-3xl font-semibold">
538
538
  📚 Resources Supplémentaires