| url | https://sqlrooms.org/theming.md |
|---|
SQLRooms uses shadcn's CSS variables approach for theming, providing a flexible and maintainable way to manage color schemes and design tokens across the application.
The application uses ThemeProvider to manage theme state:
<ThemeProvider defaultTheme="dark" storageKey="sqlrooms-ui-theme">
<App />
</ThemeProvider>defaultTheme: Initial theme ("light" or "dark")storageKey: localStorage key for persisting theme preference
You can either use the pre-built ThemeSwitch component or implement one yourself like here:
import {ThemeSwitch} from '@sqlrooms/ui';
function MyNavBarComponent() {
return (
<div>
...
<ThemeSwitch />
</div>
);
}Or with a custom implementation using Button and useTheme:
import {useTheme, Button} from '@sqlrooms/ui';
function ThemeToggle() {
const {theme, setTheme} = useTheme();
return (
<Button
variant="outline"
onClick={() => setTheme(theme === 'dark' ? 'light' : 'dark')}
>
Toggle theme
</Button>
);
}The theming system uses CSS custom properties in HSL format. These variables are defined in the global CSS:
:root {
--background: 0 0% 100%;
--foreground: 222.2 84% 4.9%;
--card: 0 0% 100%;
--card-foreground: 222.2 84% 4.9%;
--popover: 0 0% 100%;
--popover-foreground: 222.2 84% 4.9%;
--primary: 221.2 83.2% 53.3%;
--primary-foreground: 210 40% 98%;
--secondary: 210 40% 96.1%;
--secondary-foreground: 222.2 47.4% 11.2%;
--muted: 210 40% 96.1%;
--muted-foreground: 215.4 16.3% 46.9%;
--accent: 210 40% 96.1%;
--accent-foreground: 222.2 47.4% 11.2%;
--destructive: 0 84.2% 60.2%;
--destructive-foreground: 210 40% 98%;
--border: 214.3 31.8% 91.4%;
--input: 214.3 31.8% 91.4%;
--ring: 221.2 83.2% 53.3%;
--radius: 0.5rem;
--chart-1: 12 76% 61%;
--chart-2: 173 58% 39%;
--chart-3: 197 37% 24%;
--chart-4: 43 74% 66%;
--chart-5: 27 87% 67%;
}
.dark {
--background: 222.2 84% 4.9%;
--foreground: 210 40% 98%;
--card: 222.2 84% 4.9%;
--card-foreground: 210 40% 98%;
--popover: 222.2 84% 4.9%;
--popover-foreground: 210 40% 98%;
--primary: 217.2 91.2% 59.8%;
--primary-foreground: 222.2 47.4% 11.2%;
--secondary: 217.2 32.6% 17.5%;
--secondary-foreground: 210 40% 98%;
--muted: 217.2 32.6% 17.5%;
--muted-foreground: 215 20.2% 65.1%;
--accent: 217.2 32.6% 17.5%;
--accent-foreground: 210 40% 98%;
--destructive: 0 62.8% 30.6%;
--destructive-foreground: 210 40% 98%;
--border: 217.2 32.6% 17.5%;
--input: 217.2 32.6% 17.5%;
--ring: 224.3 76.3% 48%;
--chart-1: 220 70% 50%;
--chart-2: 160 60% 45%;
--chart-3: 30 80% 55%;
--chart-4: 280 65% 60%;
--chart-5: 340 75% 55%;
}-
Base Colors
--background/--foreground: Main background and text colors--card/--card-foreground: Card component colors--popover/--popover-foreground: Popover/dropdown colors
-
Semantic Colors
--primary/--primary-foreground: Primary action colors--secondary/--secondary-foreground: Secondary action colors--muted/--muted-foreground: Subdued UI elements--accent/--accent-foreground: Emphasis and highlights--destructive/--destructive-foreground: Error and deletion actions
-
UI Elements
--border: Border colors--input: Form input borders--ring: Focus ring color--radius: Border radius for components
-
Chart Colors
--chart-1through--chart-5: Data visualization colors
To use these variables in your components:
.my-component {
background-color: hsl(var(--background));
color: hsl(var(--foreground));
border: 1px solid hsl(var(--border));
border-radius: var(--radius);
}The theme variables are mapped to Tailwind's color system, allowing you to use them directly in className props:
import { Button, Input } from '@sqlrooms/ui';
// Basic usage
<div className="bg-background text-foreground">
<Button className="bg-primary text-primary-foreground">
Click me
</Button>
</div>
// With hover states
<Button
variant="secondary"
className="hover:bg-secondary/90 text-secondary-foreground"
>
Hover me
</Button>
// With opacity modifiers
<div className="bg-muted/50 text-muted-foreground">
Semi-transparent background
</div>
// Border and ring utilities
<Input className="focus:ring-2 ring-ring" />
// Destructive actions
<Button
variant="destructive"
className="hover:bg-destructive/90"
>
Delete
</Button>These class names automatically adapt to the current theme, switching between light and dark mode values as appropriate.
You can explicitly specify different styles for light and dark modes using Tailwind's dark: modifier:
import { Button } from '@sqlrooms/ui';
// Basic dark mode override
<div className="bg-white dark:bg-slate-950">
Light and dark specific background
</div>
// Combining with theme variables
<div className="bg-background text-foreground">
<div className="bg-card dark:bg-card/90 dark:text-card-foreground/90">
Card with dark mode opacity
</div>
</div>
// Complex component example
<Button
variant="primary"
className="
hover:bg-primary/90
dark:bg-primary/80
dark:text-primary-foreground/90
dark:hover:bg-primary/70
"
>
Adaptive Button
</Button>
// Multiple dark mode modifiers
<div className="
bg-background
text-foreground/80 dark:text-foreground/70
border-border dark:border-border/50
shadow-md dark:shadow-xl
">
Complex Container
</div>Note: The dark: modifier works automatically with our theme system - it will apply when the theme is set to "dark" through the ThemeProvider.
To create or modify themes:
- Visit the shadcn theme generator
- Customize colors interactively
- Copy the generated CSS
- Update your global CSS file with the new variables
For detailed API documentation, refer to: