Beacon Ember themeFree
Beacon Ember: a vivid analogous palette around hue 101, flat surfaces, sharp corners, compact density, soft contrast. warm. A yellow theme. Radius 0.25rem.
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/beacon-ember.json:root {
--radius: 0.25rem;
--font-sans: "IBM Plex Mono", ui-monospace, SFMono-Regular, monospace;
--font-mono: "Space Mono", ui-monospace, SFMono-Regular, monospace;
--background: oklch(0.986 0.017 96.7);
--foreground: oklch(0.28 0.027 96.7);
--card: oklch(0.998 0.004 96.7);
--card-foreground: oklch(0.28 0.027 96.7);
--popover: oklch(0.998 0.004 96.7);
--popover-foreground: oklch(0.28 0.027 96.7);
--primary: oklch(0.638 0.133 100.9);
--primary-foreground: oklch(0.18 0.02 100.9);
--secondary: oklch(0.952 0.041 96.7);
--secondary-foreground: oklch(0.28 0.027 96.7);
--muted: oklch(0.959 0.024 96.7);
--muted-foreground: oklch(0.5 0.031 96.7);
--accent: oklch(0.947 0.027 8.6);
--accent-foreground: oklch(0.28 0.027 96.7);
--destructive: oklch(0.575 0.21 24.9);
--border: oklch(0.932 0.027 96.7);
--input: oklch(0.913 0.031 96.7);
--ring: oklch(0.648 0.135 100.9);
--chart-1: oklch(0.54 0.114 104);
--chart-2: oklch(0.72 0.19 145.3);
--chart-3: oklch(0.46 0.105 63.4);
--chart-4: oklch(0.62 0.106 195.7);
--chart-5: oklch(0.78 0.133 9.2);
--sidebar: oklch(0.97 0.019 96.7);
--sidebar-foreground: oklch(0.28 0.027 96.7);
--sidebar-primary: oklch(0.638 0.133 100.9);
--sidebar-primary-foreground: oklch(0.18 0.02 100.9);
--sidebar-accent: oklch(0.947 0.027 8.6);
--sidebar-accent-foreground: oklch(0.28 0.027 96.7);
--sidebar-border: oklch(0.932 0.027 96.7);
--sidebar-ring: oklch(0.648 0.135 100.9);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-sm: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-md: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-lg: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xl: 0px 0px 0px 0px oklch(0 0 0 / 0%);
}
.dark {
--background: oklch(0.216 0.021 105.9);
--foreground: oklch(0.93 0.027 105.9);
--card: oklch(0.248 0.017 105.9);
--card-foreground: oklch(0.93 0.027 105.9);
--popover: oklch(0.264 0.017 105.9);
--popover-foreground: oklch(0.93 0.027 105.9);
--primary: oklch(0.544 0.113 100.9);
--primary-foreground: oklch(0.985 0.004 100.9);
--secondary: oklch(0.262 0.051 105.9);
--secondary-foreground: oklch(0.93 0.027 105.9);
--muted: oklch(0.252 0.03 105.9);
--muted-foreground: oklch(0.72 0.031 105.9);
--accent: oklch(0.268 0.055 17.8);
--accent-foreground: oklch(0.93 0.027 105.9);
--destructive: oklch(0.7 0.191 25.8);
--border: oklch(0.288 0.034 105.9);
--input: oklch(0.313 0.038 105.9);
--ring: oklch(0.534 0.111 100.9);
--chart-1: oklch(0.62 0.131 104.8);
--chart-2: oklch(0.8 0.19 154.3);
--chart-3: oklch(0.54 0.134 54.8);
--chart-4: oklch(0.7 0.12 194.2);
--chart-5: oklch(0.86 0.076 17.5);
--sidebar: oklch(0.238 0.023 105.9);
--sidebar-foreground: oklch(0.93 0.027 105.9);
--sidebar-primary: oklch(0.544 0.113 100.9);
--sidebar-primary-foreground: oklch(0.985 0.004 100.9);
--sidebar-accent: oklch(0.268 0.055 17.8);
--sidebar-accent-foreground: oklch(0.93 0.027 105.9);
--sidebar-border: oklch(0.288 0.034 105.9);
--sidebar-ring: oklch(0.534 0.111 100.9);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-sm: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-md: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-lg: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xl: 0px 0px 0px 0px oklch(0 0 0 / 0%);
}
@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.
/* Beacon Ember (beacon-ember) */
@import "tailwindcss";
@custom-variant dark (&:is(.dark *));
:root {
--radius: 0.25rem;
--spacing: 0.225rem;
--font-sans: "IBM Plex Mono", ui-monospace, SFMono-Regular, monospace;
--font-mono: "Space Mono", ui-monospace, SFMono-Regular, monospace;
--background: oklch(0.986 0.017 96.7);
--foreground: oklch(0.28 0.027 96.7);
--card: oklch(0.998 0.004 96.7);
--card-foreground: oklch(0.28 0.027 96.7);
--popover: oklch(0.998 0.004 96.7);
--popover-foreground: oklch(0.28 0.027 96.7);
--primary: oklch(0.638 0.133 100.9);
--primary-foreground: oklch(0.18 0.02 100.9);
--secondary: oklch(0.952 0.041 96.7);
--secondary-foreground: oklch(0.28 0.027 96.7);
--muted: oklch(0.959 0.024 96.7);
--muted-foreground: oklch(0.5 0.031 96.7);
--accent: oklch(0.947 0.027 8.6);
--accent-foreground: oklch(0.28 0.027 96.7);
--destructive: oklch(0.575 0.21 24.9);
--border: oklch(0.932 0.027 96.7);
--input: oklch(0.913 0.031 96.7);
--ring: oklch(0.648 0.135 100.9);
--chart-1: oklch(0.54 0.114 104);
--chart-2: oklch(0.72 0.19 145.3);
--chart-3: oklch(0.46 0.105 63.4);
--chart-4: oklch(0.62 0.106 195.7);
--chart-5: oklch(0.78 0.133 9.2);
--sidebar: oklch(0.97 0.019 96.7);
--sidebar-foreground: oklch(0.28 0.027 96.7);
--sidebar-primary: oklch(0.638 0.133 100.9);
--sidebar-primary-foreground: oklch(0.18 0.02 100.9);
--sidebar-accent: oklch(0.947 0.027 8.6);
--sidebar-accent-foreground: oklch(0.28 0.027 96.7);
--sidebar-border: oklch(0.932 0.027 96.7);
--sidebar-ring: oklch(0.648 0.135 100.9);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-sm: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-md: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-lg: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xl: 0px 0px 0px 0px oklch(0 0 0 / 0%);
}
.dark {
--background: oklch(0.216 0.021 105.9);
--foreground: oklch(0.93 0.027 105.9);
--card: oklch(0.248 0.017 105.9);
--card-foreground: oklch(0.93 0.027 105.9);
--popover: oklch(0.264 0.017 105.9);
--popover-foreground: oklch(0.93 0.027 105.9);
--primary: oklch(0.544 0.113 100.9);
--primary-foreground: oklch(0.985 0.004 100.9);
--secondary: oklch(0.262 0.051 105.9);
--secondary-foreground: oklch(0.93 0.027 105.9);
--muted: oklch(0.252 0.03 105.9);
--muted-foreground: oklch(0.72 0.031 105.9);
--accent: oklch(0.268 0.055 17.8);
--accent-foreground: oklch(0.93 0.027 105.9);
--destructive: oklch(0.7 0.191 25.8);
--border: oklch(0.288 0.034 105.9);
--input: oklch(0.313 0.038 105.9);
--ring: oklch(0.534 0.111 100.9);
--chart-1: oklch(0.62 0.131 104.8);
--chart-2: oklch(0.8 0.19 154.3);
--chart-3: oklch(0.54 0.134 54.8);
--chart-4: oklch(0.7 0.12 194.2);
--chart-5: oklch(0.86 0.076 17.5);
--sidebar: oklch(0.238 0.023 105.9);
--sidebar-foreground: oklch(0.93 0.027 105.9);
--sidebar-primary: oklch(0.544 0.113 100.9);
--sidebar-primary-foreground: oklch(0.985 0.004 100.9);
--sidebar-accent: oklch(0.268 0.055 17.8);
--sidebar-accent-foreground: oklch(0.93 0.027 105.9);
--sidebar-border: oklch(0.288 0.034 105.9);
--sidebar-ring: oklch(0.534 0.111 100.9);
--shadow-2xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xs: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-sm: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-md: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-lg: 0px 0px 0px 0px oklch(0 0 0 / 0%);
--shadow-xl: 0px 0px 0px 0px oklch(0 0 0 / 0%);
}
@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);
--font-mono: var(--font-mono);
--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 | 14.01:1 / 4.5:1 | Pass |
| Text on cards | 14.49:1 / 4.5:1 | Pass |
| Popover text | 14.49:1 / 4.5:1 | Pass |
| Muted text on muted | 5.32:1 / 4.5:1 | Pass |
| Muted text on background | 5.75:1 / 4.5:1 | Pass |
| Primary button text | 5.59:1 / 4.5:1 | Pass |
| Secondary button text | 12.7:1 / 4.5:1 | Pass |
| Accent label | 12.35:1 / 4.5:1 | Pass |
| Sidebar text | 13.38:1 / 4.5:1 | Pass |
| Sidebar active item | 5.59:1 / 4.5:1 | Pass |
| Sidebar hover item | 12.35:1 / 4.5:1 | Pass |
| Primary on background | 3.23:1 / 3:1 | Pass |
| Focus ring on background | 3.11:1 / 3:1 | Pass |
| Destructive on background | 4.68:1 / 4.5:1 | Pass |
| Destructive on cards | 4.84:1 / 4.5:1 | Pass |
| Pair | Ratio | Result |
|---|---|---|
| Text on background | 14.25:1 / 4.5:1 | Pass |
| Text on cards | 13.12:1 / 4.5:1 | Pass |
| Popover text | 12.51:1 / 4.5:1 | Pass |
| Muted text on muted | 6.42:1 / 4.5:1 | Pass |
| Muted text on background | 7.07:1 / 4.5:1 | Pass |
| Primary button text | 4.73:1 / 4.5:1 | Pass |
| Secondary button text | 12.56:1 / 4.5:1 | Pass |
| Accent label | 12.64:1 / 4.5:1 | Pass |
| Sidebar text | 13.48:1 / 4.5:1 | Pass |
| Sidebar active item | 4.73:1 / 4.5:1 | Pass |
| Sidebar hover item | 12.64:1 / 4.5:1 | Pass |
| Primary on background | 3.53:1 / 3:1 | Pass |
| Focus ring on background | 3.39:1 / 3:1 | Pass |
| Destructive on background | 6:1 / 4.5:1 | Pass |
| Destructive on cards | 5.52:1 / 4.5:1 | Pass |
Similar themes
The closest themes by colour, measured in OKLab across the key tokens in light and dark.