Beacon Docs

Themes

Beacon ships with 7 built-in themes plus an automatic day/night switching mode. Themes are applied via CSS custom properties, making it easy to create your own.


Changing the theme

From the sidebar

  1. Click the palette icon at the bottom of the sidebar (below the gear icon)
  2. A dropdown appears showing all available themes with color preview dots
  3. Click a theme name to apply it immediately
  4. The selection is saved to localStorage and persists across reloads

From the configuration

Set the theme option:

  • Add-on: Configuration tab > theme: "midnight"
  • Docker: Environment variable in the container config
  • Development: VITE_THEME=midnight in .env

The theme selector in the sidebar overrides the configuration value (since it saves to localStorage).


All 7 themes

1. Skylight (default light theme)

A warm, clean light theme with soft pastels. Designed for well-lit rooms and daytime use.

TokenColorHex
BackgroundWarm off-white#faf9f6
SurfaceWhite#ffffff
TextNear black#1a1a1a
Text secondaryGray#6b7280
Grid linesLight gray#e5e5e5
AccentBlue#3b82f6
HeaderWhite#ffffff
Today highlightBlue tintrgba(59, 130, 246, 0.04)

Event colors: Soft blue, soft green, soft purple, soft orange, soft pink, soft teal


2. Midnight (default dark theme)

A deep navy dark theme with warm amber accents. The recommended theme for wall-mounted displays, especially in the evening.

TokenColorHex
BackgroundDeep navy#0f172a
SurfaceDark slate#1e293b
TextNear white#f8fafc
Text secondarySlate gray#94a3b8
Grid linesDark slate#334155
AccentAmber/Gold#f59e0b
HeaderDark slate#1e293b
Today highlightAmber tintrgba(245, 158, 11, 0.06)

Event colors: Bright blue, bright green, bright purple, bright orange, bright pink, bright teal


3. Nord Ice

Inspired by the Nord color palette. A cool-toned light theme with frost and aurora accents.

TokenColorHex
BackgroundSnow storm#ECEFF4
SurfaceLighter snow#E5E9F0
TextPolar night#2E3440
Text secondaryDark gray#4C566A
Grid linesFrost#D8DEE9
AccentFrost blue#5E81AC
HeaderLighter snow#E5E9F0
Today highlightBlue tintrgba(94, 129, 172, 0.08)

Event colors: Frost blue, Aurora green, Aurora purple, Aurora orange, Aurora red, Frost cyan


4. Dracula

Based on the popular Dracula theme. A purple-accented dark theme with vibrant event colors.

TokenColorHex
BackgroundDark gray#282A36
SurfaceMedium gray#44475A
TextWhite#F8F8F2
Text secondaryBlue-gray#6272A4
Grid linesMedium gray#44475A
AccentPurple#BD93F9
HeaderMedium gray#44475A
Today highlightPurple tintrgba(189, 147, 249, 0.08)

Event colors: Cyan, Green, Purple, Orange, Pink, Yellow


5. Monokai

Inspired by the Monokai color scheme. A warm dark theme with a green accent.

TokenColorHex
BackgroundDark olive#272822
SurfaceMedium olive#3E3D32
TextWhite#F8F8F2
Text secondaryOlive gray#75715E
Grid linesMedium olive#3E3D32
AccentGreen#A6E22E
HeaderMedium olive#3E3D32
Today highlightGreen tintrgba(166, 226, 46, 0.06)

Event colors: Blue, Green, Purple, Orange, Pink/Magenta, Yellow


6. Rose

A soft, warm light theme with pink and rose tones. Ideal for a feminine or playful aesthetic.

TokenColorHex
BackgroundPale rose#fff1f2
SurfaceWhite#ffffff
TextDark brown#4a2c2a
Text secondaryMuted brown#9b7a78
Grid linesLight rose#fce7e8
AccentRose red#e11d48
HeaderWhite#ffffff
Today highlightRose tintrgba(225, 29, 72, 0.05)

Event colors: Rose, Lavender, Peach, Pink, Sky, Lime


7. Forest

An earthy, nature-inspired light theme with warm greens and natural tones.

TokenColorHex
BackgroundBeige#f5f5dc
SurfaceWarm white#fefdf5
TextDark olive#3d3929
Text secondaryMuted olive#7c7560
Grid linesSand#e8e4cc
AccentForest green#5f7c47
HeaderWarm white#fefdf5
Today highlightGreen tintrgba(95, 124, 71, 0.06)

Event colors: Sage, Olive/gold, Terracotta, Moss, Wheat, Muted teal


Auto dark mode

Select Auto (time) in the theme selector to let Beacon switch themes automatically based on time of day.

Time RangeTheme Used
6:00 AM - 6:59 PMSkylight (light)
7:00 PM - 5:59 AMMidnight (dark)

How it works

  1. On load, Beacon checks the current hour
  2. If between 6 AM and 7 PM, the Skylight theme is applied
  3. Otherwise, the Midnight theme is applied
  4. A timer re-evaluates every 60 seconds, so the switch happens automatically at the threshold hours
  5. The data-theme attribute on <html> is set to light or dark based on the background color luminance

Customizing the dark theme

The dark theme used by auto mode defaults to Midnight. The auto dark theme ID is stored in localStorage under beacon-auto-dark-theme. You can change it by setting that key to any theme ID (e.g., dracula, monokai).


Creating custom themes (developer guide)

Theme structure

Each theme is a TypeScript object implementing the Theme interface:

interface Theme {
  id: string;
  name: string;
  colors: {
    background: string;    // Main background color
    surface: string;       // Card/panel background
    text: string;          // Primary text color
    textSecondary: string; // Secondary/muted text
    gridLines: string;     // Calendar grid lines, borders
    accent: string;        // Primary accent (buttons, highlights)
    headerBg: string;      // Header and sidebar background
    todayHighlight: string; // Today column background tint
    shadow: string;        // Box shadow for cards
  };
  eventColors: string[];   // 6 colors for calendar events
  fonts: {
    display: string;       // Large text (clock, headings)
    body: string;          // Body text
    mono: string;          // Monospace text
  };
}

Step 1: Create the theme file

Create a new file at src/styles/themes/mytheme.ts:

import type { Theme } from './index';

export const mytheme: Theme = {
  id: 'mytheme',
  name: 'My Theme',
  colors: {
    background: '#1a1a2e',
    surface: '#16213e',
    text: '#eaeaea',
    textSecondary: '#a0a0b0',
    gridLines: '#2a2a4e',
    accent: '#e94560',
    headerBg: '#16213e',
    todayHighlight: 'rgba(233, 69, 96, 0.06)',
    shadow: '0 1px 3px rgba(0, 0, 0, 0.3)',
  },
  eventColors: ['#4cc9f0', '#7209b7', '#f72585', '#4361ee', '#4895ef', '#560bad'],
  fonts: {
    display: "'Plus Jakarta Sans', system-ui, -apple-system, sans-serif",
    body: "'Inter', system-ui, -apple-system, sans-serif",
    mono: "'JetBrains Mono', 'SF Mono', 'Fira Code', monospace",
  },
};

Step 2: Register the theme

Edit src/styles/themes/index.ts:

  1. Add the export: export { mytheme } from './mytheme';
  2. Add the import: import { mytheme } from './mytheme';
  3. Add it to the themes array: export const themes: Theme[] = [..., mytheme];

Step 3: Test

Run npm run dev and select your theme from the palette dropdown. Check:

  • Text readability from 6 feet away
  • Event color contrast against the background
  • The theme in both bright and dim lighting conditions

CSS custom properties reference

These CSS custom properties are set on :root by the theme system and used throughout all stylesheets:

PropertyMaps ToDescription
--bg-primarycolors.backgroundMain page background
--bg-surfacecolors.surfaceCard and panel backgrounds
--bg-headercolors.headerBgHeader bar background
--bg-sidebarcolors.headerBgSidebar background
--bg-todaycolors.todayHighlightToday column tint
--bordercolors.gridLinesPrimary border color
--border-subtlecolors.gridLinesSubtle border color
--text-primarycolors.textPrimary text color
--text-secondarycolors.textSecondarySecondary/muted text
--grid-linescolors.gridLinesCalendar grid line color
--accentcolors.accentAccent color for buttons, links
--shadowcolors.shadowBox shadow for elevated elements
--event-1 through --event-6eventColors[0-5]Calendar event colors
--font-displayfonts.displayDisplay/heading font family
--font-bodyfonts.bodyBody text font family
--font-monofonts.monoMonospace font family

data-theme attribute

The data-theme attribute on <html> is automatically set to light or dark based on the perceived brightness of the background color. This allows CSS to use [data-theme="dark"] selectors for theme-specific styles that cannot be expressed through custom properties alone.


Tips for good themes

  • Avoid pure black (#000000) backgrounds. They create harsh contrast and look like holes on OLED displays.
  • Avoid pure white (#ffffff) text on dark backgrounds. Use an off-white like #f0f0f0 for a softer look.
  • Keep accent usage minimal. The accent should highlight the current time, active day, and primary actions.
  • Test in dim lighting. Wall displays are often viewed in dimly lit rooms.
  • Ensure event color contrast. All 6 event colors must be distinguishable against both the background and the calendar grid.
  • Use the same font stack. The default fonts (Plus Jakarta Sans, Inter, JetBrains Mono) work well at all sizes. Only change fonts if you have a specific reason.

Was this page helpful?

Give Feedback