Beryl Outline themeFree
Beryl Outline: a balanced mono palette around hue 165, bordered surfaces, none corners, comfortable density, soft contrast. minimal, editorial. A emerald theme. Radius 0rem.
Live preview
Install
The CLI writes these variables into your global stylesheet. Every component reads them, so the whole app changes at once.
npx shadcn@latest add https://ui.tealmac.com/r/themes/basic-fog.json:root {
--radius: 0rem;
--font-sans: "Space Grotesk", ui-sans-serif, system-ui, sans-serif;
--background: oklch(0.966 0.004 165.5);
--foreground: oklch(0.28 0.007 165.5);
--card: oklch(0.98 0.004 165.5);
--card-foreground: oklch(0.28 0.007 165.5);
--popover: oklch(0.98 0.004 165.5);
--popover-foreground: oklch(0.28 0.007 165.5);
--primary: oklch(0.609 0.128 165.2);
--primary-foreground: oklch(0.18 0.02 165.2);
--secondary: oklch(0.931 0.011 165.5);
--secondary-foreground: oklch(0.28 0.007 165.5);
--muted: oklch(0.939 0.006 165.5);
--muted-foreground: oklch(0.5 0.008 165.5);
--accent: oklch(0.927 0.025 185.5);
--accent-foreground: oklch(0.28 0.007 165.5);
--destructive: oklch(0.56 0.21 27.7);
--border: oklch(0.87 0.007 165.5);
--input: oklch(0.836 0.008 165.5);
--ring: oklch(0.619 0.13 165.2);
--chart-1: oklch(0.54 0.113 165.3);
--chart-2: oklch(0.72 0.124 190.5);
--chart-3: oklch(0.46 0.132 133.9);
--chart-4: oklch(0.62 0.121 228.3);
--chart-5: oklch(0.78 0.14 102.4);
--sidebar: oklch(0.95 0.005 165.5);
--sidebar-foreground: oklch(0.28 0.007 165.5);
--sidebar-primary: oklch(0.609 0.128 165.2);
--sidebar-primary-foreground: oklch(0.18 0.02 165.2);
--sidebar-accent: oklch(0.927 0.025 185.5);
--sidebar-accent-foreground: oklch(0.28 0.007 165.5);
--sidebar-border: oklch(0.87 0.007 165.5);
--sidebar-ring: oklch(0.619 0.13 165.2);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 1px 0px 0px oklch(0.25 0.03 165.2 / 6%);
--shadow-sm: 0px 1px 2px 0px oklch(0.25 0.03 165.2 / 6%);
--shadow-md: 0px 2px 4px 0px oklch(0.25 0.03 165.2 / 8%);
--shadow-lg: 0px 4px 8px 0px oklch(0.25 0.03 165.2 / 10%);
--shadow-xl: 0px 8px 16px 0px oklch(0.25 0.03 165.2 / 12%);
}
.dark {
--background: oklch(0.216 0.006 169.2);
--foreground: oklch(0.93 0.007 169.2);
--card: oklch(0.248 0.004 169.2);
--card-foreground: oklch(0.93 0.007 169.2);
--popover: oklch(0.264 0.004 169.2);
--popover-foreground: oklch(0.93 0.007 169.2);
--primary: oklch(0.531 0.111 165.2);
--primary-foreground: oklch(0.985 0.004 165.2);
--secondary: oklch(0.262 0.013 169.2);
--secondary-foreground: oklch(0.93 0.007 169.2);
--muted: oklch(0.252 0.008 169.2);
--muted-foreground: oklch(0.72 0.008 169.2);
--accent: oklch(0.268 0.025 189.2);
--accent-foreground: oklch(0.93 0.007 169.2);
--destructive: oklch(0.7 0.192 31);
--border: oklch(0.344 0.009 169.2);
--input: oklch(0.389 0.01 169.2);
--ring: oklch(0.521 0.109 165.2);
--chart-1: oklch(0.62 0.128 166.7);
--chart-2: oklch(0.8 0.136 197);
--chart-3: oklch(0.54 0.14 137.2);
--chart-4: oklch(0.7 0.137 228);
--chart-5: oklch(0.86 0.14 110.3);
--sidebar: oklch(0.238 0.006 169.2);
--sidebar-foreground: oklch(0.93 0.007 169.2);
--sidebar-primary: oklch(0.531 0.111 165.2);
--sidebar-primary-foreground: oklch(0.985 0.004 165.2);
--sidebar-accent: oklch(0.268 0.025 189.2);
--sidebar-accent-foreground: oklch(0.93 0.007 169.2);
--sidebar-border: oklch(0.344 0.009 169.2);
--sidebar-ring: oklch(0.521 0.109 165.2);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 1px 0px 0px oklch(0 0 0 / 18%);
--shadow-sm: 0px 1px 2px 0px oklch(0 0 0 / 18%);
--shadow-md: 0px 2px 4px 0px oklch(0 0 0 / 24%);
--shadow-lg: 0px 4px 8px 0px oklch(0 0 0 / 30%);
--shadow-xl: 0px 8px 16px 0px oklch(0 0 0 / 36%);
}
@theme inline {
--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
}
Export the tokens
The same theme as Tailwind v4 CSS, plain CSS variables, SCSS, JavaScript, TypeScript, DTCG design tokens, Figma variables and starter files for Swift, Android, Jetpack Compose and Flutter.
/* Beryl Outline (basic-fog) */
@import "tailwindcss";
@custom-variant dark (&:is(.dark *));
:root {
--radius: 0rem;
--spacing: 0.275rem;
--font-sans: "Space Grotesk", ui-sans-serif, system-ui, sans-serif;
--background: oklch(0.966 0.004 165.5);
--foreground: oklch(0.28 0.007 165.5);
--card: oklch(0.98 0.004 165.5);
--card-foreground: oklch(0.28 0.007 165.5);
--popover: oklch(0.98 0.004 165.5);
--popover-foreground: oklch(0.28 0.007 165.5);
--primary: oklch(0.609 0.128 165.2);
--primary-foreground: oklch(0.18 0.02 165.2);
--secondary: oklch(0.931 0.011 165.5);
--secondary-foreground: oklch(0.28 0.007 165.5);
--muted: oklch(0.939 0.006 165.5);
--muted-foreground: oklch(0.5 0.008 165.5);
--accent: oklch(0.927 0.025 185.5);
--accent-foreground: oklch(0.28 0.007 165.5);
--destructive: oklch(0.56 0.21 27.7);
--border: oklch(0.87 0.007 165.5);
--input: oklch(0.836 0.008 165.5);
--ring: oklch(0.619 0.13 165.2);
--chart-1: oklch(0.54 0.113 165.3);
--chart-2: oklch(0.72 0.124 190.5);
--chart-3: oklch(0.46 0.132 133.9);
--chart-4: oklch(0.62 0.121 228.3);
--chart-5: oklch(0.78 0.14 102.4);
--sidebar: oklch(0.95 0.005 165.5);
--sidebar-foreground: oklch(0.28 0.007 165.5);
--sidebar-primary: oklch(0.609 0.128 165.2);
--sidebar-primary-foreground: oklch(0.18 0.02 165.2);
--sidebar-accent: oklch(0.927 0.025 185.5);
--sidebar-accent-foreground: oklch(0.28 0.007 165.5);
--sidebar-border: oklch(0.87 0.007 165.5);
--sidebar-ring: oklch(0.619 0.13 165.2);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 1px 0px 0px oklch(0.25 0.03 165.2 / 6%);
--shadow-sm: 0px 1px 2px 0px oklch(0.25 0.03 165.2 / 6%);
--shadow-md: 0px 2px 4px 0px oklch(0.25 0.03 165.2 / 8%);
--shadow-lg: 0px 4px 8px 0px oklch(0.25 0.03 165.2 / 10%);
--shadow-xl: 0px 8px 16px 0px oklch(0.25 0.03 165.2 / 12%);
}
.dark {
--background: oklch(0.216 0.006 169.2);
--foreground: oklch(0.93 0.007 169.2);
--card: oklch(0.248 0.004 169.2);
--card-foreground: oklch(0.93 0.007 169.2);
--popover: oklch(0.264 0.004 169.2);
--popover-foreground: oklch(0.93 0.007 169.2);
--primary: oklch(0.531 0.111 165.2);
--primary-foreground: oklch(0.985 0.004 165.2);
--secondary: oklch(0.262 0.013 169.2);
--secondary-foreground: oklch(0.93 0.007 169.2);
--muted: oklch(0.252 0.008 169.2);
--muted-foreground: oklch(0.72 0.008 169.2);
--accent: oklch(0.268 0.025 189.2);
--accent-foreground: oklch(0.93 0.007 169.2);
--destructive: oklch(0.7 0.192 31);
--border: oklch(0.344 0.009 169.2);
--input: oklch(0.389 0.01 169.2);
--ring: oklch(0.521 0.109 165.2);
--chart-1: oklch(0.62 0.128 166.7);
--chart-2: oklch(0.8 0.136 197);
--chart-3: oklch(0.54 0.14 137.2);
--chart-4: oklch(0.7 0.137 228);
--chart-5: oklch(0.86 0.14 110.3);
--sidebar: oklch(0.238 0.006 169.2);
--sidebar-foreground: oklch(0.93 0.007 169.2);
--sidebar-primary: oklch(0.531 0.111 165.2);
--sidebar-primary-foreground: oklch(0.985 0.004 165.2);
--sidebar-accent: oklch(0.268 0.025 189.2);
--sidebar-accent-foreground: oklch(0.93 0.007 169.2);
--sidebar-border: oklch(0.344 0.009 169.2);
--sidebar-ring: oklch(0.521 0.109 165.2);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 1px 0px 0px oklch(0 0 0 / 18%);
--shadow-sm: 0px 1px 2px 0px oklch(0 0 0 / 18%);
--shadow-md: 0px 2px 4px 0px oklch(0 0 0 / 24%);
--shadow-lg: 0px 4px 8px 0px oklch(0 0 0 / 30%);
--shadow-xl: 0px 8px 16px 0px oklch(0 0 0 / 36%);
}
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--color-card: var(--card);
--color-card-foreground: var(--card-foreground);
--color-popover: var(--popover);
--color-popover-foreground: var(--popover-foreground);
--color-primary: var(--primary);
--color-primary-foreground: var(--primary-foreground);
--color-secondary: var(--secondary);
--color-secondary-foreground: var(--secondary-foreground);
--color-muted: var(--muted);
--color-muted-foreground: var(--muted-foreground);
--color-accent: var(--accent);
--color-accent-foreground: var(--accent-foreground);
--color-destructive: var(--destructive);
--color-border: var(--border);
--color-input: var(--input);
--color-ring: var(--ring);
--color-chart-1: var(--chart-1);
--color-chart-2: var(--chart-2);
--color-chart-3: var(--chart-3);
--color-chart-4: var(--chart-4);
--color-chart-5: var(--chart-5);
--color-sidebar: var(--sidebar);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-ring: var(--sidebar-ring);
--radius-sm: calc(var(--radius) - 4px);
--radius-md: calc(var(--radius) - 2px);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) + 4px);
--font-sans: var(--font-sans);
--shadow-2xs: var(--shadow-2xs);
--shadow-xs: var(--shadow-xs);
--shadow-sm: var(--shadow-sm);
--shadow-md: var(--shadow-md);
--shadow-lg: var(--shadow-lg);
--shadow-xl: var(--shadow-xl);
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
}
Contrast report
This theme passes every theme gate: text contrast (WCAG 2.2 AA), chart colours that stay apart, and matching light and dark modes.
| Pair | Ratio | Result |
|---|---|---|
| Text on background | 13.2:1 / 4.5:1 | Pass |
| Text on cards | 13.76:1 / 4.5:1 | Pass |
| Popover text | 13.76:1 / 4.5:1 | Pass |
| Muted text on muted | 5.01:1 / 4.5:1 | Pass |
| Muted text on background | 5.42:1 / 4.5:1 | Pass |
| Primary button text | 5.24:1 / 4.5:1 | Pass |
| Secondary button text | 11.93:1 / 4.5:1 | Pass |
| Accent label | 11.84:1 / 4.5:1 | Pass |
| Sidebar text | 12.6:1 / 4.5:1 | Pass |
| Sidebar active item | 5.24:1 / 4.5:1 | Pass |
| Sidebar hover item | 11.84:1 / 4.5:1 | Pass |
| Primary on background | 3.24:1 / 3:1 | Pass |
| Focus ring on background | 3.11:1 / 3:1 | Pass |
| Destructive on background | 4.7:1 / 4.5:1 | Pass |
| Destructive on cards | 4.89:1 / 4.5:1 | Pass |
| Pair | Ratio | Result |
|---|---|---|
| Text on background | 14.23:1 / 4.5:1 | Pass |
| Text on cards | 13.11:1 / 4.5:1 | Pass |
| Popover text | 12.5:1 / 4.5:1 | Pass |
| Muted text on muted | 6.42:1 / 4.5:1 | Pass |
| Muted text on background | 7.06:1 / 4.5:1 | Pass |
| Primary button text | 4.76:1 / 4.5:1 | Pass |
| Secondary button text | 12.54:1 / 4.5:1 | Pass |
| Accent label | 12.25:1 / 4.5:1 | Pass |
| Sidebar text | 13.47:1 / 4.5:1 | Pass |
| Sidebar active item | 4.76:1 / 4.5:1 | Pass |
| Sidebar hover item | 12.25:1 / 4.5:1 | Pass |
| Primary on background | 3.52:1 / 3:1 | Pass |
| Focus ring on background | 3.37:1 / 3:1 | Pass |
| Destructive on background | 6.01:1 / 4.5:1 | Pass |
| Destructive on cards | 5.54:1 / 4.5:1 | Pass |
Similar themes
The closest themes by colour, measured in OKLab across the key tokens in light and dark.