ScaleRocket/Web

Composants UI

Bibliothèque de composants partagée avec Button, Card, Input, Toast et support de thèmes.

Vue d'ensemble

ScaleRocket fournit une bibliothèque de composants partagée dans packages/ui/. Construite sur Tailwind CSS et inspirée de shadcn/ui, ces composants sont utilisés dans les trois applications.

Composants disponibles

Button

import { Button } from "@saas/ui";

<Button variant="default">Primary</Button>
<Button variant="outline">Outline</Button>
<Button variant="ghost">Ghost</Button>
<Button variant="destructive">Delete</Button>
<Button variant="link">Link style</Button>
<Button size="sm">Small</Button>
<Button size="lg">Large</Button>
<Button disabled>Disabled</Button>
<Button loading>Saving...</Button>

Props :

PropTypeDéfautDescription
variant"default" | "outline" | "ghost" | "destructive" | "link""default"Style visuel
size"sm" | "default" | "lg""default"Taille du bouton
loadingbooleanfalseAffiche un spinner et désactive le bouton
disabledbooleanfalseDésactive l'interaction

Card

import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "@saas/ui";

<Card>
  <CardHeader>
    <CardTitle>Plan Name</CardTitle>
    <CardDescription>Monthly subscription</CardDescription>
  </CardHeader>
  <CardContent>
    <p>$29/month</p>
  </CardContent>
  <CardFooter>
    <Button>Subscribe</Button>
  </CardFooter>
</Card>

Input

import { Input } from "@saas/ui";

<Input type="email" placeholder="you@example.com" />
<Input type="password" placeholder="Password" />
<Input disabled value="Read only" />

Props : Étend les props natives de <input> plus :

PropTypeDescription
errorstringAffiche un message d'erreur sous le champ
labelstringTexte du label au-dessus du champ

Toast

import { useToast } from "@saas/ui";

const { toast } = useToast();

// Success
toast({ title: "Saved!", description: "Your changes have been saved." });

// Error
toast({ title: "Error", description: "Something went wrong.", variant: "destructive" });

Encapsulez votre application avec le provider Toaster :

import { Toaster } from "@saas/ui";

function App() {
  return (
    <>
      <YourApp />
      <Toaster />
    </>
  );
}

ThemeProvider

Fournit le support du mode clair/sombre dans toute l'application :

import { ThemeProvider } from "@saas/ui";

<ThemeProvider defaultTheme="system" storageKey="scalerocket-theme">
  <App />
</ThemeProvider>

Props :

PropTypeDéfautDescription
defaultTheme"light" | "dark" | "system""system"Thème initial
storageKeystring"theme"Clé localStorage pour la persistance

ThemeToggle

Un bouton déroulant pour basculer entre les thèmes clair, sombre et système :

import { ThemeToggle } from "@saas/ui";

<ThemeToggle />

Utilisation dans les applications

Importez les composants depuis @saas/ui dans n'importe quelle application :

// apps/app/src/pages/dashboard.tsx
import { Button, Card, CardContent } from "@saas/ui";

Le package est lié via le workspace pnpm -- aucune publication nécessaire.

Variantes et personnalisation

Les composants utilisent des classes Tailwind CSS et des variables CSS pour la thématisation. Personnalisez le système de design en modifiant :

/* packages/ui/src/globals.css */
:root {
  --background: 0 0% 100%;
  --foreground: 0 0% 3.9%;
  --primary: 0 0% 9%;
  --primary-foreground: 0 0% 98%;
  --muted: 0 0% 96.1%;
  --muted-foreground: 0 0% 45.1%;
  --destructive: 0 84.2% 60.2%;
  --border: 0 0% 89.8%;
  --radius: 0.5rem;
}

.dark {
  --background: 0 0% 3.9%;
  --foreground: 0 0% 98%;
  --primary: 0 0% 98%;
  --primary-foreground: 0 0% 9%;
  /* ... */
}

Ajouter de nouveaux composants

  1. Créez le composant dans packages/ui/src/components/ :
// packages/ui/src/components/badge.tsx
import { cn } from "../lib/utils";

interface BadgeProps {
  variant?: "default" | "success" | "warning" | "error";
  children: React.ReactNode;
}

export function Badge({ variant = "default", children }: BadgeProps) {
  return (
    <span
      className={cn(
        "inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-medium",
        variant === "default" && "bg-primary/10 text-primary",
        variant === "success" && "bg-green-100 text-green-800",
        variant === "warning" && "bg-yellow-100 text-yellow-800",
        variant === "error" && "bg-red-100 text-red-800"
      )}
    >
      {children}
    </span>
  );
}
  1. Exportez-le depuis packages/ui/src/index.ts :
export { Badge } from "./components/badge";
  1. Utilisez-le dans n'importe quelle application :
import { Badge } from "@saas/ui";

<Badge variant="success">Active</Badge>

Mode sombre

Le mode sombre fonctionne automatiquement avec le ThemeProvider. Tous les composants respectent le thème actuel via les variables CSS.

Pour styliser conditionnellement en mode sombre avec Tailwind :

<div className="bg-white dark:bg-gray-900">
  <p className="text-gray-900 dark:text-gray-100">Adapts to theme</p>
</div>

Accédez au thème actuel de manière programmatique :

import { useTheme } from "@saas/ui";

const { theme, setTheme } = useTheme();
// theme: "light" | "dark" | "system"

Fini ? Marquez cette page comme terminée.

On this page