:root{--bg: #f5f6f8;--panel: #fff;--text: #1b1f24;--muted: #6b7380;--line: #e2e5ea;--we: #eef0f3;--accent: #2f6fed;--danger: #d33;--today: #ffd54a;color-scheme:light dark}@media (prefers-color-scheme: dark){:root{--bg: #14171b;--panel: #1d2127;--text: #e8eaed;--muted: #9aa3b0;--line: #2d333b;--we: #252a31}}*{box-sizing:border-box}body{margin:0;background:var(--bg);color:var(--text);font:15px/1.4 system-ui,-apple-system,Segoe UI,sans-serif}button,input,select{font:inherit;color:inherit}.app{max-width:1280px;margin:0 auto;padding:12px 16px 40px}.top{display:flex;align-items:center;gap:16px;flex-wrap:wrap;margin-bottom:12px}.top h1{font-size:20px;margin:0;flex:1 1 auto}.tabs{display:flex;background:var(--panel);border:1px solid var(--line);border-radius:10px;overflow:hidden}.tabs button{border:0;background:none;padding:7px 14px;cursor:pointer}.tabs button.on{background:var(--accent);color:#fff}.btn{border:1px solid var(--line);background:var(--panel);border-radius:8px;padding:6px 12px;cursor:pointer}.btn:hover{border-color:var(--accent)}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.danger{color:var(--danger)}.btn.ghost{background:none}.btn:disabled,.choice:disabled{opacity:.5;cursor:default}.icon-btn{border:0;background:none;font-size:24px;line-height:1;cursor:pointer;color:var(--muted)}.link{border:0;background:none;color:var(--accent);cursor:pointer;padding:0}.error{color:var(--danger)}.banner{background:var(--panel);border:1px solid var(--danger);padding:8px 12px;border-radius:8px}.hint{color:var(--muted);font-size:13px;margin:6px 0}.toolbar{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin:12px 0 8px}.nav{display:flex;align-items:center;gap:8px}.nav h2{margin:0 6px;font-size:18px;min-width:150px;text-align:center}.vcards{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px}.vcard{background:var(--panel);border:1px solid var(--line);border-top:4px solid;border-radius:12px;padding:12px 14px}.vcard-head{display:flex;justify-content:space-between;align-items:baseline}.vcard-year{color:var(--muted);font-size:13px}.vcard-main{display:flex;align-items:baseline;gap:10px;margin:4px 0 8px}.vcard-rest{font-size:34px;font-weight:700;line-height:1}.vcard-rest.neg{color:var(--danger)}.vcard-of{color:var(--muted);display:flex;align-items:center;gap:6px}.allow{width:56px;text-align:center;border:1px solid var(--line);background:var(--bg);border-radius:6px;padding:3px}.bar{height:8px;background:var(--we);border-radius:4px;overflow:hidden}.bar>div{height:100%;border-radius:4px;transition:width .2s}.vcard-foot{color:var(--muted);font-size:13px;margin-top:6px}.grid-wrap{overflow-x:auto;background:var(--panel);border:1px solid var(--line);border-radius:12px}.grid{border-collapse:collapse;width:100%;-webkit-user-select:none;user-select:none}.grid th,.grid td{border:1px solid var(--line);text-align:center;padding:0}.grid .name-col{position:sticky;left:0;background:var(--panel);z-index:1;text-align:left;padding:0 12px;min-width:110px;white-space:nowrap;font-weight:600}.dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:8px}.kw{font-size:11px;color:var(--muted);font-weight:500;height:20px}.day{min-width:32px;font-weight:500;padding:3px 0}.day .wd{display:block;font-size:11px;color:var(--muted)}.day .dn{display:block}.day.we,.cell.we{background:var(--we)}.day.today{box-shadow:inset 0 -3px 0 var(--today)}.cell{height:40px;cursor:pointer;font-size:13px;font-weight:600}.cell.today{box-shadow:inset 2px 0 0 var(--today),inset -2px 0 0 var(--today)}.cell.sel{outline:2px solid var(--accent);outline-offset:-2px;position:relative}.cell:hover{filter:brightness(.94)}.legend{display:flex;gap:16px;flex-wrap:wrap;list-style:none;padding:0;margin:12px 0 0}.legend li{display:flex;align-items:center;gap:6px}.legend em{color:var(--muted);font-style:normal;font-size:13px}.swatch{display:inline-grid;place-items:center;width:22px;height:22px;border-radius:5px;font-size:12px;font-weight:600}.year{display:grid;gap:14px}.year-person h3{margin:0 0 6px;font-size:16px}.ygrid{border-collapse:collapse;width:100%}.ygrid th{text-align:left;padding:0 8px;font-weight:500;width:44px;font-size:13px}.ygrid td{border:1px solid var(--line);height:17px;min-width:14px}.ygrid td.we{background:var(--we)}.ygrid td.void{background:var(--bg)}.ygrid td.today{outline:2px solid var(--today);outline-offset:-2px}.backdrop{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:grid;place-items:center;padding:16px;z-index:10}.dialog{background:var(--panel);border-radius:14px;padding:18px;width:min(480px,100%);max-height:100%;overflow:auto}.dialog-head{display:flex;justify-content:space-between;align-items:center}.dialog h2{margin:0;font-size:18px}.form-row{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin:12px 0 0}.form-row label{display:grid;gap:4px;font-size:13px;color:var(--muted)}.form-row input,.form-row select{border:1px solid var(--line);background:var(--bg);border-radius:8px;padding:6px 8px;min-width:0}.choices{display:grid;gap:8px;margin-top:12px}.choice{border:0;border-radius:10px;padding:12px 14px;cursor:pointer;text-align:left;display:flex;flex-direction:column;gap:2px}.choice small{opacity:.9}.choice.clear{background:var(--we);color:var(--text)}.choice:hover:not(:disabled){filter:brightness(.93)}.panel{background:var(--panel);border:1px solid var(--line);border-radius:12px;padding:14px 16px;margin-bottom:14px}.panel h2{margin:0 0 4px;font-size:17px}.srow{display:flex;align-items:center;gap:10px;padding:6px 0;flex-wrap:wrap}.srow.add{border-top:1px solid var(--line);margin-top:6px;padding-top:12px}.srow input[type=color]{width:38px;height:34px;padding:2px;border:1px solid var(--line);border-radius:8px;background:none;cursor:pointer}.srow input:not([type]),.srow input[type=text]{border:1px solid var(--line);background:var(--bg);border-radius:8px;padding:6px 10px}.grow{flex:1 1 160px;min-width:0}.check{display:flex;align-items:center;gap:6px;color:var(--muted);font-size:14px;white-space:nowrap}.login{min-height:100vh;display:grid;place-items:center;padding:16px}.login .panel{width:min(340px,100%);display:grid;gap:12px}.login h1{margin:0;font-size:20px}.login input{border:1px solid var(--line);background:var(--bg);border-radius:8px;padding:8px 10px}@media (max-width: 640px){.app{padding:10px 12px 32px}.form-row{grid-template-columns:1fr}.cell{height:44px}.grid .name-col{min-width:84px;padding:0 8px}.nav h2{min-width:0;font-size:16px}}.months{display:grid;gap:14px}.month-title{margin:0 0 6px;font-size:15px}.seg{display:flex;background:var(--panel);border:1px solid var(--line);border-radius:8px;overflow:hidden}.seg button{border:0;background:none;padding:6px 10px;cursor:pointer;font-size:14px}.seg button.on{background:var(--accent);color:#fff}.grid.multi{width:max-content;min-width:100%}.grid.multi .day{width:34px;min-width:34px}.grid.compact .cell{height:28px;font-size:12px}.grid.compact .name-col{padding:0 8px;font-size:14px}.toolbar .nav{flex-wrap:wrap}@media (max-width: 640px){.grid.multi .day{width:32px;min-width:32px}.seg button{padding:6px 8px;font-size:13px}}.tip{position:fixed;z-index:20;transform:translate(-50%,calc(-100% - 8px));pointer-events:none;background:#1b1f24;color:#fff;border-radius:8px;padding:6px 10px;font-size:13px;line-height:1.35;display:grid;gap:1px;white-space:nowrap;box-shadow:0 4px 14px #00000059}.tip span{opacity:.8}.tip .tip-act{opacity:1;display:flex;align-items:center;gap:6px;font-weight:600}.tip i{width:10px;height:10px;border-radius:3px;display:inline-block}.ygrid td:hover{outline:2px solid var(--accent);outline-offset:-2px}
