/* =============================== LIGHT MODE (default) — colors only =============================== */ :root { --bg: #f6f7fb; --panel: #ffffff; --ink: #111; --ink-rgb: 17, 17, 17; --muted: #888; --weekend: #888; --firstday: #000; --label-bg: #fafbfe; --label-bg-rgb: 250, 251, 254; } /* WINTER — cool gray-blue hue, light-dark-light */ .cell.dec { background: hsl(220 20% 95%) } /* light */ .cell.jan { background: hsl(220 20% 88%) } /* dark */ .cell.feb { background: hsl(220 20% 95%) } /* light */ /* SPRING — fresh green hue, dark-light-dark */ .cell.mar { background: hsl(125 60% 88%) } /* dark */ .cell.apr { background: hsl(125 60% 95%) } /* light */ .cell.may { background: hsl(125 60% 88%) } /* dark */ /* SUMMER — golden yellow-brown hue, light-dark-light */ .cell.jun { background: hsl(45 85% 95%) } /* light */ .cell.jul { background: hsl(45 85% 88%) } /* dark */ .cell.aug { background: hsl(45 85% 95%) } /* light */ /* AUTUMN — red-orange hue, dark-light-dark */ .cell.sep { background: hsl(18 78% 88%) } /* dark */ .cell.oct { background: hsl(18 78% 95%) } /* light */ .cell.nov { background: hsl(18 78% 88%) } /* dark */ /* =============================== DARK MODE — colors only =============================== */ @media (prefers-color-scheme: dark) { :root { --bg: radial-gradient(1200px 800px at 20% -10%, #1c2130 0%, #0c0f16 35%, #0a0b11 100%); --panel: #111318; --ink: #ddd; --ink-rgb: 221, 221, 221; --muted: #888; --weekend: #999; --firstday: #fff; --label-bg: #1a1d25; --label-bg-rgb: 26, 29, 37; } /* WINTER — cool gray-blue hue, light-dark-li666ght */ .cell.dec { background: hsl(220 20% 22%) } /* light */ .cell.jan { background: hsl(220 20% 16%) } /* dark */ .cell.feb { background: hsl(220 20% 22%) } /* light */ /* SPRING — fresh green hue, dark-light-dark */ .cell.mar { background: hsl(125 40% 18%) } /* dark */ .cell.apr { background: hsl(125 40% 26%) } /* light */ .cell.may { background: hsl(125 40% 18%) } /* dark */ /* SUMMER — golden yellow-brown hue, light-dark-light */ .cell.jun { background: hsl(45 70% 24%) } /* light */ .cell.jul { background: hsl(45 70% 18%) } /* dark */ .cell.aug { background: hsl(45 70% 24%) } /* light */ /* AUTUMN — red-orange hue, dark-light-dark */ .cell.sep { background: hsl(18 70% 18%) } /* dark */ .cell.oct { background: hsl(18 70% 26%) } /* light */ .cell.nov { background: hsl(18 70% 18%) } /* dark */ } /* =============================== Base layout & typography (mode-agnostic) =============================== */ :root { --gap: 0; --row-h: 2.2em; --w-label: 3em; --w-cell: 3em; --overlay-w: 3rem; /* extra right-side strip for month labels */ --week-row-h: 4em; } * { box-sizing: border-box } body { margin: 0; font: 500 14px/1.2 ui-sans-serif, system-ui, -apple-system, Segoe UI, Roboto, Inter, Arial; background: var(--bg); color: var(--ink); } .wrap { width: fit-content; max-width: none; margin: 2rem auto; background: var(--panel); height: calc(100vh - 4rem); display: flex; flex-direction: column; min-width: calc(var(--w-label) + 7 * var(--w-cell) + 2.4rem); /* Account for padding */ } header { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: .75rem; flex-shrink: 0; } .header-controls { display: flex; align-items: center; gap: 0.75rem; } .date-input { background: var(--panel); color: var(--ink); border: 1px solid var(--muted); padding: 0.5em 0.75em; border-radius: 0.25rem; font-weight: 500; font-size: 0.9rem; min-width: 120px; font-family: ui-monospace, 'Cascadia Code', 'Source Code Pro', Menlo, monospace; } .date-input.clean-input { background: transparent; border: none; padding: 0.5em 0; color: var(--ink); } .date-input:focus { outline: none; border-color: var(--ink); } .date-input.clean-input:focus { outline: none; border: none; } .today-button { background: var(--ink); color: var(--panel); border: none; padding: 0.5em 1em; border-radius: 0.25rem; font-weight: 600; font-size: 0.9rem; cursor: pointer; transition: opacity 0.2s ease; } .today-button:hover { opacity: 0.8; } .calendar-header { display: grid; grid-template-columns: var(--w-label) repeat(7, var(--w-cell)) var(--overlay-w); gap: 0; border-bottom: .1em solid var(--muted); flex-shrink: 0; } .calendar-container { flex: 1; overflow: hidden; position: relative; width: 100%; display: flex; } .calendar-viewport { height: 100%; overflow-y: auto; overflow-x: hidden; flex: 0 0 auto; width: calc(var(--w-label) + 7 * var(--w-cell) + var(--overlay-w)); /* Hide scrollbar */ scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE/Edge */ } .calendar-viewport::-webkit-scrollbar { display: none; /* Chrome/Safari/Webkit */ } .jogwheel-viewport { position: absolute; top: 0; right: 0; bottom: 0; width: var(--overlay-w); height: 100%; overflow-y: auto; overflow-x: hidden; /* Hide scrollbar */ scrollbar-width: none; /* Firefox */ -ms-overflow-style: none; /* IE/Edge */ z-index: 20; /* Above calendar content and labels */ } .jogwheel-viewport::-webkit-scrollbar { display: none; /* Chrome/Safari/Webkit */ } .jogwheel-content { position: relative; width: 100%; background: transparent; } .calendar-content { position: relative; } .week-row { display: grid; grid-template-columns: var(--w-label) repeat(7, var(--w-cell)) var(--overlay-w); gap: 0; position: relative; overflow: visible; height: var(--week-row-h); } /* Ensure children match the fixed week height */ .week-row .cell, .week-row .week-label { height: var(--week-row-h); } header h1 { margin: 0; font-size: 1rem; } .dow-label, .week-label { display: grid; place-items: center; width: var(--w-label); height: var(--row-h); color: var(--muted); } .dow { text-transform: uppercase; } .cell { display: grid; place-items: center; width: var(--w-cell); height: var(--row-h); font-weight: 700; margin: 0; padding: 0; border: 1px transparent; cursor: pointer; transition: background-color 0.15s ease; } .cell:hover { background: rgba(var(--ink-rgb, 17, 17, 17), 0.1); } .weekend { color: var(--weekend) } .firstday { color: var(--firstday); text-shadow: 0 0 .1em var(--ink) } .today h1 { background: var(--ink) !important; color: var(--panel) !important; border-radius: 0.25rem; font-weight: 700; cursor: pointer; } .selected, .range-start, .range-end, .range-middle, .range-single { background: var(--weekend) !important; } .selected h1 { background: transparent !important; color: var(--panel) !important; font-weight: 700; cursor: pointer; } .range-start h1, .range-end h1, .range-middle h1, .range-single h1 { background: transparent !important; color: var(--panel) !important; font-weight: 700; cursor: pointer; } .cell h1 { cursor: inherit !important; /* Inherit cursor from parent cell */ padding: 0.25em; margin: 0; border-radius: 0.25rem; transition: background-color 0.15s ease; font-size: 1em; } .cell h1:hover { background: var(--muted); color: var(--panel); } /* =============================== JOGWHEEL MONTH LABELS =============================== */ .month-name-label { grid-column: -2 / -1; /* last overlay column */ font-size: 2em; font-weight: 700; color: var(--muted); display: flex; align-items: center; /* center in container */ justify-content: center; pointer-events: none; z-index: 15; overflow: visible; position: absolute; top: 0; right: 0; width: var(--overlay-w); } .month-name-label > span { display: inline-block; white-space: nowrap; writing-mode: vertical-rl; text-orientation: mixed; transform: rotate(180deg); transform-origin: center; }