/* Layout variables */ :root { /* Layout */ --row-h: 2.2em; --label-w: minmax(4em, 8%); --cell-w: 1fr; --cell-h: clamp(4em, 8vh, 8em); --overlay-w: minmax(3rem, 5%); } /* Layout & typography */ * { 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: 100%; margin: 0; background: var(--panel); height: 100vh; display: flex; flex-direction: column; padding: 1rem; white-space: pre-wrap; } header { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: .75rem; flex-shrink: 0; } .header-controls { display: flex; align-items: center; gap: .75rem; } .today-date { cursor: pointer } .today-date::first-line { color: var(--today) } .today-button:hover { opacity: .8 } /* Header row */ .calendar-header, #calendar-header { display: grid; grid-template-columns: var(--label-w) repeat(7, var(--cell-w)) var(--overlay-w); border-bottom: .1em solid var(--muted); align-items: last baseline; flex-shrink: 0; width: 100%; } .calendar-header .dow-label { display:grid; place-items:center; height: var(--cell-h); color: var(--muted) } .overlay-header-spacer { grid-column: -2 / -1 } /* Main container */ .calendar-container, #calendar-container { flex: 1; overflow: hidden; position: relative; width: 100%; display: flex; } /* Viewports (support id or class) */ .calendar-viewport, #calendar-viewport { height: 100%; overflow-y: auto; overflow-x: hidden; flex: 1; width: 100%; scrollbar-width: none; } .calendar-viewport::-webkit-scrollbar, #calendar-viewport::-webkit-scrollbar { display: none } .jogwheel-viewport, #jogwheel-viewport { position: absolute; top: 0; right: 0; bottom: 0; width: var(--overlay-w); overflow-y: auto; overflow-x: hidden; scrollbar-width: none; z-index: 20; cursor: ns-resize; } .jogwheel-viewport::-webkit-scrollbar, #jogwheel-viewport::-webkit-scrollbar { display: none } .jogwheel-content, #jogwheel-content { position: relative; width: 100% } .calendar-content, #calendar-content { position: relative } /* Week row: label + 7-day grid + jogwheel column */ .week-row { display: grid; grid-template-columns: var(--label-w) repeat(7, var(--cell-w)) var(--overlay-w); position: relative; overflow: visible; height: var(--cell-h); scroll-snap-align: start; width: 100%; } /* Label cells */ .dow-label, .week-label { display: grid; place-items: center; width: 100%; height: var(--cell-h); color: var(--muted); cursor: ns-resize; font-size: 1.2em; } /* 7-day grid inside each week row */ .week-row > .days-grid { grid-column: 2 / span 7; display: grid; grid-template-columns: repeat(7, 1fr); grid-auto-rows: 1fr; position: relative; height: 100%; width: 100%; } /* Overlay sitting above the day cells, same 7-col grid */ .week-row > .days-grid > .week-overlay { margin-top: 1.2em; position: absolute; inset: 0; pointer-events: none; display: grid; grid-template-columns: repeat(7, 1fr); grid-auto-rows: 1fr; z-index: 15; } .month-name-label { grid-column: -2 / -1; font-size: 2em; font-weight: 700; color: var(--muted); display: flex; align-items: center; justify-content: center; pointer-events: none; z-index: 15; overflow: visible; position: absolute; top: 0; right: 0; width: 100%; } .month-name-label > span { display: inline-block; white-space: nowrap; writing-mode: vertical-rl; text-orientation: mixed; transform: rotate(180deg); transform-origin: center; }