@lastbrain/app 0.1.42 → 0.1.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/AdminLayout.tsx"],"names":[],"mappings":"AAEA,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAEtE"}
1
+ {"version":3,"file":"AdminLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/AdminLayout.tsx"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAEtE"}
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import { jsx as _jsx } from "react/jsx-runtime";
3
2
  export function AdminLayout({ children }) {
4
3
  return _jsx("div", { className: "pt-18 px-2 md:px-5", children: children });
@@ -1 +1 @@
1
- {"version":3,"file":"AuthLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/AuthLayout.tsx"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAErE"}
1
+ {"version":3,"file":"AuthLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/AuthLayout.tsx"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAErE"}
@@ -1,4 +1,3 @@
1
- "use client";
2
1
  import { jsx as _jsx } from "react/jsx-runtime";
3
2
  export function AuthLayout({ children }) {
4
3
  return _jsx("div", { className: "pt-18 px-2 md:px-5 ", children: children });
@@ -1,4 +1,7 @@
1
- export declare function PublicLayout({ children }: {
1
+ interface PublicLayoutProps {
2
2
  children: React.ReactNode;
3
- }): import("react/jsx-runtime").JSX.Element;
3
+ footerConfig?: any;
4
+ }
5
+ export declare function PublicLayout({ children, footerConfig }: PublicLayoutProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
4
7
  //# sourceMappingURL=PublicLayout.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublicLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/PublicLayout.tsx"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAAE,2CAEvE"}
1
+ {"version":3,"file":"PublicLayout.d.ts","sourceRoot":"","sources":["../../src/layouts/PublicLayout.tsx"],"names":[],"mappings":"AAIA,UAAU,iBAAiB;IACzB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,YAAY,CAAC,EAAE,GAAG,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,iBAAiB,2CAOzE"}
@@ -1,5 +1,6 @@
1
1
  "use client";
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- export function PublicLayout({ children }) {
4
- return _jsx("section", { className: "pt-16 ", children: children });
2
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Footer } from "@lastbrain/ui";
4
+ export function PublicLayout({ children, footerConfig }) {
5
+ return (_jsxs(_Fragment, { children: [_jsx("section", { className: "pt-16 min-h-[calc(100vh)]", children: children }), footerConfig && _jsx(Footer, { config: footerConfig })] }));
5
6
  }
@@ -53,7 +53,7 @@ export async function initApp(options) {
53
53
  // 3. Créer la structure Next.js
54
54
  await createNextStructure(targetDir, force, useHeroUI, withAuth);
55
55
  // 4. Créer les fichiers de configuration
56
- await createConfigFiles(targetDir, force, useHeroUI);
56
+ await createConfigFiles(targetDir, force, useHeroUI, projectName);
57
57
  // 5. Créer le système de proxy storage
58
58
  await createStorageProxy(targetDir, force);
59
59
  // 6. Créer .gitignore et .env.local.example
@@ -359,41 +359,19 @@ async function createNextStructure(targetDir, force, useHeroUI, withAuth) {
359
359
  if (!fs.existsSync(layoutDest) || force) {
360
360
  let layoutContent = "";
361
361
  if (useHeroUI) {
362
- // Layout avec HeroUI
362
+ // Layout avec HeroUI - Server Component
363
363
  layoutContent = `// GENERATED BY LASTBRAIN APP-SHELL
364
-
365
- "use client";
364
+ // Server Component pour permettre le SSR des pages enfants
366
365
 
367
366
  import "../styles/globals.css";
368
- import { HeroUIProvider } from "@heroui/system";
369
-
370
- import { ThemeProvider } from "next-themes";
371
- import { useRouter } from "next/navigation";
372
- import { AppProviders } from "../components/AppProviders";
367
+ import { ClientLayout } from "../components/ClientLayout";
373
368
  import type { PropsWithChildren } from "react";
374
- import { AppHeader } from "../components/AppHeader";
375
369
 
376
370
  export default function RootLayout({ children }: PropsWithChildren<{}>) {
377
- const router = useRouter();
378
-
379
371
  return (
380
372
  <html lang="fr" suppressHydrationWarning>
381
373
  <body className="min-h-screen">
382
- <HeroUIProvider navigate={router.push}>
383
- <ThemeProvider
384
- attribute="class"
385
- defaultTheme="dark"
386
- enableSystem={false}
387
- storageKey="lastbrain-theme"
388
- >
389
- <AppProviders>
390
- <AppHeader />
391
- <div className="min-h-screen text-foreground bg-background">
392
- {children}
393
- </div>
394
- </AppProviders>
395
- </ThemeProvider>
396
- </HeroUIProvider>
374
+ <ClientLayout>{children}</ClientLayout>
397
375
  </body>
398
376
  </html>
399
377
  );
@@ -401,34 +379,19 @@ export default function RootLayout({ children }: PropsWithChildren<{}>) {
401
379
  `;
402
380
  }
403
381
  else {
404
- // Layout Tailwind CSS uniquement
382
+ // Layout Tailwind CSS uniquement - Server Component
405
383
  layoutContent = `// GENERATED BY LASTBRAIN APP-SHELL
406
-
407
- "use client";
384
+ // Server Component pour permettre le SSR des pages enfants
408
385
 
409
386
  import "../styles/globals.css";
410
- import { ThemeProvider } from "next-themes";
411
- import { AppProviders } from "../components/AppProviders";
387
+ import { ClientLayout } from "../components/ClientLayout";
412
388
  import type { PropsWithChildren } from "react";
413
- import { AppHeader } from "../components/AppHeader";
414
389
 
415
390
  export default function RootLayout({ children }: PropsWithChildren<{}>) {
416
391
  return (
417
392
  <html lang="fr" suppressHydrationWarning>
418
393
  <body className="min-h-screen">
419
- <ThemeProvider
420
- attribute="class"
421
- defaultTheme="light"
422
- enableSystem={false}
423
- storageKey="lastbrain-theme"
424
- >
425
- <AppProviders>
426
- <AppHeader />
427
- <div className="min-h-screen bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-white">
428
- {children}
429
- </div>
430
- </AppProviders>
431
- </ThemeProvider>
394
+ <ClientLayout>{children}</ClientLayout>
432
395
  </body>
433
396
  </html>
434
397
  );
@@ -457,9 +420,16 @@ export default function RootLayout({ children }: PropsWithChildren<{}>) {
457
420
  const homePageContent = `// GENERATED BY LASTBRAIN APP-SHELL
458
421
 
459
422
  import { SimpleHomePage } from "@lastbrain/app";
423
+ import { Footer } from "@lastbrain/ui";
424
+ import { footerConfig } from "../config/footer";
460
425
 
461
426
  export default function RootPage() {
462
- return <SimpleHomePage showAuth={${withAuth}} />;
427
+ return (
428
+ <>
429
+ <SimpleHomePage showAuth={${withAuth}} />
430
+ <Footer config={footerConfig} />
431
+ </>
432
+ );
463
433
  }
464
434
  `;
465
435
  await fs.writeFile(homePagePath, homePageContent);
@@ -504,6 +474,8 @@ export default function NotFound() {
504
474
  await createRoute(appDir, "admin", "admin", force);
505
475
  await createRoute(appDir, "auth", "auth", force);
506
476
  await createRoute(appDir, "docs", "public", force);
477
+ // Créer le composant ClientLayout (wrapper client avec providers)
478
+ await createClientLayout(targetDir, force, useHeroUI);
507
479
  // Créer le composant AppHeader
508
480
  await createAppHeader(targetDir, force);
509
481
  // Créer le composant AppAside
@@ -511,6 +483,81 @@ export default function NotFound() {
511
483
  // Créer le wrapper AppProviders avec configuration realtime
512
484
  await createAppProvidersWrapper(targetDir, force);
513
485
  }
486
+ async function createClientLayout(targetDir, force, useHeroUI) {
487
+ const componentsDir = path.join(targetDir, "components");
488
+ await fs.ensureDir(componentsDir);
489
+ const clientLayoutPath = path.join(componentsDir, "ClientLayout.tsx");
490
+ if (!fs.existsSync(clientLayoutPath) || force) {
491
+ let clientLayoutContent = "";
492
+ if (useHeroUI) {
493
+ // ClientLayout avec HeroUI
494
+ clientLayoutContent = `"use client";
495
+
496
+ import { HeroUIProvider } from "@heroui/system";
497
+ import { ThemeProvider } from "next-themes";
498
+ import { useRouter } from "next/navigation";
499
+ import { AppProviders } from "./AppProviders";
500
+ import { AppHeader } from "./AppHeader";
501
+ import type { ReactNode } from "react";
502
+
503
+ export function ClientLayout({ children }: { children: ReactNode }) {
504
+ const router = useRouter();
505
+
506
+ return (
507
+ <HeroUIProvider navigate={router.push}>
508
+ <ThemeProvider
509
+ attribute="class"
510
+ defaultTheme="dark"
511
+ enableSystem={false}
512
+ storageKey="lastbrain-theme"
513
+ >
514
+ <AppProviders>
515
+ <AppHeader />
516
+ <div className="min-h-screen text-foreground bg-background">
517
+ {children}
518
+ </div>
519
+ </AppProviders>
520
+ </ThemeProvider>
521
+ </HeroUIProvider>
522
+ );
523
+ }
524
+ `;
525
+ }
526
+ else {
527
+ // ClientLayout Tailwind CSS uniquement
528
+ clientLayoutContent = `"use client";
529
+
530
+ import { ThemeProvider } from "next-themes";
531
+ import { AppProviders } from "./AppProviders";
532
+ import { AppHeader } from "./AppHeader";
533
+ import type { ReactNode } from "react";
534
+
535
+ export function ClientLayout({ children }: { children: ReactNode }) {
536
+ return (
537
+ <ThemeProvider
538
+ attribute="class"
539
+ defaultTheme="light"
540
+ enableSystem={false}
541
+ storageKey="lastbrain-theme"
542
+ >
543
+ <AppProviders>
544
+ <AppHeader />
545
+ <div className="min-h-screen bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-white">
546
+ {children}
547
+ </div>
548
+ </AppProviders>
549
+ </ThemeProvider>
550
+ );
551
+ }
552
+ `;
553
+ }
554
+ await fs.writeFile(clientLayoutPath, clientLayoutContent);
555
+ console.log(chalk.green("✓ components/ClientLayout.tsx créé"));
556
+ }
557
+ else {
558
+ console.log(chalk.gray(" components/ClientLayout.tsx existe déjà (utilisez --force pour écraser)"));
559
+ }
560
+ }
514
561
  async function createRoute(appDir, routeName, layoutType, force) {
515
562
  const routeDir = path.join(appDir, routeName);
516
563
  await fs.ensureDir(routeDir);
@@ -553,11 +600,26 @@ export default function AuthLayout({
553
600
  }`;
554
601
  }
555
602
  else {
556
- // Layout standard pour les autres routes
603
+ // Layout standard pour les autres routes (ex: docs = public)
557
604
  const layoutComponent = layoutType.charAt(0).toUpperCase() + layoutType.slice(1) + "Layout";
558
- layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
605
+ if (routeName === "docs") {
606
+ // Layout docs avec footer
607
+ layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
608
+ import { footerConfig } from "../../config/footer";
609
+
610
+ export default function DocsLayout({
611
+ children,
612
+ }: {
613
+ children: React.ReactNode;
614
+ }) {
615
+ return <${layoutComponent} footerConfig={footerConfig}>{children}</${layoutComponent}>;
616
+ }`;
617
+ }
618
+ else {
619
+ layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
559
620
 
560
621
  export default ${layoutComponent};`;
622
+ }
561
623
  }
562
624
  await fs.writeFile(layoutPath, layoutContent);
563
625
  console.log(chalk.green(`✓ app/${routeName}/layout.tsx créé`));
@@ -721,7 +783,7 @@ export function AppProviders({ children }: { children: ReactNode }) {
721
783
  console.log(chalk.gray(" components/AppProviders.tsx existe déjà (utilisez --force pour écraser)"));
722
784
  }
723
785
  }
724
- async function createConfigFiles(targetDir, force, useHeroUI) {
786
+ async function createConfigFiles(targetDir, force, useHeroUI, projectName) {
725
787
  console.log(chalk.yellow("\n⚙️ Création des fichiers de configuration..."));
726
788
  // middleware.ts - Protection des routes /auth/*, /admin/* et /api/admin/*
727
789
  const middlewarePath = path.join(targetDir, "middleware.ts");
@@ -983,6 +1045,25 @@ export const menuConfig: MenuConfig = {
983
1045
  await fs.writeFile(menuConfigPath, menuConfig);
984
1046
  console.log(chalk.green("✓ config/menu.ts créé"));
985
1047
  }
1048
+ // config/footer.ts
1049
+ const footerConfigPath = path.join(configDir, "footer.ts");
1050
+ if (!fs.existsSync(footerConfigPath) || force) {
1051
+ const footerConfig = `// Auto-generated footer configuration
1052
+ // Run "node ../../scripts/generate-footer-config.js ./apps/[your-app]" to regenerate
1053
+ "use client";
1054
+
1055
+ import type { FooterConfig } from "@lastbrain/ui";
1056
+
1057
+ export const footerConfig: FooterConfig = {
1058
+ companyName: "${projectName}",
1059
+ companyDescription: "Application LastBrain",
1060
+ links: [],
1061
+ social: [],
1062
+ };
1063
+ `;
1064
+ await fs.writeFile(footerConfigPath, footerConfig);
1065
+ console.log(chalk.green("✓ config/footer.ts créé"));
1066
+ }
986
1067
  // Créer les hooks
987
1068
  await createHooksDirectory(targetDir, force);
988
1069
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../src/scripts/module-build.ts"],"names":[],"mappings":"AAw0CA,wBAAsB,cAAc,kBAyFnC"}
1
+ {"version":3,"file":"module-build.d.ts","sourceRoot":"","sources":["../../src/scripts/module-build.ts"],"names":[],"mappings":"AA63CA,wBAAsB,cAAc,kBA+FnC"}
@@ -1027,7 +1027,6 @@ import { NextRequest, NextResponse } from "next/server";
1027
1027
  * GENERATED FILE - DO NOT EDIT MANUALLY
1028
1028
  * Generated at: ${timestamp}
1029
1029
  * Generated from module storage configurations
1030
- *
1031
1030
  * Buckets configurés:
1032
1031
  ${allBuckets.map((b) => ` * - ${b.name} (${b.public ? "public" : "private"})`).join("\n")}
1033
1032
  */
@@ -1120,6 +1119,53 @@ export async function GET(
1120
1119
  console.error("❌ Error generating storage proxy API:", error);
1121
1120
  }
1122
1121
  }
1122
+ async function generateFooterConfig(moduleConfigs) {
1123
+ try {
1124
+ // Extraire tous les liens footer des modules
1125
+ const allFooterLinks = moduleConfigs
1126
+ .filter((config) => config.footer && config.footer.length > 0)
1127
+ .flatMap((config) => config.footer);
1128
+ if (allFooterLinks.length === 0) {
1129
+ console.log("⏭️ No footer links found, skipping footer config generation");
1130
+ return;
1131
+ }
1132
+ // Trier les liens par position et order
1133
+ allFooterLinks.sort((a, b) => {
1134
+ const posOrder = { left: 0, center: 1, right: 2 };
1135
+ const posA = posOrder[a.position || "left"] || 0;
1136
+ const posB = posOrder[b.position || "left"] || 0;
1137
+ if (posA !== posB)
1138
+ return posA - posB;
1139
+ return (a.order || 0) - (b.order || 0);
1140
+ });
1141
+ const timestamp = new Date().toISOString();
1142
+ const content = `// Auto-generated footer configuration
1143
+ // Generated from module build configs
1144
+ // Generated at: ${timestamp}
1145
+ "use client";
1146
+
1147
+ import type { FooterConfig } from "@lastbrain/ui";
1148
+
1149
+ export const footerConfig: FooterConfig = {
1150
+ companyName: "LastBrain",
1151
+ companyDescription: "Plateforme de développement rapide d'applications",
1152
+ links: ${JSON.stringify(allFooterLinks, null, 2)},
1153
+ social: [],
1154
+ };
1155
+ `;
1156
+ const configDir = path.join(projectRoot, "config");
1157
+ ensureDirectory(configDir);
1158
+ const footerPath = path.join(configDir, "footer.ts");
1159
+ fs.writeFileSync(footerPath, content);
1160
+ if (isDebugMode) {
1161
+ console.log(`✅ Generated footer config: ${footerPath}`);
1162
+ console.log(` - ${allFooterLinks.length} footer link(s)`);
1163
+ }
1164
+ }
1165
+ catch (error) {
1166
+ console.error("❌ Error generating footer config:", error);
1167
+ }
1168
+ }
1123
1169
  export async function runModuleBuild() {
1124
1170
  ensureDirectory(appDirectory);
1125
1171
  // Nettoyer les fichiers générés précédemment
@@ -1184,6 +1230,11 @@ export async function runModuleBuild() {
1184
1230
  console.log("🔌 Generating storage proxy API...");
1185
1231
  }
1186
1232
  await generateStorageProxyApi(moduleConfigs);
1233
+ // Générer la configuration footer
1234
+ if (isDebugMode) {
1235
+ console.log("🦶 Generating footer configuration...");
1236
+ }
1237
+ await generateFooterConfig(moduleConfigs);
1187
1238
  // Message de succès final
1188
1239
  if (!isDebugMode) {
1189
1240
  console.log("\n✅ Module build completed successfully!");
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.1.17 | MIT License | https://tailwindcss.com */
2
- @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-orange-100:oklch(95.4% .038 75.164);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-900:oklch(40.8% .123 38.172);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-900:oklch(39.3% .095 152.535);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-900:oklch(39.8% .07 227.392);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-600:oklch(59.2% .249 .584);--color-pink-900:oklch(40.8% .153 2.432);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,[data-theme]{color:hsl(var(--heroui-foreground));background-color:hsl(var(--heroui-background))}:root,[data-theme=light]{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.top-18{top:calc(var(--spacing)*18)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.min-h-screen{min-height:100vh}.w-8{width:calc(var(--spacing)*8)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.scroll-mt-32{scroll-margin-top:calc(var(--spacing)*32)}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-green-500{border-left-color:var(--color-green-500)}.border-l-orange-500{border-left-color:var(--color-orange-500)}.border-l-purple-500{border-left-color:var(--color-purple-500)}.bg-background,.bg-background\/20{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab, red, red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)20%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-primary{background-color:hsl(var(--heroui-primary)/1)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-purple-50{--tw-gradient-via:var(--color-purple-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-purple-600{--tw-gradient-via:var(--color-purple-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-pink-50{--tw-gradient-to:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-pink-600{--tw-gradient-to:var(--color-pink-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.mask-\[radial-gradient\(ellipse_at_center\,transparent_20\%\,black\)\]{-webkit-mask-image:radial-gradient(#0000 20%,#000);mask-image:radial-gradient(#0000 20%,#000)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.py-24{padding-block:calc(var(--spacing)*24)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-16{padding-top:calc(var(--spacing)*16)}.pt-18{padding-top:calc(var(--spacing)*18)}.pt-32{padding-top:calc(var(--spacing)*32)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.pl-5{padding-left:calc(var(--spacing)*5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-100{color:var(--color-blue-100)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-cyan-600{color:var(--color-cyan-600)}.text-danger{color:hsl(var(--heroui-danger)/1)}.text-default-600{color:hsl(var(--heroui-default-600)/1)}.text-default-700{color:hsl(var(--heroui-default-700)/1)}.text-foreground{color:hsl(var(--heroui-foreground)/1)}.text-green-600{color:var(--color-green-600)}.text-orange-600{color:var(--color-orange-600)}.text-pink-600{color:var(--color-pink-600)}.text-primary-foreground{color:hsl(var(--heroui-primary-foreground)/1)}.text-purple-600{color:var(--color-purple-600)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.dark{color-scheme:dark;--heroui-background:0 0% 0%;--heroui-foreground-50:240 5.88% 10%;--heroui-foreground-100:240 3.7% 15.88%;--heroui-foreground-200:240 5.26% 26.08%;--heroui-foreground-300:240 5.2% 33.92%;--heroui-foreground-400:240 3.83% 46.08%;--heroui-foreground-500:240 5.03% 64.9%;--heroui-foreground-600:240 4.88% 83.92%;--heroui-foreground-700:240 5.88% 90%;--heroui-foreground-800:240 4.76% 95.88%;--heroui-foreground-900:0 0% 98.04%;--heroui-foreground:210 5.56% 92.94%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-divider:0 0% 100%;--heroui-content1:240 5.88% 10%;--heroui-content1-foreground:0 0% 98.04%;--heroui-content2:240 3.7% 15.88%;--heroui-content2-foreground:240 4.76% 95.88%;--heroui-content3:240 5.26% 26.08%;--heroui-content3-foreground:240 5.88% 90%;--heroui-content4:240 5.2% 33.92%;--heroui-content4-foreground:240 4.88% 83.92%;--heroui-default-50:240 5.88% 10%;--heroui-default-100:240 3.7% 15.88%;--heroui-default-200:240 5.26% 26.08%;--heroui-default-300:240 5.2% 33.92%;--heroui-default-400:240 3.83% 46.08%;--heroui-default-500:240 5.03% 64.9%;--heroui-default-600:240 4.88% 83.92%;--heroui-default-700:240 5.88% 90%;--heroui-default-800:240 4.76% 95.88%;--heroui-default-900:0 0% 98.04%;--heroui-default-foreground:0 0% 100%;--heroui-default:240 5.26% 26.08%;--heroui-primary-50:211.84 100% 9.61%;--heroui-primary-100:211.84 100% 19.22%;--heroui-primary-200:212.24 100% 28.82%;--heroui-primary-300:212.14 100% 38.43%;--heroui-primary-400:212.02 100% 46.67%;--heroui-primary-500:212.14 92.45% 58.43%;--heroui-primary-600:212.24 92.45% 68.82%;--heroui-primary-700:211.84 92.45% 79.22%;--heroui-primary-800:211.84 92.45% 89.61%;--heroui-primary-900:212.5 92.31% 94.9%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 66.67% 9.41%;--heroui-secondary-100:270 66.67% 18.82%;--heroui-secondary-200:270 66.67% 28.24%;--heroui-secondary-300:270 66.67% 37.65%;--heroui-secondary-400:270 66.67% 47.06%;--heroui-secondary-500:270 59.26% 57.65%;--heroui-secondary-600:270 59.26% 68.24%;--heroui-secondary-700:270 59.26% 78.82%;--heroui-secondary-800:270 59.26% 89.41%;--heroui-secondary-900:270 61.54% 94.9%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 59.26% 57.65%;--heroui-success-50:145.71 77.78% 8.82%;--heroui-success-100:146.2 79.78% 17.45%;--heroui-success-200:145.79 79.26% 26.47%;--heroui-success-300:146.01 79.89% 35.1%;--heroui-success-400:145.96 79.46% 43.92%;--heroui-success-500:146.01 62.45% 55.1%;--heroui-success-600:145.79 62.57% 66.47%;--heroui-success-700:146.2 61.74% 77.45%;--heroui-success-800:145.71 61.4% 88.82%;--heroui-success-900:146.67 64.29% 94.51%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:37.14 75% 10.98%;--heroui-warning-100:37.14 75% 21.96%;--heroui-warning-200:36.96 73.96% 33.14%;--heroui-warning-300:37.01 74.22% 44.12%;--heroui-warning-400:37.03 91.27% 55.1%;--heroui-warning-500:37.01 91.26% 64.12%;--heroui-warning-600:36.96 91.24% 73.14%;--heroui-warning-700:37.14 91.3% 81.96%;--heroui-warning-800:37.14 91.3% 90.98%;--heroui-warning-900:54.55 91.67% 95.29%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:340 84.91% 10.39%;--heroui-danger-100:339.33 86.54% 20.39%;--heroui-danger-200:339.11 85.99% 30.78%;--heroui-danger-300:339 86.54% 40.78%;--heroui-danger-400:339.2 90.36% 51.18%;--heroui-danger-500:339 90% 60.78%;--heroui-danger-600:339.11 90.6% 70.78%;--heroui-danger-700:339.33 90% 80.39%;--heroui-danger-800:340 91.84% 90.39%;--heroui-danger-900:339.13 92% 95.1%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #0000000d,0px 2px 10px 0px #0003,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-medium:0px 0px 15px 0px #0000000f,0px 2px 30px 0px #00000038,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-large:0px 0px 30px 0px #00000012,0px 30px 60px 0px #00000042,inset 0px 0px 1px 0px #ffffff26;--heroui-hover-opacity:.9}.light{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}.opacity-70{opacity:.7}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media (hover:hover){.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--heroui-primary)/1)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--heroui-primary)/1)90%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media (min-width:40rem){.sm\:flex-row{flex-direction:row}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:px-5{padding-inline:calc(var(--spacing)*5)}.md\:py-32{padding-block:calc(var(--spacing)*32)}.md\:pt-12{padding-top:calc(var(--spacing)*12)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}}@media (min-width:64rem){.lg\:ml-20{margin-left:calc(var(--spacing)*20)}.lg\:ml-72{margin-left:calc(var(--spacing)*72)}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:pb-8{padding-bottom:calc(var(--spacing)*8)}}.dark\:border-blue-800:is(.dark *){border-color:var(--color-blue-800)}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark\:bg-blue-950\/30:is(.dark *){background-color:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.dark\:bg-cyan-900\/30:is(.dark *){background-color:#104e644d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-cyan-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-cyan-900)30%,transparent)}}.dark\:bg-green-900\/30:is(.dark *){background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)30%,transparent)}}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7e2a0c4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark\:bg-pink-900\/30:is(.dark *){background-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-pink-900)30%,transparent)}}.dark\:bg-purple-900\/30:is(.dark *){background-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)30%,transparent)}}.dark\:bg-slate-800:is(.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-900:is(.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/50:is(.dark *){background-color:#0f172b80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-slate-900)50%,transparent)}}.dark\:bg-slate-950:is(.dark *){background-color:var(--color-slate-950)}.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-from:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-from:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-slate-900:is(.dark *){--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via:#59168b33}@supports (color:color-mix(in lab, red, red)){.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via:color-mix(in oklab,var(--color-purple-900)20%,transparent)}}.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-to:#1c398e33}@supports (color:color-mix(in lab, red, red)){.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-to:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-to:#3c03664d}@supports (color:color-mix(in lab, red, red)){.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-to:color-mix(in oklab,var(--color-purple-950)30%,transparent)}}.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-blue-100:is(.dark *){color:var(--color-blue-100)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-cyan-400:is(.dark *){color:var(--color-cyan-400)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-orange-400:is(.dark *){color:var(--color-orange-400)}.dark\:text-pink-400:is(.dark *){color:var(--color-pink-400)}.dark\:text-purple-400:is(.dark *){color:var(--color-purple-400)}.dark\:text-slate-300:is(.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:is(.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:is(.dark *){color:var(--color-slate-500)}.dark\:text-white:is(.dark *){color:var(--color-white)}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-font-weight:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-orange-100:oklch(95.4% .038 75.164);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-900:oklch(40.8% .123 38.172);--color-green-100:oklch(96.2% .044 156.743);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-900:oklch(39.3% .095 152.535);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-900:oklch(39.8% .07 227.392);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-600:oklch(59.2% .249 .584);--color-pink-900:oklch(40.8% .153 2.432);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--blur-lg:16px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root,[data-theme]{color:hsl(var(--heroui-foreground));background-color:hsl(var(--heroui-background))}:root,[data-theme=light]{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}}@layer components;@layer utilities{.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.top-18{top:calc(var(--spacing)*18)}.bottom-0{bottom:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-6{margin-left:calc(var(--spacing)*6)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.h-8{height:calc(var(--spacing)*8)}.h-16{height:calc(var(--spacing)*16)}.max-h-\[calc\(100vh-6rem\)\]{max-height:calc(100vh - 6rem)}.min-h-\[calc\(100vh\)\],.min-h-screen{min-height:100vh}.w-8{width:calc(var(--spacing)*8)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-md{max-width:var(--container-md)}.min-w-0{min-width:calc(var(--spacing)*0)}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.cursor-pointer{cursor:pointer}.scroll-mt-32{scroll-margin-top:calc(var(--spacing)*32)}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}.self-start{align-self:flex-start}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-blue-200{border-color:var(--color-blue-200)}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-green-500{border-left-color:var(--color-green-500)}.border-l-orange-500{border-left-color:var(--color-orange-500)}.border-l-purple-500{border-left-color:var(--color-purple-500)}.bg-background,.bg-background\/20{background-color:hsl(var(--heroui-background)/1)}@supports (color:color-mix(in lab, red, red)){.bg-background\/20{background-color:color-mix(in oklab,hsl(var(--heroui-background)/1)20%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-green-100{background-color:var(--color-green-100)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-primary{background-color:hsl(var(--heroui-primary)/1)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-white{background-color:var(--color-white)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-purple-50{--tw-gradient-via:var(--color-purple-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-purple-600{--tw-gradient-via:var(--color-purple-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-pink-50{--tw-gradient-to:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-pink-600{--tw-gradient-to:var(--color-pink-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.mask-\[radial-gradient\(ellipse_at_center\,transparent_20\%\,black\)\]{-webkit-mask-image:radial-gradient(#0000 20%,#000);mask-image:radial-gradient(#0000 20%,#000)}.bg-clip-text{-webkit-background-clip:text;background-clip:text}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.py-24{padding-block:calc(var(--spacing)*24)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-16{padding-top:calc(var(--spacing)*16)}.pt-18{padding-top:calc(var(--spacing)*18)}.pt-32{padding-top:calc(var(--spacing)*32)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-24{padding-bottom:calc(var(--spacing)*24)}.pl-5{padding-left:calc(var(--spacing)*5)}.text-center{text-align:center}.text-left{text-align:left}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-pre-wrap{white-space:pre-wrap}.text-blue-100{color:var(--color-blue-100)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-900{color:var(--color-blue-900)}.text-cyan-600{color:var(--color-cyan-600)}.text-danger{color:hsl(var(--heroui-danger)/1)}.text-default-600{color:hsl(var(--heroui-default-600)/1)}.text-default-700{color:hsl(var(--heroui-default-700)/1)}.text-foreground{color:hsl(var(--heroui-foreground)/1)}.text-green-600{color:var(--color-green-600)}.text-orange-600{color:var(--color-orange-600)}.text-pink-600{color:var(--color-pink-600)}.text-primary-foreground{color:hsl(var(--heroui-primary-foreground)/1)}.text-purple-600{color:var(--color-purple-600)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-900{color:var(--color-slate-900)}.text-transparent{color:#0000}.text-white{color:var(--color-white)}.dark{color-scheme:dark;--heroui-background:0 0% 0%;--heroui-foreground-50:240 5.88% 10%;--heroui-foreground-100:240 3.7% 15.88%;--heroui-foreground-200:240 5.26% 26.08%;--heroui-foreground-300:240 5.2% 33.92%;--heroui-foreground-400:240 3.83% 46.08%;--heroui-foreground-500:240 5.03% 64.9%;--heroui-foreground-600:240 4.88% 83.92%;--heroui-foreground-700:240 5.88% 90%;--heroui-foreground-800:240 4.76% 95.88%;--heroui-foreground-900:0 0% 98.04%;--heroui-foreground:210 5.56% 92.94%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-divider:0 0% 100%;--heroui-content1:240 5.88% 10%;--heroui-content1-foreground:0 0% 98.04%;--heroui-content2:240 3.7% 15.88%;--heroui-content2-foreground:240 4.76% 95.88%;--heroui-content3:240 5.26% 26.08%;--heroui-content3-foreground:240 5.88% 90%;--heroui-content4:240 5.2% 33.92%;--heroui-content4-foreground:240 4.88% 83.92%;--heroui-default-50:240 5.88% 10%;--heroui-default-100:240 3.7% 15.88%;--heroui-default-200:240 5.26% 26.08%;--heroui-default-300:240 5.2% 33.92%;--heroui-default-400:240 3.83% 46.08%;--heroui-default-500:240 5.03% 64.9%;--heroui-default-600:240 4.88% 83.92%;--heroui-default-700:240 5.88% 90%;--heroui-default-800:240 4.76% 95.88%;--heroui-default-900:0 0% 98.04%;--heroui-default-foreground:0 0% 100%;--heroui-default:240 5.26% 26.08%;--heroui-primary-50:211.84 100% 9.61%;--heroui-primary-100:211.84 100% 19.22%;--heroui-primary-200:212.24 100% 28.82%;--heroui-primary-300:212.14 100% 38.43%;--heroui-primary-400:212.02 100% 46.67%;--heroui-primary-500:212.14 92.45% 58.43%;--heroui-primary-600:212.24 92.45% 68.82%;--heroui-primary-700:211.84 92.45% 79.22%;--heroui-primary-800:211.84 92.45% 89.61%;--heroui-primary-900:212.5 92.31% 94.9%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 66.67% 9.41%;--heroui-secondary-100:270 66.67% 18.82%;--heroui-secondary-200:270 66.67% 28.24%;--heroui-secondary-300:270 66.67% 37.65%;--heroui-secondary-400:270 66.67% 47.06%;--heroui-secondary-500:270 59.26% 57.65%;--heroui-secondary-600:270 59.26% 68.24%;--heroui-secondary-700:270 59.26% 78.82%;--heroui-secondary-800:270 59.26% 89.41%;--heroui-secondary-900:270 61.54% 94.9%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 59.26% 57.65%;--heroui-success-50:145.71 77.78% 8.82%;--heroui-success-100:146.2 79.78% 17.45%;--heroui-success-200:145.79 79.26% 26.47%;--heroui-success-300:146.01 79.89% 35.1%;--heroui-success-400:145.96 79.46% 43.92%;--heroui-success-500:146.01 62.45% 55.1%;--heroui-success-600:145.79 62.57% 66.47%;--heroui-success-700:146.2 61.74% 77.45%;--heroui-success-800:145.71 61.4% 88.82%;--heroui-success-900:146.67 64.29% 94.51%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:37.14 75% 10.98%;--heroui-warning-100:37.14 75% 21.96%;--heroui-warning-200:36.96 73.96% 33.14%;--heroui-warning-300:37.01 74.22% 44.12%;--heroui-warning-400:37.03 91.27% 55.1%;--heroui-warning-500:37.01 91.26% 64.12%;--heroui-warning-600:36.96 91.24% 73.14%;--heroui-warning-700:37.14 91.3% 81.96%;--heroui-warning-800:37.14 91.3% 90.98%;--heroui-warning-900:54.55 91.67% 95.29%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:340 84.91% 10.39%;--heroui-danger-100:339.33 86.54% 20.39%;--heroui-danger-200:339.11 85.99% 30.78%;--heroui-danger-300:339 86.54% 40.78%;--heroui-danger-400:339.2 90.36% 51.18%;--heroui-danger-500:339 90% 60.78%;--heroui-danger-600:339.11 90.6% 70.78%;--heroui-danger-700:339.33 90% 80.39%;--heroui-danger-800:340 91.84% 90.39%;--heroui-danger-900:339.13 92% 95.1%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #0000000d,0px 2px 10px 0px #0003,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-medium:0px 0px 15px 0px #0000000f,0px 2px 30px 0px #00000038,inset 0px 0px 1px 0px #ffffff26;--heroui-box-shadow-large:0px 0px 30px 0px #00000012,0px 30px 60px 0px #00000042,inset 0px 0px 1px 0px #ffffff26;--heroui-hover-opacity:.9}.light{color-scheme:light;--heroui-background:0 0% 100%;--heroui-foreground-50:0 0% 98.04%;--heroui-foreground-100:240 4.76% 95.88%;--heroui-foreground-200:240 5.88% 90%;--heroui-foreground-300:240 4.88% 83.92%;--heroui-foreground-400:240 5.03% 64.9%;--heroui-foreground-500:240 3.83% 46.08%;--heroui-foreground-600:240 5.2% 33.92%;--heroui-foreground-700:240 5.26% 26.08%;--heroui-foreground-800:240 3.7% 15.88%;--heroui-foreground-900:240 5.88% 10%;--heroui-foreground:201.82 24.44% 8.82%;--heroui-divider:0 0% 6.67%;--heroui-focus:212.02 100% 46.67%;--heroui-overlay:0 0% 0%;--heroui-content1:0 0% 100%;--heroui-content1-foreground:201.82 24.44% 8.82%;--heroui-content2:240 4.76% 95.88%;--heroui-content2-foreground:240 3.7% 15.88%;--heroui-content3:240 5.88% 90%;--heroui-content3-foreground:240 5.26% 26.08%;--heroui-content4:240 4.88% 83.92%;--heroui-content4-foreground:240 5.2% 33.92%;--heroui-default-50:0 0% 98.04%;--heroui-default-100:240 4.76% 95.88%;--heroui-default-200:240 5.88% 90%;--heroui-default-300:240 4.88% 83.92%;--heroui-default-400:240 5.03% 64.9%;--heroui-default-500:240 3.83% 46.08%;--heroui-default-600:240 5.2% 33.92%;--heroui-default-700:240 5.26% 26.08%;--heroui-default-800:240 3.7% 15.88%;--heroui-default-900:240 5.88% 10%;--heroui-default-foreground:0 0% 0%;--heroui-default:240 4.88% 83.92%;--heroui-primary-50:212.5 92.31% 94.9%;--heroui-primary-100:211.84 92.45% 89.61%;--heroui-primary-200:211.84 92.45% 79.22%;--heroui-primary-300:212.24 92.45% 68.82%;--heroui-primary-400:212.14 92.45% 58.43%;--heroui-primary-500:212.02 100% 46.67%;--heroui-primary-600:212.14 100% 38.43%;--heroui-primary-700:212.24 100% 28.82%;--heroui-primary-800:211.84 100% 19.22%;--heroui-primary-900:211.84 100% 9.61%;--heroui-primary-foreground:0 0% 100%;--heroui-primary:212.02 100% 46.67%;--heroui-secondary-50:270 61.54% 94.9%;--heroui-secondary-100:270 59.26% 89.41%;--heroui-secondary-200:270 59.26% 78.82%;--heroui-secondary-300:270 59.26% 68.24%;--heroui-secondary-400:270 59.26% 57.65%;--heroui-secondary-500:270 66.67% 47.06%;--heroui-secondary-600:270 66.67% 37.65%;--heroui-secondary-700:270 66.67% 28.24%;--heroui-secondary-800:270 66.67% 18.82%;--heroui-secondary-900:270 66.67% 9.41%;--heroui-secondary-foreground:0 0% 100%;--heroui-secondary:270 66.67% 47.06%;--heroui-success-50:146.67 64.29% 94.51%;--heroui-success-100:145.71 61.4% 88.82%;--heroui-success-200:146.2 61.74% 77.45%;--heroui-success-300:145.79 62.57% 66.47%;--heroui-success-400:146.01 62.45% 55.1%;--heroui-success-500:145.96 79.46% 43.92%;--heroui-success-600:146.01 79.89% 35.1%;--heroui-success-700:145.79 79.26% 26.47%;--heroui-success-800:146.2 79.78% 17.45%;--heroui-success-900:145.71 77.78% 8.82%;--heroui-success-foreground:0 0% 0%;--heroui-success:145.96 79.46% 43.92%;--heroui-warning-50:54.55 91.67% 95.29%;--heroui-warning-100:37.14 91.3% 90.98%;--heroui-warning-200:37.14 91.3% 81.96%;--heroui-warning-300:36.96 91.24% 73.14%;--heroui-warning-400:37.01 91.26% 64.12%;--heroui-warning-500:37.03 91.27% 55.1%;--heroui-warning-600:37.01 74.22% 44.12%;--heroui-warning-700:36.96 73.96% 33.14%;--heroui-warning-800:37.14 75% 21.96%;--heroui-warning-900:37.14 75% 10.98%;--heroui-warning-foreground:0 0% 0%;--heroui-warning:37.03 91.27% 55.1%;--heroui-danger-50:339.13 92% 95.1%;--heroui-danger-100:340 91.84% 90.39%;--heroui-danger-200:339.33 90% 80.39%;--heroui-danger-300:339.11 90.6% 70.78%;--heroui-danger-400:339 90% 60.78%;--heroui-danger-500:339.2 90.36% 51.18%;--heroui-danger-600:339 86.54% 40.78%;--heroui-danger-700:339.11 85.99% 30.78%;--heroui-danger-800:339.33 86.54% 20.39%;--heroui-danger-900:340 84.91% 10.39%;--heroui-danger-foreground:0 0% 100%;--heroui-danger:339.2 90.36% 51.18%;--heroui-divider-weight:1px;--heroui-disabled-opacity:.5;--heroui-font-size-tiny:.75rem;--heroui-font-size-small:.875rem;--heroui-font-size-medium:1rem;--heroui-font-size-large:1.125rem;--heroui-line-height-tiny:1rem;--heroui-line-height-small:1.25rem;--heroui-line-height-medium:1.5rem;--heroui-line-height-large:1.75rem;--heroui-radius-small:8px;--heroui-radius-medium:12px;--heroui-radius-large:14px;--heroui-border-width-small:1px;--heroui-border-width-medium:2px;--heroui-border-width-large:3px;--heroui-box-shadow-small:0px 0px 5px 0px #00000005,0px 2px 10px 0px #0000000f,0px 0px 1px 0px #0000004d;--heroui-box-shadow-medium:0px 0px 15px 0px #00000008,0px 2px 30px 0px #00000014,0px 0px 1px 0px #0000004d;--heroui-box-shadow-large:0px 0px 30px 0px #0000000a,0px 30px 60px 0px #0000001f,0px 0px 1px 0px #0000004d;--heroui-hover-opacity:.8}.opacity-70{opacity:.7}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media (hover:hover){.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-primary\/90:hover{background-color:hsl(var(--heroui-primary)/1)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab,hsl(var(--heroui-primary)/1)90%,transparent)}}.hover\:underline:hover{text-decoration-line:underline}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}@media (min-width:40rem){.sm\:flex-row{flex-direction:row}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:px-5{padding-inline:calc(var(--spacing)*5)}.md\:py-32{padding-block:calc(var(--spacing)*32)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}}@media (min-width:64rem){.lg\:ml-20{margin-left:calc(var(--spacing)*20)}.lg\:ml-72{margin-left:calc(var(--spacing)*72)}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:pb-8{padding-bottom:calc(var(--spacing)*8)}}.dark\:border-blue-800:is(.dark *){border-color:var(--color-blue-800)}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark\:bg-blue-950\/30:is(.dark *){background-color:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-950\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.dark\:bg-cyan-900\/30:is(.dark *){background-color:#104e644d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-cyan-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-cyan-900)30%,transparent)}}.dark\:bg-green-900\/30:is(.dark *){background-color:#0d542b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-green-900)30%,transparent)}}.dark\:bg-orange-900\/30:is(.dark *){background-color:#7e2a0c4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-orange-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark\:bg-pink-900\/30:is(.dark *){background-color:#8610434d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-pink-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-pink-900)30%,transparent)}}.dark\:bg-purple-900\/30:is(.dark *){background-color:#59168b4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-purple-900)30%,transparent)}}.dark\:bg-slate-800:is(.dark *){background-color:var(--color-slate-800)}.dark\:bg-slate-900:is(.dark *){background-color:var(--color-slate-900)}.dark\:bg-slate-900\/50:is(.dark *){background-color:#0f172b80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-slate-900\/50:is(.dark *){background-color:color-mix(in oklab,var(--color-slate-900)50%,transparent)}}.dark\:bg-slate-950:is(.dark *){background-color:var(--color-slate-950)}.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-from:#1624564d}@supports (color:color-mix(in lab, red, red)){.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-from:color-mix(in oklab,var(--color-blue-950)30%,transparent)}}.dark\:from-blue-950\/30:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-slate-900:is(.dark *){--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via:#59168b33}@supports (color:color-mix(in lab, red, red)){.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via:color-mix(in oklab,var(--color-purple-900)20%,transparent)}}.dark\:via-purple-900\/20:is(.dark *){--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-to:#1c398e33}@supports (color:color-mix(in lab, red, red)){.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-to:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark\:to-blue-900\/20:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-to:#3c03664d}@supports (color:color-mix(in lab, red, red)){.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-to:color-mix(in oklab,var(--color-purple-950)30%,transparent)}}.dark\:to-purple-950\/30:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-blue-100:is(.dark *){color:var(--color-blue-100)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-cyan-400:is(.dark *){color:var(--color-cyan-400)}.dark\:text-green-400:is(.dark *){color:var(--color-green-400)}.dark\:text-orange-400:is(.dark *){color:var(--color-orange-400)}.dark\:text-pink-400:is(.dark *){color:var(--color-pink-400)}.dark\:text-purple-400:is(.dark *){color:var(--color-purple-400)}.dark\:text-slate-300:is(.dark *){color:var(--color-slate-300)}.dark\:text-slate-400:is(.dark *){color:var(--color-slate-400)}.dark\:text-slate-500:is(.dark *){color:var(--color-slate-500)}.dark\:text-white:is(.dark *){color:var(--color-white)}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,oBAAoB,4CAovDnC"}
1
+ {"version":3,"file":"DefaultDoc.d.ts","sourceRoot":"","sources":["../../src/templates/DefaultDoc.tsx"],"names":[],"mappings":"AAmBA,wBAAgB,oBAAoB,4CAyxDnC"}
@@ -243,5 +243,5 @@ export function DocUsageCustom() {
243
243
  <p>Description...</p>
244
244
  </div>
245
245
  );
246
- }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Modules Disponibles" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-ai](../packages/module-ai/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-ai?label=%40lastbrain%2Fmodule-ai", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_token_ledger, user_prompts"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module ai" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module ai` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-ai/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-auth](../packages/module-auth/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-auth?label=%40lastbrain%2Fmodule-auth", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 publique(s), 4 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_profil, user_address, user_notifications"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module auth` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-auth/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-billing](../packages/module-billing/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-billing?label=%40lastbrain%2Fmodule-billing", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": billing_invoice, billing_invoice_line, billing_invoice_payment, billing_invoice_log, billing_invoice_counter, billing_settings"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module billing" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module billing` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-billing/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-cart](../packages/module-core-cart/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-cart?label=%40lastbrain%2Fmodule-core-cart", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": carts, cart_items"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-cart" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-cart` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-cart/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-commerce](../packages/module-core-commerce/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-commerce?label=%40lastbrain%2Fmodule-core-commerce", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": commerce_events, commerce_stats_daily"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-commerce" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-commerce` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-commerce/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-order](../packages/module-core-order/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-order?label=%40lastbrain%2Fmodule-core-order", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": orders, order_items, order_status_logs"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-order" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-order` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-order/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-payment](../packages/module-core-payment/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-payment?label=%40lastbrain%2Fmodule-core-payment", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": payments"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-payment" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-payment` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-payment/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-product](../packages/module-core-product/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-product?label=%40lastbrain%2Fmodule-core-product", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 publique(s)"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": products, product_variants, product_stock, product_images, product_seo"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-product" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-product` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-product/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-recipes](../packages/module-recipes/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-recipes?label=%40lastbrain%2Fmodule-recipes", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 4 auth"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": recipes, recipe_favorites, recipe_comments, recipe_image_queue, recipe_embeddings"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module recipes" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module recipes` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-recipes/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-tasks](../packages/module-tasks/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-tasks?label=%40lastbrain%2Fmodule-tasks", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": tasks, tasks_logs"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module tasks" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module tasks` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-tasks/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la", " ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] })] }));
246
+ }` }) }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Exporter la documentation" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Dans", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "src/index.ts" }), " ", ":"] }), _jsx(Alert, { hideIcon: true, color: "primary", className: "p-4 mb-4", children: _jsx("pre", { className: "whitespace-pre-wrap", children: `export { MonModuleDoc } from "./components/Doc.js";` }) })] })] }), _jsxs(Card, { id: "section-links", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(Link, { size: 24 }), "Liens utiles & remerciements \uD83D\uDE4F"] }) }), _jsx(CardBody, { children: _jsxs("div", { className: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4", children: [_jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://nextjs.org/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Next.js" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://nextjs.org/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://supabase.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Supabase" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Documentation officielle" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://supabase.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://www.heroui.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Heroui" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Composants UI" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://www.heroui.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://tailwindcss.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Tailwind CSS" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Framework CSS" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://tailwindcss.com/docs" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://lucide.dev/", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Lucide Icons" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Icones SVG" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://lucide.dev/" })] }) }), _jsx(Card, { className: "hover:shadow-lg transition-shadow", isPressable: true, as: "a", href: "https://stripe.com/docs", target: "_blank", rel: "noopener noreferrer", children: _jsxs(CardBody, { children: [_jsx("h3", { className: "text-lg font-semibold mb-2", children: "Stripe" }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-3", children: "Syst\u00E8me de paiement" }), _jsx("p", { className: "text-xs text-blue-600 dark:text-blue-400 truncate", children: "https://stripe.com/docs" })] }) })] }) })] }), _jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsxs("h2", { className: "text-2xl font-semibold flex items-center gap-2", children: [_jsx(FileText, { size: 24 }), "Modules"] }) }), _jsxs(CardBody, { className: "space-y-4", children: [_jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "Les modules LastBrain permettent d'ajouter des fonctionnalit\u00E9s compl\u00E8tes \u00E0 votre application de mani\u00E8re modulaire." }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Modules Disponibles" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-ai](../packages/module-ai/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-ai?label=%40lastbrain%2Fmodule-ai", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_token_ledger, user_prompts"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module ai" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module ai` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-ai/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-auth](../packages/module-auth/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-auth?label=%40lastbrain%2Fmodule-auth", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 publique(s), 4 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": user_profil, user_address, user_notifications"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module auth" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module auth` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-auth/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-billing](../packages/module-billing/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-billing?label=%40lastbrain%2Fmodule-billing", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 3 auth, 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": billing_invoice, billing_invoice_line, billing_invoice_payment, billing_invoice_log, billing_invoice_counter, billing_settings"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module billing" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module billing` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-billing/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-cart](../packages/module-core-cart/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-cart?label=%40lastbrain%2Fmodule-core-cart", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": carts, cart_items"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-cart" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-cart` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-cart/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-commerce](../packages/module-core-commerce/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-commerce?label=%40lastbrain%2Fmodule-core-commerce", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": commerce_events, commerce_stats_daily"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-commerce" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-commerce` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-commerce/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-order](../packages/module-core-order/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-order?label=%40lastbrain%2Fmodule-core-order", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": orders, order_items, order_status_logs"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-order" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-order` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-order/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-payment](../packages/module-core-payment/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-payment?label=%40lastbrain%2Fmodule-core-payment", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": payments"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-payment" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-payment` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-payment/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-core-product](../packages/module-core-product/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-core-product?label=%40lastbrain%2Fmodule-core-product", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 publique(s)"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": products, product_variants, product_stock, product_images, product_seo, product_variant_families, product_variant_options, product_delivery, product_additional_info, product_stats"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module core-product" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module core-product` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-core-product/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-legal](../packages/module-legal/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-legal?label=%40lastbrain%2Fmodule-legal", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 4 publique(s), 2 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": legal_settings, legal_pages"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module legal" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module legal` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-legal/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-recipes](../packages/module-recipes/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-recipes?label=%40lastbrain%2Fmodule-recipes", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 4 auth"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": recipes, recipe_favorites, recipe_comments, recipe_image_queue, recipe_embeddings"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module recipes" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module recipes` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-recipes/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h4", { className: "font-medium mb-2", children: "[module-tasks](../packages/module-tasks/README.md)" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["!", _jsx("a", { href: "https://img.shields.io/npm/v/@lastbrain/module-tasks?label=%40lastbrain%2Fmodule-tasks", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "npm version" })] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Pages" }), ": 2 auth, 1 admin"] }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: [_jsx("strong", { children: "Tables" }), ": tasks, tasks_logs"] }), _jsx("h4", { className: "font-medium mb-2", children: "Installation du module tasks" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module tasks` }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: _jsx("a", { href: "../packages/module-tasks/README.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "\uD83D\uDCD6 Documentation compl\u00E8te \u2192" }) }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "---" }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "Commandes" }), _jsx("h4", { className: "font-medium mb-2", children: "Installer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain add-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h4", { className: "font-medium mb-2", children: "Cr\u00E9er un nouveau module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain create-module nom-du-module` }), _jsx("h4", { className: "font-medium mb-2", children: "G\u00E9n\u00E9rer la documentation des modules" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm generate:module-docs` }), _jsx("h4", { className: "font-medium mb-2", children: "Supprimer un module" }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm lastbrain remove-module nom-du-module` }), _jsx(Snippet, { symbol: "", hideSymbol: true, className: "text-sm mb-2", children: `pnpm build:modules` }), _jsx("h3", { className: "text-lg font-semibold mb-2", children: "D\u00E9veloppement de modules" }), _jsxs("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: ["Pour cr\u00E9er un nouveau module, consultez la", " ", _jsx("a", { href: "./004_CREATE_MODULE.md", className: "text-blue-600 hover:underline", target: "_blank", rel: "noopener noreferrer", children: "documentation de cr\u00E9ation de modules" }), "."] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: "La documentation de chaque module est g\u00E9n\u00E9r\u00E9e automatiquement depuis :" }), _jsxs("div", { className: "space-y-2", children: [_jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le fichier", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "module-name.build.config.ts" }), " ", "pour les pages et APIs"] })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsx("span", { children: "Les fichiers de migration SQL pour les tables" })] }), _jsxs("div", { className: "flex items-start gap-2", children: [_jsx("span", { className: "text-green-600", children: "\u2705" }), _jsxs("span", { children: ["Le README.md est auto-g\u00E9n\u00E9r\u00E9 avec", " ", _jsx("code", { className: "text-sm bg-slate-100 dark:bg-slate-800 px-2 py-1 rounded", children: "pnpm generate:module-docs" })] })] })] })] })] })] }));
247
247
  }
@@ -187,7 +187,7 @@ export function DocPage({ modules = [], defaultContent }) {
187
187
  color: "primary",
188
188
  })),
189
189
  ];
190
- return (_jsx("div", { className: "w-full pt-8 md:pt-12 pb-24 lg:pb-8", children: _jsxs("div", { className: "container mx-auto md:px-4 py-8", children: [_jsx("div", { className: "fixed w-full h-16 left-0 bottom-0 bg-background/20 backdrop-blur-lg z-50 lg:hidden p-2", children: _jsx("div", { className: "flex justify-center", children: _jsx(Button, { isIconOnly: true, variant: "solid", onPress: () => setIsDrawerOpen(true), children: _jsx(Menu, { size: 24 }) }) }) }), _jsx(Drawer, { isOpen: isDrawerOpen, onOpenChange: setIsDrawerOpen, placement: "left", children: _jsxs(DrawerContent, { children: [_jsx(DrawerHeader, { children: _jsx("h2", { className: "text-xl font-semibold", children: "Navigation" }) }), _jsx(DrawerBody, { children: _jsx(NavigationListbox, { navigationItems: navigationItems, selectedModule: selectedModule, scrollToSection: scrollToSection, setSelectedModule: setSelectedModule }) })] }) }), _jsxs("div", { className: "flex gap-4", children: [_jsx("aside", { className: "hidden lg:block w-72 shrink-0 sticky top-18 self-start", children: _jsx(Card, { children: _jsx(CardBody, { children: _jsx(NavigationListbox, { navigationItems: navigationItems, selectedModule: selectedModule, scrollToSection: scrollToSection, setSelectedModule: setSelectedModule }) }) }) }), _jsxs("main", { className: "flex-1 w-full min-w-0 space-y-8", children: [defaultContent ? (_jsx("div", { children: defaultContent })) : (_jsx(DefaultDocumentation, {})), modules.length > 0 && (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsx("h2", { className: "text-2xl font-semibold", children: "Modules disponibles" }) }), _jsxs(CardBody, { children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Voici la liste de tous les modules disponibles dans LastBrain. Les modules actifs sont utilis\u00E9s dans votre application." }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: modules.map((module) => (_jsx(Card, { isPressable: module.available, onPress: () => module.available && scrollToSection(module.id), className: `${module.available
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 && (_jsxs("div", { className: "space-y-6", children: [_jsxs(Card, { id: "section-modules", className: "scroll-mt-32", children: [_jsx(CardHeader, { children: _jsx("h2", { className: "text-2xl font-semibold", children: "Modules disponibles" }) }), _jsxs(CardBody, { children: [_jsx("p", { className: "text-slate-600 dark:text-slate-400 mb-4", children: "Voici la liste de tous les modules disponibles dans LastBrain. Les modules actifs sont utilis\u00E9s dans votre application." }), _jsx("div", { className: "grid grid-cols-1 md:grid-cols-2 gap-4", children: modules.map((module) => (_jsx(Card, { isPressable: module.available, onPress: () => module.available && scrollToSection(module.id), className: `${module.available
191
191
  ? "cursor-pointer hover:shadow-lg"
192
192
  : "opacity-70"} transition-shadow`, children: _jsxs(CardBody, { children: [_jsxs("div", { className: "flex items-start justify-between mb-2", children: [_jsxs("h3", { className: "text-lg font-semibold flex flex-inline items-center gap-2", children: [_jsx(Blocks, { size: 20, className: "shrink-0" }), module.name] }), _jsx(Chip, { size: "sm", color: module.available ? "success" : "warning", variant: "flat", children: module.available ? "Actif" : "Inactif" })] }), _jsx("p", { className: "text-sm text-slate-600 dark:text-slate-400 mb-2", children: module.description }), !module.available && (_jsxs("div", { className: "flex justify-between items-center text-xs text-default-700 mt-2", children: [_jsx("span", { children: "Pour activer : " }), _jsx(Snippet, { hideSymbol: true, color: "primary", children: `pnpm lastbrain add-module ${module.id}` })] }))] }) }, module.id))) })] })] }), modules
193
193
  .filter((m) => m.available)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lastbrain/app",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
4
4
  "description": "Framework modulaire Next.js avec CLI et système de modules",
5
5
  "private": false,
6
6
  "type": "module",
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  export function AdminLayout({ children }: { children: React.ReactNode }) {
4
2
  return <div className="pt-18 px-2 md:px-5">{children}</div>;
5
3
  }
@@ -1,5 +1,3 @@
1
- "use client";
2
-
3
1
  export function AuthLayout({ children }: { children: React.ReactNode }) {
4
2
  return <div className="pt-18 px-2 md:px-5 ">{children}</div>;
5
3
  }
@@ -1,5 +1,17 @@
1
1
  "use client";
2
2
 
3
- export function PublicLayout({ children }: { children: React.ReactNode }) {
4
- return <section className="pt-16 ">{children}</section>;
3
+ import { Footer } from "@lastbrain/ui";
4
+
5
+ interface PublicLayoutProps {
6
+ children: React.ReactNode;
7
+ footerConfig?: any;
8
+ }
9
+
10
+ export function PublicLayout({ children, footerConfig }: PublicLayoutProps) {
11
+ return (
12
+ <>
13
+ <section className="pt-16 min-h-[calc(100vh)]">{children}</section>
14
+ {footerConfig && <Footer config={footerConfig} />}
15
+ </>
16
+ );
5
17
  }
@@ -85,7 +85,7 @@ export async function initApp(options: InitAppOptions) {
85
85
  await createNextStructure(targetDir, force, useHeroUI, withAuth);
86
86
 
87
87
  // 4. Créer les fichiers de configuration
88
- await createConfigFiles(targetDir, force, useHeroUI);
88
+ await createConfigFiles(targetDir, force, useHeroUI, projectName);
89
89
 
90
90
  // 5. Créer le système de proxy storage
91
91
  await createStorageProxy(targetDir, force);
@@ -490,75 +490,38 @@ async function createNextStructure(
490
490
  let layoutContent = "";
491
491
 
492
492
  if (useHeroUI) {
493
- // Layout avec HeroUI
493
+ // Layout avec HeroUI - Server Component
494
494
  layoutContent = `// GENERATED BY LASTBRAIN APP-SHELL
495
-
496
- "use client";
495
+ // Server Component pour permettre le SSR des pages enfants
497
496
 
498
497
  import "../styles/globals.css";
499
- import { HeroUIProvider } from "@heroui/system";
500
-
501
- import { ThemeProvider } from "next-themes";
502
- import { useRouter } from "next/navigation";
503
- import { AppProviders } from "../components/AppProviders";
498
+ import { ClientLayout } from "../components/ClientLayout";
504
499
  import type { PropsWithChildren } from "react";
505
- import { AppHeader } from "../components/AppHeader";
506
500
 
507
501
  export default function RootLayout({ children }: PropsWithChildren<{}>) {
508
- const router = useRouter();
509
-
510
502
  return (
511
503
  <html lang="fr" suppressHydrationWarning>
512
504
  <body className="min-h-screen">
513
- <HeroUIProvider navigate={router.push}>
514
- <ThemeProvider
515
- attribute="class"
516
- defaultTheme="dark"
517
- enableSystem={false}
518
- storageKey="lastbrain-theme"
519
- >
520
- <AppProviders>
521
- <AppHeader />
522
- <div className="min-h-screen text-foreground bg-background">
523
- {children}
524
- </div>
525
- </AppProviders>
526
- </ThemeProvider>
527
- </HeroUIProvider>
505
+ <ClientLayout>{children}</ClientLayout>
528
506
  </body>
529
507
  </html>
530
508
  );
531
509
  }
532
510
  `;
533
511
  } else {
534
- // Layout Tailwind CSS uniquement
512
+ // Layout Tailwind CSS uniquement - Server Component
535
513
  layoutContent = `// GENERATED BY LASTBRAIN APP-SHELL
536
-
537
- "use client";
514
+ // Server Component pour permettre le SSR des pages enfants
538
515
 
539
516
  import "../styles/globals.css";
540
- import { ThemeProvider } from "next-themes";
541
- import { AppProviders } from "../components/AppProviders";
517
+ import { ClientLayout } from "../components/ClientLayout";
542
518
  import type { PropsWithChildren } from "react";
543
- import { AppHeader } from "../components/AppHeader";
544
519
 
545
520
  export default function RootLayout({ children }: PropsWithChildren<{}>) {
546
521
  return (
547
522
  <html lang="fr" suppressHydrationWarning>
548
523
  <body className="min-h-screen">
549
- <ThemeProvider
550
- attribute="class"
551
- defaultTheme="light"
552
- enableSystem={false}
553
- storageKey="lastbrain-theme"
554
- >
555
- <AppProviders>
556
- <AppHeader />
557
- <div className="min-h-screen bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-white">
558
- {children}
559
- </div>
560
- </AppProviders>
561
- </ThemeProvider>
524
+ <ClientLayout>{children}</ClientLayout>
562
525
  </body>
563
526
  </html>
564
527
  );
@@ -593,9 +556,16 @@ export default function RootLayout({ children }: PropsWithChildren<{}>) {
593
556
  const homePageContent = `// GENERATED BY LASTBRAIN APP-SHELL
594
557
 
595
558
  import { SimpleHomePage } from "@lastbrain/app";
559
+ import { Footer } from "@lastbrain/ui";
560
+ import { footerConfig } from "../config/footer";
596
561
 
597
562
  export default function RootPage() {
598
- return <SimpleHomePage showAuth={${withAuth}} />;
563
+ return (
564
+ <>
565
+ <SimpleHomePage showAuth={${withAuth}} />
566
+ <Footer config={footerConfig} />
567
+ </>
568
+ );
599
569
  }
600
570
  `;
601
571
  await fs.writeFile(homePagePath, homePageContent);
@@ -643,6 +613,9 @@ export default function NotFound() {
643
613
  await createRoute(appDir, "auth", "auth", force);
644
614
  await createRoute(appDir, "docs", "public", force);
645
615
 
616
+ // Créer le composant ClientLayout (wrapper client avec providers)
617
+ await createClientLayout(targetDir, force, useHeroUI);
618
+
646
619
  // Créer le composant AppHeader
647
620
  await createAppHeader(targetDir, force);
648
621
 
@@ -653,6 +626,92 @@ export default function NotFound() {
653
626
  await createAppProvidersWrapper(targetDir, force);
654
627
  }
655
628
 
629
+ async function createClientLayout(
630
+ targetDir: string,
631
+ force: boolean,
632
+ useHeroUI: boolean,
633
+ ) {
634
+ const componentsDir = path.join(targetDir, "components");
635
+ await fs.ensureDir(componentsDir);
636
+
637
+ const clientLayoutPath = path.join(componentsDir, "ClientLayout.tsx");
638
+
639
+ if (!fs.existsSync(clientLayoutPath) || force) {
640
+ let clientLayoutContent = "";
641
+
642
+ if (useHeroUI) {
643
+ // ClientLayout avec HeroUI
644
+ clientLayoutContent = `"use client";
645
+
646
+ import { HeroUIProvider } from "@heroui/system";
647
+ import { ThemeProvider } from "next-themes";
648
+ import { useRouter } from "next/navigation";
649
+ import { AppProviders } from "./AppProviders";
650
+ import { AppHeader } from "./AppHeader";
651
+ import type { ReactNode } from "react";
652
+
653
+ export function ClientLayout({ children }: { children: ReactNode }) {
654
+ const router = useRouter();
655
+
656
+ return (
657
+ <HeroUIProvider navigate={router.push}>
658
+ <ThemeProvider
659
+ attribute="class"
660
+ defaultTheme="dark"
661
+ enableSystem={false}
662
+ storageKey="lastbrain-theme"
663
+ >
664
+ <AppProviders>
665
+ <AppHeader />
666
+ <div className="min-h-screen text-foreground bg-background">
667
+ {children}
668
+ </div>
669
+ </AppProviders>
670
+ </ThemeProvider>
671
+ </HeroUIProvider>
672
+ );
673
+ }
674
+ `;
675
+ } else {
676
+ // ClientLayout Tailwind CSS uniquement
677
+ clientLayoutContent = `"use client";
678
+
679
+ import { ThemeProvider } from "next-themes";
680
+ import { AppProviders } from "./AppProviders";
681
+ import { AppHeader } from "./AppHeader";
682
+ import type { ReactNode } from "react";
683
+
684
+ export function ClientLayout({ children }: { children: ReactNode }) {
685
+ return (
686
+ <ThemeProvider
687
+ attribute="class"
688
+ defaultTheme="light"
689
+ enableSystem={false}
690
+ storageKey="lastbrain-theme"
691
+ >
692
+ <AppProviders>
693
+ <AppHeader />
694
+ <div className="min-h-screen bg-slate-50 text-slate-900 dark:bg-slate-950 dark:text-white">
695
+ {children}
696
+ </div>
697
+ </AppProviders>
698
+ </ThemeProvider>
699
+ );
700
+ }
701
+ `;
702
+ }
703
+
704
+ await fs.writeFile(clientLayoutPath, clientLayoutContent);
705
+ console.log(chalk.green("✓ components/ClientLayout.tsx créé"));
706
+ } else {
707
+ console.log(
708
+ chalk.gray(
709
+ " components/ClientLayout.tsx existe déjà (utilisez --force pour écraser)",
710
+ ),
711
+ );
712
+ }
713
+ }
714
+
656
715
  async function createRoute(
657
716
  appDir: string,
658
717
  routeName: string,
@@ -700,12 +759,27 @@ export default function AuthLayout({
700
759
  );
701
760
  }`;
702
761
  } else {
703
- // Layout standard pour les autres routes
762
+ // Layout standard pour les autres routes (ex: docs = public)
704
763
  const layoutComponent =
705
764
  layoutType.charAt(0).toUpperCase() + layoutType.slice(1) + "Layout";
706
- layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
765
+
766
+ if (routeName === "docs") {
767
+ // Layout docs avec footer
768
+ layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
769
+ import { footerConfig } from "../../config/footer";
770
+
771
+ export default function DocsLayout({
772
+ children,
773
+ }: {
774
+ children: React.ReactNode;
775
+ }) {
776
+ return <${layoutComponent} footerConfig={footerConfig}>{children}</${layoutComponent}>;
777
+ }`;
778
+ } else {
779
+ layoutContent = `import { ${layoutComponent} } from "@lastbrain/app";
707
780
 
708
781
  export default ${layoutComponent};`;
782
+ }
709
783
  }
710
784
 
711
785
  await fs.writeFile(layoutPath, layoutContent);
@@ -900,6 +974,7 @@ async function createConfigFiles(
900
974
  targetDir: string,
901
975
  force: boolean,
902
976
  useHeroUI: boolean,
977
+ projectName?: string,
903
978
  ) {
904
979
  console.log(chalk.yellow("\n⚙️ Création des fichiers de configuration..."));
905
980
 
@@ -1174,6 +1249,26 @@ export const menuConfig: MenuConfig = {
1174
1249
  console.log(chalk.green("✓ config/menu.ts créé"));
1175
1250
  }
1176
1251
 
1252
+ // config/footer.ts
1253
+ const footerConfigPath = path.join(configDir, "footer.ts");
1254
+ if (!fs.existsSync(footerConfigPath) || force) {
1255
+ const footerConfig = `// Auto-generated footer configuration
1256
+ // Run "node ../../scripts/generate-footer-config.js ./apps/[your-app]" to regenerate
1257
+ "use client";
1258
+
1259
+ import type { FooterConfig } from "@lastbrain/ui";
1260
+
1261
+ export const footerConfig: FooterConfig = {
1262
+ companyName: "${projectName}",
1263
+ companyDescription: "Application LastBrain",
1264
+ links: [],
1265
+ social: [],
1266
+ };
1267
+ `;
1268
+ await fs.writeFile(footerConfigPath, footerConfig);
1269
+ console.log(chalk.green("✓ config/footer.ts créé"));
1270
+ }
1271
+
1177
1272
  // Créer les hooks
1178
1273
  await createHooksDirectory(targetDir, force);
1179
1274
  }
@@ -1241,7 +1241,6 @@ import { NextRequest, NextResponse } from "next/server";
1241
1241
  * GENERATED FILE - DO NOT EDIT MANUALLY
1242
1242
  * Generated at: ${timestamp}
1243
1243
  * Generated from module storage configurations
1244
- *
1245
1244
  * Buckets configurés:
1246
1245
  ${allBuckets.map((b) => ` * - ${b.name} (${b.public ? "public" : "private"})`).join("\n")}
1247
1246
  */
@@ -1350,6 +1349,60 @@ export async function GET(
1350
1349
  }
1351
1350
  }
1352
1351
 
1352
+ async function generateFooterConfig(moduleConfigs: ModuleBuildConfig[]) {
1353
+ try {
1354
+ // Extraire tous les liens footer des modules
1355
+ const allFooterLinks = moduleConfigs
1356
+ .filter((config) => config.footer && config.footer.length > 0)
1357
+ .flatMap((config) => config.footer!);
1358
+
1359
+ if (allFooterLinks.length === 0) {
1360
+ console.log(
1361
+ "⏭️ No footer links found, skipping footer config generation",
1362
+ );
1363
+ return;
1364
+ }
1365
+
1366
+ // Trier les liens par position et order
1367
+ allFooterLinks.sort((a, b) => {
1368
+ const posOrder = { left: 0, center: 1, right: 2 };
1369
+ const posA = posOrder[a.position || "left"] || 0;
1370
+ const posB = posOrder[b.position || "left"] || 0;
1371
+ if (posA !== posB) return posA - posB;
1372
+ return (a.order || 0) - (b.order || 0);
1373
+ });
1374
+
1375
+ const timestamp = new Date().toISOString();
1376
+ const content = `// Auto-generated footer configuration
1377
+ // Generated from module build configs
1378
+ // Generated at: ${timestamp}
1379
+ "use client";
1380
+
1381
+ import type { FooterConfig } from "@lastbrain/ui";
1382
+
1383
+ export const footerConfig: FooterConfig = {
1384
+ companyName: "LastBrain",
1385
+ companyDescription: "Plateforme de développement rapide d'applications",
1386
+ links: ${JSON.stringify(allFooterLinks, null, 2)},
1387
+ social: [],
1388
+ };
1389
+ `;
1390
+
1391
+ const configDir = path.join(projectRoot, "config");
1392
+ ensureDirectory(configDir);
1393
+
1394
+ const footerPath = path.join(configDir, "footer.ts");
1395
+ fs.writeFileSync(footerPath, content);
1396
+
1397
+ if (isDebugMode) {
1398
+ console.log(`✅ Generated footer config: ${footerPath}`);
1399
+ console.log(` - ${allFooterLinks.length} footer link(s)`);
1400
+ }
1401
+ } catch (error) {
1402
+ console.error("❌ Error generating footer config:", error);
1403
+ }
1404
+ }
1405
+
1353
1406
  export async function runModuleBuild() {
1354
1407
  ensureDirectory(appDirectory);
1355
1408
 
@@ -1431,6 +1484,12 @@ export async function runModuleBuild() {
1431
1484
  }
1432
1485
  await generateStorageProxyApi(moduleConfigs);
1433
1486
 
1487
+ // Générer la configuration footer
1488
+ if (isDebugMode) {
1489
+ console.log("🦶 Generating footer configuration...");
1490
+ }
1491
+ await generateFooterConfig(moduleConfigs);
1492
+
1434
1493
  // Message de succès final
1435
1494
  if (!isDebugMode) {
1436
1495
  console.log("\n✅ Module build completed successfully!");
@@ -1634,7 +1634,9 @@ export function DocUsageCustom() {
1634
1634
  </p>
1635
1635
  <p className="text-sm text-slate-600 dark:text-slate-400 mb-2">
1636
1636
  <strong>Tables</strong>: products, product_variants, product_stock,
1637
- product_images, product_seo
1637
+ product_images, product_seo, product_variant_families,
1638
+ product_variant_options, product_delivery, product_additional_info,
1639
+ product_stats
1638
1640
  </p>
1639
1641
  <h4 className="font-medium mb-2">
1640
1642
  Installation du module core-product
@@ -1653,6 +1655,41 @@ export function DocUsageCustom() {
1653
1655
  </a>
1654
1656
  </p>
1655
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>
1656
1693
  <h4 className="font-medium mb-2">
1657
1694
  [module-recipes](../packages/module-recipes/README.md)
1658
1695
  </h4>
@@ -296,7 +296,7 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
296
296
  ];
297
297
 
298
298
  return (
299
- <div className="w-full pt-8 md:pt-12 pb-24 lg:pb-8">
299
+ <div className="w-full pb-24 lg:pb-8">
300
300
  <div className="container mx-auto md:px-4 py-8">
301
301
  {/* Mobile menu button */}
302
302
  <div className="fixed w-full h-16 left-0 bottom-0 bg-background/20 backdrop-blur-lg z-50 lg:hidden p-2">
@@ -334,8 +334,8 @@ export function DocPage({ modules = [], defaultContent }: DocPageProps) {
334
334
 
335
335
  <div className="flex gap-4">
336
336
  {/* Desktop Navigation sidebar */}
337
- <aside className="hidden lg:block w-72 shrink-0 sticky top-18 self-start">
338
- <Card>
337
+ <aside>
338
+ <Card className="hidden max-h-[calc(100vh-6rem)] overflow-y-auto lg:block w-72 shrink-0 sticky top-18 self-start">
339
339
  <CardBody>
340
340
  <NavigationListbox
341
341
  navigationItems={navigationItems}