INBOX/adhd-friendly-dashboard-variants-v2 (1)/adhd-friendly-colour-variants/olive-oat/olive-oat-dashboard.html
2026-08-07 15:50:54 +02:00

804 lines
27 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en" data-theme="light">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light dark">
<title>Olive Oat — Dashboard Demo</title>
<style>
@import url("https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible:wght@400;700&family=Lexend:wght@400;500;600;700&display=swap");
:root {
--page: #F9F7F0;
--page-accent: #ECE8D9;
--surface: #FFFDF8;
--surface-alt: #F4F1E5;
--surface-strong: #E3DFCD;
--text: #35362B;
--muted: #737363;
--border: #D7D3C1;
--primary: #777B4F;
--primary-hover: #5D623A;
--on-primary: #FFFFFF;
--secondary: #DDE6E2;
--secondary-hover: #CEDBD5;
--on-secondary: #2D3B37;
--accent-1: #A88FA0;
--accent-2: #77949A;
--accent-3: #C8A575;
--danger: #A36558;
--danger-soft: #F3E6E1;
--success: #6F8464;
--success-soft: color-mix(in srgb, var(--success) 12%, var(--surface));
--focus: #A6A77B;
color-scheme: light;
--font-body: "Atkinson Hyperlegible", "Segoe UI", Arial, sans-serif;
--font-ui: "Lexend", "Segoe UI", Arial, sans-serif;
--shadow-lg: 0 28px 70px rgb(121 92 78 / 14%);
--shadow-md: 0 14px 34px rgb(121 92 78 / 10%);
--shadow-sm: 0 8px 20px rgb(121 92 78 / 7%);
--radius-sm: 0.7rem;
--radius-md: 1rem;
--radius-lg: 1.45rem;
--radius-xl: 1.8rem;
}
html[data-theme="dark"] {
--page: #030401;
--page-accent: #0A0C05;
--surface: #15170E;
--surface-alt: #212418;
--surface-strong: #343827;
--text: #F5F4EA;
--muted: #C4C3B4;
--border: #505443;
--primary: #A9AD75;
--primary-hover: #8F945D;
--on-primary: #20230E;
--secondary: #3E5A57;
--secondary-hover: #50706C;
--on-secondary: #F1F7F5;
--accent-1: #B29BAA;
--accent-2: #7E9DA1;
--accent-3: #D0B27F;
--danger: #D18E7E;
--danger-soft: #402B24;
--success: #9BAF8F;
--success-soft: color-mix(in srgb, var(--success) 12%, var(--surface));
--focus: #C1C493;
color-scheme: dark;
--shadow-lg: 0 38px 96px rgb(0 0 0 / 58%);
--shadow-md: 0 18px 44px rgb(0 0 0 / 34%);
--shadow-sm: 0 10px 24px rgb(0 0 0 / 22%);
}
* { box-sizing: border-box; }
html, body {
margin: 0;
min-height: 100%;
font-family: var(--font-body);
font-size: 18px;
line-height: 1.6;
color: var(--text);
background:
radial-gradient(circle at 10% 10%, color-mix(in srgb, var(--accent-1, var(--primary)) 14%, transparent), transparent 30%),
radial-gradient(circle at 88% 18%, color-mix(in srgb, var(--accent-2, var(--secondary)) 10%, transparent), transparent 26%),
linear-gradient(145deg, var(--page), var(--page-accent, var(--page)));
}
body { min-height: 100vh; }
button, input, select { font: inherit; }
a { color: inherit; text-decoration: none; }
:focus-visible {
outline: 3px solid var(--focus, color-mix(in srgb, var(--primary) 40%, white));
outline-offset: 3px;
}
.app {
min-height: 100vh;
display: grid;
grid-template-columns: 280px minmax(0, 1fr);
}
.sidebar {
position: sticky;
top: 0;
height: 100vh;
display: flex;
flex-direction: column;
gap: 1.4rem;
padding: 1.25rem;
background: color-mix(in srgb, var(--surface) 88%, transparent);
border-right: 1px solid var(--border);
backdrop-filter: blur(12px);
}
.brand {
display: flex;
gap: 0.85rem;
align-items: center;
padding: 0.8rem 0.9rem;
border-radius: var(--radius-md);
background: var(--surface-alt);
border: 1px solid var(--border);
box-shadow: var(--shadow-sm);
}
.brand-mark {
display: grid;
place-items: center;
width: 2.6rem;
aspect-ratio: 1;
border-radius: 0.9rem;
color: var(--primary);
background: color-mix(in srgb, var(--primary) 12%, var(--surface));
border: 1px solid color-mix(in srgb, var(--primary) 24%, var(--border));
}
.brand-mark svg { width: 1.35rem; height: 1.35rem; }
.brand-text strong, .brand-text span { display: block; }
.brand-text strong {
font-family: var(--font-ui);
font-size: 0.98rem;
letter-spacing: -0.02em;
}
.brand-text span {
color: var(--muted);
font-size: 0.82rem;
}
.nav-group { display: grid; gap: 0.35rem; }
.nav-title {
margin: 0 0 0.2rem;
padding: 0 0.85rem;
color: var(--muted);
font-family: var(--font-ui);
font-size: 0.76rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.nav-link {
display: flex;
align-items: center;
gap: 0.75rem;
padding: 0.78rem 0.88rem;
border-radius: var(--radius-sm);
color: var(--muted);
font-family: var(--font-ui);
font-size: 0.95rem;
font-weight: 500;
transition: background-color 140ms ease, color 140ms ease;
}
.nav-link svg { width: 1.1rem; height: 1.1rem; flex: 0 0 auto; }
.nav-link:hover { color: var(--text); background: var(--surface-alt); }
.nav-link.active {
color: var(--primary);
background: color-mix(in srgb, var(--primary) 10%, var(--surface));
border: 1px solid color-mix(in srgb, var(--primary) 20%, var(--border));
box-shadow: var(--shadow-sm);
}
.sidebar-card {
margin-top: auto;
padding: 1rem;
background: linear-gradient(
145deg,
color-mix(in srgb, var(--surface-alt) 96%, transparent),
color-mix(in srgb, var(--surface) 96%, transparent)
);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-sm);
}
.sidebar-card p { margin: 0.35rem 0 0; color: var(--muted); font-size: 0.9rem; }
.sidebar-card strong {
display: block;
font-family: var(--font-ui);
font-size: 1rem;
letter-spacing: -0.02em;
}
.sidebar-card button {
margin-top: 0.95rem;
width: 100%;
min-height: 2.8rem;
border: 1px solid var(--primary);
border-radius: var(--radius-sm);
background: var(--primary);
color: var(--on-primary);
font-family: var(--font-ui);
font-weight: 700;
cursor: pointer;
}
.main { min-width: 0; padding: 1.3rem; }
.topbar {
display: flex;
flex-wrap: wrap;
justify-content: space-between;
gap: 1rem;
align-items: center;
margin-bottom: 1.15rem;
padding: 1rem 1.1rem;
background: color-mix(in srgb, var(--surface) 94%, transparent);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-sm);
backdrop-filter: blur(10px);
}
.topbar-copy h1 {
margin: 0;
font-family: var(--font-ui);
font-size: clamp(1.7rem, 3vw, 2.45rem);
line-height: 1.12;
letter-spacing: -0.035em;
}
.topbar-copy p { margin: 0.35rem 0 0; color: var(--muted); font-size: 0.95rem; }
.topbar-actions {
display: flex;
flex-wrap: wrap;
gap: 0.7rem;
align-items: center;
}
.search {
display: flex;
align-items: center;
gap: 0.55rem;
min-width: min(100%, 280px);
padding: 0.7rem 0.85rem;
background: var(--surface-alt);
border: 1px solid var(--border);
border-radius: 999px;
}
.search input {
width: 100%;
border: 0;
background: transparent;
color: var(--text);
outline: none;
}
.search input::placeholder { color: var(--muted); }
.topbar-button, .theme-button {
min-height: 2.7rem;
padding: 0.72rem 1rem;
border-radius: 999px;
border: 1px solid var(--border);
background: var(--surface-alt);
color: var(--text);
font-family: var(--font-ui);
font-weight: 600;
cursor: pointer;
}
.topbar-button.primary {
border-color: var(--primary);
background: var(--primary);
color: var(--on-primary);
box-shadow: 0 10px 22px color-mix(in srgb, var(--primary) 20%, transparent);
}
.dashboard-grid {
display: grid;
gap: 1rem;
grid-template-columns: repeat(12, minmax(0, 1fr));
}
.card {
min-width: 0;
padding: 1.1rem;
background: color-mix(in srgb, var(--surface) 97%, transparent);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-sm);
}
.card-header {
display: flex;
justify-content: space-between;
gap: 1rem;
align-items: start;
margin-bottom: 0.95rem;
}
.card-header h2, .card-header h3, .card h3 {
margin: 0;
font-family: var(--font-ui);
line-height: 1.18;
letter-spacing: -0.03em;
}
.card-header p, .card p.card-subtitle {
margin: 0.3rem 0 0;
color: var(--muted);
font-size: 0.9rem;
}
.metric-grid {
grid-column: 1 / -1;
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: 1rem;
}
.metric-card {
padding: 1rem;
background: linear-gradient(
160deg,
color-mix(in srgb, var(--surface-alt) 92%, transparent),
color-mix(in srgb, var(--surface) 98%, transparent)
);
border: 1px solid var(--border);
border-radius: var(--radius-xl);
box-shadow: var(--shadow-sm);
}
.metric-card .label {
color: var(--muted);
font-family: var(--font-ui);
font-size: 0.82rem;
font-weight: 600;
}
.metric-card .value {
margin-top: 0.4rem;
font-family: var(--font-ui);
font-size: clamp(1.8rem, 3vw, 2.25rem);
line-height: 1.05;
letter-spacing: -0.04em;
}
.metric-card .meta {
margin-top: 0.45rem;
display: inline-flex;
align-items: center;
gap: 0.4rem;
font-size: 0.84rem;
color: var(--muted);
}
.chip {
display: inline-flex;
align-items: center;
gap: 0.35rem;
padding: 0.26rem 0.55rem;
border-radius: 999px;
font-family: var(--font-ui);
font-size: 0.74rem;
font-weight: 600;
}
.chip.success {
color: var(--success, var(--primary));
background: var(--success-soft, color-mix(in srgb, var(--success, var(--primary)) 12%, var(--surface)));
}
.chip.primary {
color: var(--primary);
background: color-mix(in srgb, var(--primary) 12%, var(--surface));
}
.overview-card { grid-column: span 8; }
.split-card { grid-column: span 4; }
.chart {
display: grid;
grid-template-columns: repeat(7, 1fr);
align-items: end;
gap: 0.8rem;
min-height: 230px;
margin-top: 1.2rem;
}
.bar-group {
display: grid;
gap: 0.55rem;
justify-items: center;
}
.bar-stack {
width: 100%;
max-width: 2.2rem;
height: 180px;
display: flex;
align-items: end;
}
.bar {
width: 100%;
border-radius: 999px 999px 0 0;
background: linear-gradient(
180deg,
color-mix(in srgb, var(--accent-1, var(--primary)) 70%, var(--primary)),
var(--primary)
);
box-shadow: inset 0 1px 0 rgb(255 255 255 / 18%);
}
.bar-label { color: var(--muted); font-size: 0.78rem; }
.progress-list { display: grid; gap: 0.95rem; margin-top: 1rem; }
.progress-item { display: grid; gap: 0.4rem; }
.progress-item strong { font-family: var(--font-ui); font-size: 0.95rem; }
.progress-meta {
display: flex;
justify-content: space-between;
gap: 1rem;
color: var(--muted);
font-size: 0.82rem;
}
.progress-track {
width: 100%;
height: 0.65rem;
overflow: hidden;
background: var(--surface-alt);
border-radius: 999px;
border: 1px solid var(--border);
}
.progress-fill {
height: 100%;
border-radius: inherit;
background: linear-gradient(90deg, var(--primary), var(--accent-1, var(--primary)));
}
.tasks-card { grid-column: span 5; }
.activity-card { grid-column: span 7; }
.list { display: grid; gap: 0.75rem; margin-top: 1rem; }
.task {
display: flex;
align-items: start;
gap: 0.75rem;
padding: 0.85rem;
background: var(--surface-alt);
border: 1px solid var(--border);
border-radius: var(--radius-md);
}
.task input[type="checkbox"] {
margin-top: 0.18rem;
width: 1rem;
height: 1rem;
accent-color: var(--primary);
}
.task strong {
display: block;
font-family: var(--font-ui);
font-size: 0.95rem;
}
.task p {
margin: 0.2rem 0 0;
color: var(--muted);
font-size: 0.85rem;
}
.activity-item {
display: flex;
justify-content: space-between;
gap: 1rem;
align-items: start;
padding: 0.85rem 0;
border-bottom: 1px solid var(--border);
}
.activity-item:last-child { border-bottom: 0; padding-bottom: 0; }
.activity-item strong {
display: block;
font-family: var(--font-ui);
font-size: 0.95rem;
}
.activity-item p {
margin: 0.2rem 0 0;
color: var(--muted);
font-size: 0.85rem;
max-width: 46ch;
}
.activity-time { white-space: nowrap; color: var(--muted); font-size: 0.8rem; }
.team-card { grid-column: span 4; }
.typography-card { grid-column: span 8; }
.avatars { display: flex; margin-top: 1rem; }
.avatar {
width: 2.6rem;
height: 2.6rem;
margin-left: -0.45rem;
display: grid;
place-items: center;
border-radius: 999px;
border: 2px solid var(--surface);
color: var(--on-primary);
font-family: var(--font-ui);
font-size: 0.82rem;
font-weight: 700;
background: linear-gradient(145deg, var(--primary), var(--accent-1, var(--primary)));
}
.avatar:first-child { margin-left: 0; }
.sample-card {
margin-top: 1rem;
padding: 1.1rem;
background: linear-gradient(
160deg,
color-mix(in srgb, var(--surface-alt) 92%, transparent),
color-mix(in srgb, var(--surface) 98%, transparent)
);
border: 1px solid var(--border);
border-radius: var(--radius-lg);
}
.sample-card__eyebrow {
margin: 0 0 0.45rem;
color: var(--primary);
font-family: var(--font-ui);
font-size: 0.76rem;
font-weight: 700;
letter-spacing: 0.09em;
text-transform: uppercase;
}
.sample-card h3 {
margin: 0;
font-family: var(--font-ui);
font-size: 1.35rem;
line-height: 1.18;
letter-spacing: -0.03em;
}
.sample-card__subheading {
margin: 0.42rem 0 0;
color: var(--muted);
font-family: var(--font-ui);
font-size: 0.96rem;
font-weight: 500;
}
.sample-card__body {
margin: 0.9rem 0 0;
color: var(--text);
font-family: var(--font-body);
font-size: 1rem;
line-height: 1.68;
max-width: 64ch;
}
@media (max-width: 1180px) {
.metric-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.overview-card, .split-card, .tasks-card, .activity-card, .team-card, .typography-card {
grid-column: 1 / -1;
}
}
@media (max-width: 960px) {
.app { grid-template-columns: 1fr; }
.sidebar { position: static; height: auto; }
.main { padding-top: 0; }
}
@media (max-width: 720px) {
html { font-size: 17px; }
.metric-grid { grid-template-columns: 1fr; }
.topbar { padding: 0.95rem; }
.search { min-width: 100%; }
.chart { gap: 0.45rem; }
.bar-stack { max-width: 1.5rem; }
.sample-card h3 { font-size: 1.2rem; }
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: .01ms !important;
animation-iteration-count: 1 !important;
transition-duration: .01ms !important;
scroll-behavior: auto !important;
}
}
</style>
</head>
<body>
<div class="app">
<aside class="sidebar">
<div class="brand">
<div class="brand-mark" aria-hidden="true">
<svg viewBox="0 0 24 24" fill="none">
<path d="M5 15.5 12 4l7 11.5-7 4.5-7-4.5Z" stroke="currentColor" stroke-width="1.7"></path>
<circle cx="12" cy="12" r="2.2" fill="currentColor"></circle>
</svg>
</div>
<div class="brand-text">
<strong>Olive Oat</strong>
<span>Dashboard system</span>
</div>
</div>
<nav aria-label="Primary navigation">
<div class="nav-group">
<p class="nav-title">Workspace</p>
<a class="nav-link active" href="#"><svg viewBox="0 0 24 24" fill="none"><path d="M3 10.5 12 4l9 6.5V20H3v-9.5Z" stroke="currentColor" stroke-width="1.8" stroke-linejoin="round"></path></svg>Overview</a>
<a class="nav-link" href="#"><svg viewBox="0 0 24 24" fill="none"><rect x="4" y="5" width="16" height="14" rx="2" stroke="currentColor" stroke-width="1.8"></rect><path d="M8 9h8M8 13h5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg>Projects</a>
<a class="nav-link" href="#"><svg viewBox="0 0 24 24" fill="none"><path d="M8 7h8M8 12h8M8 17h8" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path><circle cx="5" cy="7" r="1" fill="currentColor"></circle><circle cx="5" cy="12" r="1" fill="currentColor"></circle><circle cx="5" cy="17" r="1" fill="currentColor"></circle></svg>Tasks</a>
<a class="nav-link" href="#"><svg viewBox="0 0 24 24" fill="none"><path d="M5 19V9m7 10V5m7 14v-7" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg>Reports</a>
</div>
<div class="nav-group" style="margin-top: 1rem;">
<p class="nav-title">Library</p>
<a class="nav-link" href="#"><svg viewBox="0 0 24 24" fill="none"><path d="M7 4h10a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H7V4Z" stroke="currentColor" stroke-width="1.8"></path><path d="M7 4a2 2 0 0 0-2 2v12a2 2 0 0 1 2-2h10" stroke="currentColor" stroke-width="1.8"></path></svg>Style guide</a>
<a class="nav-link" href="#"><svg viewBox="0 0 24 24" fill="none"><circle cx="12" cy="8" r="4" stroke="currentColor" stroke-width="1.8"></circle><path d="M4 20a8 8 0 0 1 16 0" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path></svg>Team</a>
</div>
</nav>
<div class="sidebar-card">
<strong>Design note</strong>
<p>Olive Oat uses calm neutral surfaces with a focused primary colour for important actions and active states.</p>
<button type="button">Create report</button>
</div>
</aside>
<main class="main">
<header class="topbar">
<div class="topbar-copy">
<h1>Dashboard overview</h1>
<p>A modern application example using the Olive Oat system.</p>
</div>
<div class="topbar-actions">
<label class="search" aria-label="Search">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" aria-hidden="true">
<circle cx="11" cy="11" r="7" stroke="currentColor" stroke-width="1.8"></circle>
<path d="m20 20-3.5-3.5" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"></path>
</svg>
<input type="search" placeholder="Search projects, tasks or notes">
</label>
<button class="theme-button" id="theme-toggle" type="button">Toggle theme</button>
<button class="topbar-button primary" type="button">New workspace</button>
</div>
</header>
<section class="metric-grid">
<article class="metric-card">
<span class="label">Active projects</span>
<div class="value">12</div>
<div class="meta"><span class="chip primary">+2 this week</span></div>
</article>
<article class="metric-card">
<span class="label">Tasks completed</span>
<div class="value">84%</div>
<div class="meta"><span class="chip success">On track</span></div>
</article>
<article class="metric-card">
<span class="label">Focus hours</span>
<div class="value">26.4</div>
<div class="meta">Compared with 22.8 last week</div>
</article>
<article class="metric-card">
<span class="label">Messages waiting</span>
<div class="value">7</div>
<div class="meta">2 marked important</div>
</article>
</section>
<section class="dashboard-grid" style="margin-top: 1rem;">
<article class="card overview-card">
<div class="card-header">
<div>
<h2>Weekly progress</h2>
<p>Mock analytics card for testing surfaces, typography and chart colours.</p>
</div>
<span class="chip primary">Updated today</span>
</div>
<div class="chart" aria-label="Weekly progress chart">
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 54%;"></div></div><span class="bar-label">Mon</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 72%;"></div></div><span class="bar-label">Tue</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 63%;"></div></div><span class="bar-label">Wed</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 81%;"></div></div><span class="bar-label">Thu</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 68%;"></div></div><span class="bar-label">Fri</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 44%;"></div></div><span class="bar-label">Sat</span></div>
<div class="bar-group"><div class="bar-stack"><div class="bar" style="height: 58%;"></div></div><span class="bar-label">Sun</span></div>
</div>
</article>
<article class="card split-card">
<div class="card-header">
<div>
<h3>Project status</h3>
<p>Simple progress indicators</p>
</div>
</div>
<div class="progress-list">
<div class="progress-item">
<div class="progress-meta"><strong>Website refresh</strong><span>72%</span></div>
<div class="progress-track"><div class="progress-fill" style="width:72%"></div></div>
</div>
<div class="progress-item">
<div class="progress-meta"><strong>Volunteer onboarding</strong><span>48%</span></div>
<div class="progress-track"><div class="progress-fill" style="width:48%"></div></div>
</div>
<div class="progress-item">
<div class="progress-meta"><strong>Event planning</strong><span>86%</span></div>
<div class="progress-track"><div class="progress-fill" style="width:86%"></div></div>
</div>
</div>
</article>
<article class="card tasks-card">
<div class="card-header">
<div>
<h3>Todays priorities</h3>
<p>One section for focused next steps</p>
</div>
<span class="chip primary">3 urgent</span>
</div>
<div class="list">
<label class="task"><input type="checkbox"><span><strong>Review homepage copy</strong><p>Check clarity, hierarchy and readability before sign-off.</p></span></label>
<label class="task"><input type="checkbox" checked><span><strong>Send volunteer update</strong><p>Newsletter draft is ready and only needs final approval.</p></span></label>
<label class="task"><input type="checkbox"><span><strong>Plan next dashboard section</strong><p>Decide whether resources or calendar should be the next module.</p></span></label>
</div>
</article>
<article class="card activity-card">
<div class="card-header">
<div>
<h3>Recent activity</h3>
<p>Readable event feed for testing longer text lines</p>
</div>
</div>
<div class="list" style="gap: 0;">
<div class="activity-item"><div><strong>Design system updated</strong><p>The Olive Oat palette was applied to buttons, cards and dashboards.</p></div><span class="activity-time">10 min ago</span></div>
<div class="activity-item"><div><strong>New accessibility review</strong><p>Contrast and keyboard focus were checked in both light and dark mode.</p></div><span class="activity-time">45 min ago</span></div>
<div class="activity-item"><div><strong>Typography sample approved</strong><p>Lexend and Atkinson Hyperlegible remain the chosen pairing for UI and reading text.</p></div><span class="activity-time">2 h ago</span></div>
</div>
</article>
<article class="card team-card">
<div class="card-header">
<div>
<h3>Team snapshot</h3>
<p>Compact people module</p>
</div>
</div>
<div class="avatars" aria-label="Team members">
<div class="avatar">AJ</div>
<div class="avatar">PM</div>
<div class="avatar">KM</div>
<div class="avatar">LV</div>
</div>
<p class="card-subtitle" style="margin-top: 1rem;">Four collaborators currently active in this workspace.</p>
</article>
<article class="card typography-card">
<div class="card-header">
<div>
<h3>Typography sample card</h3>
<p>To test the dashboard with headings, subheadings and paragraph text.</p>
</div>
</div>
<article class="sample-card" aria-labelledby="sample-heading">
<p class="sample-card__eyebrow">Typography sample</p>
<h3 id="sample-heading">A modern editorial dashboard card heading</h3>
<p class="sample-card__subheading">
A concise subheading shows how Lexend behaves inside a polished application dashboard.
</p>
<p class="sample-card__body">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere,
neque vitae facilisis luctus, justo sapien posuere lorem, sed cursus mauris
erat vel sem. Donec vitae lectus at mi tincidunt suscipit. Suspendisse
potenti. Sed porttitor, libero ac faucibus suscipit, mauris turpis pharetra
quam, ac consequat nisl ligula non justo.
</p>
</article>
</article>
</section>
</main>
</div>
<script>
const root = document.documentElement;
const themeToggle = document.getElementById("theme-toggle");
const storageKey = "olive-oat-dashboard-theme";
const setTheme = (theme) => {
root.dataset.theme = theme;
localStorage.setItem(storageKey, theme);
themeToggle.textContent = theme === "dark" ? "Use light mode" : "Use dark mode";
};
const storedTheme = localStorage.getItem(storageKey);
const preferredTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
setTheme(storedTheme || preferredTheme);
themeToggle.addEventListener("click", () => {
setTheme(root.dataset.theme === "dark" ? "light" : "dark");
});
</script>
</body>
</html>