@lastbrain/app 0.1.36 → 0.1.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/module-registry.test.js +5 -16
- package/dist/scripts/init-app.d.ts.map +1 -1
- package/dist/scripts/init-app.js +2 -2
- package/dist/scripts/module-add.d.ts +0 -11
- package/dist/scripts/module-add.d.ts.map +1 -1
- package/dist/scripts/module-add.js +45 -22
- package/dist/scripts/module-build.d.ts.map +1 -1
- package/dist/scripts/module-build.js +90 -1
- package/dist/scripts/module-create.d.ts +23 -0
- package/dist/scripts/module-create.d.ts.map +1 -1
- package/dist/scripts/module-create.js +289 -56
- package/dist/scripts/module-delete.d.ts +6 -0
- package/dist/scripts/module-delete.d.ts.map +1 -0
- package/dist/scripts/module-delete.js +143 -0
- package/dist/scripts/module-list.d.ts.map +1 -1
- package/dist/scripts/module-list.js +2 -2
- package/dist/scripts/module-remove.d.ts.map +1 -1
- package/dist/scripts/module-remove.js +20 -4
- package/dist/styles.css +1 -1
- package/dist/templates/DefaultDoc.d.ts.map +1 -1
- package/dist/templates/DefaultDoc.js +132 -9
- package/dist/templates/DocPage.d.ts.map +1 -1
- package/dist/templates/DocPage.js +24 -7
- package/package.json +4 -4
- package/src/__tests__/module-registry.test.ts +5 -17
- package/src/scripts/init-app.ts +5 -2
- package/src/scripts/module-add.ts +55 -23
- package/src/scripts/module-build.ts +109 -1
- package/src/scripts/module-create.ts +392 -69
- package/src/scripts/module-delete.ts +202 -0
- package/src/scripts/module-list.ts +9 -2
- package/src/scripts/module-remove.ts +36 -4
- package/src/templates/DefaultDoc.tsx +1121 -424
- package/src/templates/DocPage.tsx +26 -10
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Card, CardBody, CardHeader, Snippet, Alert } from "@lastbrain/ui";
|
|
3
|
-
import { FileText, Rocket, Building2, BookOpen, Database, User, Shield, Zap, Palette, HardDrive, Link } from "lucide-react";
|
|
3
|
+
import { FileText, Rocket, Building2, BookOpen, Database, User, Shield, Zap, Palette, HardDrive, Link, } from "lucide-react";
|
|
4
4
|
export function DefaultDocumentation() {
|
|
5
|
-
return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Documentation LastBrain"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain est un framework modulaire pour cr\u00E9er des applications Next.js avec une architecture bas\u00E9e sur des modules r\u00E9utilisables." }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Version:" }), " v1.0.0"] })] })] }), _jsxs(Card, { id: "section-quickstart", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9marrage rapide"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("p", { className: "text-slate-600 dark:text-slate-400", children: [_jsx("strong", { children: "Note importante :" }), " LastBrain est un \u00E9cosyst\u00E8me de packages interconnect\u00E9s. L'application g\u00E9n\u00E9r\u00E9e utilise automatiquement ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ", ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", et les modules comme ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-auth" }), " et ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-ai" }), ". Tous ces packages sont n\u00E9cessaires pour le bon fonctionnement."] }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 1. Créer une nouvelle application (utilise @latest pour la version la plus récente)` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 2. Accéder au dossier` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd mon-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 3. Initialiser Supabase` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 4. Démarrer l'application` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Explication de la commande" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpx" }) }), " : Ex\u00E9cute un package npm sans l'installer globalement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app@latest" }) }), " : Package CLI de LastBrain en version la plus r\u00E9cente"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "init" }) }), " : Commande pour initialiser une nouvelle application"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "mon-app" }) }), " : Nom du dossier de votre application"] })] })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Cette commande va :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Cr\u00E9er la structure Next.js compl\u00E8te" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Installer automatiquement tous les packages n\u00E9cessaires (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ", ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", modules...)"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Configurer Supabase et les migrations" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer les routes des modules s\u00E9lectionn\u00E9s" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ation du Compte Admin" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# Promouvoir votre compte en admin via Supabase` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `update auth.users` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `set raw_app_meta_data = jsonb_set(` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` '{roles}',` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` '["admin"]'::jsonb` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `)` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `where email = 'votre@email.com';` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Votre application est maintenant disponible sur ", _jsx("a", { href: "http://localhost:3000", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "http://localhost:3000" }), " ! \uD83C\uDF89"] })] })] }), _jsxs(Card, { id: "section-architecture", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Building2, { size: 24 }), "Architecture"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/core" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/ui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/module-\\*" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Modules fonctionnels (auth, ai, etc.). Chaque module contient ses pages, APIs, composants, migrations et documentation." })] })] }), _jsxs(Card, { id: "section-create-module", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documentation des modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commande CLI" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module mon-module` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cr\u00E9e un nouveau module dans ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-mon-module" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4 whitespace-pre-wrap", children: `📁 module-mon-module/
|
|
5
|
+
return (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-welcome", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Documentation LastBrain"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain est un framework modulaire pour cr\u00E9er des applications Next.js avec une architecture bas\u00E9e sur des modules r\u00E9utilisables." }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Version:" }), " v1.0.0"] })] })] }), _jsxs(Card, { id: "section-quickstart", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9marrage rapide"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsxs("p", { className: "text-slate-600 dark:text-slate-400", children: [_jsx("strong", { children: "Note importante :" }), " LastBrain est un \u00E9cosyst\u00E8me de packages interconnect\u00E9s. L'application g\u00E9n\u00E9r\u00E9e utilise automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", et les modules comme", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-auth" }), " ", "et", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/module-ai" }), ". Tous ces packages sont n\u00E9cessaires pour le bon fonctionnement."] }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 1. Créer une nouvelle application (utilise @latest pour la version la plus récente)` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 2. Accéder au dossier` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd mon-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 3. Initialiser Supabase` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# 4. Démarrer l'application` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Explication de la commande" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpx @lastbrain/app@latest init mon-app` }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpx" }) }), " ", ": Ex\u00E9cute un package npm sans l'installer globalement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/app@latest" }) }), " ", ": Package CLI de LastBrain en version la plus r\u00E9cente"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "init" }) }), " ", ": Commande pour initialiser une nouvelle application"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "mon-app" }) }), " ", ": Nom du dossier de votre application"] })] })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Cette commande va :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Cr\u00E9er la structure Next.js compl\u00E8te" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Installer automatiquement tous les packages n\u00E9cessaires (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/core" }), ",", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), ", modules...)"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Configurer Supabase et les migrations" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "G\u00E9n\u00E9rer les routes des modules s\u00E9lectionn\u00E9s" })] })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ation du Compte Admin" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# Promouvoir votre compte en admin via Supabase` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `update auth.users` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `set raw_app_meta_data = jsonb_set(` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` '{roles}',` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: ` '["admin"]'::jsonb` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `)` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `where email = 'votre@email.com';` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("a", { href: "http://localhost:3000", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "http://localhost:3000" }), " ", "! \uD83C\uDF89"] })] })] }), _jsxs(Card, { id: "section-architecture", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Building2, { size: 24 }), "Architecture"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le projet est organis\u00E9 en monorepo avec pnpm workspaces :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Framework principal et CLI. Contient les layouts, scripts de build, templates et la logique de g\u00E9n\u00E9ration des pages." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/core" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilitaires et types partag\u00E9s. Contient les helpers Supabase, fonctions serveur et types TypeScript communs." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/ui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Composants UI r\u00E9utilisables bas\u00E9s sur NextUI et Tailwind CSS. Fournit les composants Card, Button, Input, etc." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "@lastbrain/module-\\*" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Modules fonctionnels (auth, ai, etc.). Chaque module contient ses pages, APIs, composants, migrations et documentation." })] })] }), _jsxs(Card, { id: "section-create-module", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documentation des modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commande CLI" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module mon-module` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cr\u00E9e un nouveau module dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-mon-module" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure d'un module" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4 whitespace-pre-wrap", children: `📁 module-mon-module/
|
|
6
6
|
├── 📄 package.json
|
|
7
7
|
├── 📄 mon-module.build.config.ts
|
|
8
8
|
└── 📁 src/
|
|
@@ -12,7 +12,7 @@ export function DefaultDocumentation() {
|
|
|
12
12
|
├── 📁 api/
|
|
13
13
|
├── 📁 components/
|
|
14
14
|
└── 📁 supabase/
|
|
15
|
-
└── 📁 migrations/` }), _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 ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " d\u00E9finit les pages et APIs :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export default {
|
|
15
|
+
└── 📁 migrations/` }), _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", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "d\u00E9finit les pages et APIs :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export default {
|
|
16
16
|
name: "Mon Module",
|
|
17
17
|
description: "Description du module",
|
|
18
18
|
pages: [
|
|
@@ -28,14 +28,14 @@ export function DefaultDocumentation() {
|
|
|
28
28
|
handler: "./api/mon-api",
|
|
29
29
|
},
|
|
30
30
|
],
|
|
31
|
-
};` }) })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsx("h4", { className: "font-medium mb-2", children: "D\u00E9marrer Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("h4", { className: "font-medium mb-2", children: "Synchroniser les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:migrations:sync` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er une migration" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `supabase migration new ma_migration` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Les modules peuvent avoir leurs propres migrations dans ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] }), _jsxs(Card, { id: "section-admin", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(User, { size: 24 }), "Cr\u00E9er un Compte Administrateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Cr\u00E9er un compte" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Allez sur ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/signup" }), " et cr\u00E9ez votre compte"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Promouvoir en administrateur" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `update auth.users
|
|
31
|
+
};` }) })] })] }), _jsxs(Card, { id: "section-database", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Database, { size: 24 }), "Base de donn\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase local" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain utilise Supabase pour la base de donn\u00E9es et l'authentification." }), _jsx("h4", { className: "font-medium mb-2", children: "D\u00E9marrer Supabase" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:init` }), _jsx("h4", { className: "font-medium mb-2", children: "Synchroniser les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm db:migrations:sync` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er une migration" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `supabase migration new ma_migration` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Migrations des modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Les modules peuvent avoir leurs propres migrations dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "supabase/migrations/" }), ". Elles sont automatiquement synchronis\u00E9es lors du build."] })] })] }), _jsxs(Card, { id: "section-admin", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(User, { size: 24 }), "Cr\u00E9er un Compte Administrateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Cr\u00E9er un compte" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Promouvoir en administrateur" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "http://localhost:54323" }), ") ou via psql :"] }), _jsxs(Snippet, { hideSymbol: true, color: "primary", className: "text-sm mb-2", children: [_jsx("span", { children: `update auth.users
|
|
32
32
|
` }), _jsx("span", { children: `set raw_app_meta_data = jsonb_set(
|
|
33
33
|
` }), _jsx("span", { children: ` coalesce(raw_app_meta_data, '{}'::jsonb),
|
|
34
34
|
` }), _jsx("span", { children: ` '{roles}',
|
|
35
35
|
` }), _jsx("span", { children: ` '["admin"]'::jsonb
|
|
36
36
|
` }), _jsx("span", { children: `)
|
|
37
37
|
` }), _jsx("span", { children: `where email = 'votre@email.com';
|
|
38
|
-
` })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Vous pouvez maintenant acc\u00E9der \u00E0 ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin" })] })] })] }), _jsxs(Card, { id: "section-development", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-routes", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Shield, { size: 24 }), "Routes Prot\u00E9g\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Routes" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/*" }), " \u2192 Authentification requise"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/*" }), " \u2192 Superadmin uniquement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/docs/*" }), " \u2192 Acc\u00E8s public"] })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le middleware se trouve dans ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "middleware.ts" })] })] })] }), _jsxs(Card, { id: "section-workflow", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "Workflow de D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-*/src" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Compiler le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd apps/my-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `supabase migration up` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-ui", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Palette, { size: 24 }), "Interface utilisateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Composants NextUI" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le package ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), " r\u00E9exporte les composants NextUI avec une configuration Tailwind personnalis\u00E9e."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Th\u00E8mes" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le mode sombre/clair est g\u00E9r\u00E9 par ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "next-themes" }), ". Le switch est disponible dans le header de l'application."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS v4" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le projet utilise Tailwind CSS v4 avec un preset personnalis\u00E9 partag\u00E9 via ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui/tailwind.preset" }), "."] })] })] }), _jsxs(Card, { id: "section-storage", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(HardDrive, { size: 24 }), "Syst\u00E8me de Proxy Storage"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de proxy pour les fichiers Supabase Storage qui permet d'utiliser des URLs propres avec contr\u00F4le d'acc\u00E8s granulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "URLs Proxy vs URLs Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u274C URL Supabase classique (longue)" }) }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u2705 URL Proxy (propre)" }) }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/avatar/user_128_123456.webp` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration des Buckets" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDCC2 avatar (Public)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Photos de profil et avatars \u2022 10MB max \u2022 Types: JPEG, PNG, WebP, GIF" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/avatar/user_128_123456.webp` }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD12 app (Priv\u00E9)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Fichiers priv\u00E9s des utilisateurs \u2022 100MB max \u2022 Authentification requise" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/app/user-id/documents/file.pdf` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans le code" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Upload d'un fichier
|
|
38
|
+
` })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin" })] })] })] }), _jsxs(Card, { id: "section-development", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Rocket, { size: 24 }), "D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-routes", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Shield, { size: 24 }), "Routes Prot\u00E9g\u00E9es"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Routes" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/auth/*" }), " ", "\u2192 Authentification requise"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/admin/*" }), " ", "\u2192 Superadmin uniquement"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "/docs/*" }), " ", "\u2192 Acc\u00E8s public"] })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "middleware.ts" })] })] })] }), _jsxs(Card, { id: "section-workflow", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Zap, { size: 24 }), "Workflow de D\u00E9veloppement"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/module-*/src" })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "2. Compiler le module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd packages/module-auth` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `cd apps/my-app` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `supabase migration up` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm dev` })] })] }), _jsxs(Card, { id: "section-ui", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Palette, { size: 24 }), "Interface utilisateur"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Composants NextUI" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le package", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui" }), " ", "r\u00E9exporte les composants NextUI avec une configuration Tailwind personnalis\u00E9e."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Th\u00E8mes" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le mode sombre/clair est g\u00E9r\u00E9 par", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "next-themes" }), ". Le switch est disponible dans le header de l'application."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS v4" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le projet utilise Tailwind CSS v4 avec un preset personnalis\u00E9 partag\u00E9 via", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "@lastbrain/ui/tailwind.preset" }), "."] })] })] }), _jsxs(Card, { id: "section-storage", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(HardDrive, { size: 24 }), "Syst\u00E8me de Proxy Storage"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de proxy pour les fichiers Supabase Storage qui permet d'utiliser des URLs propres avec contr\u00F4le d'acc\u00E8s granulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "URLs Proxy vs URLs Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u274C URL Supabase classique (longue)" }) }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("strong", { children: "\u2705 URL Proxy (propre)" }) }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/avatar/user_128_123456.webp` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration des Buckets" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDCC2 avatar (Public)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Photos de profil et avatars \u2022 10MB max \u2022 Types: JPEG, PNG, WebP, GIF" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/avatar/user_128_123456.webp` }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD12 app (Priv\u00E9)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Fichiers priv\u00E9s des utilisateurs \u2022 100MB max \u2022 Authentification requise" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `/api/storage/app/user-id/documents/file.pdf` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans le code" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Upload d'un fichier
|
|
39
39
|
import { uploadFile } from "@/api/storage";
|
|
40
40
|
|
|
41
41
|
const proxyUrl = await uploadFile(
|
|
@@ -50,7 +50,7 @@ const proxyUrl = await uploadFile(
|
|
|
50
50
|
import { storagePathToProxyUrl } from "@/lib/storage";
|
|
51
51
|
|
|
52
52
|
const proxyUrl = storagePathToProxyUrl("avatar/user_128_123456.webp");
|
|
53
|
-
// Retourne: "/api/storage/avatar/user_128_123456.webp"` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 URLs plus courtes et lisibles" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Contr\u00F4le d'acc\u00E8s granulaire" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Cache optimis\u00E9 (1 an)" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 am\u00E9lior\u00E9e" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 D\u00E9tection auto des types MIME" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Extensible facilement" }) })] })] })] }), _jsxs(Card, { id: "section-realtime", 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 }), "Syst\u00E8me Realtime"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de notifications et de synchronisation en temps r\u00E9el bas\u00E9 sur Supabase Realtime. Le syst\u00E8me est enti\u00E8rement automatis\u00E9 et scalable." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration dans les modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ajoutez la configuration realtime dans votre ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "build.config.ts" }), " pour activer la synchronisation en temps r\u00E9el :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export default {
|
|
53
|
+
// Retourne: "/api/storage/avatar/user_128_123456.webp"` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 URLs plus courtes et lisibles" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Contr\u00F4le d'acc\u00E8s granulaire" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Cache optimis\u00E9 (1 an)" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 am\u00E9lior\u00E9e" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 D\u00E9tection auto des types MIME" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Extensible facilement" }) })] })] })] }), _jsxs(Card, { id: "section-realtime", 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 }), "Syst\u00E8me Realtime"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "LastBrain int\u00E8gre un syst\u00E8me de notifications et de synchronisation en temps r\u00E9el bas\u00E9 sur Supabase Realtime. Le syst\u00E8me est enti\u00E8rement automatis\u00E9 et scalable." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Configuration dans les modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Ajoutez la configuration realtime dans votre", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "build.config.ts" }), " ", "pour activer la synchronisation en temps r\u00E9el :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export default {
|
|
54
54
|
name: "Module Auth",
|
|
55
55
|
description: "Gestion de l'authentification",
|
|
56
56
|
|
|
@@ -78,7 +78,7 @@ const proxyUrl = storagePathToProxyUrl("avatar/user_128_123456.webp");
|
|
|
78
78
|
pages: [
|
|
79
79
|
// vos pages...
|
|
80
80
|
],
|
|
81
|
-
};` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Lors du build des modules, la configuration realtime est automatiquement g\u00E9n\u00E9r\u00E9e :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cela g\u00E9n\u00E8re automatiquement ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "config/realtime.ts" }), " avec toutes les configurations des modules."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans les composants" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilisez les hooks pr\u00E9-construits pour \u00E9couter les changements :" }), _jsx("h4", { className: "font-medium mb-2", children: "1. Hook g\u00E9n\u00E9rique pour une table" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `import { useTableRealtime } from "@lastbrain/core";
|
|
81
|
+
};` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Lors du build des modules, la configuration realtime est automatiquement g\u00E9n\u00E9r\u00E9e :" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Cela g\u00E9n\u00E8re automatiquement", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "config/realtime.ts" }), " ", "avec toutes les configurations des modules."] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Utilisation dans les composants" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Utilisez les hooks pr\u00E9-construits pour \u00E9couter les changements :" }), _jsx("h4", { className: "font-medium mb-2", children: "1. Hook g\u00E9n\u00E9rique pour une table" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `import { useTableRealtime } from "@lastbrain/core";
|
|
82
82
|
|
|
83
83
|
function MonComposant() {
|
|
84
84
|
const signal = useTableRealtime("user_notifications");
|
|
@@ -113,12 +113,135 @@ function MonComposant() {
|
|
|
113
113
|
console.log("Données reçues:", payload);
|
|
114
114
|
}
|
|
115
115
|
}, [signal.tick]);
|
|
116
|
-
}` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Architecture du syst\u00E8me" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83C\uDFAF EventBus Global" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Syst\u00E8me central de coordination des \u00E9v\u00E9nements realtime \u00E0 travers toute l'application." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD0C RealtimeProvider" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Provider React qui \u00E9tablit les connexions Supabase Realtime bas\u00E9es sur la configuration des modules." }), _jsx("h4", { className: "font-medium mb-2", children: "\u26A1 Hooks Scalables" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Collection de hooks React pour \u00E9couter des tables ou \u00E9v\u00E9nements sp\u00E9cifiques avec auto-refresh." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDEE0\uFE0F Build int\u00E9gr\u00E9" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration TypeScript lors du build des modules." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Configuration d\u00E9clarative dans les modules" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 G\u00E9n\u00E9ration automatique de config" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Hooks React pr\u00EAts \u00E0 l'emploi" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 RLS de Supabase" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Scalable pour n'importe quelle table" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 TypeScript avec types g\u00E9n\u00E9r\u00E9s" }) })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemples d'utilisation" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDD14 Notifications" }), ": Affichage en temps r\u00E9el des nouvelles notifications avec badge et auto-refresh"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDC65 Utilisateurs en ligne" }), ": Suivi des connexions/d\u00E9connexions des utilisateurs en direct"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDCCA Donn\u00E9es collaboratives" }), ": Synchronisation automatique des modifications de donn\u00E9es entre utilisateurs"] })] })] })] })] }), _jsxs(Card, { id: "section-module-docs", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documenter ses modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "
|
|
116
|
+
}` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Architecture du syst\u00E8me" }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83C\uDFAF EventBus Global" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Syst\u00E8me central de coordination des \u00E9v\u00E9nements realtime \u00E0 travers toute l'application." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDD0C RealtimeProvider" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Provider React qui \u00E9tablit les connexions Supabase Realtime bas\u00E9es sur la configuration des modules." }), _jsx("h4", { className: "font-medium mb-2", children: "\u26A1 Hooks Scalables" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Collection de hooks React pour \u00E9couter des tables ou \u00E9v\u00E9nements sp\u00E9cifiques avec auto-refresh." }), _jsx("h4", { className: "font-medium mb-2", children: "\uD83D\uDEE0\uFE0F Build int\u00E9gr\u00E9" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "G\u00E9n\u00E9ration automatique de la configuration TypeScript lors du build des modules." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Avantages du syst\u00E8me" }), _jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Configuration d\u00E9clarative dans les modules" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 G\u00E9n\u00E9ration automatique de config" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Hooks React pr\u00EAts \u00E0 l'emploi" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 S\u00E9curit\u00E9 RLS de Supabase" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 Scalable pour n'importe quelle table" }) }), _jsx("div", { className: "flex items-start gap-2", children: _jsx("span", { children: "\u2705 TypeScript avec types g\u00E9n\u00E9r\u00E9s" }) })] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemples d'utilisation" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDD14 Notifications" }), ": Affichage en temps r\u00E9el des nouvelles notifications avec badge et auto-refresh"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDC65 Utilisateurs en ligne" }), ": Suivi des connexions/d\u00E9connexions des utilisateurs en direct"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: [_jsx("strong", { children: "\uD83D\uDCCA Donn\u00E9es collaboratives" }), ": Synchronisation automatique des modifications de donn\u00E9es entre utilisateurs"] })] })] })] })] }), _jsxs(Card, { id: "section-module-docs", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(BookOpen, { size: 24 }), "Documenter ses modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Chaque module peut exporter un composant de documentation qui sera automatiquement int\u00E9gr\u00E9 dans cette page." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Documentation auto-g\u00E9n\u00E9r\u00E9e" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Lorsque vous cr\u00E9ez un module, la documentation de base (", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), ") est automatiquement g\u00E9n\u00E9r\u00E9e \u00E0 partir du fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "build.config.ts" }), ". Cette documentation inclut :"] }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les pages disponibles" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les routes API" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les tables de base de donn\u00E9es" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les instructions d'installation" })] })] }), _jsx("h4", { className: "font-medium mb-2", children: "R\u00E9g\u00E9n\u00E9rer la documentation" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `# ou pour un module spécifique` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs auth` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["\u26A0\uFE0F ", _jsx("strong", { children: "Important" }), " : Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), " ", "est ", _jsx("strong", { children: "\u00E9cras\u00E9" }), " \u00E0 chaque g\u00E9n\u00E9ration. Ne le modifiez pas directement !"] }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Personnaliser la section \"Utilisation\"" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour ajouter du contenu personnalis\u00E9 qui ne sera", " ", _jsx("strong", { children: "jamais \u00E9cras\u00E9" }), ", cr\u00E9ez un fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", ":"] }), _jsx("h4", { className: "font-medium mb-2", children: "\u00C9tape 1 : Cr\u00E9er le composant personnalis\u00E9" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "packages/votre-module/src/components/DocUsageCustom.tsx" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `"use client";
|
|
117
|
+
|
|
118
|
+
import { Card, CardBody, CardHeader, Alert, Tabs, Tab } from "@lastbrain/ui";
|
|
119
|
+
import { Lightbulb } from "lucide-react";
|
|
120
|
+
// Importez vos composants à documenter
|
|
121
|
+
import { MonComposant } from "../web/components/MonComposant";
|
|
122
|
+
|
|
123
|
+
export function DocUsageCustom() {
|
|
124
|
+
return (
|
|
125
|
+
<div className="space-y-6">
|
|
126
|
+
<Alert color="primary" className="mb-6">
|
|
127
|
+
<div className="flex items-start gap-2">
|
|
128
|
+
<Lightbulb size={20} className="mt-0.5 flex-shrink-0" />
|
|
129
|
+
<div>
|
|
130
|
+
<p className="font-semibold">Introduction</p>
|
|
131
|
+
<p className="text-sm mt-1">
|
|
132
|
+
Description de votre module et de ses fonctionnalités principales.
|
|
133
|
+
</p>
|
|
134
|
+
</div>
|
|
135
|
+
</div>
|
|
136
|
+
</Alert>
|
|
137
|
+
|
|
138
|
+
<Tabs aria-label="Exemples d'utilisation">
|
|
139
|
+
<Tab key="exemple1" title="Exemple 1">
|
|
140
|
+
<Card className="mt-4">
|
|
141
|
+
<CardHeader>
|
|
142
|
+
<h3 className="text-xl font-semibold">MonComposant</h3>
|
|
143
|
+
</CardHeader>
|
|
144
|
+
<CardBody className="space-y-6">
|
|
145
|
+
<div>
|
|
146
|
+
<h4 className="text-lg font-semibold mb-2">Description</h4>
|
|
147
|
+
<p className="text-slate-600 dark:text-slate-400">
|
|
148
|
+
Décrivez votre composant et son utilisation.
|
|
149
|
+
</p>
|
|
150
|
+
</div>
|
|
151
|
+
|
|
152
|
+
<div>
|
|
153
|
+
<h4 className="text-lg font-semibold mb-3">Exemple interactif</h4>
|
|
154
|
+
<MonComposant />
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<div>
|
|
158
|
+
<h4 className="text-lg font-semibold mb-2">Code d'utilisation</h4>
|
|
159
|
+
<Alert color="default" className="p-4">
|
|
160
|
+
<pre className="whitespace-pre-wrap text-sm">{\`import { MonComposant } from "@lastbrain/votre-module";
|
|
161
|
+
|
|
162
|
+
export function MyApp() {
|
|
163
|
+
return <MonComposant />;
|
|
164
|
+
}\`}</pre>
|
|
165
|
+
</Alert>
|
|
166
|
+
</div>
|
|
167
|
+
|
|
168
|
+
<div>
|
|
169
|
+
<h4 className="text-lg font-semibold mb-2">Props disponibles</h4>
|
|
170
|
+
<div className="overflow-x-auto">
|
|
171
|
+
<table className="w-full text-sm">
|
|
172
|
+
<thead className="border-b">
|
|
173
|
+
<tr>
|
|
174
|
+
<th className="text-left py-2 px-2">Prop</th>
|
|
175
|
+
<th className="text-left py-2 px-2">Type</th>
|
|
176
|
+
<th className="text-left py-2 px-2">Description</th>
|
|
177
|
+
</tr>
|
|
178
|
+
</thead>
|
|
179
|
+
<tbody className="divide-y">
|
|
180
|
+
<tr>
|
|
181
|
+
<td className="py-2 px-2 font-mono">prop1</td>
|
|
182
|
+
<td className="py-2 px-2">string</td>
|
|
183
|
+
<td className="py-2 px-2">Description de la prop</td>
|
|
184
|
+
</tr>
|
|
185
|
+
</tbody>
|
|
186
|
+
</table>
|
|
187
|
+
</div>
|
|
188
|
+
</div>
|
|
189
|
+
</CardBody>
|
|
190
|
+
</Card>
|
|
191
|
+
</Tab>
|
|
192
|
+
|
|
193
|
+
<Tab key="exemple2" title="Exemple 2">
|
|
194
|
+
{/* Autres exemples */}
|
|
195
|
+
</Tab>
|
|
196
|
+
</Tabs>
|
|
197
|
+
</div>
|
|
198
|
+
);
|
|
199
|
+
}` }) }), _jsx("h4", { className: "font-medium mb-2", children: "\u00C9tape 2 : Le g\u00E9n\u00E9rateur l'int\u00E8gre automatiquement" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Une fois", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", "cr\u00E9\u00E9, lancez la r\u00E9g\u00E9n\u00E9ration :"] }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs` }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Le script d\u00E9tecte automatiquement l'existence de", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", "et l'importe dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "Doc.tsx" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// Doc.tsx (généré automatiquement)
|
|
200
|
+
import { DocUsageCustom } from "./DocUsageCustom";
|
|
201
|
+
|
|
202
|
+
// Dans la section Utilisation :
|
|
203
|
+
<Card>
|
|
204
|
+
<CardHeader>
|
|
205
|
+
<h2>Utilisation</h2>
|
|
206
|
+
</CardHeader>
|
|
207
|
+
<CardBody>
|
|
208
|
+
<DocUsageCustom />
|
|
209
|
+
</CardBody>
|
|
210
|
+
</Card>` }) }), _jsx("h4", { className: "font-medium mb-2", children: "\u00C9tape 3 : Mettre \u00E0 jour sans perdre vos modifications" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Vous pouvez maintenant r\u00E9g\u00E9n\u00E9rer la documentation autant de fois que vous voulez, votre fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "DocUsageCustom.tsx" }), " ", "ne sera ", _jsx("strong", { children: "jamais \u00E9cras\u00E9" }), " :"] }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm update:module-docs` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exemple concret : Module AI" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Le module AI utilise cette approche pour documenter ses composants de g\u00E9n\u00E9ration :" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `// packages/module-ai/src/components/DocUsageCustom.tsx
|
|
211
|
+
import { TextareaGenerative } from "../web/components/TextareaGenerative";
|
|
212
|
+
import { ImageGenerative } from "../web/components/ImageGenerative";
|
|
213
|
+
|
|
214
|
+
export function DocUsageCustom() {
|
|
215
|
+
return (
|
|
216
|
+
<Tabs>
|
|
217
|
+
<Tab key="textarea" title="Génération de Texte">
|
|
218
|
+
<TextareaGenerative
|
|
219
|
+
prompt="Écris une courte description..."
|
|
220
|
+
model="gpt-4o-mini"
|
|
221
|
+
/>
|
|
222
|
+
</Tab>
|
|
223
|
+
<Tab key="image" title="Génération d'Images">
|
|
224
|
+
<ImageGenerative
|
|
225
|
+
prompt="Un chat astronaute..."
|
|
226
|
+
model="dall-e-3"
|
|
227
|
+
/>
|
|
228
|
+
</Tab>
|
|
229
|
+
</Tabs>
|
|
230
|
+
);
|
|
231
|
+
}` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Structure recommand\u00E9e" }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4 whitespace-pre-wrap", children: `packages/votre-module/
|
|
232
|
+
├── src/
|
|
233
|
+
│ ├── components/
|
|
234
|
+
│ │ ├── Doc.tsx # ⚠️ AUTO-GÉNÉRÉ - Ne pas modifier
|
|
235
|
+
│ │ └── DocUsageCustom.tsx # ✅ Votre contenu personnalisé
|
|
236
|
+
│ ├── web/
|
|
237
|
+
│ │ └── components/
|
|
238
|
+
│ │ └── MonComposant.tsx # Vos composants à documenter
|
|
239
|
+
│ └── votre-module.build.config.ts` }), _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: ["Si vous pr\u00E9f\u00E9rez cr\u00E9er une documentation compl\u00E8tement manuelle, 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(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export function MonModuleDoc() {
|
|
117
240
|
return (
|
|
118
241
|
<div>
|
|
119
242
|
<h1>Mon Module</h1>
|
|
120
243
|
<p>Description...</p>
|
|
121
244
|
</div>
|
|
122
245
|
);
|
|
123
|
-
}` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " :"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Modules Disponibles" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-ai](../packages/module-ai/README.md)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "@lastbrain/module-ai" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_token_ledger, user_prompts"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-ai/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-auth](../packages/module-auth/README.md)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "@lastbrain/module-auth" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 publique(s), 3 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_profil, user_address, user_notifications"] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-auth/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] })] }));
|
|
246
|
+
}` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Modules Disponibles" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-ai](../packages/module-ai/README.md)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "@lastbrain/module-ai" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_token_ledger, user_prompts"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module ai" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module ai` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-ai/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-auth](../packages/module-auth/README.md)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "@lastbrain/module-auth" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 publique(s), 4 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_profil, user_address, user_notifications"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module auth` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-auth/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-tasks](../packages/module-tasks/README.md)" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "@lastbrain/module-tasks" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": tasks, tasks_logs"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module tasks" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module tasks` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-tasks/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la", " ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] })] }));
|
|
124
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocPage.d.ts","sourceRoot":"","sources":["../../src/templates/DocPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"DocPage.d.ts","sourceRoot":"","sources":["../../src/templates/DocPage.tsx"],"names":[],"mappings":"AAEA,OAAO,KAA8B,MAAM,OAAO,CAAC;AA+FnD,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EACF,SAAS,GACT,WAAW,GACX,SAAS,GACT,QAAQ,GACR,SAAS,GACT,SAAS,GACT,SAAS,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,cAAc,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAClC;AAED,wBAAgB,OAAO,CAAC,EAAE,OAAY,EAAE,cAAc,EAAE,EAAE,YAAY,2CA+TrE"}
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
4
4
|
import { useState, useEffect } from "react";
|
|
5
5
|
import { Card, CardBody, CardHeader, Listbox, ListboxItem, Chip, Button, Drawer, DrawerContent, DrawerHeader, DrawerBody, Snippet, } from "@lastbrain/ui";
|
|
6
|
-
import { Menu, Home, Sparkles, Rocket, Building2, Package, Database, Palette, BookOpen, Link, Blocks, HardDrive, } from "lucide-react";
|
|
6
|
+
import { Menu, Home, Sparkles, Rocket, Building2, Package, Database, Palette, BookOpen, Link, Blocks, HardDrive, RotateCcw, } from "lucide-react";
|
|
7
7
|
import { DefaultDocumentation } from "./DefaultDoc.js";
|
|
8
|
-
const NavigationListbox = ({ navigationItems, selectedModule, scrollToSection, setSelectedModule, }) => (_jsx(Listbox, { "aria-label": "Navigation", selectionMode: "single", selectedKeys: selectedModule ? [selectedModule] : [], onSelectionChange: (keys) => {
|
|
8
|
+
const NavigationListbox = ({ navigationItems, selectedModule, scrollToSection, setSelectedModule, }) => (_jsx(Listbox, { "aria-label": "Navigation", selectionMode: "single", variant: "solid", selectedKeys: selectedModule ? [selectedModule] : [], onSelectionChange: (keys) => {
|
|
9
9
|
const key = Array.from(keys)[0];
|
|
10
10
|
if (key) {
|
|
11
11
|
scrollToSection(key);
|
|
@@ -16,8 +16,8 @@ const NavigationListbox = ({ navigationItems, selectedModule, scrollToSection, s
|
|
|
16
16
|
}
|
|
17
17
|
}, items: navigationItems, children: (item) => {
|
|
18
18
|
const IconComponent = item.icon;
|
|
19
|
-
return (_jsx(ListboxItem, { textValue: item.name, description: item.description, color:
|
|
20
|
-
} }));
|
|
19
|
+
return (_jsx(ListboxItem, { textValue: item.name, description: item.description, color: "default", variant: "solid", endContent: item.number && (_jsx(Chip, { size: "sm", color: "primary", children: item.number ?? 0 })), startContent: _jsx(IconComponent, { size: 18, className: "shrink-0" }), children: item.name }, item.id));
|
|
20
|
+
} }, `listbox-${selectedModule}`));
|
|
21
21
|
export function DocPage({ modules = [], defaultContent }) {
|
|
22
22
|
const [selectedModule, setSelectedModule] = useState("default");
|
|
23
23
|
const [isDrawerOpen, setIsDrawerOpen] = useState(false);
|
|
@@ -92,62 +92,78 @@ export function DocPage({ modules = [], defaultContent }) {
|
|
|
92
92
|
name: "Documentation",
|
|
93
93
|
description: "Accueil",
|
|
94
94
|
icon: Home,
|
|
95
|
+
color: "default",
|
|
95
96
|
},
|
|
96
97
|
{
|
|
97
98
|
id: "section-welcome",
|
|
98
99
|
name: "Bienvenue",
|
|
99
100
|
description: "",
|
|
100
101
|
icon: Sparkles,
|
|
102
|
+
color: "default",
|
|
101
103
|
},
|
|
102
104
|
{
|
|
103
105
|
id: "section-quickstart",
|
|
104
106
|
name: "Démarrage rapide",
|
|
105
107
|
description: "",
|
|
106
108
|
icon: Rocket,
|
|
109
|
+
color: "default",
|
|
107
110
|
},
|
|
108
111
|
{
|
|
109
112
|
id: "section-architecture",
|
|
110
113
|
name: "Architecture",
|
|
111
114
|
description: "",
|
|
112
115
|
icon: Building2,
|
|
116
|
+
color: "default",
|
|
113
117
|
},
|
|
114
118
|
{
|
|
115
119
|
id: "section-create-module",
|
|
116
120
|
name: "Créer un module",
|
|
117
121
|
description: "",
|
|
118
122
|
icon: Package,
|
|
123
|
+
color: "default",
|
|
119
124
|
},
|
|
120
125
|
{
|
|
121
126
|
id: "section-database",
|
|
122
127
|
name: "Base de données",
|
|
123
128
|
description: "",
|
|
124
129
|
icon: Database,
|
|
130
|
+
color: "default",
|
|
125
131
|
},
|
|
126
132
|
{
|
|
127
133
|
id: "section-storage",
|
|
128
134
|
name: "Proxy Storage",
|
|
129
135
|
description: "Gestion des fichiers",
|
|
130
136
|
icon: HardDrive,
|
|
137
|
+
color: "default",
|
|
131
138
|
},
|
|
132
139
|
{
|
|
133
140
|
id: "section-realtime",
|
|
134
141
|
name: "Système Realtime",
|
|
135
142
|
description: "Synchronisation temps réel",
|
|
136
|
-
icon:
|
|
143
|
+
icon: RotateCcw,
|
|
144
|
+
color: "default",
|
|
137
145
|
},
|
|
138
146
|
{
|
|
139
147
|
id: "section-ui",
|
|
140
148
|
name: "Interface utilisateur",
|
|
141
149
|
description: "",
|
|
142
150
|
icon: Palette,
|
|
151
|
+
color: "default",
|
|
143
152
|
},
|
|
144
153
|
{
|
|
145
154
|
id: "section-module-docs",
|
|
146
155
|
name: "Doc des modules",
|
|
147
156
|
description: "",
|
|
148
157
|
icon: BookOpen,
|
|
158
|
+
color: "default",
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: "section-links",
|
|
162
|
+
name: "Liens utiles",
|
|
163
|
+
description: "",
|
|
164
|
+
icon: Link,
|
|
165
|
+
color: "default",
|
|
149
166
|
},
|
|
150
|
-
{ id: "section-links", name: "Liens utiles", description: "", icon: Link },
|
|
151
167
|
...(modules.length > 0
|
|
152
168
|
? [
|
|
153
169
|
{
|
|
@@ -156,6 +172,7 @@ export function DocPage({ modules = [], defaultContent }) {
|
|
|
156
172
|
description: "",
|
|
157
173
|
icon: Blocks,
|
|
158
174
|
number: modules.length,
|
|
175
|
+
color: "default",
|
|
159
176
|
},
|
|
160
177
|
]
|
|
161
178
|
: []),
|
|
@@ -170,7 +187,7 @@ export function DocPage({ modules = [], defaultContent }) {
|
|
|
170
187
|
color: "primary",
|
|
171
188
|
})),
|
|
172
189
|
];
|
|
173
|
-
return (_jsx("div", { className: "w-full pt-8 md:pt-12 pb-24 lg:pb-8", children: _jsxs("div", { className: "container mx-auto md:px-4 py-8", children: [_jsx("div", { className: "fixed w-full h-16 left-0 bottom-0 bg-background/20 backdrop-blur-lg z-50 lg:hidden p-2", children: _jsx("div", { className: "flex justify-center", children: _jsx(Button, { isIconOnly: true, variant: "solid", onPress: () => setIsDrawerOpen(true), children: _jsx(Menu, { size: 24 }) }) }) }), _jsx(Drawer, { isOpen: isDrawerOpen, onOpenChange: setIsDrawerOpen, placement: "left", children: _jsxs(DrawerContent, { children: [_jsx(DrawerHeader, { children: _jsx("h2", { className: "text-xl font-semibold", children: "Navigation" }) }), _jsx(DrawerBody, { children: _jsx(NavigationListbox, { navigationItems: navigationItems, selectedModule: selectedModule, scrollToSection: scrollToSection, setSelectedModule: setSelectedModule }) })] }) }), _jsxs("div", { className: "flex gap-
|
|
190
|
+
return (_jsx("div", { className: "w-full pt-8 md:pt-12 pb-24 lg:pb-8", children: _jsxs("div", { className: "container mx-auto md:px-4 py-8", children: [_jsx("div", { className: "fixed w-full h-16 left-0 bottom-0 bg-background/20 backdrop-blur-lg z-50 lg:hidden p-2", children: _jsx("div", { className: "flex justify-center", children: _jsx(Button, { isIconOnly: true, variant: "solid", onPress: () => setIsDrawerOpen(true), children: _jsx(Menu, { size: 24 }) }) }) }), _jsx(Drawer, { isOpen: isDrawerOpen, onOpenChange: setIsDrawerOpen, placement: "left", children: _jsxs(DrawerContent, { children: [_jsx(DrawerHeader, { children: _jsx("h2", { className: "text-xl font-semibold", children: "Navigation" }) }), _jsx(DrawerBody, { children: _jsx(NavigationListbox, { navigationItems: navigationItems, selectedModule: selectedModule, scrollToSection: scrollToSection, setSelectedModule: setSelectedModule }) })] }) }), _jsxs("div", { className: "flex gap-4", children: [_jsx("aside", { className: "hidden lg:block w-72 shrink-0 sticky top-18 self-start", children: _jsx(Card, { children: _jsx(CardBody, { children: _jsx(NavigationListbox, { navigationItems: navigationItems, selectedModule: selectedModule, scrollToSection: scrollToSection, setSelectedModule: setSelectedModule }) }) }) }), _jsxs("main", { className: "flex-1 w-full min-w-0 space-y-8", children: [defaultContent ? (_jsx("div", { children: defaultContent })) : (_jsx(DefaultDocumentation, {})), modules.length > 0 && (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsx("h2", { className: "text-2xl font-semibold", children: "Modules disponibles" }) }), _jsxs(CardBody, { children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Voici la liste de tous les modules disponibles dans LastBrain. Les modules actifs sont utilis\u00E9s dans votre application." }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: modules.map((module) => (_jsx(Card, { isPressable: module.available, onPress: () => module.available && scrollToSection(module.id), className: `${module.available
|
|
174
191
|
? "cursor-pointer hover:shadow-lg"
|
|
175
192
|
: "opacity-70"} transition-shadow`, children: _jsxs(CardBody, { children: [_jsxs("div", { className: "flex items-start justify-between mb-2", children: [_jsxs("h3", { className: "text-lg font-semibold flex flex-inline items-center gap-2", children: [_jsx(Blocks, { size: 20, className: "shrink-0" }), module.name] }), _jsx(Chip, { size: "sm", color: module.available ? "success" : "warning", variant: "flat", children: module.available ? "Actif" : "Inactif" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: module.description }), !module.available && (_jsxs("div", { className: "flex justify-between items-center text-xs text-default-700 mt-2", children: [_jsx("span", { children: "Pour activer : " }), _jsx(Snippet, { hideSymbol: true, color: "primary", children: `pnpm lastbrain add-module ${module.id}` })] }))] }) }, module.id))) })] })] }), modules
|
|
176
193
|
.filter((m) => m.available)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lastbrain/app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.37",
|
|
4
4
|
"description": "Framework modulaire Next.js avec CLI et système de modules",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@lastbrain/core": "^0.1.0",
|
|
35
35
|
"@lastbrain/ui": "^0.1.4",
|
|
36
|
-
"@supabase/supabase-js": "^2.
|
|
36
|
+
"@supabase/supabase-js": "^2.84.0",
|
|
37
37
|
"chalk": "^5.3.0",
|
|
38
|
-
"commander": "^
|
|
38
|
+
"commander": "^14.0.2",
|
|
39
39
|
"fs-extra": "^11.2.0",
|
|
40
|
-
"inquirer": "^
|
|
40
|
+
"inquirer": "^13.0.1",
|
|
41
41
|
"lucide-react": "^0.554.0",
|
|
42
42
|
"next-themes": "^0.4.6",
|
|
43
43
|
"react": "^19.0.0",
|