/* ============================================================ Ivory & Ink — Bullet Journal Styles Based on the Ivory & Ink UI Style Guide ============================================================ */ /* ---------- CSS custom properties (light mode) ---------- */ :root { /* Page & surfaces */ --page: #FAF8F2; --page-accent: #F0ECE2; --surface: #FFFEFA; --surface-alt: #F6F2E9; --surface-strong: #E8E1D4; --border: #D8D1C5; /* Text */ --text: #242321; --muted: #6E6A63; /* Actions */ --primary: #2D2B28; --primary-hover: #171614; --secondary: #E8E2D8; --secondary-hover: #DAD2C5; /* Supporting accents */ --accent-1: #817A70; --accent-2: #8C9795; --accent-3: #B49B73; --success: #6F806F; --danger: #8A5D54; /* Focus */ --focus: #817A70; /* Spacing */ --space-xxs: 4px; --space-xs: 8px; --space-sm: 16px; --space-md: 24px; --space-lg: 32px; --space-xl: 48px; /* Typography */ --font-body: "Atkinson Hyperlegible", "Segoe UI", Arial, sans-serif; --font-ui: "Lexend", "Segoe UI", Arial, sans-serif; --font-size-body: 18px; --font-size-btn: 16px; --line-height: 1.6; } /* ---------- Dark mode ---------- */ html[data-theme="dark"] { --page: #020202; --page-accent: #090806; --surface: #151411; --surface-alt: #201E1A; --surface-strong: #322F28; --border: #4D4941; --text: #FAF7EF; --muted: #C7C1B5; --primary: #E8E1D4; --primary-hover: #FFF9ED; --secondary: #4C4840; --secondary-hover: #625D53; --accent-1: #B6ADA0; --accent-2: #8EA09C; --accent-3: #C8AD7C; --success: #9BAE99; --danger: #C89084; --focus: #B6ADA0; } /* ---------- Reset ---------- */ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } html { font-size: var(--font-size-body); scroll-behavior: smooth; } body { background-color: var(--page); color: var(--text); font-family: var(--font-body); line-height: var(--line-height); min-height: 100vh; display: flex; flex-direction: column; transition: background-color 0.2s ease, color 0.2s ease; } /* ---------- Layout ---------- */ .page-surface { display: flex; flex-direction: column; min-height: 100vh; max-width: 1200px; margin: 0 auto; width: 100%; } /* Header */ .page-header { display: flex; align-items: center; justify-content: space-between; flex-wrap: wrap; gap: var(--space-xs); padding: var(--space-sm) var(--space-md); background-color: var(--surface); border-bottom: 1px solid var(--border); } .page-header__title { font-family: var(--font-ui); font-size: 1.25rem; font-weight: 600; color: var(--text); } .header-nav { display: flex; gap: var(--space-xs); flex-wrap: wrap; } /* Main */ .page-main { flex: 1; padding: var(--space-md); } /* Footer */ .page-footer { display: flex; align-items: center; justify-content: center; gap: var(--space-xs); flex-wrap: wrap; padding: var(--space-sm) var(--space-md); background-color: var(--surface); border-top: 1px solid var(--border); } /* ---------- Cards ---------- */ .card { background-color: var(--surface); border: 1px solid var(--border); border-radius: 8px; padding: var(--space-md); margin-bottom: var(--space-md); } .card--full { width: 100%; } .card--future { opacity: 0.7; border-style: dashed; } .card__eyebrow { font-family: var(--font-ui); font-size: 0.75rem; text-transform: uppercase; letter-spacing: 0.08em; color: var(--muted); margin-bottom: var(--space-xs); } .card h2 { font-family: var(--font-ui); font-size: 1.5rem; font-weight: 600; margin-bottom: var(--space-sm); color: var(--text); } .card h3 { font-family: var(--font-ui); font-size: 1.125rem; font-weight: 500; margin-bottom: var(--space-xs); color: var(--text); } .future-text { color: var(--muted); font-size: 0.9rem; margin-bottom: var(--space-sm); } .future-placeholder { display: flex; justify-content: center; padding: var(--space-md); color: var(--accent-1); } /* ---------- Daily Log Layout (Step 2) ---------- */ .daily-log-layout { display: grid; grid-template-columns: 1fr; gap: var(--space-md); } @media (min-width: 768px) { .daily-log-layout { grid-template-columns: 2fr 1fr; } } .daily-log__current { min-width: 0; } .daily-log__future { display: flex; flex-direction: column; gap: var(--space-sm); } /* ---------- Buttons ---------- */ .btn { display: inline-flex; align-items: center; justify-content: center; gap: var(--space-xxs); padding: var(--space-xs) var(--space-sm); font-family: var(--font-ui); font-size: var(--font-size-btn); font-weight: 500; line-height: 1; border: none; border-radius: 6px; cursor: pointer; text-decoration: none; min-height: 44px; min-width: 44px; transition: background-color 0.15s ease, color 0.15s ease; } .btn:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; } .btn:hover { filter: brightness(0.95); } .btn:disabled { opacity: 0.5; cursor: not-allowed; } .btn-primary { background-color: var(--primary); color: var(--surface); } .btn-primary:hover { background-color: var(--primary-hover); } .btn-secondary { background-color: var(--secondary); color: var(--text); } .btn-secondary:hover { background-color: var(--secondary-hover); } .btn-icon { background: transparent; color: var(--muted); padding: var(--space-xxs) var(--space-xs); font-size: 1.25rem; min-width: 36px; min-height: 36px; } .btn-icon:hover { color: var(--danger); background-color: var(--surface-alt); } .btn-sm { font-size: 0.875rem; padding: var(--space-xxs) var(--space-xs); min-height: 36px; } .btn-block { width: 100%; } /* ---------- Forms ---------- */ .form-group { margin-bottom: var(--space-sm); } .form-group label { display: block; font-family: var(--font-ui); font-size: 0.9rem; font-weight: 500; margin-bottom: var(--space-xxs); color: var(--text); } .form-help { display: block; font-size: 0.8rem; color: var(--muted); margin-top: var(--space-xxs); } input[type="text"], input[type="password"], input[type="email"], input[type="number"], input[type="file"], textarea, select { width: 100%; padding: var(--space-xs) var(--space-sm); font-family: var(--font-body); font-size: 1rem; line-height: var(--line-height); color: var(--text); background-color: var(--surface-alt); border: 1px solid var(--border); border-radius: 6px; transition: border-color 0.15s ease; } input:focus, textarea:focus, select:focus { outline: none; border-color: var(--primary); outline: 3px solid var(--focus); outline-offset: 1px; } textarea { resize: vertical; min-height: 60px; } /* ---------- Bullets Section ---------- */ .bullets-section { margin: var(--space-sm) 0; } .bullets-list { display: flex; flex-direction: column; gap: var(--space-xs); margin-bottom: var(--space-xs); } .bullet-item { background-color: var(--surface-alt); border: 1px solid var(--border); border-radius: 6px; padding: var(--space-xs); } .bullet-item__row { display: flex; gap: var(--space-xxs); align-items: center; flex-wrap: wrap; } .bullet-item__type, .bullet-item__symbol, .bullet-item__status { width: auto; min-width: 60px; padding: var(--space-xxs) var(--space-xs); font-size: 0.85rem; } .bullet-item__text { flex: 1; min-width: 120px; } /* ---------- Gratitude ---------- */ .gratitude-section { margin: var(--space-sm) 0; } .gratitude-grid { display: grid; grid-template-columns: 1fr; gap: var(--space-xs); } @media (min-width: 480px) { .gratitude-grid { grid-template-columns: repeat(3, 1fr); } } .gratitude-item { display: flex; flex-direction: column; gap: var(--space-xxs); } .gratitude-item label { font-family: var(--font-ui); font-size: 0.85rem; color: var(--muted); } .gratitude-item input { padding: var(--space-xxs) var(--space-xs); } /* ---------- Sleep ---------- */ .sleep-section { margin: var(--space-sm) 0; } .sleep-grid { display: grid; grid-template-columns: 1fr; gap: var(--space-xs); } @media (min-width: 480px) { .sleep-grid { grid-template-columns: repeat(3, 1fr); } } .sleep-item { display: flex; flex-direction: column; gap: var(--space-xxs); } .sleep-item label { font-family: var(--font-ui); font-size: 0.85rem; color: var(--muted); } .sleep-item input, .sleep-item select { padding: var(--space-xxs) var(--space-xs); } /* ---------- Mood ---------- */ .mood-section { margin: var(--space-sm) 0; } .mood-selector { display: flex; flex-direction: column; gap: var(--space-xxs); } .mood-selector label { font-family: var(--font-ui); font-size: 0.9rem; color: var(--text); } .mood-selector select { padding: var(--space-xs) var(--space-sm); } /* ---------- Logs List ---------- */ .logs-list { display: flex; flex-direction: column; gap: var(--space-xs); } .log-list-item { display: flex; gap: var(--space-sm); padding: var(--space-sm); background-color: var(--surface-alt); border: 1px solid var(--border); border-radius: 6px; text-decoration: none; color: var(--text); transition: background-color 0.15s ease; } .log-list-item:hover, .log-list-item:focus-visible { background-color: var(--surface-strong); } .log-list-item:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; } .log-list-item__date { flex-shrink: 0; font-family: var(--font-ui); font-size: 0.85rem; color: var(--muted); min-width: 70px; } .log-list-item__preview { flex: 1; min-width: 0; } .log-list-item__prompt { font-size: 0.9rem; color: var(--text); margin-bottom: var(--space-xxs); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .log-list-item__meta { display: flex; gap: var(--space-sm); font-size: 0.8rem; color: var(--muted); } /* ---------- Settings ---------- */ .settings-fieldset { border: 1px solid var(--border); border-radius: 6px; padding: var(--space-sm); margin-bottom: var(--space-sm); } .settings-fieldset legend { font-family: var(--font-ui); font-size: 1rem; font-weight: 600; color: var(--text); padding: 0 var(--space-xxs); } .import-form { margin-top: var(--space-sm); } /* ---------- Flash Messages ---------- */ .flash-message { padding: var(--space-xs) var(--space-sm); border-radius: 6px; margin-bottom: var(--space-sm); font-size: 0.9rem; } .flash-message.error { background-color: var(--danger); color: var(--surface); border: 1px solid var(--border); } .flash-message.success { background-color: var(--success); color: var(--surface); border: 1px solid var(--border); } .flash-message.info { background-color: var(--accent-2); color: var(--text); border: 1px solid var(--border); } /* ---------- Empty State ---------- */ .empty-state { text-align: center; padding: var(--space-lg); color: var(--muted); } .empty-state a { color: var(--primary); text-decoration: underline; } /* ---------- Page Footer Text ---------- */ .page-footer-text { text-align: center; padding: var(--space-sm); font-size: 0.85rem; color: var(--muted); } .page-footer-text a { color: var(--primary); } /* ---------- Typography Helpers ---------- */ .text-muted { color: var(--muted); } .text-small { font-size: 0.85rem; } /* ---------- Accessibility ---------- */ @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; scroll-behavior: auto !important; } } /* Focus visible for keyboard navigation */ a:focus-visible, button:focus-visible, input:focus-visible, textarea:focus-visible, select:focus-visible { outline: 3px solid var(--focus); outline-offset: 2px; } /* High contrast / zoom support */ @media (zoom: 200%) { body { font-size: 2em; } } /* ---------- Screen reader only ---------- */ .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; }