/* ============================================================ 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; --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; } .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; --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: 14px; line-height: 1.5; -webkit-font-smoothing: antialiased; transition: background 0.2s var(--ease), color 0.2s var(--ease); } /* ============================================================ 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 { outline: 2px solid var(--accent); outline-offset: 2px; } .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); } /* forms */ input { 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); } input:focus { border-color: var(--accent); } form { display: flex; flex-direction: column; } .muted { color: var(--muted); } .error { color: var(--danger); } /* 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); } /* event actions */ .event-actions { display: flex; gap: var(--space-2); margin-top: var(--space-4); } .event-actions button { margin-top: 0; } /* 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; 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-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); } .legend-dot.event-confirmed, .legend-dot.event-busy, .legend-dot.event-private { border-radius: 2px; border-left: none; } /* 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; } /* ============================================================ Modals ============================================================ */ .modal-backdrop { position: fixed; inset: 0; background: rgba(10, 11, 13, 0.5); display: flex; align-items: center; justify-content: center; padding: var(--space-4); z-index: 100; } .modal-box { background: var(--panel); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: var(--space-5); width: 100%; max-width: 440px; max-height: 85vh; overflow-y: auto; box-shadow: var(--shadow-md); } .modal-box h2 { margin-top: 0; font-family: var(--font-display); font-weight: 600; font-size: 19px; } .modal-box label { display: block; font-size: 12.5px; color: var(--muted); margin-top: var(--space-3); } .modal-actions { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-5); } .modal-actions button { width: auto; margin-top: 0; padding: 8px 16px; } .danger-button { border-color: var(--danger) !important; color: var(--danger) !important; } /* action rows above list pages */ .page-actions { display: flex; gap: var(--space-2); margin-bottom: var(--space-2); } .page-actions button { width: auto; margin-top: 0; } /* settings */ .settings-row { display: flex; align-items: center; gap: var(--space-2); font-size: 13.5px; color: var(--text); margin-top: var(--space-3); } .settings-row input[type="checkbox"] { width: auto; margin: 0; } .settings-row select { margin-left: auto; width: auto; padding: 6px 10px; border-radius: var(--radius-sm); border: 1px solid var(--border); background: var(--bg); color: var(--text); } .ascii-art-box { font-family: var(--font-mono); font-size: 11px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: var(--space-3); overflow-x: auto; margin-top: var(--space-2); } body.reduced-motion, body.reduced-motion * { transition: none !important; animation: none !important; } body.high-contrast { --border: #000000; --border-strong: #000000; --muted: #2a2a2a; } body.high-contrast.dark { --border: #ffffff; --border-strong: #ffffff; --muted: #e6e6e6; } body.high-contrast .calendar-event { border-left-width: 4px; } body.underline-links a { text-decoration: underline; } body.always-focus a:focus, body.always-focus button:focus, body.always-focus input:focus, body.always-focus select:focus { outline: 2px solid var(--accent); outline-offset: 2px; } body.font-scale-large { font-size: 16px; } body.font-scale-xlarge { font-size: 18px; }