804 lines
27 KiB
HTML
804 lines
27 KiB
HTML
<!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>Today’s 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>
|