@lastbrain/app 0.1.43 → 0.1.44

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 (48) hide show
  1. package/dist/__tests__/module-registry.test.js +1 -1
  2. package/dist/layouts/AdminLayoutWithSidebar.d.ts +2 -1
  3. package/dist/layouts/AdminLayoutWithSidebar.d.ts.map +1 -1
  4. package/dist/layouts/AdminLayoutWithSidebar.js +10 -4
  5. package/dist/layouts/AuthLayoutWithSidebar.d.ts +2 -1
  6. package/dist/layouts/AuthLayoutWithSidebar.d.ts.map +1 -1
  7. package/dist/layouts/AuthLayoutWithSidebar.js +10 -4
  8. package/dist/layouts/PublicLayout.d.ts +2 -1
  9. package/dist/layouts/PublicLayout.d.ts.map +1 -1
  10. package/dist/layouts/PublicLayoutWithSidebar.d.ts +2 -1
  11. package/dist/layouts/PublicLayoutWithSidebar.d.ts.map +1 -1
  12. package/dist/layouts/PublicLayoutWithSidebar.js +10 -4
  13. package/dist/scripts/db-migrations-sync.js +67 -38
  14. package/dist/scripts/dev-sync.js +1 -0
  15. package/dist/scripts/init-app.d.ts.map +1 -1
  16. package/dist/scripts/init-app.js +41 -9
  17. package/dist/scripts/module-build.d.ts.map +1 -1
  18. package/dist/scripts/module-build.js +15 -5
  19. package/dist/scripts/module-create.d.ts.map +1 -1
  20. package/dist/scripts/module-create.js +19 -0
  21. package/dist/scripts/module-delete.d.ts.map +1 -1
  22. package/dist/scripts/module-delete.js +6 -2
  23. package/dist/scripts/module-list.d.ts.map +1 -1
  24. package/dist/scripts/module-list.js +1 -1
  25. package/dist/styles.css +1 -1
  26. package/dist/templates/DefaultDoc.d.ts.map +1 -1
  27. package/dist/templates/DefaultDoc.js +6 -13
  28. package/dist/templates/DocPage.d.ts.map +1 -1
  29. package/dist/templates/DocPage.js +3 -5
  30. package/dist/templates/SimpleDocPage.js +2 -2
  31. package/dist/templates/SimpleHomePage.js +1 -1
  32. package/package.json +7 -2
  33. package/src/__tests__/module-registry.test.ts +1 -1
  34. package/src/layouts/AdminLayoutWithSidebar.tsx +13 -6
  35. package/src/layouts/AuthLayoutWithSidebar.tsx +13 -6
  36. package/src/layouts/PublicLayout.tsx +2 -2
  37. package/src/layouts/PublicLayoutWithSidebar.tsx +13 -6
  38. package/src/scripts/db-migrations-sync.ts +86 -57
  39. package/src/scripts/dev-sync.ts +1 -0
  40. package/src/scripts/init-app.ts +47 -9
  41. package/src/scripts/module-build.ts +17 -5
  42. package/src/scripts/module-create.ts +25 -2
  43. package/src/scripts/module-delete.ts +8 -6
  44. package/src/scripts/module-list.ts +1 -4
  45. package/src/templates/DefaultDoc.tsx +346 -492
  46. package/src/templates/DocPage.tsx +37 -19
  47. package/src/templates/SimpleDocPage.tsx +2 -2
  48. package/src/templates/SimpleHomePage.tsx +3 -3
@@ -15,6 +15,7 @@ import {
15
15
  Palette,
16
16
  HardDrive,
17
17
  Link,
18
+ Package,
18
19
  } from "lucide-react";
19
20
 
20
21
  export function DefaultDocumentation() {
@@ -32,17 +33,6 @@ export function DefaultDocumentation() {
32
33
  Framework modulaire pour créer rapidement des applications Next.js
33
34
  avec système de modules, authentification et base de données.
34
35
  </p>
35
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
36
- !
37
- <a
38
- href="https://img.shields.io/github/package-json/dependency-version/lastpublication/starter/next?label=Next.js&path=packages/app/package.json"
39
- className="text-blue-600 hover:underline"
40
- target="_blank"
41
- rel="noopener noreferrer"
42
- >
43
- Next.js
44
- </a>
45
- </p>
46
36
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
47
37
  <strong>Require\</strong>*
48
38
  </p>
@@ -122,39 +112,40 @@ export function DefaultDocumentation() {
122
112
  </code>
123
113
  . Tous ces packages sont nécessaires pour le bon fonctionnement.
124
114
  </p>
125
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
126
- {`# 1. Lancer Docker Desktop`}
127
- </Snippet>
128
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
129
- {`Attendre que Docker soit “Running”.`}
130
- </Snippet>
131
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
132
- {`# 2. Installer Supabase CLI (si pas déjà installé)`}
133
- </Snippet>
115
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
116
+ # 1. Lancer Docker Desktop
117
+ </p>
118
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
119
+ Attendre que Docker soit “Running”.
120
+ </p>
121
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
122
+ # 2. Installer Supabase CLI (si pas déjà installé)
123
+ </p>
134
124
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
135
125
  {`brew install supabase/tap/supabase`}
136
126
  </Snippet>
137
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
138
- {`# 3. Créer une nouvelle application (utilise @latest pour la version la plus récente)`}
139
- </Snippet>
127
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
128
+ # 3. Créer une nouvelle application (utilise @latest pour la version
129
+ la plus récente)
130
+ </p>
140
131
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
141
132
  {`pnpx @lastbrain/app@latest init mon-app`}
142
133
  </Snippet>
143
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
144
- {`# 4. Accéder au dossier`}
145
- </Snippet>
134
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
135
+ # 4. Accéder au dossier
136
+ </p>
146
137
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
147
138
  {`cd mon-app`}
148
139
  </Snippet>
149
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
150
- {`# 5. Initialiser Supabase`}
151
- </Snippet>
140
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
141
+ # 5. Initialiser Supabase
142
+ </p>
152
143
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
153
144
  {`pnpm db:init`}
154
145
  </Snippet>
155
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
156
- {`# 6. Démarrer l'application si pas déjà lancé port :3000 par default`}
157
- </Snippet>
146
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
147
+ # 6. Démarrer l'application si pas déjà lancé port :3000 par default
148
+ </p>
158
149
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
159
150
  {`pnpm dev`}
160
151
  </Snippet>
@@ -240,33 +231,26 @@ export function DefaultDocumentation() {
240
231
  <span className="text-green-600">✅</span>
241
232
  <span>Générer les routes des modules sélectionnés</span>
242
233
  </div>
234
+ <div className="flex items-start gap-2">
235
+ <span className="text-green-600">✅</span>
236
+ <span>
237
+ Générer le .env.local avec les variables d'environnement
238
+ Supabase
239
+ </span>
240
+ </div>
243
241
  </div>
244
242
  <h3 className="text-lg font-semibold mb-2">
245
243
  Création du Compte Admin
246
244
  </h3>
247
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
248
- {`# Promouvoir votre compte en admin via Supabase`}
249
- </Snippet>
250
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
251
- {`update auth.users`}
252
- </Snippet>
253
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
254
- {`set raw_app_meta_data = jsonb_set(`}
255
- </Snippet>
256
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
257
- {` coalesce(raw_app_meta_data, '{}'::jsonb),`}
258
- </Snippet>
259
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
260
- {` '{roles}',`}
261
- </Snippet>
262
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
263
- {` '["admin"]'::jsonb`}
264
- </Snippet>
265
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
266
- {`)`}
267
- </Snippet>
268
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
269
- {`where email = 'votre@email.com';`}
245
+ <Snippet hideSymbol color="primary" className="text-sm mb-2">
246
+ <span>{`# Promouvoir votre compte en admin via Supabase`}</span>
247
+ <span>{`update auth.users`}</span>
248
+ <span>{`set raw_app_meta_data = jsonb_set(`}</span>
249
+ <span>{` coalesce(raw_app_meta_data, '{}'::jsonb),`}</span>
250
+ <span>{` '{roles}',`}</span>
251
+ <span>{` '["admin"]'::jsonb`}</span>
252
+ <span>{`)`}</span>
253
+ <span>{`where email = 'votre@email.com';`}</span>
270
254
  </Snippet>
271
255
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
272
256
  Votre application est maintenant disponible sur{" "}
@@ -405,9 +389,9 @@ export function DefaultDocumentation() {
405
389
  {`pnpm db:migrations:sync`}
406
390
  </Snippet>
407
391
  <h4 className="font-medium mb-2">Créer une migration</h4>
408
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
409
- {`supabase migration new ma_migration`}
410
- </Snippet>
392
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
393
+ supabase migration new ma_migration
394
+ </p>
411
395
  <h3 className="text-lg font-semibold mb-2">Migrations des modules</h3>
412
396
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
413
397
  Les modules peuvent avoir leurs propres migrations dans{" "}
@@ -446,20 +430,13 @@ export function DefaultDocumentation() {
446
430
  ) ou via psql :
447
431
  </p>
448
432
  <Snippet hideSymbol color="primary" className="text-sm mb-2">
449
- <span>{`update auth.users
450
- `}</span>
451
- <span>{`set raw_app_meta_data = jsonb_set(
452
- `}</span>
453
- <span>{` coalesce(raw_app_meta_data, '{}'::jsonb),
454
- `}</span>
455
- <span>{` '{roles}',
456
- `}</span>
457
- <span>{` '["admin"]'::jsonb
458
- `}</span>
459
- <span>{`)
460
- `}</span>
461
- <span>{`where email = 'votre@email.com';
462
- `}</span>
433
+ <span>{`update auth.users`}</span>
434
+ <span>{`set raw_app_meta_data = jsonb_set(`}</span>
435
+ <span>{` coalesce(raw_app_meta_data, '{}'::jsonb),`}</span>
436
+ <span>{` '{roles}',`}</span>
437
+ <span>{` '["admin"]'::jsonb`}</span>
438
+ <span>{`)`}</span>
439
+ <span>{`where email = 'votre@email.com';`}</span>
463
440
  </Snippet>
464
441
  <h3 className="text-lg font-semibold mb-2">
465
442
  3. Accéder à l'interface admin
@@ -592,9 +569,9 @@ export function DefaultDocumentation() {
592
569
  <h3 className="text-lg font-semibold mb-2">
593
570
  4. Appliquer les migrations
594
571
  </h3>
595
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
596
- {`supabase migration up`}
597
- </Snippet>
572
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
573
+ supabase migration up
574
+ </p>
598
575
  <h3 className="text-lg font-semibold mb-2">5. Tester</h3>
599
576
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
600
577
  {`pnpm dev`}
@@ -658,15 +635,15 @@ export function DefaultDocumentation() {
658
635
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
659
636
  <strong>❌ URL Supabase classique (longue)</strong>
660
637
  </p>
661
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
662
- {`https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp`}
663
- </Snippet>
638
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
639
+ https://xxx.supabase.co/storage/v1/object/public/avatar/user_128_123456.webp
640
+ </p>
664
641
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
665
642
  <strong>✅ URL Proxy (propre)</strong>
666
643
  </p>
667
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
668
- {`/api/storage/avatar/user_128_123456.webp`}
669
- </Snippet>
644
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
645
+ /api/storage/avatar/user_128_123456.webp
646
+ </p>
670
647
  <h3 className="text-lg font-semibold mb-2">
671
648
  Configuration des Buckets
672
649
  </h3>
@@ -674,17 +651,17 @@ export function DefaultDocumentation() {
674
651
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
675
652
  Photos de profil et avatars • 10MB max • Types: JPEG, PNG, WebP, GIF
676
653
  </p>
677
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
678
- {`/api/storage/avatar/user_128_123456.webp`}
679
- </Snippet>
654
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
655
+ /api/storage/avatar/user_128_123456.webp
656
+ </p>
680
657
  <h4 className="font-medium mb-2">🔒 app (Privé)</h4>
681
658
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
682
659
  Fichiers privés des utilisateurs • 100MB max • Authentification
683
660
  requise
684
661
  </p>
685
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
686
- {`/api/storage/app/user-id/documents/file.pdf`}
687
- </Snippet>
662
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
663
+ /api/storage/app/user-id/documents/file.pdf
664
+ </p>
688
665
  <h3 className="text-lg font-semibold mb-2">
689
666
  Utilisation dans le code
690
667
  </h3>
@@ -975,9 +952,9 @@ function MonComposant() {
975
952
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
976
953
  {`pnpm update:module-docs`}
977
954
  </Snippet>
978
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
979
- {`# ou pour un module spécifique`}
980
- </Snippet>
955
+ <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
956
+ # ou pour un module spécifique
957
+ </p>
981
958
  <Snippet symbol="" hideSymbol className="text-sm mb-2">
982
959
  {`pnpm update:module-docs auth`}
983
960
  </Snippet>
@@ -1023,7 +1000,7 @@ export function DocUsageCustom() {
1023
1000
  <div className="space-y-6">
1024
1001
  <Alert color="primary" className="mb-6">
1025
1002
  <div className="flex items-start gap-2">
1026
- <Lightbulb size={20} className="mt-0.5 flex-shrink-0" />
1003
+ <Lightbulb size={20} className="mt-0.5 shrink-0" />
1027
1004
  <div>
1028
1005
  <p className="font-semibold">Introduction</p>
1029
1006
  <p className="text-sm mt-1">
@@ -1354,413 +1331,290 @@ export function DocUsageCustom() {
1354
1331
  <Card id="section-modules" className="scroll-mt-32">
1355
1332
  <CardHeader>
1356
1333
  <h2 className="text-2xl font-semibold flex items-center gap-2">
1357
- <FileText size={24} />
1334
+ <Package size={24} />
1358
1335
  Modules
1359
1336
  </h2>
1360
1337
  </CardHeader>
1361
- <CardBody className="space-y-4">
1362
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1338
+ <CardBody className="space-y-6">
1339
+ <p className="text-slate-600 dark:text-slate-400">
1363
1340
  Les modules LastBrain permettent d'ajouter des fonctionnalités
1364
1341
  complètes à votre application de manière modulaire.
1365
1342
  </p>
1366
- <h3 className="text-lg font-semibold mb-2">Modules Disponibles</h3>
1367
- <h4 className="font-medium mb-2">
1368
- [module-ai](../packages/module-ai/README.md)
1369
- </h4>
1370
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1371
- !
1372
- <a
1373
- href="https://img.shields.io/npm/v/@lastbrain/module-ai?label=%40lastbrain%2Fmodule-ai"
1374
- className="text-blue-600 hover:underline"
1375
- target="_blank"
1376
- rel="noopener noreferrer"
1377
- >
1378
- npm version
1379
- </a>
1380
- </p>
1381
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1382
- <strong>Pages</strong>: 1 auth, 1 admin
1383
- </p>
1384
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1385
- <strong>Tables</strong>: user_token_ledger, user_prompts
1386
- </p>
1387
- <h4 className="font-medium mb-2">Installation du module ai</h4>
1388
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1389
- {`pnpm lastbrain add-module ai`}
1390
- </Snippet>
1391
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1392
- <a
1393
- href="../packages/module-ai/README.md"
1394
- className="text-blue-600 hover:underline"
1395
- target="_blank"
1396
- rel="noopener noreferrer"
1397
- >
1398
- 📖 Documentation complète →
1399
- </a>
1400
- </p>
1401
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1402
- <h4 className="font-medium mb-2">
1403
- [module-auth](../packages/module-auth/README.md)
1404
- </h4>
1405
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1406
- !
1407
- <a
1408
- href="https://img.shields.io/npm/v/@lastbrain/module-auth?label=%40lastbrain%2Fmodule-auth"
1409
- className="text-blue-600 hover:underline"
1410
- target="_blank"
1411
- rel="noopener noreferrer"
1412
- >
1413
- npm version
1414
- </a>
1415
- </p>
1416
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1417
- <strong>Pages</strong>: 3 publique(s), 4 auth, 2 admin
1418
- </p>
1419
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1420
- <strong>Tables</strong>: user_profil, user_address,
1421
- user_notifications
1422
- </p>
1423
- <h4 className="font-medium mb-2">Installation du module auth</h4>
1424
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1425
- {`pnpm lastbrain add-module auth`}
1426
- </Snippet>
1427
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1428
- <a
1429
- href="../packages/module-auth/README.md"
1430
- className="text-blue-600 hover:underline"
1431
- target="_blank"
1432
- rel="noopener noreferrer"
1433
- >
1434
- 📖 Documentation complète →
1435
- </a>
1436
- </p>
1437
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1438
- <h4 className="font-medium mb-2">
1439
- [module-billing](../packages/module-billing/README.md)
1440
- </h4>
1441
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1442
- !
1443
- <a
1444
- href="https://img.shields.io/npm/v/@lastbrain/module-billing?label=%40lastbrain%2Fmodule-billing"
1445
- className="text-blue-600 hover:underline"
1446
- target="_blank"
1447
- rel="noopener noreferrer"
1448
- >
1449
- npm version
1450
- </a>
1451
- </p>
1452
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1453
- <strong>Pages</strong>: 3 auth, 2 admin
1454
- </p>
1455
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1456
- <strong>Tables</strong>: billing_invoice, billing_invoice_line,
1457
- billing_invoice_payment, billing_invoice_log,
1458
- billing_invoice_counter, billing_settings
1459
- </p>
1460
- <h4 className="font-medium mb-2">Installation du module billing</h4>
1461
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1462
- {`pnpm lastbrain add-module billing`}
1463
- </Snippet>
1464
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1465
- <a
1466
- href="../packages/module-billing/README.md"
1467
- className="text-blue-600 hover:underline"
1468
- target="_blank"
1469
- rel="noopener noreferrer"
1470
- >
1471
- 📖 Documentation complète
1472
- </a>
1473
- </p>
1474
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1475
- <h4 className="font-medium mb-2">
1476
- [module-core-cart](../packages/module-core-cart/README.md)
1477
- </h4>
1478
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1479
- !
1480
- <a
1481
- href="https://img.shields.io/npm/v/@lastbrain/module-core-cart?label=%40lastbrain%2Fmodule-core-cart"
1482
- className="text-blue-600 hover:underline"
1483
- target="_blank"
1484
- rel="noopener noreferrer"
1485
- >
1486
- npm version
1487
- </a>
1488
- </p>
1489
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1490
- <strong>Pages</strong>: 2 auth, 1 admin
1491
- </p>
1492
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1493
- <strong>Tables</strong>: carts, cart_items
1494
- </p>
1495
- <h4 className="font-medium mb-2">Installation du module core-cart</h4>
1496
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1497
- {`pnpm lastbrain add-module core-cart`}
1498
- </Snippet>
1499
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1500
- <a
1501
- href="../packages/module-core-cart/README.md"
1502
- className="text-blue-600 hover:underline"
1503
- target="_blank"
1504
- rel="noopener noreferrer"
1505
- >
1506
- 📖 Documentation complète
1507
- </a>
1508
- </p>
1509
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1510
- <h4 className="font-medium mb-2">
1511
- [module-core-commerce](../packages/module-core-commerce/README.md)
1512
- </h4>
1513
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1514
- !
1515
- <a
1516
- href="https://img.shields.io/npm/v/@lastbrain/module-core-commerce?label=%40lastbrain%2Fmodule-core-commerce"
1517
- className="text-blue-600 hover:underline"
1518
- target="_blank"
1519
- rel="noopener noreferrer"
1520
- >
1521
- npm version
1522
- </a>
1523
- </p>
1524
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1525
- <strong>Tables</strong>: commerce_events, commerce_stats_daily
1526
- </p>
1527
- <h4 className="font-medium mb-2">
1528
- Installation du module core-commerce
1529
- </h4>
1530
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1531
- {`pnpm lastbrain add-module core-commerce`}
1532
- </Snippet>
1533
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1534
- <a
1535
- href="../packages/module-core-commerce/README.md"
1536
- className="text-blue-600 hover:underline"
1537
- target="_blank"
1538
- rel="noopener noreferrer"
1539
- >
1540
- 📖 Documentation complète
1541
- </a>
1542
- </p>
1543
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1544
- <h4 className="font-medium mb-2">
1545
- [module-core-order](../packages/module-core-order/README.md)
1546
- </h4>
1547
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1548
- !
1549
- <a
1550
- href="https://img.shields.io/npm/v/@lastbrain/module-core-order?label=%40lastbrain%2Fmodule-core-order"
1551
- className="text-blue-600 hover:underline"
1552
- target="_blank"
1553
- rel="noopener noreferrer"
1554
- >
1555
- npm version
1556
- </a>
1557
- </p>
1558
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1559
- <strong>Pages</strong>: 2 auth
1560
- </p>
1561
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1562
- <strong>Tables</strong>: orders, order_items, order_status_logs
1563
- </p>
1564
- <h4 className="font-medium mb-2">
1565
- Installation du module core-order
1566
- </h4>
1567
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1568
- {`pnpm lastbrain add-module core-order`}
1569
- </Snippet>
1570
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1571
- <a
1572
- href="../packages/module-core-order/README.md"
1573
- className="text-blue-600 hover:underline"
1574
- target="_blank"
1575
- rel="noopener noreferrer"
1576
- >
1577
- 📖 Documentation complète →
1578
- </a>
1579
- </p>
1580
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1581
- <h4 className="font-medium mb-2">
1582
- [module-core-payment](../packages/module-core-payment/README.md)
1583
- </h4>
1584
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1585
- !
1586
- <a
1587
- href="https://img.shields.io/npm/v/@lastbrain/module-core-payment?label=%40lastbrain%2Fmodule-core-payment"
1588
- className="text-blue-600 hover:underline"
1589
- target="_blank"
1590
- rel="noopener noreferrer"
1591
- >
1592
- npm version
1593
- </a>
1594
- </p>
1595
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1596
- <strong>Pages</strong>: 1 admin
1597
- </p>
1598
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1599
- <strong>Tables</strong>: payments
1600
- </p>
1601
- <h4 className="font-medium mb-2">
1602
- Installation du module core-payment
1603
- </h4>
1604
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1605
- {`pnpm lastbrain add-module core-payment`}
1606
- </Snippet>
1607
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1608
- <a
1609
- href="../packages/module-core-payment/README.md"
1610
- className="text-blue-600 hover:underline"
1611
- target="_blank"
1612
- rel="noopener noreferrer"
1613
- >
1614
- 📖 Documentation complète →
1615
- </a>
1616
- </p>
1617
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1618
- <h4 className="font-medium mb-2">
1619
- [module-core-product](../packages/module-core-product/README.md)
1620
- </h4>
1621
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1622
- !
1623
- <a
1624
- href="https://img.shields.io/npm/v/@lastbrain/module-core-product?label=%40lastbrain%2Fmodule-core-product"
1625
- className="text-blue-600 hover:underline"
1626
- target="_blank"
1627
- rel="noopener noreferrer"
1628
- >
1629
- npm version
1630
- </a>
1631
- </p>
1632
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1633
- <strong>Pages</strong>: 2 publique(s)
1634
- </p>
1635
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1636
- <strong>Tables</strong>: products, product_variants, product_stock,
1637
- product_images, product_seo, product_variant_families,
1638
- product_variant_options, product_delivery, product_additional_info,
1639
- product_stats
1640
- </p>
1641
- <h4 className="font-medium mb-2">
1642
- Installation du module core-product
1643
- </h4>
1644
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1645
- {`pnpm lastbrain add-module core-product`}
1646
- </Snippet>
1647
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1648
- <a
1649
- href="../packages/module-core-product/README.md"
1650
- className="text-blue-600 hover:underline"
1651
- target="_blank"
1652
- rel="noopener noreferrer"
1653
- >
1654
- 📖 Documentation complète →
1655
- </a>
1656
- </p>
1657
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1658
- <h4 className="font-medium mb-2">
1659
- [module-legal](../packages/module-legal/README.md)
1660
- </h4>
1661
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1662
- !
1663
- <a
1664
- href="https://img.shields.io/npm/v/@lastbrain/module-legal?label=%40lastbrain%2Fmodule-legal"
1665
- className="text-blue-600 hover:underline"
1666
- target="_blank"
1667
- rel="noopener noreferrer"
1668
- >
1669
- npm version
1670
- </a>
1671
- </p>
1672
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1673
- <strong>Pages</strong>: 4 publique(s), 2 admin
1674
- </p>
1675
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1676
- <strong>Tables</strong>: legal_settings, legal_pages
1677
- </p>
1678
- <h4 className="font-medium mb-2">Installation du module legal</h4>
1679
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1680
- {`pnpm lastbrain add-module legal`}
1681
- </Snippet>
1682
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1683
- <a
1684
- href="../packages/module-legal/README.md"
1685
- className="text-blue-600 hover:underline"
1686
- target="_blank"
1687
- rel="noopener noreferrer"
1688
- >
1689
- 📖 Documentation complète →
1690
- </a>
1691
- </p>
1692
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1693
- <h4 className="font-medium mb-2">
1694
- [module-recipes](../packages/module-recipes/README.md)
1695
- </h4>
1696
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1697
- !
1698
- <a
1699
- href="https://img.shields.io/npm/v/@lastbrain/module-recipes?label=%40lastbrain%2Fmodule-recipes"
1700
- className="text-blue-600 hover:underline"
1701
- target="_blank"
1702
- rel="noopener noreferrer"
1703
- >
1704
- npm version
1705
- </a>
1706
- </p>
1707
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1708
- <strong>Pages</strong>: 4 auth
1709
- </p>
1710
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1711
- <strong>Tables</strong>: recipes, recipe_favorites, recipe_comments,
1712
- recipe_image_queue, recipe_embeddings
1713
- </p>
1714
- <h4 className="font-medium mb-2">Installation du module recipes</h4>
1715
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1716
- {`pnpm lastbrain add-module recipes`}
1717
- </Snippet>
1718
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1719
- <a
1720
- href="../packages/module-recipes/README.md"
1721
- className="text-blue-600 hover:underline"
1722
- target="_blank"
1723
- rel="noopener noreferrer"
1724
- >
1725
- 📖 Documentation complète →
1726
- </a>
1727
- </p>
1728
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1729
- <h4 className="font-medium mb-2">
1730
- [module-tasks](../packages/module-tasks/README.md)
1731
- </h4>
1732
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1733
- !
1734
- <a
1735
- href="https://img.shields.io/npm/v/@lastbrain/module-tasks?label=%40lastbrain%2Fmodule-tasks"
1736
- className="text-blue-600 hover:underline"
1737
- target="_blank"
1738
- rel="noopener noreferrer"
1739
- >
1740
- npm version
1741
- </a>
1742
- </p>
1743
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1744
- <strong>Pages</strong>: 2 auth, 1 admin
1745
- </p>
1746
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1747
- <strong>Tables</strong>: tasks, tasks_logs
1748
- </p>
1749
- <h4 className="font-medium mb-2">Installation du module tasks</h4>
1750
- <Snippet symbol="" hideSymbol className="text-sm mb-2">
1751
- {`pnpm lastbrain add-module tasks`}
1752
- </Snippet>
1753
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1754
- <a
1755
- href="../packages/module-tasks/README.md"
1756
- className="text-blue-600 hover:underline"
1757
- target="_blank"
1758
- rel="noopener noreferrer"
1759
- >
1760
- 📖 Documentation complète →
1761
- </a>
1762
- </p>
1763
- <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">---</p>
1343
+ <div>
1344
+ <h3 className="text-xl font-semibold mb-4">Modules Disponibles</h3>
1345
+ <div className="grid grid-cols-1 gap-4">
1346
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-blue-500">
1347
+ <CardBody className="space-y-3">
1348
+ <div className="flex items-start justify-between">
1349
+ <h3 className="text-lg font-semibold">Ai</h3>
1350
+ <span className="text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded">
1351
+ FREE
1352
+ </span>
1353
+ </div>
1354
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1355
+ Module LastBrain
1356
+ </p>
1357
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1358
+ <strong>Pages:</strong> 1 auth, 1 admin
1359
+ </p>
1360
+
1361
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1362
+ {`pnpm lastbrain add-module ai`}
1363
+ </Snippet>
1364
+ <a
1365
+ href="https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-ai"
1366
+ className="text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1"
1367
+ target="_blank"
1368
+ rel="noopener noreferrer"
1369
+ >
1370
+ 📖 Documentation →
1371
+ </a>
1372
+ </CardBody>
1373
+ </Card>
1374
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-blue-500">
1375
+ <CardBody className="space-y-3">
1376
+ <div className="flex items-start justify-between">
1377
+ <h3 className="text-lg font-semibold">Auth</h3>
1378
+ <span className="text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded">
1379
+ FREE
1380
+ </span>
1381
+ </div>
1382
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1383
+ Module LastBrain
1384
+ </p>
1385
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1386
+ <strong>Pages:</strong> 3 publique(s), 4 auth, 2 admin
1387
+ </p>
1388
+
1389
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1390
+ {`pnpm lastbrain add-module auth`}
1391
+ </Snippet>
1392
+ <a
1393
+ href="https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-auth"
1394
+ className="text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1"
1395
+ target="_blank"
1396
+ rel="noopener noreferrer"
1397
+ >
1398
+ 📖 Documentation →
1399
+ </a>
1400
+ </CardBody>
1401
+ </Card>
1402
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1403
+ <CardBody className="space-y-3">
1404
+ <div className="flex items-start justify-between">
1405
+ <h3 className="text-lg font-semibold">Billing Pro</h3>
1406
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1407
+ PRO
1408
+ </span>
1409
+ </div>
1410
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1411
+ Module LastBrain
1412
+ </p>
1413
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1414
+ <strong>Pages:</strong> 3 auth, 2 admin
1415
+ </p>
1416
+
1417
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1418
+ {`pnpm lastbrain add-module billing-pro`}
1419
+ </Snippet>
1420
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1421
+ 🔒 Documentation privée
1422
+ </span>
1423
+ </CardBody>
1424
+ </Card>
1425
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1426
+ <CardBody className="space-y-3">
1427
+ <div className="flex items-start justify-between">
1428
+ <h3 className="text-lg font-semibold">Core Cart Pro</h3>
1429
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1430
+ PRO
1431
+ </span>
1432
+ </div>
1433
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1434
+ Module LastBrain
1435
+ </p>
1436
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1437
+ <strong>Pages:</strong> 2 auth, 1 admin
1438
+ </p>
1439
+
1440
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1441
+ {`pnpm lastbrain add-module core-cart-pro`}
1442
+ </Snippet>
1443
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1444
+ 🔒 Documentation privée
1445
+ </span>
1446
+ </CardBody>
1447
+ </Card>
1448
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1449
+ <CardBody className="space-y-3">
1450
+ <div className="flex items-start justify-between">
1451
+ <h3 className="text-lg font-semibold">Core Commerce Pro</h3>
1452
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1453
+ PRO
1454
+ </span>
1455
+ </div>
1456
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1457
+ Module LastBrain
1458
+ </p>
1459
+
1460
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1461
+ {`pnpm lastbrain add-module core-commerce-pro`}
1462
+ </Snippet>
1463
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1464
+ 🔒 Documentation privée
1465
+ </span>
1466
+ </CardBody>
1467
+ </Card>
1468
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1469
+ <CardBody className="space-y-3">
1470
+ <div className="flex items-start justify-between">
1471
+ <h3 className="text-lg font-semibold">Core Order Pro</h3>
1472
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1473
+ PRO
1474
+ </span>
1475
+ </div>
1476
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1477
+ Module LastBrain
1478
+ </p>
1479
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1480
+ <strong>Pages:</strong> 2 auth
1481
+ </p>
1482
+
1483
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1484
+ {`pnpm lastbrain add-module core-order-pro`}
1485
+ </Snippet>
1486
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1487
+ 🔒 Documentation privée
1488
+ </span>
1489
+ </CardBody>
1490
+ </Card>
1491
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1492
+ <CardBody className="space-y-3">
1493
+ <div className="flex items-start justify-between">
1494
+ <h3 className="text-lg font-semibold">Core Payment Pro</h3>
1495
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1496
+ PRO
1497
+ </span>
1498
+ </div>
1499
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1500
+ Module LastBrain
1501
+ </p>
1502
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1503
+ <strong>Pages:</strong> 1 admin
1504
+ </p>
1505
+
1506
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1507
+ {`pnpm lastbrain add-module core-payment-pro`}
1508
+ </Snippet>
1509
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1510
+ 🔒 Documentation privée
1511
+ </span>
1512
+ </CardBody>
1513
+ </Card>
1514
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1515
+ <CardBody className="space-y-3">
1516
+ <div className="flex items-start justify-between">
1517
+ <h3 className="text-lg font-semibold">Core Product Pro</h3>
1518
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1519
+ PRO
1520
+ </span>
1521
+ </div>
1522
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1523
+ Module LastBrain
1524
+ </p>
1525
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1526
+ <strong>Pages:</strong> 2 publique(s)
1527
+ </p>
1528
+
1529
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1530
+ {`pnpm lastbrain add-module core-product-pro`}
1531
+ </Snippet>
1532
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1533
+ 🔒 Documentation privée
1534
+ </span>
1535
+ </CardBody>
1536
+ </Card>
1537
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-blue-500">
1538
+ <CardBody className="space-y-3">
1539
+ <div className="flex items-start justify-between">
1540
+ <h3 className="text-lg font-semibold">Legal</h3>
1541
+ <span className="text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded">
1542
+ FREE
1543
+ </span>
1544
+ </div>
1545
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1546
+ Module LastBrain
1547
+ </p>
1548
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1549
+ <strong>Pages:</strong> 4 publique(s), 2 admin
1550
+ </p>
1551
+
1552
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1553
+ {`pnpm lastbrain add-module legal`}
1554
+ </Snippet>
1555
+ <a
1556
+ href="https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-legal"
1557
+ className="text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1"
1558
+ target="_blank"
1559
+ rel="noopener noreferrer"
1560
+ >
1561
+ 📖 Documentation
1562
+ </a>
1563
+ </CardBody>
1564
+ </Card>
1565
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-purple-500">
1566
+ <CardBody className="space-y-3">
1567
+ <div className="flex items-start justify-between">
1568
+ <h3 className="text-lg font-semibold">Recipes Pro</h3>
1569
+ <span className="text-xs bg-purple-100 dark:bg-purple-900 text-purple-800 dark:text-purple-200 px-2 py-1 rounded">
1570
+ PRO
1571
+ </span>
1572
+ </div>
1573
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1574
+ Module LastBrain
1575
+ </p>
1576
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1577
+ <strong>Pages:</strong> 4 auth
1578
+ </p>
1579
+
1580
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1581
+ {`pnpm lastbrain add-module recipes-pro`}
1582
+ </Snippet>
1583
+ <span className="text-xs text-slate-500 dark:text-slate-400 inline-flex items-center gap-1">
1584
+ 🔒 Documentation privée
1585
+ </span>
1586
+ </CardBody>
1587
+ </Card>
1588
+ <Card className="hover:shadow-lg transition-shadow border-l-4 border-l-blue-500">
1589
+ <CardBody className="space-y-3">
1590
+ <div className="flex items-start justify-between">
1591
+ <h3 className="text-lg font-semibold">Tasks</h3>
1592
+ <span className="text-xs bg-blue-100 dark:bg-blue-900 text-blue-800 dark:text-blue-200 px-2 py-1 rounded">
1593
+ FREE
1594
+ </span>
1595
+ </div>
1596
+ <p className="text-sm text-slate-600 dark:text-slate-400">
1597
+ Module LastBrain
1598
+ </p>
1599
+ <p className="text-xs text-slate-500 dark:text-slate-500">
1600
+ <strong>Pages:</strong> 2 auth, 1 admin
1601
+ </p>
1602
+
1603
+ <Snippet symbol="💻" hideSymbol className="text-sm">
1604
+ {`pnpm lastbrain add-module nom-du-module`}
1605
+ </Snippet>
1606
+ <a
1607
+ href="https://github.com/Lastbrain-labs/lb-starter/tree/main/packages/module-tasks"
1608
+ className="text-sm text-blue-600 dark:text-blue-400 hover:underline inline-flex items-center gap-1"
1609
+ target="_blank"
1610
+ rel="noopener noreferrer"
1611
+ >
1612
+ 📖 Documentation
1613
+ </a>
1614
+ </CardBody>
1615
+ </Card>
1616
+ </div>
1617
+ </div>
1764
1618
  <h3 className="text-lg font-semibold mb-2">Commandes</h3>
1765
1619
  <h4 className="font-medium mb-2">Installer un module</h4>
1766
1620
  <Snippet symbol="" hideSymbol className="text-sm mb-2">