@lastbrain/app 2.0.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/dist/config/version.d.ts +7 -0
  2. package/dist/config/version.d.ts.map +1 -0
  3. package/dist/config/version.js +25 -0
  4. package/dist/src/__tests__/module-registry.test.d.ts +2 -0
  5. package/dist/src/__tests__/module-registry.test.d.ts.map +1 -0
  6. package/dist/src/__tests__/module-registry.test.js +53 -0
  7. package/dist/src/app-shell/(admin)/layout.d.ts +4 -0
  8. package/dist/src/app-shell/(admin)/layout.d.ts.map +1 -0
  9. package/dist/src/app-shell/(admin)/layout.js +5 -0
  10. package/dist/src/app-shell/(auth)/layout.d.ts +4 -0
  11. package/dist/src/app-shell/(auth)/layout.d.ts.map +1 -0
  12. package/dist/src/app-shell/(auth)/layout.js +5 -0
  13. package/dist/src/app-shell/(public)/page.d.ts +2 -0
  14. package/dist/src/app-shell/(public)/page.d.ts.map +1 -0
  15. package/dist/src/app-shell/(public)/page.js +5 -0
  16. package/dist/src/app-shell/layout.d.ts +3 -0
  17. package/dist/src/app-shell/layout.d.ts.map +1 -0
  18. package/dist/src/app-shell/layout.js +3 -0
  19. package/dist/src/app-shell/not-found.d.ts +2 -0
  20. package/dist/src/app-shell/not-found.d.ts.map +1 -0
  21. package/dist/src/app-shell/not-found.js +10 -0
  22. package/dist/src/auth/authHelpers.d.ts +7 -0
  23. package/dist/src/auth/authHelpers.d.ts.map +1 -0
  24. package/dist/src/auth/authHelpers.js +19 -0
  25. package/dist/src/auth/useAuthSession.d.ts +7 -0
  26. package/dist/src/auth/useAuthSession.d.ts.map +1 -0
  27. package/dist/src/auth/useAuthSession.js +49 -0
  28. package/dist/src/cli.d.ts +3 -0
  29. package/dist/src/cli.d.ts.map +1 -0
  30. package/dist/src/cli.js +143 -0
  31. package/dist/src/components/NotificationContainer.d.ts +2 -0
  32. package/dist/src/components/NotificationContainer.d.ts.map +1 -0
  33. package/dist/src/components/NotificationContainer.js +8 -0
  34. package/dist/src/hooks/useNotifications.d.ts +30 -0
  35. package/dist/src/hooks/useNotifications.d.ts.map +1 -0
  36. package/dist/src/hooks/useNotifications.js +165 -0
  37. package/dist/src/index.d.ts +22 -0
  38. package/dist/src/index.d.ts.map +1 -0
  39. package/dist/src/index.js +22 -0
  40. package/dist/src/layouts/AdminLayout.d.ts +4 -0
  41. package/dist/src/layouts/AdminLayout.d.ts.map +1 -0
  42. package/dist/src/layouts/AdminLayout.js +4 -0
  43. package/dist/src/layouts/AdminLayoutWithSidebar.d.ts +10 -0
  44. package/dist/src/layouts/AdminLayoutWithSidebar.d.ts.map +1 -0
  45. package/dist/src/layouts/AdminLayoutWithSidebar.js +62 -0
  46. package/dist/src/layouts/AppProviders.d.ts +27 -0
  47. package/dist/src/layouts/AppProviders.d.ts.map +1 -0
  48. package/dist/src/layouts/AppProviders.js +48 -0
  49. package/dist/src/layouts/AuthLayout.d.ts +4 -0
  50. package/dist/src/layouts/AuthLayout.d.ts.map +1 -0
  51. package/dist/src/layouts/AuthLayout.js +4 -0
  52. package/dist/src/layouts/AuthLayoutWithSidebar.d.ts +12 -0
  53. package/dist/src/layouts/AuthLayoutWithSidebar.d.ts.map +1 -0
  54. package/dist/src/layouts/AuthLayoutWithSidebar.js +60 -0
  55. package/dist/src/layouts/PublicLayout.d.ts +8 -0
  56. package/dist/src/layouts/PublicLayout.d.ts.map +1 -0
  57. package/dist/src/layouts/PublicLayout.js +6 -0
  58. package/dist/src/layouts/PublicLayoutWithSidebar.d.ts +9 -0
  59. package/dist/src/layouts/PublicLayoutWithSidebar.d.ts.map +1 -0
  60. package/dist/src/layouts/PublicLayoutWithSidebar.js +60 -0
  61. package/dist/src/layouts/RootLayout.d.ts +6 -0
  62. package/dist/src/layouts/RootLayout.d.ts.map +1 -0
  63. package/dist/src/layouts/RootLayout.js +9 -0
  64. package/dist/src/modules/module-loader.d.ts +5 -0
  65. package/dist/src/modules/module-loader.d.ts.map +1 -0
  66. package/dist/src/modules/module-loader.js +10 -0
  67. package/dist/src/scripts/db-init.d.ts +2 -0
  68. package/dist/src/scripts/db-init.d.ts.map +1 -0
  69. package/dist/src/scripts/db-init.js +300 -0
  70. package/dist/src/scripts/db-migrations-sync.d.ts +2 -0
  71. package/dist/src/scripts/db-migrations-sync.d.ts.map +1 -0
  72. package/dist/src/scripts/db-migrations-sync.js +84 -0
  73. package/dist/src/scripts/dev-sync.d.ts +2 -0
  74. package/dist/src/scripts/dev-sync.d.ts.map +1 -0
  75. package/dist/src/scripts/dev-sync.js +194 -0
  76. package/dist/src/scripts/init-app.d.ts +12 -0
  77. package/dist/src/scripts/init-app.d.ts.map +1 -0
  78. package/dist/src/scripts/init-app.js +2175 -0
  79. package/dist/src/scripts/module-add.d.ts +2 -0
  80. package/dist/src/scripts/module-add.d.ts.map +1 -0
  81. package/dist/src/scripts/module-add.js +232 -0
  82. package/dist/src/scripts/module-build.d.ts +2 -0
  83. package/dist/src/scripts/module-build.d.ts.map +1 -0
  84. package/dist/src/scripts/module-build.js +1280 -0
  85. package/dist/src/scripts/module-create.d.ts +28 -0
  86. package/dist/src/scripts/module-create.d.ts.map +1 -0
  87. package/dist/src/scripts/module-create.js +1429 -0
  88. package/dist/src/scripts/module-delete.d.ts +6 -0
  89. package/dist/src/scripts/module-delete.d.ts.map +1 -0
  90. package/dist/src/scripts/module-delete.js +147 -0
  91. package/dist/src/scripts/module-list.d.ts +2 -0
  92. package/dist/src/scripts/module-list.d.ts.map +1 -0
  93. package/dist/src/scripts/module-list.js +61 -0
  94. package/dist/src/scripts/module-remove.d.ts +2 -0
  95. package/dist/src/scripts/module-remove.d.ts.map +1 -0
  96. package/dist/src/scripts/module-remove.js +311 -0
  97. package/dist/src/scripts/readme-build.d.ts +2 -0
  98. package/dist/src/scripts/readme-build.d.ts.map +1 -0
  99. package/dist/src/scripts/readme-build.js +39 -0
  100. package/dist/src/scripts/script-runner.d.ts +5 -0
  101. package/dist/src/scripts/script-runner.d.ts.map +1 -0
  102. package/dist/src/scripts/script-runner.js +25 -0
  103. package/dist/src/templates/AuthGuidePage.d.ts +2 -0
  104. package/dist/src/templates/AuthGuidePage.d.ts.map +1 -0
  105. package/dist/src/templates/AuthGuidePage.js +9 -0
  106. package/dist/src/templates/DefaultDoc.d.ts +2 -0
  107. package/dist/src/templates/DefaultDoc.d.ts.map +1 -0
  108. package/dist/src/templates/DefaultDoc.js +240 -0
  109. package/dist/src/templates/DocPage.d.ts +17 -0
  110. package/dist/src/templates/DocPage.d.ts.map +1 -0
  111. package/dist/src/templates/DocPage.js +193 -0
  112. package/dist/src/templates/DocsPageWithModules.d.ts +2 -0
  113. package/dist/src/templates/DocsPageWithModules.d.ts.map +1 -0
  114. package/dist/src/templates/DocsPageWithModules.js +8 -0
  115. package/dist/src/templates/MigrationsGuidePage.d.ts +2 -0
  116. package/dist/src/templates/MigrationsGuidePage.d.ts.map +1 -0
  117. package/dist/src/templates/MigrationsGuidePage.js +11 -0
  118. package/dist/src/templates/ModuleGuidePage.d.ts +2 -0
  119. package/dist/src/templates/ModuleGuidePage.d.ts.map +1 -0
  120. package/dist/src/templates/ModuleGuidePage.js +14 -0
  121. package/dist/src/templates/SimpleDocPage.d.ts +2 -0
  122. package/dist/src/templates/SimpleDocPage.d.ts.map +1 -0
  123. package/dist/src/templates/SimpleDocPage.js +28 -0
  124. package/dist/src/templates/SimpleHomePage.d.ts +6 -0
  125. package/dist/src/templates/SimpleHomePage.d.ts.map +1 -0
  126. package/dist/src/templates/SimpleHomePage.js +7 -0
  127. package/dist/src/types/menu.d.ts +23 -0
  128. package/dist/src/types/menu.d.ts.map +1 -0
  129. package/dist/src/types/menu.js +1 -0
  130. package/package.json +4 -5
  131. package/src/scripts/init-app.ts +7 -76
@@ -0,0 +1,193 @@
1
+ // GENERATED BY LASTBRAIN TEMPLATE (Documentation Page)
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState, useEffect } from "react";
5
+ import { Card, CardBody, Listbox, ListboxItem, Chip, Button, Drawer, DrawerContent, DrawerHeader, DrawerBody, Accordion, AccordionItem, } from "@lastbrain/ui";
6
+ import { Menu, Home, Sparkles, Rocket, Building2, Package, Database, Palette, BookOpen, Link, Blocks, HardDrive, RotateCcw, } from "lucide-react";
7
+ import { DefaultDocumentation } from "./DefaultDoc";
8
+ const NavigationListbox = ({ navigationItems, selectedModule, scrollToSection, setSelectedModule, }) => (_jsx(Listbox, { "aria-label": "Navigation", selectionMode: "single", variant: "solid", selectedKeys: selectedModule ? [selectedModule] : [], onSelectionChange: (keys) => {
9
+ const key = Array.from(keys)[0];
10
+ if (key) {
11
+ scrollToSection(key);
12
+ }
13
+ else {
14
+ setSelectedModule("");
15
+ window.scrollTo({ top: 0, behavior: "smooth" });
16
+ }
17
+ }, items: navigationItems, children: (item) => {
18
+ const IconComponent = item.icon;
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
+ export function DocPage({ modules = [], defaultContent }) {
22
+ const [selectedModule, setSelectedModule] = useState("default");
23
+ const [isDrawerOpen, setIsDrawerOpen] = useState(false);
24
+ // Détecter la section visible lors du scroll
25
+ useEffect(() => {
26
+ const handleScroll = () => {
27
+ const sections = [
28
+ "default",
29
+ "section-welcome",
30
+ "section-quickstart",
31
+ "section-architecture",
32
+ "section-create-module",
33
+ "section-database",
34
+ "section-storage",
35
+ "section-realtime",
36
+ "section-ui",
37
+ "section-module-docs",
38
+ "section-links",
39
+ ...(modules.length > 0 ? ["section-modules"] : []),
40
+ ...modules.map((m) => `module-${m.id}`),
41
+ ]; // Trouver la section actuellement visible
42
+ let currentSection = "default";
43
+ // Si on est tout en haut de la page
44
+ if (window.scrollY < 100) {
45
+ currentSection = "default";
46
+ }
47
+ else {
48
+ // Parcourir les sections pour trouver celle qui est visible
49
+ for (const sectionId of sections) {
50
+ if (sectionId === "default")
51
+ continue;
52
+ const element = document.getElementById(sectionId);
53
+ if (element) {
54
+ const rect = element.getBoundingClientRect();
55
+ // Section est visible si son top est dans la moitié supérieure de l'écran
56
+ if (rect.top <= window.innerHeight / 3 && rect.bottom >= 0) {
57
+ currentSection = sectionId.startsWith("module-")
58
+ ? sectionId.replace("module-", "")
59
+ : sectionId;
60
+ break;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ setSelectedModule(currentSection);
66
+ };
67
+ // Écouter le scroll
68
+ window.addEventListener("scroll", handleScroll);
69
+ // Appeler une fois au chargement
70
+ handleScroll();
71
+ return () => window.removeEventListener("scroll", handleScroll);
72
+ }, [modules]);
73
+ const scrollToSection = (sectionId) => {
74
+ setIsDrawerOpen(false); // Fermer le drawer après sélection
75
+ if (sectionId === "default") {
76
+ window.scrollTo({ top: 0, behavior: "smooth" });
77
+ return;
78
+ }
79
+ const elementId = sectionId.startsWith("section-")
80
+ ? sectionId
81
+ : `module-${sectionId}`;
82
+ const element = document.getElementById(elementId);
83
+ if (element) {
84
+ const yOffset = -70;
85
+ const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
86
+ window.scrollTo({ top: y, behavior: "smooth" });
87
+ }
88
+ };
89
+ const navigationItems = [
90
+ {
91
+ id: "default",
92
+ name: "Documentation",
93
+ description: "Accueil",
94
+ icon: Home,
95
+ color: "default",
96
+ },
97
+ {
98
+ id: "section-welcome",
99
+ name: "Bienvenue",
100
+ description: "",
101
+ icon: Sparkles,
102
+ color: "default",
103
+ },
104
+ {
105
+ id: "section-quickstart",
106
+ name: "Démarrage rapide",
107
+ description: "",
108
+ icon: Rocket,
109
+ color: "default",
110
+ },
111
+ {
112
+ id: "section-architecture",
113
+ name: "Architecture",
114
+ description: "",
115
+ icon: Building2,
116
+ color: "default",
117
+ },
118
+ {
119
+ id: "section-create-module",
120
+ name: "Créer un module",
121
+ description: "",
122
+ icon: Package,
123
+ color: "default",
124
+ },
125
+ {
126
+ id: "section-database",
127
+ name: "Base de données",
128
+ description: "",
129
+ icon: Database,
130
+ color: "default",
131
+ },
132
+ {
133
+ id: "section-storage",
134
+ name: "Proxy Storage",
135
+ description: "Gestion des fichiers",
136
+ icon: HardDrive,
137
+ color: "default",
138
+ },
139
+ {
140
+ id: "section-realtime",
141
+ name: "Système Realtime",
142
+ description: "Synchronisation temps réel",
143
+ icon: RotateCcw,
144
+ color: "default",
145
+ },
146
+ {
147
+ id: "section-ui",
148
+ name: "Interface utilisateur",
149
+ description: "",
150
+ icon: Palette,
151
+ color: "default",
152
+ },
153
+ {
154
+ id: "section-module-docs",
155
+ name: "Doc des modules",
156
+ description: "",
157
+ icon: BookOpen,
158
+ color: "default",
159
+ },
160
+ {
161
+ id: "section-links",
162
+ name: "Liens utiles",
163
+ description: "",
164
+ icon: Link,
165
+ color: "default",
166
+ },
167
+ ...(modules.length > 0
168
+ ? [
169
+ {
170
+ id: "section-modules",
171
+ name: "Modules disponibles",
172
+ description: "",
173
+ icon: Blocks,
174
+ number: modules.length,
175
+ color: "default",
176
+ },
177
+ ]
178
+ : []),
179
+ // Afficher seulement les modules actifs dans la navigation
180
+ ...modules
181
+ .filter((m) => m.available)
182
+ .map((m) => ({
183
+ id: m.id,
184
+ name: m.name,
185
+ description: m.description,
186
+ icon: Package,
187
+ color: "primary",
188
+ })),
189
+ ];
190
+ return (_jsx("div", { className: "w-full 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", { children: _jsx(Card, { className: "hidden max-h-[calc(100vh-6rem)] overflow-y-auto lg:block w-72 shrink-0 sticky top-18 self-start", 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 && (_jsx("div", { id: "section-modules", children: _jsx(Accordion, { variant: "splitted", children: modules
191
+ .filter((m) => m.available)
192
+ .map((module) => (_jsx(AccordionItem, { id: `module-${module.id}`, className: "my-4", title: _jsxs("div", { className: "flex justify-between", children: [_jsxs("div", { className: "flex flex-inline items-center gap-2", children: [_jsx(Package, { size: 20, className: "shrink-0" }), _jsx("span", { children: module.name })] }), _jsx(Chip, { size: "sm", color: module.available ? "success" : "warning", variant: "flat", children: module.available ? "Actif" : "Inactif" })] }), children: _jsx("div", { className: "scroll-mt-32", children: module.content }, module.id) }, module.id))) }) }))] })] })] }) }));
193
+ }
@@ -0,0 +1,2 @@
1
+ export declare function DocsPageWithModules(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=DocsPageWithModules.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DocsPageWithModules.d.ts","sourceRoot":"","sources":["../../../src/templates/DocsPageWithModules.tsx"],"names":[],"mappings":"AAeA,wBAAgB,mBAAmB,4CAMlC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { DocPage } from "./DocPage";
3
+ export function DocsPageWithModules() {
4
+ // This will be replaced by module-build script with actual module configs
5
+ // MODULES_CONFIG_PLACEHOLDER
6
+ const modules = [];
7
+ return _jsx(DocPage, { modules: modules });
8
+ }
@@ -0,0 +1,2 @@
1
+ export declare function MigrationsGuidePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=MigrationsGuidePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MigrationsGuidePage.d.ts","sourceRoot":"","sources":["../../../src/templates/MigrationsGuidePage.tsx"],"names":[],"mappings":"AAIA,wBAAgB,mBAAmB,4CAwDlC"}
@@ -0,0 +1,11 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Code, Divider, Chip } from "@lastbrain/ui";
3
+ export function MigrationsGuidePage() {
4
+ return (_jsxs("div", { className: "max-w-5xl mx-auto px-6 py-10 space-y-10", children: [_jsxs("header", { className: "space-y-3", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Guide Migrations" }), _jsx("p", { className: "text-slate-600 dark:text-slate-300 text-sm", children: "Gestion s\u00E9par\u00E9e des scripts UP et DOWN par module." }), _jsxs("div", { className: "flex gap-2 flex-wrap", children: [_jsx(Chip, { color: "primary", children: "UP" }), _jsx(Chip, { color: "secondary", children: "DOWN" }), _jsx(Chip, { color: "success", children: "Reset" }), _jsx(Chip, { color: "warning", children: "Push" })] })] }), _jsx(Divider, {}), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Emplacement" }), _jsx(Code, { className: "text-xs block", children: "supabase/migrations/ (UP)" }), _jsx(Code, { className: "text-xs block", children: "supabase/migrations-down/ (DOWN)" })] }), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Cycle" }), _jsxs("ol", { className: "list-decimal pl-5 text-sm space-y-1 text-slate-600 dark:text-slate-400", children: [_jsx("li", { children: "Ajouter fichier SQL (ex: 002_add_profiles.sql)" }), _jsx("li", { children: "Rebuild module si nouveaux scripts copi\u00E9s" }), _jsxs("li", { children: [_jsx(Code, { className: "text-xs inline", children: "supabase db push" }), " pour appliquer"] }), _jsxs("li", { children: [_jsx(Code, { className: "text-xs inline", children: "supabase db reset" }), " en dev complet"] }), _jsx("li", { children: "DOWNs ex\u00E9cut\u00E9s via remove-module (option down)" })] })] }), _jsxs(Card, { className: "p-6 space-y-2", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Exemple fichier UP" }), _jsx(Code, { className: "text-xs whitespace-pre-wrap", children: `-- 002_add_profiles.sql
5
+ CREATE TABLE profiles (
6
+ id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
7
+ email text NOT NULL UNIQUE,
8
+ created_at timestamptz DEFAULT now()
9
+ );` })] }), _jsxs(Card, { className: "p-6 space-y-2", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Exemple fichier DOWN" }), _jsx(Code, { className: "text-xs whitespace-pre-wrap", children: `-- 002_add_profiles.down.sql
10
+ DROP TABLE IF EXISTS profiles CASCADE;` })] }), _jsx("footer", { className: "text-center text-xs text-slate-500 dark:text-slate-500", children: "\u00C9vitez reset en production; privil\u00E9giez push contr\u00F4l\u00E9." })] }));
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare function ModuleGuidePage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=ModuleGuidePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ModuleGuidePage.d.ts","sourceRoot":"","sources":["../../../src/templates/ModuleGuidePage.tsx"],"names":[],"mappings":"AAIA,wBAAgB,eAAe,4CAkE9B"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Card, Code, Divider, Chip } from "@lastbrain/ui";
3
+ export function ModuleGuidePage() {
4
+ return (_jsxs("div", { className: "max-w-5xl mx-auto px-6 py-10 space-y-10", children: [_jsxs("header", { className: "space-y-3", children: [_jsx("h1", { className: "text-3xl font-bold", children: "Guide Modules" }), _jsx("p", { className: "text-slate-600 dark:text-slate-300 text-sm", children: "Cr\u00E9ez, enregistrez et d\u00E9ployez des modules LastBrain r\u00E9utilisables." }), _jsxs("div", { className: "flex gap-2 flex-wrap", children: [_jsx(Chip, { color: "primary", children: "Pages" }), _jsx(Chip, { color: "secondary", children: "APIs" }), _jsx(Chip, { color: "success", children: "Migrations" })] })] }), _jsx(Divider, {}), _jsxs(Card, { className: "p-6 space-y-4", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Structure d'un module" }), _jsx(Code, { className: "text-xs block", children: "packages/module-xyz/" }), _jsx(Code, { className: "text-xs block", children: "\u251C\u2500 src/" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 index.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 xyz.build.config.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u251C\u2500 web/public/XyzPage.tsx" }), _jsx(Code, { className: "text-xs block", children: "\u2502 \u2514\u2500 api/public/info.ts" }), _jsx(Code, { className: "text-xs block", children: "\u2514\u2500 supabase/migrations/001_xyz_init.sql" })] }), _jsxs(Card, { className: "p-6 space-y-3", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Config de build" }), _jsx(Code, { className: "text-xs whitespace-pre-wrap", children: `const xyzBuildConfig = {
5
+ moduleName: "@lastbrain/module-xyz",
6
+ pages: [
7
+ { section: "public", path: "/xyz", componentExport: "XyzPage" }
8
+ ],
9
+ apis: [
10
+ { method: "GET", path: "/api/xyz/info", handlerExport: "GET", entryPoint: "api/public/info", authRequired: false }
11
+ ],
12
+ migrations: { enabled: true, priority: 30, path: "supabase/migrations", files: ["001_xyz_init.sql"] }
13
+ };` })] }), _jsxs(Card, { className: "p-6 space-y-2", children: [_jsx("h2", { className: "text-lg font-semibold", children: "Cycle" }), _jsxs("ol", { className: "list-decimal pl-5 text-sm space-y-1 text-slate-600 dark:text-slate-400", children: [_jsx("li", { children: "Cr\u00E9er dossier module + config" }), _jsxs("li", { children: ["Exporter composants/API dans ", _jsx("code", { children: "index.ts" })] }), _jsxs("li", { children: [_jsx(Code, { className: "text-xs inline", children: "pnpm build" }), " dans le module"] }), _jsx("li", { children: _jsx(Code, { className: "text-xs inline", children: "pnpm lastbrain add-module xyz" }) }), _jsx("li", { children: _jsx(Code, { className: "text-xs inline", children: "pnpm build:modules" }) }), _jsxs("li", { children: ["Appliquer migrations si besoin (", _jsx(Code, { className: "text-xs inline", children: "supabase db push" }), ")"] })] })] })] }));
14
+ }
@@ -0,0 +1,2 @@
1
+ export declare function SimpleDocPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=SimpleDocPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleDocPage.d.ts","sourceRoot":"","sources":["../../../src/templates/SimpleDocPage.tsx"],"names":[],"mappings":"AAYA,wBAAgB,aAAa,4CA8jB5B"}
@@ -0,0 +1,28 @@
1
+ // Documentation page with navigation
2
+ "use client";
3
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { useState } from "react";
5
+ import { Card, CardBody, CardHeader, Snippet, Listbox, ListboxItem, } from "@lastbrain/ui";
6
+ export function SimpleDocPage() {
7
+ const [selectedSection, setSelectedSection] = useState("intro");
8
+ const scrollToSection = (sectionId) => {
9
+ setSelectedSection(sectionId);
10
+ const element = document.getElementById(sectionId);
11
+ if (element) {
12
+ const yOffset = -80;
13
+ const y = element.getBoundingClientRect().top + window.pageYOffset + yOffset;
14
+ window.scrollTo({ top: y, behavior: "smooth" });
15
+ }
16
+ };
17
+ return (_jsx("div", { className: "pt-32 container mx-auto px-4 py-8", children: _jsxs("div", { className: "flex gap-8", children: [_jsx("aside", { className: "w-64 shrink-0 sticky top-4 self-start", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-2", children: _jsx("h2", { className: "text-xl font-semibold", children: "Navigation" }) }), _jsx(CardBody, { children: _jsxs(Listbox, { "aria-label": "Documentation sections", selectionMode: "single", selectedKeys: [selectedSection], onSelectionChange: (keys) => {
18
+ const key = Array.from(keys)[0];
19
+ if (key)
20
+ scrollToSection(key);
21
+ }, children: [_jsx(ListboxItem, { children: "Introduction" }, "intro"), _jsx(ListboxItem, { children: "D\u00E9marrage Rapide" }, "quickstart"), _jsx(ListboxItem, { children: "Modules" }, "modules"), _jsx(ListboxItem, { children: "Base de Donn\u00E9es" }, "database"), _jsx(ListboxItem, { children: "D\u00E9veloppement" }, "development"), _jsx(ListboxItem, { children: "Routes Prot\u00E9g\u00E9es" }, "routes"), _jsx(ListboxItem, { children: "Compte Admin" }, "admin"), _jsx(ListboxItem, { children: "Commandes CLI" }, "cli"), _jsx(ListboxItem, { children: "Workflow" }, "workflow")] }) })] }) }), _jsxs("main", { className: "flex-1 space-y-8", children: [_jsxs("section", { id: "intro", children: [_jsx("h1", { className: "text-4xl font-bold mb-4 bg-linear-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent", children: "Documentation LastBrain" }), _jsx("p", { className: "text-xl text-slate-600 dark:text-slate-400 mb-6", children: "Framework modulaire pour cr\u00E9er rapidement des applications Next.js avec syst\u00E8me de modules, authentification et base de donn\u00E9es." }), _jsx(Card, { children: _jsx(CardBody, { children: _jsxs("ul", { className: "space-y-2 text-slate-700 dark:text-slate-300", children: [_jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "CLI int\u00E9gr\u00E9" }), " - Cr\u00E9ez et g\u00E9rez vos applications en ligne de commande"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Syst\u00E8me de modules" }), " - Architecture modulaire extensible"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "HeroUI" }), " - 58 composants UI modernes et accessibles"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "TypeScript" }), " - Typage strict pour une meilleure DX"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Supabase" }), " - Base de donn\u00E9es et authentification int\u00E9gr\u00E9es"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Hot reload" }), " - D\u00E9veloppement avec rechargement automatique"] }), _jsxs("li", { children: ["\u2705 ", _jsx("strong", { children: "Migrations" }), " - Gestion UP/DOWN des migrations SQL"] })] }) }) })] }), _jsx("section", { id: "quickstart", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9marrage Rapide" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Installation" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. D\u00E9marrer" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm install" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm db:init" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Votre application est maintenant disponible sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:3000" })] })] })] })] }) }), _jsx("section", { id: "modules", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCE6 Modules Disponibles" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-auth" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "Authentification compl\u00E8te avec gestion des profils utilisateur, adresses et notifications." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module auth" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "module-ai" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-3", children: "G\u00E9n\u00E9ration IA (texte et images) avec syst\u00E8me de tokens et gestion des co\u00FBts." }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module ai" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module auth" }) })] })] })] }) }), _jsx("section", { id: "database", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDDC4\uFE0F Base de Donn\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Initialiser Supabase" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:init" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9marrer Supabase local" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase start" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Synchroniser les migrations des modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm db:migrations:sync" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Acc\u00E9der au Studio Supabase" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["Une fois Supabase d\u00E9marr\u00E9, acc\u00E9dez au Studio sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "http://localhost:54323" })] })] })] })] }) }), _jsx("section", { id: "development", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDE80 D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lancer le serveur de d\u00E9veloppement" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "G\u00E9n\u00E9rer les routes des modules" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: "\u00C0 ex\u00E9cuter apr\u00E8s avoir ajout\u00E9 ou modifi\u00E9 des modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build:modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Build de production" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm build" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "D\u00E9velopper un module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm dev" })] })] })] })] }) }), _jsx("section", { id: "routes", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDD Routes Prot\u00E9g\u00E9es" }) }), _jsxs(CardBody, { className: "pt-4", children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Le middleware prot\u00E8ge automatiquement vos routes selon ces r\u00E8gles :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-blue-600 dark:text-blue-400", children: "/auth/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Authentification requise" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-purple-600 dark:text-purple-400", children: "/admin/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Superadmin uniquement" })] }), _jsxs("div", { className: "p-3 bg-slate-50 dark:bg-slate-900 rounded", children: [_jsx("code", { className: "text-green-600 dark:text-green-400", children: "/docs/*" }), _jsx("span", { className: "ml-2", children: "\u2192 Acc\u00E8s public" })] })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-4", children: ["Le middleware se trouve dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "middleware.ts" })] })] })] }) }), _jsx("section", { id: "admin", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDC64 Cr\u00E9er un Compte Administrateur" }) }), _jsx(CardBody, { className: "pt-4 space-y-4", children: _jsxs("ol", { className: "list-decimal list-inside space-y-4", children: [_jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Cr\u00E9er un compte" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: ["Allez sur", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/signup" }), " ", "et cr\u00E9ez votre compte"] })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Promouvoir en administrateur" }), _jsx("p", { className: "text-slate-600 dark:text-slate-400 ml-6 mb-2", children: "Ex\u00E9cutez cette requ\u00EAte SQL dans le Studio Supabase ou via psql :" }), _jsx("div", { className: "ml-6", children: _jsxs(Snippet, { symbol: "", color: "default", size: "sm", children: [_jsx("span", { children: `update auth.users` }), _jsx("span", { children: `
22
+ set raw_app_meta_data = jsonb_set(` }), _jsx("span", { children: `
23
+ coalesce(raw_app_meta_data, '{}'::jsonb),` }), _jsx("span", { children: `
24
+ '{roles}',` }), _jsx("span", { children: `
25
+ '["admin"]'::jsonb` }), _jsx("span", { children: `
26
+ )` }), _jsx("span", { children: `
27
+ where email = 'votre@email.com';` })] }) })] }), _jsxs("li", { className: "text-lg", children: [_jsx("strong", { children: "Acc\u00E9der \u00E0 l'interface admin" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 ml-6", children: ["Vous pouvez maintenant acc\u00E9der \u00E0", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "/admin" })] })] })] }) })] }) }), _jsx("section", { id: "cli", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDD27 Commandes CLI" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er une application" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm create-app apps/my-app --heroui" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Ajouter un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain add-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain remove-module [nom]" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Lister les modules" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain list-modules" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "Cr\u00E9er un module" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm lastbrain create-module my-module" }) })] })] })] }) }), _jsx("section", { id: "workflow", children: _jsxs(Card, { children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\u26A1 Workflow de D\u00E9veloppement" }) }), _jsxs(CardBody, { className: "pt-4 space-y-4", children: [_jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "1. Modifier un module" }), _jsxs("p", { className: "text-slate-600 dark:text-slate-400 mb-2", children: ["\u00C9ditez les fichiers dans", " ", _jsx("code", { className: "px-2 py-1 bg-slate-100 dark:bg-slate-800 rounded", children: "packages/module-*/src" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "2. Compiler le module" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd packages/module-auth" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "3. R\u00E9g\u00E9n\u00E9rer les pages" }), _jsxs("div", { className: "flex flex-col gap-2", children: [_jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "cd apps/my-app" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: "pnpm build:modules" })] })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "4. Appliquer les migrations" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "supabase migration up" }) })] }), _jsxs("div", { children: [_jsx("h3", { className: "text-xl font-semibold mb-2", children: "5. Tester" }), _jsx(Snippet, { symbol: "", color: "default", size: "sm", children: _jsx("span", { children: "pnpm dev" }) })] })] })] }) }), _jsx("section", { id: "resources", children: _jsxs(Card, { className: "bg-linear-to-r from-blue-50 to-purple-50 dark:from-blue-950/30 dark:to-purple-950/30 border-blue-200 dark:border-blue-800", children: [_jsx(CardHeader, { className: "pb-0", children: _jsx("h2", { className: "text-3xl font-semibold", children: "\uD83D\uDCDA Resources Suppl\u00E9mentaires" }) }), _jsx(CardBody, { className: "pt-4", children: _jsxs("ul", { className: "space-y-2", children: [_jsxs("li", { children: ["\uD83D\uDCD6", " ", _jsx("a", { href: "/docs/CLI.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Documentation CLI compl\u00E8te" })] }), _jsxs("li", { children: ["\uD83D\uDD27", " ", _jsx("a", { href: "/docs/MODULES.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Guide de cr\u00E9ation de modules" })] }), _jsxs("li", { children: ["\uD83D\uDDC4\uFE0F", " ", _jsx("a", { href: "/docs/MIGRATIONS.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Syst\u00E8me de migrations" })] }), _jsxs("li", { children: ["\uD83C\uDFD7\uFE0F", " ", _jsx("a", { href: "/docs/MONOREPO_CLI_USAGE.md", className: "text-blue-600 dark:text-blue-400 hover:underline", children: "Architecture du monorepo" })] })] }) })] }) })] })] }) }));
28
+ }
@@ -0,0 +1,6 @@
1
+ interface HomePageProps {
2
+ showAuth?: boolean;
3
+ }
4
+ export declare function SimpleHomePage({ showAuth }: HomePageProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=SimpleHomePage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SimpleHomePage.d.ts","sourceRoot":"","sources":["../../../src/templates/SimpleHomePage.tsx"],"names":[],"mappings":"AAsBA,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,cAAc,CAAC,EAAE,QAAQ,EAAE,EAAE,aAAa,2CAsWzD"}
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import NextLink from "next/link";
3
+ import { Button, Card, CardBody, CardHeader, Chip, Snippet, } from "@lastbrain/ui";
4
+ import { Rocket, Package, Database, Code, Zap, Shield, ArrowRight, BookOpen, } from "lucide-react";
5
+ export function SimpleHomePage({ showAuth }) {
6
+ return (_jsxs("div", { className: "min-h-screen", children: [_jsxs("section", { className: "relative overflow-hidden bg-linear-to-r from-blue-50 via-purple-50 to-pink-50 dark:from-slate-900 dark:via-purple-900/20 dark:to-blue-900/20", children: [_jsx("div", { className: "absolute inset-0 bg-grid-slate-200/50 dark:bg-grid-slate-700/25 mask-[radial-gradient(ellipse_at_center,transparent_20%,black)]" }), _jsx("div", { className: "relative container mx-auto px-4 py-24 md:py-32", children: _jsxs("div", { className: "max-w-4xl mx-auto text-center", children: [_jsxs("div", { className: "inline-flex items-center gap-2 px-4 py-2 rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-700 dark:text-blue-300 mb-8", children: [_jsx(Zap, { size: 16 }), _jsx("span", { className: "text-sm font-medium", children: "Framework modulaire Next.js" })] }), _jsx("h1", { className: "text-5xl md:text-7xl font-bold mb-6 bg-linear-to-r from-blue-600 via-purple-600 to-pink-600 bg-clip-text text-transparent", children: "Bienvenue sur LastBrain" }), _jsx("p", { className: "text-xl md:text-2xl text-slate-600 dark:text-slate-300 mb-12 max-w-2xl mx-auto", children: "Cr\u00E9ez des applications modernes avec une architecture modulaire, puissante et \u00E9volutive." }), _jsxs("div", { className: "flex flex-col sm:flex-row gap-4 justify-center", children: [_jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", color: "primary", endContent: _jsx(ArrowRight, { size: 20 }), className: "text-base font-medium", children: "Voir la documentation" }) }), showAuth && (_jsx(NextLink, { href: "/signup", children: _jsx(Button, { size: "lg", variant: "bordered", className: "text-base font-medium", children: "Cr\u00E9er un compte" }) }))] })] }) })] }), _jsx("section", { className: "py-20 bg-white dark:bg-slate-950", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-6xl mx-auto", children: [_jsxs("div", { className: "text-center mb-16", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Tout ce dont vous avez besoin" }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Une stack moderne pour d\u00E9marrer rapidement" })] }), _jsxs("div", { className: "grid gap-6 md:grid-cols-2 lg:grid-cols-3", children: [_jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Modulaire" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Architecture bas\u00E9e sur des modules r\u00E9utilisables. Ajoutez ou retirez des fonctionnalit\u00E9s en une commande." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-purple-100 dark:bg-purple-900/30", children: _jsx(Database, { className: "text-purple-600 dark:text-purple-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Supabase" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Base de donn\u00E9es PostgreSQL, authentification et migrations automatiques. Tout en local pour le d\u00E9veloppement." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-green-100 dark:bg-green-900/30", children: _jsx(Zap, { className: "text-green-600 dark:text-green-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Rapide" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Next.js 15, React 19, Tailwind CSS v4. Hot reload et g\u00E9n\u00E9ration automatique des routes." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-orange-100 dark:bg-orange-900/30", children: _jsx(Code, { className: "text-orange-600 dark:text-orange-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "TypeScript" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "100% TypeScript avec types partag\u00E9s entre frontend et backend. Monorepo pnpm pour une gestion optimale." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-pink-100 dark:bg-pink-900/30", children: _jsx(Shield, { className: "text-pink-600 dark:text-pink-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "S\u00E9curis\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Middleware d'authentification automatique. Routes prot\u00E9g\u00E9es pour /auth et /admin configur\u00E9es par d\u00E9faut." }) })] }), _jsxs(Card, { className: "hover:shadow-xl transition-shadow", children: [_jsx(CardHeader, { className: "pb-2", children: _jsxs("div", { className: "flex items-center gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-cyan-100 dark:bg-cyan-900/30", children: _jsx(BookOpen, { className: "text-cyan-600 dark:text-cyan-400", size: 24 }) }), _jsx("h3", { className: "text-xl font-semibold", children: "Document\u00E9" })] }) }), _jsx(CardBody, { className: "pt-2", children: _jsx("p", { className: "text-slate-600 dark:text-slate-400", children: "Documentation compl\u00E8te et interactive. Chaque module documente automatiquement ses pages et APIs." }) })] })] })] }) }) }), _jsx("section", { className: "py-20 bg-slate-50 dark:bg-slate-900/50", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-4xl mx-auto", children: [_jsxs("div", { className: "text-center mb-12", children: [_jsxs("div", { className: "inline-flex items-center gap-2 mb-4", children: [_jsx(Rocket, { size: 24, className: "text-blue-600" }), _jsx("h2", { className: "text-3xl md:text-4xl font-bold", children: "D\u00E9marrez en 4 \u00E9tapes" })] }), _jsx("p", { className: "text-lg text-slate-600 dark:text-slate-400", children: "Votre application pr\u00EAte en quelques minutes" })] }), _jsxs("div", { className: "space-y-6", children: [_jsx(Card, { className: "border-l-4 border-l-blue-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-blue-100 dark:bg-blue-900/30 flex items-center justify-center font-bold text-blue-600 dark:text-blue-400", children: "1" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Cr\u00E9ez votre application" }), _jsx(Snippet, { className: "w-full", children: "pnpx @lastbrain/app@latest init mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "L'assistant interactif vous guidera pour :" }), _jsxs("ul", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2 ml-4 space-y-1", children: [_jsx("li", { children: "\u2022 Choisir les modules \u00E0 installer (auth, ai...)" }), _jsx("li", { children: "\u2022 Cr\u00E9er la structure compl\u00E8te du projet" }), _jsx("li", { children: "\u2022 Installer automatiquement les d\u00E9pendances" }), _jsx("li", { children: "\u2022 G\u00E9n\u00E9rer les routes des modules" })] })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-purple-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-purple-100 dark:bg-purple-900/30 flex items-center justify-center font-bold text-purple-600 dark:text-purple-400", children: "2" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Acc\u00E9dez au dossier" }), _jsx(Snippet, { className: "w-full", children: "cd mon-app" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "Entrez dans le dossier de votre nouvelle application" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-orange-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-orange-100 dark:bg-orange-900/30 flex items-center justify-center font-bold text-orange-600 dark:text-orange-400", children: "3" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Initialisez Supabase" }), _jsx(Snippet, { className: "w-full", children: "pnpm db:init" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: "D\u00E9marre Supabase en local et applique toutes les migrations (base + modules)" })] })] }) }) }), _jsx(Card, { className: "border-l-4 border-l-green-500", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-4", children: [_jsx("div", { className: "shrink-0 w-8 h-8 rounded-full bg-green-100 dark:bg-green-900/30 flex items-center justify-center font-bold text-green-600 dark:text-green-400", children: "4" }), _jsxs("div", { className: "flex-1", children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lancez le serveur" }), _jsx(Snippet, { className: "w-full", children: "pnpm dev" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mt-2", children: ["Ouvre l'application sur", " ", _jsx("strong", { children: "http://localhost:3000" })] })] })] }) }) }), _jsx(Card, { className: "bg-blue-50 dark:bg-blue-950/30 border-blue-200 dark:border-blue-800", children: _jsx(CardBody, { children: _jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "p-2 rounded-lg bg-blue-100 dark:bg-blue-900/30 shrink-0", children: _jsx(Package, { className: "text-blue-600 dark:text-blue-400", size: 20 }) }), _jsxs("div", { children: [_jsx("h4", { className: "font-semibold mb-2 text-blue-900 dark:text-blue-100", children: "Ajouter des modules plus tard" }), _jsxs("div", { className: "space-y-2", children: [_jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm lastbrain add-module auth" }), _jsx(Snippet, { className: "w-full", size: "sm", children: "pnpm build:modules" })] }), _jsxs("div", { className: "text-sm text-blue-700 dark:text-blue-300 mt-2", children: ["Modules disponibles :", " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "auth" }), " ", _jsx(Chip, { size: "sm", color: "primary", variant: "flat", children: "ai" })] })] })] }) }) })] })] }) }) }), _jsx("section", { className: "py-20 bg-linear-to-r from-blue-600 to-purple-600 text-white", children: _jsx("div", { className: "container mx-auto px-4", children: _jsxs("div", { className: "max-w-3xl mx-auto text-center", children: [_jsx("h2", { className: "text-3xl md:text-4xl font-bold mb-4", children: "Pr\u00EAt \u00E0 commencer ?" }), _jsx("p", { className: "text-lg text-blue-100 mb-8", children: "Explorez la documentation compl\u00E8te pour d\u00E9couvrir toutes les fonctionnalit\u00E9s" }), _jsx(NextLink, { href: "/docs", children: _jsx(Button, { size: "lg", className: "bg-white text-blue-600 hover:bg-blue-50 font-medium", endContent: _jsx(BookOpen, { size: 20 }), children: "Consulter la documentation" }) })] }) }) })] }));
7
+ }
@@ -0,0 +1,23 @@
1
+ import type { MenuItem } from "@lastbrain/ui";
2
+ /**
3
+ * Menu items to hide from display and block routes
4
+ */
5
+ export interface MenuIgnored {
6
+ public: {
7
+ title: string;
8
+ path: string;
9
+ }[];
10
+ auth: {
11
+ title: string;
12
+ path: string;
13
+ }[];
14
+ }
15
+ /**
16
+ * Custom menu items to add without creating a module
17
+ */
18
+ export interface MenuCustom {
19
+ public?: MenuItem[];
20
+ auth?: MenuItem[];
21
+ admin?: MenuItem[];
22
+ }
23
+ //# sourceMappingURL=menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"menu.d.ts","sourceRoot":"","sources":["../../../src/types/menu.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC;IAClB,KAAK,CAAC,EAAE,QAAQ,EAAE,CAAC;CACpB"}
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/app",
3
- "version": "2.0.1",
3
+ "version": "2.0.3",
4
4
  "description": "Framework modulaire Next.js avec CLI et système de modules",
5
5
  "private": false,
6
6
  "type": "module",
@@ -24,8 +24,7 @@
24
24
  "directory": "packages/app"
25
25
  },
26
26
  "publishConfig": {
27
- "access": "public",
28
- "registry": "https://registry.npmjs.org"
27
+ "access": "public"
29
28
  },
30
29
  "bin": {
31
30
  "lastbrain": "./dist/cli.js"
@@ -42,8 +41,8 @@
42
41
  }
43
42
  },
44
43
  "dependencies": {
45
- "@lastbrain/core": "^1.0.1",
46
- "@lastbrain/ui": "^1.0.1",
44
+ "@lastbrain/core": "^1.0.3",
45
+ "@lastbrain/ui": "^1.0.3",
47
46
  "@supabase/supabase-js": "^2.84.0",
48
47
  "chalk": "^5.3.0",
49
48
  "commander": "^14.0.2",
@@ -5,7 +5,7 @@ import chalk from "chalk";
5
5
  import inquirer from "inquirer";
6
6
  import { execSync } from "child_process";
7
7
  import { AVAILABLE_MODULES } from "@lastbrain/core/config/modules";
8
-
8
+ import { PACKAGE_VERSIONS } from "../../config/version.js";
9
9
  const __filename = fileURLToPath(import.meta.url);
10
10
  const __dirname = path.dirname(__filename);
11
11
 
@@ -361,82 +361,13 @@ function getLastBrainVersions(targetDir: string): {
361
361
  };
362
362
  }
363
363
 
364
- // Hors monorepo, essayer de lire les versions depuis le monorepo source
365
- try {
366
- // Détecter si on est dans le contexte du package CLI en build
367
- const cliPkgPath = path.join(__dirname, "../../package.json");
368
-
369
- if (fs.existsSync(cliPkgPath)) {
370
- const cliPkg = JSON.parse(fs.readFileSync(cliPkgPath, "utf-8"));
371
- const cliVersion = `^${cliPkg.version}`;
372
-
373
- // Essayer de lire les versions depuis le monorepo (si disponible)
374
- const monorepoRoot = path.join(__dirname, "../../../../");
375
- const moduleAuthPkgPath = path.join(
376
- monorepoRoot,
377
- "packages/module-auth/package.json"
378
- );
379
- const moduleAiPkgPath = path.join(
380
- monorepoRoot,
381
- "packages/module-ai/package.json"
382
- );
383
- const corePkgPath = path.join(monorepoRoot, "packages/core/package.json");
384
- const uiPkgPath = path.join(monorepoRoot, "packages/ui/package.json");
385
-
386
- let moduleAuthVersion = "latest";
387
- let moduleAiVersion = "latest";
388
- let coreVersion = "latest";
389
- let uiVersion = "latest";
390
-
391
- // Lire les vraies versions depuis les package.json du monorepo
392
- if (fs.existsSync(moduleAuthPkgPath)) {
393
- const moduleAuthPkg = JSON.parse(
394
- fs.readFileSync(moduleAuthPkgPath, "utf-8")
395
- );
396
- moduleAuthVersion = `^${moduleAuthPkg.version}`;
397
- }
398
-
399
- if (fs.existsSync(moduleAiPkgPath)) {
400
- const moduleAiPkg = JSON.parse(
401
- fs.readFileSync(moduleAiPkgPath, "utf-8")
402
- );
403
- moduleAiVersion = `^${moduleAiPkg.version}`;
404
- }
405
-
406
- if (fs.existsSync(corePkgPath)) {
407
- const corePkg = JSON.parse(fs.readFileSync(corePkgPath, "utf-8"));
408
- coreVersion = `^${corePkg.version}`;
409
- }
410
-
411
- if (fs.existsSync(uiPkgPath)) {
412
- const uiPkg = JSON.parse(fs.readFileSync(uiPkgPath, "utf-8"));
413
- uiVersion = `^${uiPkg.version}`;
414
- }
415
-
416
- return {
417
- app: "^2.0.0",
418
- core: coreVersion === "latest" ? "^2.0.0" : coreVersion,
419
- ui: uiVersion === "latest" ? "^2.0.0" : uiVersion,
420
- moduleAuth:
421
- moduleAuthVersion === "latest" ? "^2.0.0" : moduleAuthVersion,
422
- moduleAi: moduleAiVersion,
423
- };
424
- }
425
- } catch (_error) {
426
- console.warn(
427
- chalk.yellow(
428
- `⚠️ Impossible de lire les versions locales (${_error}), utilisation de 'latest'`
429
- )
430
- );
431
- }
432
-
433
- // Fallback: utiliser "latest"
364
+ // Hors monorepo, utiliser les versions publiées
434
365
  return {
435
- app: "latest",
436
- core: "latest",
437
- ui: "latest",
438
- moduleAuth: "latest",
439
- moduleAi: "latest",
366
+ app: PACKAGE_VERSIONS["@lastbrain/app"] || "latest",
367
+ core: PACKAGE_VERSIONS["@lastbrain/core"] || "latest",
368
+ ui: PACKAGE_VERSIONS["@lastbrain/ui"] || "latest",
369
+ moduleAuth: PACKAGE_VERSIONS["@lastbrain/module-auth"] || "latest",
370
+ moduleAi: PACKAGE_VERSIONS["@lastbrain/module-ai"] || "latest",
440
371
  };
441
372
  }
442
373