@lastbrain/app 2.0.31 → 2.0.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/analytics/registry.d.ts +7 -0
  2. package/dist/analytics/registry.d.ts.map +1 -0
  3. package/dist/analytics/registry.js +11 -0
  4. package/dist/auth/useAuthSession.d.ts.map +1 -1
  5. package/dist/auth/useAuthSession.js +85 -1
  6. package/dist/cli.js +19 -3
  7. package/dist/components/LanguageSwitcher.d.ts.map +1 -1
  8. package/dist/components/LanguageSwitcher.js +89 -5
  9. package/dist/config/version.d.ts.map +1 -1
  10. package/dist/config/version.js +30 -19
  11. package/dist/i18n/useLink.d.ts.map +1 -1
  12. package/dist/i18n/useLink.js +15 -0
  13. package/dist/index.d.ts +3 -0
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +4 -0
  16. package/dist/layouts/AdminLayoutWithSidebar.d.ts +3 -1
  17. package/dist/layouts/AdminLayoutWithSidebar.d.ts.map +1 -1
  18. package/dist/layouts/AdminLayoutWithSidebar.js +2 -2
  19. package/dist/layouts/AppProviders.d.ts +7 -1
  20. package/dist/layouts/AppProviders.d.ts.map +1 -1
  21. package/dist/layouts/AppProviders.js +24 -3
  22. package/dist/layouts/AuthLayout.js +1 -1
  23. package/dist/layouts/PublicLayout.js +1 -1
  24. package/dist/layouts/RootLayout.d.ts.map +1 -1
  25. package/dist/scripts/init-app.d.ts.map +1 -1
  26. package/dist/scripts/init-app.js +301 -138
  27. package/dist/scripts/module-build.d.ts.map +1 -1
  28. package/dist/scripts/module-build.js +402 -67
  29. package/dist/scripts/module-create.d.ts.map +1 -1
  30. package/dist/scripts/module-create.js +227 -10
  31. package/dist/scripts/sitemap-flat-generator.d.ts +39 -0
  32. package/dist/scripts/sitemap-flat-generator.d.ts.map +1 -0
  33. package/dist/scripts/sitemap-flat-generator.js +231 -0
  34. package/dist/scripts/sitemap-manifest-generator.d.ts +59 -0
  35. package/dist/scripts/sitemap-manifest-generator.d.ts.map +1 -0
  36. package/dist/scripts/sitemap-manifest-generator.js +290 -0
  37. package/dist/sitemap/manifest.d.ts +8 -0
  38. package/dist/sitemap/manifest.d.ts.map +1 -0
  39. package/dist/sitemap/manifest.js +6 -0
  40. package/dist/styles.css +2 -2
  41. package/dist/templates/AuthGuidePage.js +2 -0
  42. package/dist/templates/DefaultDoc.d.ts.map +1 -1
  43. package/dist/templates/DefaultDoc.js +9 -5
  44. package/dist/templates/DocPage.d.ts.map +1 -1
  45. package/dist/templates/DocPage.js +40 -0
  46. package/dist/templates/MigrationsGuidePage.js +2 -0
  47. package/dist/templates/ModuleGuidePage.d.ts.map +1 -1
  48. package/dist/templates/ModuleGuidePage.js +4 -1
  49. package/dist/templates/SimpleHomePage.js +2 -0
  50. package/package.json +11 -4
  51. package/src/analytics/registry.ts +14 -0
  52. package/src/auth/useAuthSession.ts +91 -1
  53. package/src/cli.ts +19 -3
  54. package/src/components/LanguageSwitcher.tsx +113 -23
  55. package/src/config/version.ts +30 -19
  56. package/src/i18n/useLink.ts +15 -0
  57. package/src/index.ts +17 -0
  58. package/src/layouts/AdminLayoutWithSidebar.tsx +4 -0
  59. package/src/layouts/AppProviders.tsx +66 -8
  60. package/src/layouts/AuthLayout.tsx +1 -1
  61. package/src/layouts/PublicLayout.tsx +1 -1
  62. package/src/layouts/RootLayout.tsx +0 -1
  63. package/src/scripts/init-app.ts +360 -149
  64. package/src/scripts/module-build.ts +458 -72
  65. package/src/scripts/module-create.ts +260 -10
  66. package/src/scripts/sitemap-flat-generator.ts +313 -0
  67. package/src/scripts/sitemap-manifest-generator.ts +476 -0
  68. package/src/sitemap/manifest.ts +17 -0
  69. package/src/templates/AuthGuidePage.tsx +1 -1
  70. package/src/templates/DefaultDoc.tsx +397 -6
  71. package/src/templates/DocPage.tsx +40 -0
  72. package/src/templates/MigrationsGuidePage.tsx +1 -1
  73. package/src/templates/ModuleGuidePage.tsx +3 -2
  74. package/src/templates/SimpleHomePage.tsx +1 -1
@@ -1,6 +1,7 @@
1
1
  // GENERATED FILE - DO NOT EDIT MANUALLY
2
2
  // This file is auto-generated from markdown files in docs/
3
3
  // Run 'pnpm sync:docs' to regenerate
4
+ "use client";
4
5
  import React from "react";
5
6
  import { Card, CardBody, CardHeader, Snippet, Alert } from "@lastbrain/ui";
6
7
  import {
@@ -21,6 +22,211 @@ import {
21
22
  export function DefaultDocumentation() {
22
23
  return (
23
24
  <div className="space-y-6">
25
+ <Card className="bg-linear-to-r from-blue-50 to-indigo-50 dark:from-blue-950 dark:to-indigo-950 border-l-4 border-blue-500 sticky top-0 z-10">
26
+ <CardHeader>
27
+ <h2 className="text-2xl font-bold flex items-center gap-2">
28
+ <BookOpen size={24} className="text-blue-600 dark:text-blue-400" />
29
+ Sommaire de la Documentation
30
+ </h2>
31
+ </CardHeader>
32
+ <CardBody>
33
+ <div className="grid grid-cols-1 md:grid-cols-2 gap-3">
34
+ <a
35
+ href="#section-welcome"
36
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
37
+ >
38
+ <FileText
39
+ size={16}
40
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
41
+ />
42
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
43
+ LastBrain
44
+ </span>
45
+ </a>
46
+ <a
47
+ href="#section-quickstart"
48
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
49
+ >
50
+ <Rocket
51
+ size={16}
52
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
53
+ />
54
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
55
+ Démarrage rapide
56
+ </span>
57
+ </a>
58
+ <a
59
+ href="#section-architecture"
60
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
61
+ >
62
+ <Building2
63
+ size={16}
64
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
65
+ />
66
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
67
+ Architecture
68
+ </span>
69
+ </a>
70
+ <a
71
+ href="#section-create-module"
72
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
73
+ >
74
+ <BookOpen
75
+ size={16}
76
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
77
+ />
78
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
79
+ Documentation des modules
80
+ </span>
81
+ </a>
82
+ <a
83
+ href="#section-database"
84
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
85
+ >
86
+ <Database
87
+ size={16}
88
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
89
+ />
90
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
91
+ Base de données
92
+ </span>
93
+ </a>
94
+ <a
95
+ href="#section-admin"
96
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
97
+ >
98
+ <User
99
+ size={16}
100
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
101
+ />
102
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
103
+ Créer un Compte Administrateur
104
+ </span>
105
+ </a>
106
+ <a
107
+ href="#section-development"
108
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
109
+ >
110
+ <Rocket
111
+ size={16}
112
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
113
+ />
114
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
115
+ Développement
116
+ </span>
117
+ </a>
118
+ <a
119
+ href="#section-routes"
120
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
121
+ >
122
+ <Shield
123
+ size={16}
124
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
125
+ />
126
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
127
+ Routes Protégées
128
+ </span>
129
+ </a>
130
+ <a
131
+ href="#section-workflow"
132
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
133
+ >
134
+ <Zap
135
+ size={16}
136
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
137
+ />
138
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
139
+ Workflow de Développement
140
+ </span>
141
+ </a>
142
+ <a
143
+ href="#section-ui"
144
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
145
+ >
146
+ <Palette
147
+ size={16}
148
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
149
+ />
150
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
151
+ Interface utilisateur
152
+ </span>
153
+ </a>
154
+ <a
155
+ href="#section-storage"
156
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
157
+ >
158
+ <HardDrive
159
+ size={16}
160
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
161
+ />
162
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
163
+ Système de Proxy Storage
164
+ </span>
165
+ </a>
166
+ <a
167
+ href="#section-realtime"
168
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
169
+ >
170
+ <Zap
171
+ size={16}
172
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
173
+ />
174
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
175
+ Système Realtime
176
+ </span>
177
+ </a>
178
+ <a
179
+ href="#section-module-docs"
180
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
181
+ >
182
+ <FileText
183
+ size={16}
184
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
185
+ />
186
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
187
+ Documenter ses modules
188
+ </span>
189
+ </a>
190
+ <a
191
+ href="#section-links"
192
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
193
+ >
194
+ <Link
195
+ size={16}
196
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
197
+ />
198
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
199
+ Liens utiles & remerciements 🙏
200
+ </span>
201
+ </a>
202
+ <a
203
+ href="#section-modules"
204
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
205
+ >
206
+ <Package
207
+ size={16}
208
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
209
+ />
210
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
211
+ Modules
212
+ </span>
213
+ </a>
214
+ <a
215
+ href="#section-i18n"
216
+ className="flex items-center gap-2 p-2 rounded hover:bg-blue-100 dark:hover:bg-blue-900 transition-colors group"
217
+ >
218
+ <FileText
219
+ size={16}
220
+ className="text-blue-600 dark:text-blue-400 shrink-0 group-hover:scale-110 transition-transform"
221
+ />
222
+ <span className="text-sm font-medium text-slate-700 dark:text-slate-300 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">
223
+ Système de traduction i18n
224
+ </span>
225
+ </a>
226
+ </div>
227
+ </CardBody>
228
+ </Card>
229
+
24
230
  <Card id="section-welcome" className="scroll-mt-32">
25
231
  <CardHeader>
26
232
  <h2 className="text-2xl font-semibold flex items-center gap-2">
@@ -484,6 +690,145 @@ export function DefaultDocumentation() {
484
690
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
485
691
  {`pnpm dev`}
486
692
  </Snippet>
693
+ <h3 className="text-lg font-semibold mb-2">
694
+ Écouter les webhooks Stripe (local)
695
+ </h3>
696
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
697
+ Pré-requis:
698
+ </p>
699
+ <div className="space-y-2">
700
+ <div className="flex items-start gap-2">
701
+ <span className="text-green-600">✅</span>
702
+ <span>
703
+ Avoir installé la Stripe CLI: https://stripe.com/docs/stripe-cli
704
+ </span>
705
+ </div>
706
+ <div className="flex items-start gap-2">
707
+ <span className="text-green-600">✅</span>
708
+ <span>
709
+ Avoir une clé test dans votre{" "}
710
+ <code className="text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded">
711
+ .env.local
712
+ </code>
713
+ :{" "}
714
+ <code className="text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded">
715
+ STRIPE_SECRET_KEY=sk_test_...
716
+ </code>
717
+ </span>
718
+ </div>
719
+ </div>
720
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
721
+ Endpoint local utilisé par la plateforme:
722
+ </p>
723
+ <div className="space-y-2">
724
+ <div className="flex items-start gap-2">
725
+ <span className="text-green-600">✅</span>
726
+ <span>
727
+ <code className="text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded">
728
+ POST /api/public/payment/stripe/webhook
729
+ </code>
730
+ </span>
731
+ </div>
732
+ </div>
733
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
734
+ 1. Connexion Stripe CLI
735
+ </p>
736
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
737
+ stripe login
738
+ </p>
739
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
740
+ 2. Démarrez votre app en local (remplacez le port si besoin)
741
+ </p>
742
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
743
+ {`pnpm dev`}
744
+ </Snippet>
745
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
746
+ 3. Écoutez les événements et transférez-les vers l'endpoint local
747
+ </p>
748
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
749
+ stripe listen --forward-to
750
+ http://localhost:3000/api/public/payment/stripe/webhook
751
+ </p>
752
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
753
+ La commande affiche un secret de signature sous la forme{" "}
754
+ <code className="text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded">
755
+ whsec_...
756
+ </code>
757
+ .
758
+ </p>
759
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
760
+ Exportez-le dans votre terminal pour la vérification des signatures:
761
+ </p>
762
+ <Snippet symbol="" hideSymbol className="text-sm mb-2">
763
+ {`export STRIPE_WEBHOOK_SECRET=whsec_xxxxxxxxxxxxxxxxxx`}
764
+ </Snippet>
765
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
766
+ 4. Déclencher des événements de test (optionnel)
767
+ </p>
768
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
769
+ # Paiement réussi
770
+ </p>
771
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
772
+ stripe trigger payment_intent.succeeded
773
+ </p>
774
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
775
+ # Checkout complété
776
+ </p>
777
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
778
+ stripe trigger checkout.session.completed
779
+ </p>
780
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
781
+ # Abonnement (création/mise à jour/suppression)
782
+ </p>
783
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
784
+ stripe trigger customer.subscription.created
785
+ </p>
786
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
787
+ stripe trigger customer.subscription.updated
788
+ </p>
789
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
790
+ stripe trigger customer.subscription.deleted
791
+ </p>
792
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
793
+ Notes:
794
+ </p>
795
+ <div className="space-y-2">
796
+ <div className="flex items-start gap-2">
797
+ <span className="text-green-600">✅</span>
798
+ <span>
799
+ L'endpoint est exposé dans les apps: voir{" "}
800
+ <a
801
+ href="apps/lastbrain/app/api/public/payment/stripe/webhook/route.ts"
802
+ className="text-blue-600 hover:underline"
803
+ target="_blank"
804
+ rel="noopener noreferrer"
805
+ >
806
+ apps/lastbrain/app/api/public/payment/stripe/webhook/route.ts
807
+ </a>{" "}
808
+ et{" "}
809
+ <a
810
+ href="apps/recipe/app/api/public/payment/stripe/webhook/route.ts"
811
+ className="text-blue-600 hover:underline"
812
+ target="_blank"
813
+ rel="noopener noreferrer"
814
+ >
815
+ apps/recipe/app/api/public/payment/stripe/webhook/route.ts
816
+ </a>
817
+ .
818
+ </span>
819
+ </div>
820
+ <div className="flex items-start gap-2">
821
+ <span className="text-green-600">✅</span>
822
+ <span>
823
+ En production (Vercel), créez un endpoint de webhook dans Stripe
824
+ et renseignez{" "}
825
+ <code className="text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded">
826
+ STRIPE_WEBHOOK_SECRET
827
+ </code>{" "}
828
+ dans les variables d'environnement du projet.
829
+ </span>
830
+ </div>
831
+ </div>
487
832
  </CardBody>
488
833
  </Card>
489
834
 
@@ -1012,7 +1357,7 @@ const proxyUrl = storagePathToProxyUrl("avatar/user_128_123456.webp");
1012
1357
  },
1013
1358
  {
1014
1359
  schema: "public",
1015
- table: "user_profiles",
1360
+ table: "user_profil",
1016
1361
  event: "*",
1017
1362
  filter: "owner_id=eq.\${USER_ID}",
1018
1363
  broadcast: "user_profile_updated",
@@ -1171,7 +1516,7 @@ function MonComposant() {
1171
1516
  <Card id="section-module-docs" className="scroll-mt-32">
1172
1517
  <CardHeader>
1173
1518
  <h2 className="text-2xl font-semibold flex items-center gap-2">
1174
- <BookOpen size={24} />
1519
+ <FileText size={24} />
1175
1520
  Documenter ses modules
1176
1521
  </h2>
1177
1522
  </CardHeader>
@@ -1635,6 +1980,29 @@ export function DocUsageCustom() {
1635
1980
  </a>
1636
1981
  </CardBody>
1637
1982
  </Card>
1983
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1984
+ <CardBody className="space-y-3">
1985
+ <div className="flex items-start justify-between">
1986
+ <h3 className="text-lg font-semibold">Audit Pro</h3>
1987
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1988
+ PRO
1989
+ </span>
1990
+ </div>
1991
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1992
+ Module LastBrain
1993
+ </p>
1994
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1995
+ <strong>Pages:</strong> 3 publique(s)
1996
+ </p>
1997
+
1998
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1999
+ {`pnpm lastbrain add-module audit-pro`}
2000
+ </Snippet>
2001
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
2002
+ 🔒 Documentation privée
2003
+ </span>
2004
+ </CardBody>
2005
+ </Card>
1638
2006
  <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-blue-500">
1639
2007
  <CardBody className="space-y-3">
1640
2008
  <div className="flex items-start justify-between">
@@ -1647,7 +2015,7 @@ export function DocUsageCustom() {
1647
2015
  Module LastBrain
1648
2016
  </p>
1649
2017
  <p className="text-xs text-slate-500 dark:text-slate-500">
1650
- <strong>Pages:</strong> 3 publique(s), 4 auth, 2 admin
2018
+ <strong>Pages:</strong> 5 publique(s), 3 auth, 2 admin
1651
2019
  </p>
1652
2020
 
1653
2021
  <Snippet symbol="💻" hideSymbol className="text-sm">
@@ -1675,7 +2043,7 @@ export function DocUsageCustom() {
1675
2043
  Module LastBrain
1676
2044
  </p>
1677
2045
  <p className="text-xs text-slate-500 dark:text-slate-500">
1678
- <strong>Pages:</strong> 3 auth, 2 admin
2046
+ <strong>Pages:</strong> 1 publique(s), 3 auth, 5 admin
1679
2047
  </p>
1680
2048
 
1681
2049
  <Snippet symbol="💻" hideSymbol className="text-sm">
@@ -1709,6 +2077,29 @@ export function DocUsageCustom() {
1709
2077
  </span>
1710
2078
  </CardBody>
1711
2079
  </Card>
2080
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
2081
+ <CardBody className="space-y-3">
2082
+ <div className="flex items-start justify-between">
2083
+ <h3 className="text-lg font-semibold">Contact Pro</h3>
2084
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
2085
+ PRO
2086
+ </span>
2087
+ </div>
2088
+ <p className="text-sm text-slate-600 dark:text-slate-400">
2089
+ Module LastBrain
2090
+ </p>
2091
+ <p className="text-xs text-slate-500 dark:text-slate-500">
2092
+ <strong>Pages:</strong> 1 publique(s), 2 admin
2093
+ </p>
2094
+
2095
+ <Snippet symbol="💻" hideSymbol className="text-sm">
2096
+ {`pnpm lastbrain add-module contact-pro`}
2097
+ </Snippet>
2098
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
2099
+ 🔒 Documentation privée
2100
+ </span>
2101
+ </CardBody>
2102
+ </Card>
1712
2103
  <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1713
2104
  <CardBody className="space-y-3">
1714
2105
  <div className="flex items-start justify-between">
@@ -1861,7 +2252,7 @@ export function DocUsageCustom() {
1861
2252
  Module LastBrain
1862
2253
  </p>
1863
2254
  <p className="text-xs text-slate-500 dark:text-slate-500">
1864
- <strong>Pages:</strong> 2 auth
2255
+ <strong>Pages:</strong> 1 publique(s), 2 auth
1865
2256
  </p>
1866
2257
 
1867
2258
  <Snippet symbol="💻" hideSymbol className="text-sm">
@@ -1889,7 +2280,7 @@ export function DocUsageCustom() {
1889
2280
  Module LastBrain
1890
2281
  </p>
1891
2282
  <p className="text-xs text-slate-500 dark:text-slate-500">
1892
- <strong>Pages:</strong> 4 auth
2283
+ <strong>Pages:</strong> 5 auth
1893
2284
  </p>
1894
2285
 
1895
2286
  <Snippet symbol="💻" hideSymbol className="text-sm">
@@ -128,11 +128,16 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
128
128
  "default",
129
129
  "section-welcome",
130
130
  "section-quickstart",
131
+ "section-development",
132
+ "section-admin",
131
133
  "section-architecture",
132
134
  "section-create-module",
135
+ "section-routes",
136
+ "section-workflow",
133
137
  "section-database",
134
138
  "section-storage",
135
139
  "section-realtime",
140
+ "section-i18n",
136
141
  "section-ui",
137
142
  "section-module-docs",
138
143
  "section-links",
@@ -215,6 +220,13 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
215
220
  icon: Rocket,
216
221
  color: "default" as const,
217
222
  },
223
+ {
224
+ id: "section-development",
225
+ name: "Développement",
226
+ description: "",
227
+ icon: Rocket,
228
+ color: "default" as const,
229
+ },
218
230
  {
219
231
  id: "section-architecture",
220
232
  name: "Architecture",
@@ -222,6 +234,13 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
222
234
  icon: Building2,
223
235
  color: "default" as const,
224
236
  },
237
+ {
238
+ id: "section-admin",
239
+ name: "Administration",
240
+ description: "",
241
+ icon: Building2,
242
+ color: "default" as const,
243
+ },
225
244
  {
226
245
  id: "section-create-module",
227
246
  name: "Créer un module",
@@ -229,6 +248,20 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
229
248
  icon: Package,
230
249
  color: "default" as const,
231
250
  },
251
+ {
252
+ id: "section-routes",
253
+ name: "Routes & API",
254
+ description: "",
255
+ icon: Link,
256
+ color: "default" as const,
257
+ },
258
+ {
259
+ id: "section-workflow",
260
+ name: "Workflow",
261
+ description: "",
262
+ icon: RotateCcw,
263
+ color: "default" as const,
264
+ },
232
265
  {
233
266
  id: "section-database",
234
267
  name: "Base de données",
@@ -257,6 +290,13 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
257
290
  icon: Palette,
258
291
  color: "default" as const,
259
292
  },
293
+ {
294
+ id: "section-i18n",
295
+ name: "Internationalisation",
296
+ description: "",
297
+ icon: BookOpen,
298
+ color: "default" as const,
299
+ },
260
300
  {
261
301
  id: "section-module-docs",
262
302
  name: "Doc des modules",
@@ -1,5 +1,5 @@
1
+ "use client";
1
2
  // GENERATED BY LASTBRAIN TEMPLATE (Migrations Guide)
2
- import React from "react";
3
3
  import { Card, Code, Divider, Chip } from "@lastbrain/ui";
4
4
 
5
5
  export function MigrationsGuidePage() {
@@ -1,6 +1,7 @@
1
+ "use client";
1
2
  // GENERATED BY LASTBRAIN TEMPLATE (Module Guide)
2
- import React from "react";
3
- import { Card, Code, Divider, Chip } from "@lastbrain/ui";
3
+ import { Code } from "@lastbrain/ui";
4
+ import { Card, Divider, Chip } from "@lastbrain/ui/ui-server";
4
5
 
5
6
  export function ModuleGuidePage() {
6
7
  return (
@@ -1,5 +1,5 @@
1
+ "use client";
1
2
  // SIMPLE VERSION FOR DEBUGGING
2
- import React from "react";
3
3
  import NextLink from "next/link";
4
4
  import {
5
5
  Button,