/* ============================================================ Design tokens ------------------------------------------------------------ Palette: warm paper background, ink-dark sidebar "spine", deep pine accent (not the generic AI-blue). Type: Source Serif 4 for headings (editorial, planner-like), Inter for body copy, IBM Plex Mono for time/data. ============================================================ */ @import url('https://fonts.googleapis.com/css2?family=Source+Serif+4:opsz,wght@8..60,500;8..60,600&family=Inter:wght@400;500;600&family=IBM+Plex+Mono:wght@400;500&display=swap'); :root { /* Surfaces */ --bg: #f7f6f3; --panel: #ffffff; --sidebar: #15171c; --sidebar-hover: #1f222a; /* Text */ --text: #16181d; --text-inverse: #eceae4; --muted: #74716a; --muted-inverse: #8b8e97; /* Structure */ --border: #e5e2da; --border-strong: #d3cfc3; /* Accent */ --accent: #1f5c52; --accent-hover: #164941; --accent-tint: #e8efec; /* Status (used as tint + left-bar, not solid fills) */ --status-confirmed: #1f5c52; --status-confirmed-tint: #e8efec; --status-busy: #a15c14; --status-busy-tint: #f6ede1; --status-private: #4b4d57; --status-private-tint: #eceae7; --status-proposed: #2f5d86; --status-proposed-tint: #e6eef6; --danger: #ad2b38; /* Scale */ --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px; --space-5: 24px; --space-6: 32px; --space-7: 40px; --radius-sm: 6px; --radius-md: 8px; --radius-lg: 12px; --shadow-sm: 0 1px 2px rgba(21, 23, 28, 0.06); --shadow-md: 0 4px 16px rgba(21, 23, 28, 0.08); --ease: cubic-bezier(0.4, 0, 0.2, 1); --font-display: "Source Serif 4", Georgia, serif; --font-body: Inter, system-ui, sans-serif; --font-mono: "IBM Plex Mono", ui-monospace, monospace; /* Accessibility */ --font-scale: 1; } .dark { --bg: #0e0f12; --panel: #17191d; --sidebar: #0a0b0d; --sidebar-hover: #161821; --text: #eceae4; --text-inverse: #16181d; --muted: #91908a; --muted-inverse: #6b6d75; --border: #2a2c31; --border-strong: #3a3d43; --accent: #4fa393; --accent-hover: #63b6a5; --accent-tint: #16221f; --status-confirmed: #4fa393; --status-confirmed-tint: #16221f; --status-busy: #d1934f; --status-busy-tint: #26200f; --status-private: #9294a0; --status-private-tint: #1c1d21; --status-proposed: #6ba2d6; --status-proposed-tint: #101c28; --danger: #e2707c; --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3); --shadow-md: 0 8px 24px rgba(0, 0, 0, 0.4); } * { box-sizing: border-box; } body { margin: 0; background: var(--bg); color: var(--text); font-family: var(--font-body); font-size: calc(14px * var(--font-scale)); line-height: 1.5; -webkit-font-smoothing: antialiased; transition: background 0.2s var(--ease), color 0.2s var(--ease); } /* ============================================================ Skip link ============================================================ */ .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); white-space: nowrap; border: 0; } .skip-link { position: absolute; left: -9999px; top: 0; z-index: 1000; background: var(--accent); color: #fff; padding: 10px 16px; border-radius: var(--radius-sm); } .skip-link:focus { left: var(--space-4); top: var(--space-4); } /* ============================================================ Layout ============================================================ */ .layout { display: grid; grid-template-columns: 248px 1fr; height: 100vh; } .sidebar { background: var(--sidebar); color: var(--text-inverse); border-right: 1px solid rgba(255, 255, 255, 0.06); padding: var(--space-5) var(--space-4); display: flex; flex-direction: column; } .logo { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-6); padding: 0 var(--space-2); } .logo h2 { margin: 0; font-family: var(--font-display); font-weight: 600; font-size: 19px; letter-spacing: -0.01em; } nav { display: flex; flex-direction: column; gap: 2px; } nav a { cursor: pointer; padding: 10px 14px; border-radius: var(--radius-sm); color: var(--muted-inverse); font-size: 13.5px; font-weight: 500; transition: background 0.15s var(--ease), color 0.15s var(--ease); } nav a:hover { background: var(--sidebar-hover); color: var(--text-inverse); } nav .active { background: var(--accent); color: #ffffff; } .sidebar-bottom { margin-top: auto; padding-top: var(--space-4); border-top: 1px solid rgba(255, 255, 255, 0.08); } button { width: 100%; padding: 10px 14px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--panel); color: var(--text); font-family: var(--font-body); font-size: 13.5px; font-weight: 500; cursor: pointer; margin-top: var(--space-2); transition: border-color 0.15s var(--ease), background 0.15s var(--ease); } button:hover { border-color: var(--border-strong); background: var(--bg); } button:focus-visible, a:focus-visible, input:focus-visible, select:focus-visible, textarea:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } /* button variants */ .btn-primary { background: var(--accent); color: #fff; border-color: var(--accent); } .btn-primary:hover { background: var(--accent-hover); border-color: var(--accent-hover); } .btn-danger { color: var(--danger); border-color: var(--danger); background: transparent; } .btn-danger:hover { background: var(--danger); color: #fff; border-color: var(--danger); } .btn-sm { width: auto; padding: 6px 12px; font-size: 12.5px; margin-top: 0; } .sidebar button { background: transparent; border-color: rgba(255, 255, 255, 0.12); color: var(--text-inverse); } .sidebar button:hover { background: var(--sidebar-hover); border-color: rgba(255, 255, 255, 0.2); } /* Content */ .content { padding: var(--space-6) var(--space-7); overflow-y: auto; } h1 { margin-top: 0; font-family: var(--font-display); font-weight: 600; font-size: 26px; letter-spacing: -0.01em; } .card { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: var(--space-5); margin-top: var(--space-4); box-shadow: var(--shadow-sm); } .card h3 { margin-top: 0; font-family: var(--font-display); font-weight: 600; } /* forms */ input, select, textarea { width: 100%; padding: 10px 12px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg); color: var(--text); font-family: var(--font-body); font-size: 13.5px; margin-top: var(--space-2); transition: border-color 0.15s var(--ease); } textarea { resize: vertical; min-height: 64px; } input:focus, select:focus, textarea:focus { border-color: var(--accent); } form { display: flex; flex-direction: column; } .field-label { display: block; margin-top: var(--space-3); font-size: 12px; font-weight: 600; letter-spacing: 0.01em; color: var(--muted); text-transform: uppercase; } .field-row { display: flex; gap: var(--space-3); } .field-row > div { flex: 1; } .muted { color: var(--muted); } .error { color: var(--danger); } .success { color: var(--accent); } /* list items */ .list-item { padding: 10px 14px; border: 1px solid var(--border); border-radius: var(--radius-md); margin-top: var(--space-2); transition: border-color 0.15s var(--ease); } .list-item:hover { border-color: var(--border-strong); } /* badges */ .badge { display: inline-block; padding: 2px 9px; border-radius: 999px; font-family: var(--font-mono); font-size: 10.5px; letter-spacing: 0.02em; text-transform: uppercase; border: 1px solid transparent; } .badge-confirmed { background: var(--status-confirmed-tint); color: var(--status-confirmed); } .badge-busy { background: var(--status-busy-tint); color: var(--status-busy); } .badge-private { background: var(--status-private-tint); color: var(--status-private); } .badge-proposed { background: var(--status-proposed-tint); color: var(--status-proposed); } /* event actions */ .event-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-4); } .event-actions button { margin-top: 0; width: auto; padding: 8px 14px; } .event-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); } /* radio kind picker */ .kind-grid { display: grid; grid-template-columns: repeat(2, 1fr); gap: var(--space-2); margin-top: var(--space-2); } .kind-option { position: relative; display: block; border: 1px solid var(--border); border-radius: var(--radius-md); padding: 12px 14px; cursor: pointer; transition: border-color 0.15s var(--ease), background 0.15s var(--ease); } .kind-option:hover { border-color: var(--border-strong); } .kind-option input { position: absolute; opacity: 0; width: 0; height: 0; margin: 0; } .kind-option-title { display: block; font-weight: 600; } .kind-option-desc { display: block; font-size: 12px; color: var(--muted); margin-top: 2px; } .kind-option:has(input:checked) { border-color: var(--accent); background: var(--accent-tint); } /* settings toggles */ .setting-row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-4); padding: var(--space-3) 0; border-bottom: 1px solid var(--border); } .setting-row:last-child { border-bottom: none; } .setting-info { max-width: 70%; } .setting-title { font-weight: 600; } .setting-desc { font-size: 12.5px; color: var(--muted); margin-top: 2px; } .setting-control { flex-shrink: 0; } .setting-control select { width: auto; margin-top: 0; } /* switch */ .switch { position: relative; display: inline-block; width: 44px; height: 24px; } .switch input { opacity: 0; width: 0; height: 0; margin: 0; } .switch .slider { position: absolute; inset: 0; background: var(--border-strong); border-radius: 999px; transition: background 0.15s var(--ease); } .switch .slider::before { content: ""; position: absolute; height: 18px; width: 18px; left: 3px; top: 3px; background: #fff; border-radius: 50%; transition: transform 0.15s var(--ease); box-shadow: var(--shadow-sm); } .switch input:checked + .slider { background: var(--accent); } .switch input:checked + .slider::before { transform: translateX(20px); } .switch input:focus-visible + .slider { outline: 2px solid var(--accent); outline-offset: 2px; } /* member list */ .member-list { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); } .member-chip { padding: 4px 10px; border: 1px solid var(--border); border-radius: 999px; font-size: 12px; } /* calendar */ .calendar-header { display: flex; align-items: center; justify-content: space-between; } .calendar-header h3 { margin: 0; font-family: var(--font-display); font-weight: 600; font-size: 17px; text-transform: capitalize; } .calendar-nav-btn { width: auto; padding: 6px 12px; margin-top: 0; } .calendar-legend { display: flex; flex-wrap: wrap; gap: var(--space-5); margin-top: var(--space-4); font-size: 12px; color: var(--muted); } .legend-item { display: flex; align-items: center; gap: 6px; } .legend-dot { width: 8px; height: 8px; border-radius: 2px; display: inline-block; } /* week grid */ .calendar-week { display: flex; margin-top: var(--space-4); overflow-x: auto; } .calendar-gutter { width: 52px; flex-shrink: 0; padding-top: 0px; } .calendar-hour-label { height: 48px; font-family: var(--font-mono); font-size: 10.5px; color: var(--muted); text-align: right; padding-right: var(--space-2); display: flex; justify-content: flex-end; align-items: flex-start; transform: translateY(-6px); } .calendar-days { display: flex; flex: 1; min-width: 700px; } .calendar-day-column { flex: 1; display: flex; flex-direction: column; border-left: 1px solid var(--border); } .calendar-day-header { height: 32px; text-align: center; padding: 6px 0; font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.02em; text-transform: uppercase; color: var(--muted); } .calendar-day-header.today { color: var(--accent); font-weight: 600; } .calendar-day-track { position: relative; height: 576px; /* 12 uur zichtbaar x 48px */ background-image: repeating-linear-gradient( to bottom, var(--border) 0, var(--border) 1px, transparent 1px, transparent 48px ); } .calendar-event { position: absolute; left: 4px; right: 4px; border-radius: var(--radius-sm); padding: 4px 8px 4px 9px; font-size: 11px; color: var(--text); cursor: pointer; overflow: hidden; border-left: 3px solid transparent; background: var(--panel); box-shadow: var(--shadow-sm); transition: box-shadow 0.15s var(--ease); } .calendar-event:hover { box-shadow: var(--shadow-md); } .calendar-event-time { display: block; font-family: var(--font-mono); font-size: 9.5px; color: var(--muted); } .calendar-event-title { display: block; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .event-confirmed { background: var(--status-confirmed-tint); border-left-color: var(--status-confirmed); } .event-busy { background: var(--status-busy-tint); border-left-color: var(--status-busy); } .event-private { background: var(--status-private-tint); border-left-color: var(--status-private); } .event-proposed { background: var(--status-proposed-tint); border-left-color: var(--status-proposed); border-left-style: dashed; } .legend-dot.event-confirmed, .legend-dot.event-busy, .legend-dot.event-private, .legend-dot.event-proposed { border-radius: 2px; border-left: none; } .legend-dot.event-confirmed { background: var(--status-confirmed); } .legend-dot.event-busy { background: var(--status-busy); } .legend-dot.event-private { background: var(--status-private); } .legend-dot.event-proposed { background: var(--status-proposed); } /* login screen */ .login-screen { height: 100vh; width: 100%; display: flex; align-items: center; justify-content: center; background: var(--bg); } .login-box { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: var(--space-6); width: 320px; box-shadow: var(--shadow-md); } .login-box h2 { margin-top: 0; margin-bottom: var(--space-5); font-family: var(--font-display); font-weight: 600; text-align: center; } /* ============================================================ Accessibility preference classes (toggled on ) ============================================================ */ /* High contrast: stronger borders + pure ink/paper text */ body.a11y-contrast { --border: #000000; --border-strong: #000000; --muted: #2a2a2a; --text: #000000; } body.a11y-contrast.dark { --border: #ffffff; --border-strong: #ffffff; --muted: #d8d8d8; --text: #ffffff; } body.a11y-contrast .card, body.a11y-contrast .list-item, body.a11y-contrast input, body.a11y-contrast select, body.a11y-contrast textarea { border-width: 2px; } /* Underline all links for clarity */ body.a11y-underline a { text-decoration: underline; } /* Reduce motion */ body.a11y-reduce-motion, body.a11y-reduce-motion * { transition: none !important; animation: none !important; scroll-behavior: auto !important; } /* Dyslexia-friendly reading: readable stack + generous spacing */ body.a11y-dyslexic { font-family: "Atkinson Hyperlegible", "Comic Sans MS", Verdana, sans-serif; letter-spacing: 0.03em; word-spacing: 0.12em; line-height: 1.8; } body.a11y-dyslexic h1, body.a11y-dyslexic h2, body.a11y-dyslexic h3, body.a11y-dyslexic .card h3 { font-family: "Atkinson Hyperlegible", "Comic Sans MS", Verdana, sans-serif; } /* Respect the OS-level reduced motion request too */ @media (prefers-reduced-motion: reduce) { * { transition: none !important; animation: none !important; } }