/* ========================================================= raycer - monotone, thin-line aesthetic colors driven by CSS custom properties; per-user accent ========================================================= */ :root { --bg: #fafafa; --bg-elev: #ffffff; --fg: #0a0a0a; --fg-mute: #6b6b6b; --fg-faint: #b8b8b8; --line: #d8d8d8; --line-strong: #1a1a1a; --accent-ray: #c47a1c; --accent-cer: #1c8a8a; --accent: var(--accent-ray); --hairline: 1px; --radius: 2px; --gap-1: 4px; --gap-2: 8px; --gap-3: 16px; --gap-4: 24px; --gap-5: 32px; --font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Inter, Roboto, "Helvetica Neue", Arial, sans-serif; --font-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, Monaco, Consolas, monospace; } :root[data-theme="dark"], :root:not([data-theme]) { --bg: #0a0a0a; --bg-elev: #131313; --fg: #f3f3f3; --fg-mute: #8a8a8a; --fg-faint: #3a3a3a; --line: #2a2a2a; --line-strong: #e8e8e8; } @media (prefers-color-scheme: light) { :root:not([data-theme]) { --bg: #fafafa; --bg-elev: #ffffff; --fg: #0a0a0a; --fg-mute: #6b6b6b; --fg-faint: #b8b8b8; --line: #d8d8d8; --line-strong: #1a1a1a; } } :root[data-theme="light"] { --bg: #fafafa; --bg-elev: #ffffff; --fg: #0a0a0a; --fg-mute: #6b6b6b; --fg-faint: #b8b8b8; --line: #d8d8d8; --line-strong: #1a1a1a; } body[data-user="ray"] { --accent: var(--accent-ray); } body[data-user="cer"] { --accent: var(--accent-cer); } * { box-sizing: border-box; } html, body { margin: 0; padding: 0; background: var(--bg); color: var(--fg); font-family: var(--font-sans); font-size: 15px; line-height: 1.4; -webkit-font-smoothing: antialiased; -webkit-tap-highlight-color: transparent; } body { min-height: 100dvh; overscroll-behavior: none; } a { color: inherit; text-decoration: none; } button { font: inherit; color: inherit; } #app { min-height: 100dvh; display: flex; flex-direction: column; } /* ---- Landing ---- */ .landing { flex: 1; display: flex; flex-direction: column; align-items: center; justify-content: center; gap: var(--gap-4); padding: var(--gap-5); } .landing__sub { color: var(--fg-mute); font-size: 12px; letter-spacing: 0.18em; text-transform: uppercase; margin: 0; } .brand { display: inline-flex; align-items: baseline; gap: var(--gap-2); font-family: var(--font-mono); font-weight: 300; letter-spacing: -0.02em; user-select: none; } .brand--xl { font-size: clamp(48px, 14vw, 132px); } .brand--sm { font-size: 18px; gap: 2px; } .brand__user { display: inline-block; padding: 0 0.18em; border-bottom: var(--hairline) solid transparent; transition: color 120ms ease, border-color 120ms ease; color: var(--fg-mute); } .brand--xl .brand__user { padding: 0.1em 0.35em; border: var(--hairline) solid var(--line); color: var(--fg); } .brand--xl .brand__user--ray:hover, .brand--xl .brand__user--ray:focus-visible { color: var(--accent-ray); border-color: var(--accent-ray); outline: none; } .brand--xl .brand__user--cer:hover, .brand--xl .brand__user--cer:focus-visible { color: var(--accent-cer); border-color: var(--accent-cer); outline: none; } .brand__slash { color: var(--fg-faint); font-weight: 200; } body[data-user="ray"] .brand__user[data-brand="ray"] { color: var(--accent-ray); } body[data-user="cer"] .brand__user[data-brand="cer"] { color: var(--accent-cer); } /* ---- Topbar ---- */ .topbar { display: flex; align-items: center; justify-content: space-between; padding: var(--gap-3); border-bottom: var(--hairline) solid var(--line); } .topbar__meta { display: flex; align-items: center; gap: var(--gap-3); font-family: var(--font-mono); font-size: 12px; color: var(--fg-mute); letter-spacing: 0.06em; } .countdown { text-transform: uppercase; } .iconbtn { background: transparent; border: var(--hairline) solid var(--line); border-radius: var(--radius); padding: 4px 8px; font-family: var(--font-mono); font-size: 11px; color: var(--fg-mute); letter-spacing: 0.08em; text-transform: uppercase; cursor: pointer; } .iconbtn:hover { color: var(--fg); border-color: var(--fg-mute); } /* ---- Stats ---- */ .stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 0; border-bottom: var(--hairline) solid var(--line); } .stat { padding: var(--gap-3); border-right: var(--hairline) solid var(--line); display: flex; flex-direction: column; gap: 2px; } .stat:last-child { border-right: none; } .stat__label { font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.16em; text-transform: uppercase; color: var(--fg-mute); } .stat__row { display: flex; align-items: baseline; gap: var(--gap-3); font-family: var(--font-mono); } .stat__user { display: inline-flex; align-items: baseline; gap: 6px; font-size: 13px; } .stat__user-tag { font-size: 10px; letter-spacing: 0.12em; text-transform: uppercase; color: var(--fg-mute); } .stat__user--ray .stat__user-tag { color: var(--accent-ray); } .stat__user--cer .stat__user-tag { color: var(--accent-cer); } .stat__num { font-size: 18px; color: var(--fg); } .stat__num-sub { color: var(--fg-mute); font-size: 11px; } /* ---- Calendar ---- */ .calendar-wrap { flex: 1; display: flex; flex-direction: column; min-height: 0; padding: var(--gap-3); gap: var(--gap-2); } .cal-head { display: flex; align-items: center; justify-content: space-between; padding-bottom: var(--gap-2); } .cal-title { font-family: var(--font-mono); font-size: 13px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg); } .cal-nav { display: flex; gap: var(--gap-1); } .cal-grid { flex: 1; display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); grid-auto-rows: 1fr; gap: 0; border: var(--hairline) solid var(--line); min-height: 0; } .cal-dow { display: contents; } .cal-dow__cell { padding: 4px 6px; font-family: var(--font-mono); font-size: 10px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg-mute); border-bottom: var(--hairline) solid var(--line); border-right: var(--hairline) solid var(--line); background: var(--bg-elev); } .cal-dow__cell:nth-child(7n) { border-right: none; } .cal-cell { position: relative; padding: 4px 6px; border-right: var(--hairline) solid var(--line); border-top: var(--hairline) solid var(--line); background: var(--bg); cursor: pointer; display: flex; flex-direction: column; justify-content: space-between; min-height: 56px; transition: background 120ms ease; } .cal-cell:nth-child(7n) { border-right: none; } .cal-cell:hover:not(.cal-cell--off):not(.cal-cell--future) { background: var(--bg-elev); } .cal-cell--off { background: transparent; cursor: default; opacity: 0.35; } .cal-cell--future { cursor: not-allowed; } .cal-cell--out-of-range { opacity: 0.45; } .cal-cell__date { font-family: var(--font-mono); font-size: 12px; color: var(--fg); letter-spacing: 0.04em; } .cal-cell--future .cal-cell__date, .cal-cell--out-of-range .cal-cell__date { color: var(--fg-mute); } .cal-cell--today .cal-cell__date { color: var(--accent); } .cal-cell--today { box-shadow: inset 0 0 0 var(--hairline) var(--accent); } .cal-cell__grid { align-self: flex-end; display: grid; grid-template-columns: 10px 10px; grid-template-rows: 10px 10px; gap: 2px; } .cal-cell__dot { width: 10px; height: 10px; border: var(--hairline) solid var(--fg-faint); background: transparent; border-radius: 1px; } .cal-cell__dot--on { background: var(--fg); border-color: var(--fg); } .cal-cell__dot--ray.cal-cell__dot--on { background: var(--accent-ray); border-color: var(--accent-ray); } .cal-cell__dot--cer.cal-cell__dot--on { background: var(--accent-cer); border-color: var(--accent-cer); } /* ---- Action bar ---- */ .actionbar { border-top: var(--hairline) solid var(--line); display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 0; background: var(--bg-elev); padding-bottom: env(safe-area-inset-bottom, 0); } .action { position: relative; padding: var(--gap-3) var(--gap-3); border-right: var(--hairline) solid var(--line); background: transparent; border-top: 0; border-bottom: 0; border-left: 0; display: flex; flex-direction: column; align-items: stretch; gap: var(--gap-1); cursor: pointer; text-align: left; transition: background 120ms ease; } .action:last-child { border-right: none; } .action:hover { background: var(--bg); } .action__label { font-family: var(--font-mono); font-size: 11px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg-mute); } .action__title { font-size: 16px; color: var(--fg); } .action__state { font-family: var(--font-mono); font-size: 11px; color: var(--fg-mute); letter-spacing: 0.08em; text-transform: uppercase; } .action--done { background: linear-gradient(0deg, color-mix(in srgb, var(--accent) 8%, transparent), color-mix(in srgb, var(--accent) 8%, transparent)); } .action--done .action__title { color: var(--accent); } .action--done .action__state { color: var(--accent); } .action--done::before { content: ""; position: absolute; inset: 0; border-bottom: 2px solid var(--accent); pointer-events: none; } /* ---- Popover ---- */ .popover-root { position: fixed; inset: 0; background: color-mix(in srgb, var(--bg) 60%, transparent); display: flex; align-items: center; justify-content: center; padding: var(--gap-3); z-index: 50; } .popover-root[hidden] { display: none; } .popover { background: var(--bg-elev); border: var(--hairline) solid var(--line); border-radius: var(--radius); padding: var(--gap-3); width: min(360px, 100%); display: flex; flex-direction: column; gap: var(--gap-3); } .popover__head { display: flex; align-items: baseline; justify-content: space-between; } .popover__title { font-family: var(--font-mono); font-size: 12px; letter-spacing: 0.14em; text-transform: uppercase; color: var(--fg); } .popover__close { background: none; border: none; color: var(--fg-mute); cursor: pointer; font-family: var(--font-mono); font-size: 12px; } .popover__list { display: flex; flex-direction: column; gap: var(--gap-2); } .popover__row { display: flex; align-items: center; justify-content: space-between; border: var(--hairline) solid var(--line); padding: var(--gap-2) var(--gap-3); cursor: pointer; background: transparent; text-align: left; font: inherit; color: inherit; } .popover__row:hover { border-color: var(--fg-mute); } .popover__row--on { border-color: var(--accent); color: var(--accent); } .popover__row__name { font-size: 14px; } .popover__row__state { font-family: var(--font-mono); font-size: 11px; text-transform: uppercase; letter-spacing: 0.1em; color: var(--fg-mute); } .popover__row--on .popover__row__state { color: var(--accent); } .popover__hint { font-family: var(--font-mono); font-size: 10px; color: var(--fg-mute); letter-spacing: 0.1em; text-transform: uppercase; } /* ---- Misc ---- */ .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; } @media (max-width: 640px) { .stats { grid-template-columns: 1fr 1fr; } .stat { border-bottom: var(--hairline) solid var(--line); } .stat:nth-child(2n) { border-right: none; } .actionbar { grid-template-columns: 1fr; } .action { border-right: none; border-bottom: var(--hairline) solid var(--line); } .action:last-child { border-bottom: none; } .cal-cell { min-height: 48px; } .cal-cell__grid { grid-template-columns: 8px 8px; grid-template-rows: 8px 8px; } .cal-cell__dot { width: 8px; height: 8px; } }