Typography Scale
Typography is the driving visual force of the mirror. We use Inter. Display headings use very thin weights to minimize light dispersion, while smaller labels use bold weights for legibility behind the reflective glass.
08:32
<h1 class="display-xl">08:32</h1>
<div class="display-lg">-14°C</div>
<div class="headline-md">Stockholm</div>
<div class="body-base">Main content paragraph or secondary temperature description.</div>
<div class="body-sm">Details, metadata labels, or smaller paragraph blocks.</div>
Name Day
<h2 class="module-header">Name Day</h2>
Color Palette
The palette is strictly functional, optimized for light transmission through two-way glass. Every color has a defined purpose.
Color Utility Classes
Colors have specific purposes to help prioritize readability against ambient lighting.
<span class="text-primary">Primary Light</span>
<span class="text-secondary">Standard gray label</span>
<span class="text-dimmed">Dimmed Charcoal</span>
<span class="text-error">Critical Error alert</span>
Iconography
The system uses Lucide Icons as its standard, vector-based line-art iconography. All icons inherit their parent element's text color and use a thin outline (default 1.5px stroke weight).
<!-- Monochromatic line-art icons -->
<i data-lucide="sun"></i>
<i data-lucide="settings" class="text-secondary"></i>
<i data-lucide="alert-triangle" class="text-error glow"></i>
Containers & Depth
In a physical mirror, drop shadows are useless. Instead, we use semi-opaque dark backdrops to isolate content and subtle atmospheric glow filters to emphasize elements.
Demo Module
<div data-module="my-custom-module">
<h2 class="module-header">Demo Module</h2>
<div class="body-sm text-primary">Content goes here.</div>
</div>
<div class="glow display-xl">GLOWING TEXT</div>
<!-- Add class to body or container during critical alerts -->
<body class="backdrop-blur-active">
<div data-module="weather">…</div> <!-- blurred -->
<div class="alert-modal">…</div> <!-- stays sharp -->
</body>
UI Components
Pre-designed structural blocks for building clean, consistent mirror layouts.
<div class="widget-header">
<h2 class="module-header">Weather Forecast</h2>
</div>
<div style="display: flex; align-items: baseline;">
<span class="display-xl">08:32</span>
<span class="headline-md text-dimmed">:45</span>
</div>
<div data-module="notification">
<div class="body-sm text-primary">System Update Available</div>
<div class="body-sm text-secondary">Details here.</div>
</div>
<div class="data-list">
<div class="data-list__item">
<span class="data-list__label">SSE index</span>
<span class="data-list__value data-list__value--up">2,410.50 (+1.2%)</span>
</div>
<div class="data-list__item">
<span class="data-list__label">OMX Stockholm</span>
<span class="data-list__value data-list__value--down">960.20 (-0.8%)</span>
</div>
</div>
<span class="status-indicator status-indicator--online"></span> Online
<span class="status-indicator status-indicator--warning"></span> Warning
<hr class="separator-hr">
Extended Layout Elements
Comprehensive, layout-ready widgets and telemetry patterns to simplify building common dashboard modules.
<div class="forecast-grid">
<div class="forecast-grid__day">
<span class="forecast-grid__name">Mon</span>
<i data-lucide="sun" class="forecast-grid__icon"></i>
<span class="forecast-grid__temp">22°<span class="forecast-grid__temp-low">14°</span></span>
</div>
<div class="forecast-grid__day">
<span class="forecast-grid__name">Tue</span>
<i data-lucide="cloud-sun" class="forecast-grid__icon"></i>
<span class="forecast-grid__temp">20°<span class="forecast-grid__temp-low">12°</span></span>
</div>
</div>
<div class="agenda-list">
<div class="agenda-list__item">
<div class="agenda-list__date">
<span class="agenda-list__date-month">Jun</span>
<span class="agenda-list__date-day">02</span>
</div>
<div class="agenda-list__details">
<span class="agenda-list__title">Design Sync Meeting</span>
<span class="agenda-list__subtitle">09:00 - 10:30 | Room 404</span>
</div>
</div>
</div>
<div class="gauge-bar">
<div class="gauge-bar__label-row">
<span>System Storage</span>
<span>65%</span>
</div>
<div class="gauge-bar__track">
<div class="gauge-bar__fill" style="width: 65%;"></div>
</div>
</div>
<div class="stats-grid">
<div class="stats-grid__item">
<span class="stats-grid__value">0.12</span>
<span class="stats-grid__label">Load</span>
</div>
<div class="stats-grid__item">
<span class="stats-grid__value">42°</span>
<span class="stats-grid__label">Temp</span>
</div>
<div class="stats-grid__item">
<span class="stats-grid__value">1.2G</span>
<span class="stats-grid__label">RAM</span>
</div>
</div>
<div class="alert-callout">
<div>
<div class="alert-callout__title">Warning</div>
<div class="alert-callout__desc">The back door has been left open for 10 minutes.</div>
</div>
</div>
System & Connection Status
System-level indicators displayed at the top-center to show connection statuses. Use the buttons below to preview the states.
<div class="ws-status ws-status--connecting">
<span class="ws-status__dot"></span>
<span class="ws-status__label">Connecting…</span>
</div>
Module Loading Skeletons
Visual skeletons displayed on page load before WebSocket messages populate data. Click "Simulate Load Done" to see the fade-in and slide entrance animation.
<!-- Pre-rendered loading state -->
<div data-module="mirrordash_namnsdag" class="module-loading-placeholder">
<div class="module-loading-content">
<span class="module-loading-spinner"></span>
<span class="module-loading-text">Loading Swedish Name Day…</span>
</div>
</div>