:root{--col:30px;--label:178px;--row:30px;--paper:#f6f5f0;--panel:#fffefb;--ink:#1f3a8a;--text:#1a1a1a;--muted:#8a8a82;--line:#dcdad0;--line-strong:#c7c4b6;--weekend:#efeee7;--accent-soft:#e7ecfb;--today:#dfe7fb;--danger:#b23b3b}@media (prefers-color-scheme:dark){:root{--paper:#14161a;--panel:#1a1d22;--ink:#8fa9ff;--text:#e7e7e2;--muted:#7c7f86;--line:#2a2e35;--line-strong:#3a3f48;--weekend:#191c21;--accent-soft:#232a3d;--today:#26314d;--danger:#e07a7a}}*{box-sizing:border-box}body,html{margin:0;padding:0;background:var(--paper);color:var(--text);font-family:ui-monospace,SF Mono,SFMono-Regular,Menlo,Consolas,monospace;-webkit-font-smoothing:antialiased;font-size:14px}button{font-family:inherit;font-size:inherit;cursor:pointer}.wrap{max-width:1180px;margin:0 auto;padding:28px 20px 80px}.topbar{display:flex;align-items:baseline;justify-content:space-between;gap:16px;flex-wrap:wrap;margin-bottom:6px}.brand{font-size:20px;font-weight:700;letter-spacing:-.02em}.brand .dot{color:var(--ink)}.tagline{color:var(--muted);font-size:12px;margin:2px 0 22px}.monthbar{display:flex;align-items:center;gap:12px;margin-bottom:18px;flex-wrap:wrap}.month-title{font-size:17px;font-weight:700;min-width:190px}.navbtn{border:1px solid var(--line-strong);background:var(--panel);color:var(--text);width:30px;height:30px;border-radius:6px;line-height:1}.navbtn:hover{border-color:var(--ink);color:var(--ink)}.today-link{background:none;border:none;color:var(--ink);padding:0 4px;text-decoration:underline;font-size:12px}.spacer{flex:1 1 auto}.startctl{display:inline-flex;align-items:center;gap:6px;font-size:12px;color:var(--muted)}.startctl select{font-family:inherit;font-size:12px;color:var(--text);background:var(--panel);border:1px solid var(--line-strong);border-radius:6px;padding:3px 6px}.startctl select:hover{border-color:var(--ink)}.action{border:1px solid var(--line-strong);background:var(--panel);color:var(--text);padding:6px 12px;border-radius:6px}.action:hover{border-color:var(--ink);color:var(--ink)}.action.primary{background:var(--ink);color:#fff;border-color:var(--ink)}.action.primary:hover{opacity:.9;color:#fff}.board{background:var(--panel);border:1px solid var(--line-strong);border-radius:10px;overflow-x:auto;overflow-y:hidden}.board-inner{min-width:max-content}.grid-row{display:grid;grid-template-columns:var(--label) repeat(var(--days),var(--col));border-bottom:1px solid var(--line)}.grid-row:last-child{border-bottom:none}.corner,.rowlabel{position:-webkit-sticky;position:sticky;left:0;z-index:2;background:var(--panel);border-right:1px solid var(--line-strong);display:flex;align-items:center;padding:0 10px;height:var(--row);overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.head-row .cell{color:var(--muted);font-size:11px}.head-num{font-weight:700;color:var(--text)}.head-row.dow .cell{font-size:10px}.cell{height:var(--row);display:flex;align-items:center;justify-content:center;border-right:1px solid var(--line);font-size:12px}.cell.weekend{background:var(--weekend)}.cell:last-child{border-right:none}.today{background:var(--today);box-shadow:inset 1px 0 0 0 var(--ink),inset -1px 0 0 0 var(--ink)}.head-num.today{color:var(--ink);font-weight:700}.pre{opacity:.35}.habit-cell:disabled{pointer-events:none}.habit-cell{background:none;border:none;border-right:1px solid var(--line);height:var(--row);width:100%;padding:0;color:var(--ink);font-size:15px;line-height:1}.habit-cell:hover{background:var(--accent-soft)}.habit-cell.done{font-weight:700}.habit-cell.weekend{background:var(--weekend)}.habit-cell.weekend:hover{background:var(--accent-soft)}.rowlabel.editable{position:relative;gap:6px}.rowlabel .hname{flex:1 1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:14px;cursor:pointer}.rowlabel .rmv{border:none;background:none;color:var(--muted);font-size:15px;padding:0 2px;line-height:1;visibility:hidden}.grid-row:hover .rowlabel .rmv{visibility:visible}.rowlabel .rmv:hover{color:var(--danger)}.rowlabel.editable .rmv{position:absolute;right:8px;top:50%;transform:translateY(-50%)}.hname-input{flex:1 1;min-width:0;border:none;background:transparent;color:var(--text);font-family:inherit;font-size:13px;padding:2px 0;border-bottom:1px solid var(--ink);outline:none}.add-habit{display:flex;align-items:center;height:var(--row);padding:0 10px;color:var(--muted)}.add-habit button{border:none;background:none;color:var(--ink);padding:0;font-size:12px}.section-gap{height:10px;background:transparent;border:none}.metric{position:relative;border-top:1px solid var(--line-strong)}.metric-header .rowlabel,.metric-name{flex-direction:column;align-items:flex-start;justify-content:center;gap:0}.metric-name .name{font-weight:700}.metric-name .avg{color:var(--ink);font-size:12px;margin-top:1px}.metric-header .headfill{grid-column:2/-1;height:var(--row);background:var(--panel)}.vlabel{justify-content:flex-end;gap:6px}.vnum{font-feature-settings:"tnum";font-variant-numeric:tabular-nums;color:var(--muted)}.vnum.editable{cursor:pointer}.vnum.editable:hover{color:var(--ink)}.val-row .rmv{border:none;background:none;color:var(--muted);font-size:15px;padding:0 2px;line-height:1;visibility:hidden}.val-row:hover .rmv{visibility:visible}.val-row .rmv:hover{color:var(--danger)}.addval button{color:var(--ink)}.metric-line{position:absolute;left:var(--label);top:var(--row);z-index:1;pointer-events:none;display:block}.foot{margin-top:26px;color:var(--muted);font-size:12px;line-height:1.6}.foot a{color:var(--ink)}.pill{display:inline-block;border:1px solid var(--line-strong);border-radius:999px;padding:1px 8px;font-size:11px}.loading,.pill{color:var(--muted)}.loading{padding:40px 0}.print-heading{display:none}@media print{@page{size:landscape;margin:12mm}:root{--paper:#fff;--panel:#fff;--ink:#000;--text:#000;--muted:#555;--line:#999;--line-strong:#444;--weekend:#f0f0f0;--today:#fff;--col:24px;--row:24px}.add-habit,.foot,.monthbar,.rmv,.tagline,.topbar{display:none!important}.print-heading{display:block;font-weight:700;font-size:16px;margin-bottom:10px}.board{border:none;border-radius:0;overflow:visible}.board-inner{min-width:0}.corner,.rowlabel{position:static}body.print-blank .habit-cell{color:transparent!important}body.print-blank .metric-line{display:none!important}}