:root{
  --paper:#E7EAE5;
  --sheet:#F7F8F4;
  --ink:#15171C;
  --graphite:#5F656D;
  --rule:#CBD0C8;
  --marker:#D5EF3C;
  --on-marker:#15171C;
  --cobalt:#2A3CCB;
  --danger:#B3261E;
  --scrim:rgba(21,23,28,.32);
  --lift:0 1px 0 rgba(21,23,28,.04), 0 18px 40px -18px rgba(21,23,28,.35);
  color-scheme:light;
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --paper:#111318; --sheet:#1A1D24; --ink:#E8EAE3; --graphite:#9AA0A8; --rule:#2F333D;
    --marker:#CBE43A; --on-marker:#15171C; --cobalt:#9AA6FF; --danger:#FF8A80;
    --scrim:rgba(0,0,0,.55); --lift:0 18px 40px -18px rgba(0,0,0,.8);
    color-scheme:dark;
  }
}
:root[data-theme="dark"]{
  --paper:#111318; --sheet:#1A1D24; --ink:#E8EAE3; --graphite:#9AA0A8; --rule:#2F333D;
  --marker:#CBE43A; --on-marker:#15171C; --cobalt:#9AA6FF; --danger:#FF8A80;
  --scrim:rgba(0,0,0,.55); --lift:0 18px 40px -18px rgba(0,0,0,.8);
  color-scheme:dark;
}

*{box-sizing:border-box}
html,body{margin:0}
body{
  background:var(--paper); color:var(--ink);
  font:15px/1.5 "Golos Text", system-ui, sans-serif;
  -webkit-font-smoothing:antialiased;
}
button,input,textarea{font:inherit;color:inherit}
a{color:inherit}
:focus-visible{outline:2px solid var(--cobalt); outline-offset:3px; border-radius:4px}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}

.display{font-family:Tektur, "Golos Text", sans-serif; font-weight:700; font-variation-settings:"wdth" 82; letter-spacing:-.01em}
.mono{font-family:"Martian Mono", ui-monospace, monospace; font-variation-settings:"wdth" 87.5; font-size:11px; letter-spacing:0}
.label{font-family:"Martian Mono", ui-monospace, monospace; font-variation-settings:"wdth" 87.5; font-size:10.5px; font-weight:500; text-transform:uppercase; letter-spacing:.06em; color:var(--graphite); margin:0}
.hl{background:var(--marker); color:var(--on-marker); padding:0 .18em; border-radius:2px; box-decoration-break:clone; -webkit-box-decoration-break:clone}

/* ---------- buttons ---------- */
.btn{
  display:inline-flex; align-items:center; gap:8px; cursor:pointer;
  border:1px solid var(--ink); background:var(--ink); color:var(--sheet);
  padding:9px 16px; border-radius:6px; font-weight:500; font-size:14px; line-height:1.3;
  transition:transform .12s ease;
}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:transparent; color:var(--ink); border-color:var(--rule)}
.btn.ghost:hover{border-color:var(--ink)}
.btn.quiet{background:transparent; border-color:transparent; color:var(--graphite); padding-inline:8px}
.btn.quiet:hover{color:var(--ink)}
.btn.danger{background:transparent; border-color:transparent; color:var(--danger); padding-inline:0}
.btn.danger[data-armed]{text-decoration:underline; text-underline-offset:3px}
.btn .plus{font-size:17px; line-height:1; margin-top:-1px}

/* ---------- priority glyph ---------- */
.pri{display:inline-flex; align-items:flex-end; gap:2px; height:12px; vertical-align:-1px}
.pri i{display:block; width:4px; background:var(--rule); border-radius:1px}
.pri i:nth-child(1){height:5px}.pri i:nth-child(2){height:8px}.pri i:nth-child(3){height:12px}
.pri[data-p="1"] i,
.pri[data-p="2"] i:nth-child(-n+2),
.pri[data-p="3"] i:first-child{background:var(--ink)}

/* ---------- login ---------- */
.login{min-height:100vh; min-height:100dvh; display:grid; grid-template-columns:minmax(0,1.25fr) minmax(360px,.75fr)}
.login-art{padding:40px 48px; display:flex; flex-direction:column; gap:32px; justify-content:space-between; min-width:0}
.wordmark{font-size:clamp(56px,9vw,132px); line-height:.86; margin:0; font-weight:800; font-variation-settings:"wdth" 78}
.login-art svg{width:100%; max-width:620px; height:auto; display:block}
.login-caption{font-size:17px; max-width:32ch; margin:0; color:var(--graphite)}
.login-caption b{color:var(--ink); font-weight:500}
.login-side{background:var(--sheet); border-left:1px solid var(--rule); display:grid; place-items:center; padding:40px 24px}
.login-form{width:min(340px,100%)}
.login-form h2{font-size:30px; margin:0 0 28px}
.field{display:block; margin:0 0 18px; border:0; padding:0; min-width:0}
.field > span, .field > legend{display:block; font-size:13px; font-weight:500; color:var(--graphite); margin:0 0 6px; padding:0}
.input{
  width:100%; background:var(--paper); border:1px solid var(--rule); border-radius:6px;
  padding:10px 12px; font-size:15px; transition:border-color .15s, box-shadow .15s;
}
.input:focus{outline:none; border-color:var(--cobalt); box-shadow:0 0 0 3px color-mix(in srgb, var(--cobalt) 18%, transparent)}
.input[aria-invalid="true"]{border-color:var(--danger)}
textarea.input{resize:vertical; min-height:96px; line-height:1.45}
.form-error{color:var(--danger); font-size:14px; margin:-4px 0 16px; display:flex; gap:8px}
.login-form .btn{width:100%; justify-content:center; padding:12px 16px; font-size:15px; margin-top:6px}

/* login art animation */
.art-edge{fill:none; stroke-linecap:round; stroke-linejoin:round}
.art-edge.on{stroke:var(--ink); stroke-width:3; stroke-dasharray:1; stroke-dashoffset:1; animation:draw .5s ease-out forwards}
.art-edge.off{stroke:var(--graphite); stroke-width:1.75; stroke-dasharray:5 6; opacity:0; animation:fade .6s ease forwards}
.art-node{stroke-width:3; stroke:var(--ink); fill:var(--paper)}
.art-node.done{animation:fillInk .25s ease forwards}
.art-node.ready{stroke:var(--on-marker); transform-box:fill-box; transform-origin:center; animation:ready .5s cubic-bezier(.3,1.6,.5,1) forwards}
.art-node.wait{stroke:var(--graphite); stroke-width:2.5}
.art-label{font-family:"Martian Mono", monospace; font-size:11px; fill:var(--graphite); opacity:0; animation:fade .4s ease forwards}
.art-tag{opacity:0; animation:fade .4s ease forwards}
@keyframes draw{to{stroke-dashoffset:0}}
@keyframes fade{to{opacity:1}}
@keyframes fillInk{to{fill:var(--ink)}}
@keyframes ready{0%{fill:var(--paper); transform:scale(1)} 60%{fill:var(--marker); transform:scale(1.35)} 100%{fill:var(--marker); transform:scale(1)}}

/* ---------- app shell ---------- */
.topbar{position:sticky; top:0; z-index:20; background:color-mix(in srgb, var(--paper) 88%, transparent); backdrop-filter:blur(8px); border-bottom:1px solid var(--rule)}
.topbar-in{max-width:1240px; margin:0 auto; padding:0 24px; height:58px; display:flex; align-items:center; gap:28px}
.topbar.wide .topbar-in{max-width:none}
.logo{display:flex; align-items:center; gap:10px; text-decoration:none; font-size:21px}
.logo svg{flex:none}
.tabs{display:flex; gap:4px; height:100%}
.tab{display:flex; align-items:center; gap:8px; padding:0 12px; text-decoration:none; font-weight:500; color:var(--graphite); border-bottom:2px solid transparent; margin-bottom:-1px}
.tab:hover{color:var(--ink)}
.tab[aria-current="page"]{color:var(--ink); border-bottom-color:var(--ink)}
.tab .count{font-family:"Martian Mono", monospace; font-size:10.5px; background:var(--marker); color:var(--on-marker); padding:1px 6px; border-radius:10px}
.topbar .spacer{flex:1}

/* ---------- today ---------- */
.today{max-width:780px; margin:0 auto; padding:56px 24px 140px}
.today h1{font-size:clamp(36px,6.4vw,64px); line-height:.95; margin:0 0 14px}
.today .summary{margin:0 0 36px; color:var(--graphite); font-size:12px}
.today .summary b{color:var(--ink); font-weight:600}
.todo{list-style:none; margin:0; padding:0; border-top:2px solid var(--ink)}
.row{position:relative; display:grid; grid-template-columns:28px minmax(0,1fr) auto; gap:4px 16px; padding:18px 0; border-bottom:1px solid var(--rule); transition:opacity .3s ease}
.row::before{content:""; position:absolute; inset:0 -12px; background:var(--marker); opacity:0; transform-origin:left; pointer-events:none; border-radius:4px}
.row.fresh::before{animation:sweep 1.6s ease-out}
@keyframes sweep{0%{transform:scaleX(0); opacity:.55} 35%{transform:scaleX(1); opacity:.55} 100%{transform:scaleX(1); opacity:0}}
.check{position:relative; width:24px; height:24px; margin-top:1px}
.check input{position:absolute; inset:0; margin:0; opacity:0; cursor:pointer}
.check .box{position:absolute; inset:0; border:2px solid var(--ink); border-radius:5px; pointer-events:none; transition:background .15s}
.check input:checked + .box{background:var(--ink)}
.check input:checked + .box::after{content:""; position:absolute; left:6px; top:2px; width:6px; height:11px; border:solid var(--paper); border-width:0 2.5px 2.5px 0; transform:rotate(45deg)}
.check input:focus-visible + .box{outline:2px solid var(--cobalt); outline-offset:3px}
.check input:hover + .box{background:color-mix(in srgb, var(--ink) 8%, transparent)}
.check input:checked:hover + .box{background:var(--ink)}
.row-body{min-width:0; position:relative}
.row-title{font-size:17px; font-weight:500; line-height:1.35; cursor:pointer; position:relative; display:inline}
.row-title::after{content:""; position:absolute; left:0; right:0; top:55%; height:2px; background:var(--ink); transform:scaleX(0); transform-origin:left; transition:transform .38s cubic-bezier(.6,0,.3,1)}
.row.checking .row-title::after{transform:scaleX(1)}
.row.checking{opacity:.55}
.row-meta{display:flex; flex-wrap:wrap; gap:4px 14px; margin-top:6px; color:var(--graphite)}
.row-meta .proj{color:var(--ink); font-weight:500; text-transform:uppercase; letter-spacing:.04em}
.row-note{margin:6px 0 0; color:var(--graphite); font-size:14px; line-height:1.4}
.row-side{display:flex; flex-direction:column; align-items:flex-end; gap:8px; padding-top:3px; white-space:nowrap}
.row-side .mono{font-size:12px}
.fresh-tag{display:inline-block; margin-top:8px; font-size:10.5px}
.done-today{margin-top:48px}
.done-today .label{margin-bottom:10px}
.done-today .todo{border-top-width:1px; border-top-color:var(--rule)}
.done-today .row-title{color:var(--graphite); text-decoration:line-through; text-decoration-thickness:1.5px}
.done-today .row{padding:12px 0}
.empty{padding:40px 0; border-bottom:1px solid var(--rule)}
.empty p{margin:0 0 16px; max-width:44ch; font-size:17px}

/* ---------- setup ---------- */
.setup{display:grid; grid-template-columns:272px minmax(0,1fr); grid-template-rows:minmax(0,1fr); flex:1; min-height:0}
/* setup fills the viewport exactly: the map and the list scroll inside, the page never does */
body:has(.setup) #app{display:flex; flex-direction:column; height:100vh; height:100dvh; overflow:hidden}
body:has(.setup) #page{flex:1; min-height:0; display:flex; flex-direction:column}
.plist{display:flex; flex-direction:column; min-height:0; padding:28px 16px 16px 20px; border-right:1px solid var(--rule)}
.plist > .label{margin:0 0 12px 12px}
.plist .label .n{color:var(--ink)}
.pfilter{margin:0 0 10px}
.pfilter .input{padding:8px 10px; font-size:14px; background:transparent}
.pitems{flex:1; min-height:0; overflow:auto; overscroll-behavior:contain; list-style:none; margin:0 0 12px; padding:0; display:flex; flex-direction:column; gap:2px}
.pnone{margin:4px 12px 12px; color:var(--graphite); font-size:14px}
.pitem{display:block; text-decoration:none; padding:11px 12px 12px; border-radius:6px}
.pitem:hover{background:color-mix(in srgb, var(--sheet) 60%, transparent)}
.pitem[aria-current="page"]{background:var(--sheet); box-shadow:inset 3px 0 0 var(--ink)}
.pitem .pn{display:block; font-weight:500; line-height:1.3}
.pitem .pp{display:flex; align-items:center; gap:10px; margin-top:8px; color:var(--graphite)}
.bar{flex:1; height:3px; background:var(--rule); border-radius:2px; overflow:hidden}
.bar i{display:block; height:100%; background:var(--ink)}
.padd{flex:none; display:flex; gap:6px; padding:12px 0 0; border-top:1px solid var(--rule)}
.padd .input{padding:8px 10px; font-size:14px; background:transparent; min-width:0; flex:1}
.padd .btn{padding:8px 12px}

.pview{padding:32px 40px 32px; min-width:0; min-height:0; display:flex; flex-direction:column}

/* project switcher: phones only — opens the project list as a bottom sheet */
.pswitch{display:none; flex:none; align-items:center; gap:10px; width:100%; margin:0 0 14px; padding:10px 12px; border:1px solid var(--rule); border-radius:8px; background:var(--sheet); cursor:pointer; text-align:left}
.pswitch .label{color:var(--ink)}
.pswitch .n{font-family:"Martian Mono", monospace; font-size:10.5px; color:var(--graphite)}
.pswitch svg{margin-left:auto; flex:none; color:var(--graphite)}
.sheet{position:fixed; inset:auto 0 0 0; width:100%; max-width:none; height:auto; max-height:min(86vh, 720px); max-height:min(86dvh, 720px); margin:0; padding:0; border:0; border-top:1px solid var(--rule); border-radius:14px 14px 0 0; background:var(--sheet); color:var(--ink); box-shadow:var(--lift); overflow:hidden}
.sheet[open]{display:flex; flex-direction:column; animation:sheet-up .28s cubic-bezier(.2,.8,.2,1)}
.sheet::backdrop{background:rgba(10,12,16,.45)}
@keyframes sheet-up{from{transform:translateY(100%)}}
.sheet .grip{flex:none; width:36px; height:4px; border-radius:2px; background:var(--rule); margin:8px auto 0}
.sheet header{flex:none; display:flex; align-items:center; justify-content:space-between; padding:8px 12px 8px 20px}
.sheet .pfilter{flex:none; margin:0 16px 8px}
.sheet .pitems{margin:0; padding:0 8px 8px}
.sheet .pitem{padding:13px 12px 14px}
.sheet .pnone{margin:8px 20px 16px}
.sheet .padd{padding:12px 16px 12px; padding-bottom:max(12px, env(safe-area-inset-bottom))}
.phead, .vbar{flex:none}
#vp-map:not([hidden]){flex:1; min-height:0; display:flex; flex-direction:column}
#vp-list{flex:1; min-height:0; overflow:auto; overscroll-behavior:contain}
.phead{display:grid; grid-template-columns:minmax(0,1fr) auto; gap:4px 24px; align-items:start; margin-bottom:28px}
.pname-in{grid-column:1; width:100%; border:0; background:transparent; font-size:clamp(30px,4vw,44px); line-height:1.05; padding:2px 0; border-bottom:1px dashed transparent; border-radius:0}
.pname-in:hover{border-bottom-color:var(--rule)}
.pname-in:focus{outline:none; border-bottom-color:var(--cobalt)}
.pnote-in{grid-column:1; width:100%; border:0; background:transparent; color:var(--graphite); font-size:16px; padding:2px 0; border-bottom:1px dashed transparent; border-radius:0}
.pnote-in:hover{border-bottom-color:var(--rule)}
.pnote-in:focus{outline:none; border-bottom-color:var(--cobalt); color:var(--ink)}
.phead .pstats{grid-column:1; margin:10px 0 0; color:var(--graphite); font-size:11.5px}
.phead .pstats b{color:var(--ink); font-weight:600}
.phead .del{grid-column:2; grid-row:1; align-self:center; font-size:14px}

.vbar{display:flex; align-items:center; flex-wrap:wrap; gap:12px 24px; margin:0 0 14px}
.vbar .spacer{flex:1}
.vbar[data-view="list"] .legend{display:none}
.vtabs{display:inline-flex; gap:2px; padding:3px; border:1px solid var(--rule); border-radius:8px; background:var(--sheet)}
.vtab{display:inline-flex; align-items:center; gap:8px; border:0; background:none; padding:7px 14px; border-radius:5px; cursor:pointer; font-weight:500; font-size:14px; color:var(--graphite); transition:background .15s, color .15s}
.vtab:hover{color:var(--ink)}
.vtab[aria-selected="true"]{background:var(--ink); color:var(--sheet)}
.vtab svg{flex:none}
.vtab .n{font-family:"Martian Mono", monospace; font-variation-settings:"wdth" 87.5; font-size:10.5px; opacity:.65}
.vtab:focus-visible{outline-offset:1px}
.card{background:var(--sheet); border:1px solid var(--rule); border-radius:8px}
.legend{display:flex; flex-wrap:wrap; gap:6px 18px; list-style:none; margin:0; padding:0; color:var(--graphite); font-size:13px}
.legend li{display:flex; align-items:center; gap:7px}
.map{
  position:relative; overflow:hidden; border-radius:7px; cursor:grab; touch-action:none; user-select:none; -webkit-user-select:none;
  flex:1; min-height:0;
  background-image:radial-gradient(circle, color-mix(in srgb, var(--graphite) 30%, transparent) 1px, transparent 1.3px);
  background-size:24px 24px;
}
.map:focus-visible{outline-offset:-3px}
.map.panning, .map.panning .node{cursor:grabbing}
.map .schema{position:absolute; left:0; top:0; transform-origin:0 0; will-change:transform}
.map-hint{position:absolute; left:14px; bottom:14px; margin:0; color:var(--graphite); font-size:10.5px; pointer-events:none}
.zoom{position:absolute; right:12px; bottom:12px; display:flex; align-items:center; gap:2px; padding:3px; background:var(--paper); border:1px solid var(--rule); border-radius:8px; box-shadow:0 6px 18px -10px rgba(0,0,0,.4); cursor:default}
.zoom button{display:grid; place-items:center; min-width:30px; height:30px; padding:0 6px; border:0; background:none; border-radius:5px; cursor:pointer; color:var(--ink); font-size:18px; line-height:1}
.zoom button:hover:not(:disabled){background:var(--sheet)}
.zoom button:disabled{color:var(--rule); cursor:default}
.zoom .pct{min-width:52px; font-family:"Martian Mono", monospace; font-variation-settings:"wdth" 87.5; font-size:11px}
.zoom .sep{width:1px; height:18px; background:var(--rule); margin:0 3px}
.schema svg{position:absolute; inset:0; pointer-events:none; overflow:visible}
.e-done{fill:none; stroke:var(--ink); stroke-width:2.5; stroke-linecap:round; stroke-linejoin:round}
.e-wait{fill:none; stroke:var(--graphite); stroke-width:1.5; stroke-dasharray:4 5; stroke-linecap:round}
.dot{display:block; width:16px; height:16px; border-radius:50%; border:2px solid var(--ink); background:var(--sheet); box-shadow:0 0 0 3px var(--sheet); flex:none}
.dot.done{background:var(--ink)}
.dot.ready{background:var(--marker); border-color:var(--on-marker)}
.dot.wait{border-color:var(--graphite)}
.dot.sm{width:11px; height:11px; border-width:1.75px; box-shadow:none}
.node{position:absolute; width:166px; padding:0; border:0; background:none; text-align:left; cursor:pointer; color:var(--ink)}
.node .nt{display:block; margin-top:9px; font-size:13.5px; font-weight:500; line-height:1.3}
.node .nm{display:block; margin-top:4px; color:var(--graphite); font-size:10.5px}
.node.done .nt{color:var(--graphite)}
.node:hover .nt{text-decoration:underline; text-underline-offset:3px; text-decoration-thickness:1px}
.node[aria-pressed="true"] .dot{outline:2px solid var(--cobalt); outline-offset:3px}
.schema-empty{padding:28px 18px; color:var(--graphite)}

.tasks{width:100%; border-collapse:collapse}
.tasks th{position:sticky; top:0; z-index:1; text-align:left; padding:0 10px 10px; background:var(--paper); box-shadow:inset 0 -2px 0 var(--ink); white-space:nowrap}
.tasks th:first-child, .tasks td:first-child{padding-left:16px}
.tasks th.r, .tasks td.r{text-align:right; padding-right:16px}
.tasks td{padding:13px 10px; border-bottom:1px solid var(--rule); vertical-align:top}
.tasks tbody tr{cursor:pointer}
.tasks tbody tr:hover td{background:color-mix(in srgb, var(--sheet) 70%, transparent)}
.t-title{display:flex; gap:10px; align-items:baseline}
.t-title .dot{transform:translateY(1px)}
.t-title button{border:0; background:none; padding:0; text-align:left; font-weight:500; cursor:pointer; font-size:15px; line-height:1.35}
.t-title.done button{color:var(--graphite)}
.t-note{margin:3px 0 0 21px; color:var(--graphite); font-size:13.5px; display:-webkit-box; -webkit-line-clamp:1; -webkit-box-orient:vertical; overflow:hidden}
.chips{display:flex; flex-wrap:wrap; gap:4px}
.chip{font-family:"Martian Mono", monospace; font-variation-settings:"wdth" 87.5; font-size:10.5px; border:1px solid var(--rule); border-radius:4px; padding:2px 6px; background:var(--paper); white-space:nowrap; max-width:180px; overflow:hidden; text-overflow:ellipsis}
.chip.none{border-style:dashed; background:transparent; color:var(--graphite)}
.pri-cell{display:flex; align-items:center; gap:8px; white-space:nowrap; font-size:13.5px}
.vol{font-size:12px; white-space:nowrap}

/* ---------- drawer ---------- */
.scrim{position:fixed; inset:0; background:var(--scrim); z-index:40; opacity:0; transition:opacity .2s}
.scrim.open{opacity:1}
.drawer{position:fixed; top:0; right:0; bottom:0; z-index:41; width:min(480px,100%); background:var(--sheet); border-left:1px solid var(--rule); box-shadow:var(--lift); display:flex; flex-direction:column; transform:translateX(100%); transition:transform .28s cubic-bezier(.2,.8,.2,1)}
.drawer.open{transform:none}
.drawer header{display:flex; align-items:flex-start; justify-content:space-between; gap:12px; padding:22px 24px 16px; border-bottom:1px solid var(--rule)}
.drawer h2{margin:6px 0 0; font-size:26px; line-height:1.05}
.drawer form{flex:1; overflow:auto; padding:22px 24px 0; display:flex; flex-direction:column}
.drawer footer{position:sticky; bottom:0; margin:auto -24px 0; padding:14px 24px; background:var(--sheet); border-top:1px solid var(--rule); display:flex; align-items:center; gap:8px}
.drawer footer .spacer{flex:1}
.x{border:0; background:none; font-size:24px; line-height:1; cursor:pointer; color:var(--graphite); padding:4px 6px}
.x:hover{color:var(--ink)}
.seg{display:grid; grid-template-columns:repeat(3,1fr); border:1px solid var(--rule); border-radius:6px; overflow:hidden}
.seg label{position:relative; display:flex; align-items:center; justify-content:center; gap:8px; padding:9px 6px; cursor:pointer; font-size:14px; border-left:1px solid var(--rule)}
.seg label:first-child{border-left:0}
.seg input{position:absolute; opacity:0; inset:0; margin:0; cursor:pointer}
.seg label:has(input:checked){background:var(--ink); color:var(--sheet)}
.seg label:has(input:checked) .pri i{background:color-mix(in srgb, var(--sheet) 30%, transparent)}
.seg label:has(input:checked) .pri[data-p="1"] i,
.seg label:has(input:checked) .pri[data-p="2"] i:nth-child(-n+2),
.seg label:has(input:checked) .pri[data-p="3"] i:first-child{background:var(--sheet)}
.seg label:has(input:focus-visible){outline:2px solid var(--cobalt); outline-offset:-4px}
.volrow{display:flex; align-items:center; gap:8px}
.volrow .input{width:84px; text-align:right; font-family:"Martian Mono", monospace; font-size:14px}
.volrow span{color:var(--graphite); margin-right:8px}
.quick{display:flex; flex-wrap:wrap; gap:6px; margin-top:10px}
.quick button{font-family:"Martian Mono", monospace; font-variation-settings:"wdth" 87.5; font-size:11px; border:1px solid var(--rule); background:transparent; border-radius:14px; padding:4px 10px; cursor:pointer}
.quick button:hover{border-color:var(--ink)}
.hint{margin:0 0 10px; color:var(--graphite); font-size:13.5px}
.deps{list-style:none; margin:0; padding:4px 0; border:1px solid var(--rule); border-radius:6px; max-height:260px; overflow:auto; background:var(--paper)}
.deps label{display:flex; align-items:flex-start; gap:10px; padding:7px 12px; cursor:pointer; font-size:14.5px; line-height:1.35}
.deps label:hover{background:color-mix(in srgb, var(--sheet) 80%, transparent)}
.deps input{margin:3px 0 0; accent-color:var(--ink); width:15px; height:15px; flex:none}
.deps .dot{margin-top:3px}
.deps label.blocked{color:var(--graphite); cursor:not-allowed}
.deps label.blocked:hover{background:none}
.deps small{display:block; font-size:12px}
.deps .none{padding:8px 12px; color:var(--graphite); font-size:14px}
.donebox{display:flex; align-items:center; gap:10px; margin:0 0 22px; cursor:pointer; font-size:15px}
.donebox input{width:17px; height:17px; accent-color:var(--ink); margin:0}

/* ---------- toast ---------- */
.toast{position:fixed; left:50%; bottom:24px; z-index:60; transform:translate(-50%, 20px); opacity:0; pointer-events:none; width:min(560px, calc(100% - 32px)); background:var(--ink); color:var(--sheet); border-radius:8px; padding:14px 16px 14px 18px; display:flex; gap:16px; align-items:center; box-shadow:var(--lift); transition:transform .25s ease, opacity .25s ease; font-size:14.5px; line-height:1.4}
.toast.show{opacity:1; transform:translate(-50%,0); pointer-events:auto}
.toast p{margin:0; flex:1}
.toast .hl{font-weight:500}
.toast button{border:1px solid color-mix(in srgb, var(--sheet) 35%, transparent); background:transparent; color:var(--sheet); border-radius:6px; padding:6px 12px; cursor:pointer; font-weight:500; white-space:nowrap}
.toast button:hover{border-color:var(--sheet)}


/* ---------- responsive ---------- */
@media (max-width: 860px){
  .login{grid-template-columns:1fr}
  .login-art{padding:28px 16px 24px; gap:20px}
  .login-art svg{max-height:170px}
  .login-side{border-left:0; border-top:1px solid var(--rule); padding:32px 16px 96px; place-items:start center}
  .setup{grid-template-columns:minmax(0,1fr); grid-template-rows:minmax(0,1fr)}
  .plist{display:none}
  .pswitch{display:flex}
  .pview{padding:16px 16px 20px}
  .vbar .legend{order:1; flex-basis:100%}
  .map-hint{display:none}
}
@media (max-width: 640px){
  .topbar-in{padding:0 16px; gap:14px}
  .logo .word{display:none}
  .tab{padding:0 8px}
  .today{padding:32px 16px 140px}
  .row{grid-template-columns:24px minmax(0,1fr); gap:4px 14px}
  .row-side{grid-column:2; flex-direction:row; align-items:center; justify-content:flex-start; gap:12px; padding-top:6px}
  /* phones: the header above the map has to stay short — the page itself never scrolls */
  .pview{padding:12px 16px 16px}
  .pswitch{margin-bottom:10px; padding:8px 12px}
  .phead{margin-bottom:12px}
  .pname-in{font-size:26px}
  .pnote-in{font-size:14px}
  .phead .pstats{margin-top:4px}
  .phead .del{max-width:140px; font-size:13px; text-align:right}
  .vbar{gap:8px 12px; margin-bottom:10px}
  .vtab{padding:6px 12px}
  #tadd{padding:7px 13px}
  #tadd .t{display:none}
  .vbar .legend{font-size:12px}
  .tasks thead{display:none}
  .tasks, .tasks tbody, .tasks tr, .tasks td{display:block}
  .tasks tr{display:grid; grid-template-columns:1fr auto; gap:6px 12px; padding:14px 12px; border-bottom:1px solid var(--rule)}
  .tasks tbody tr:hover{background:color-mix(in srgb, var(--sheet) 70%, transparent)}
  .tasks tbody tr:hover td{background:none}
  .tasks td{border:0; padding:0 !important}
  .tasks td.c-title{grid-column:1 / -1}
  .tasks td.c-after{grid-column:1 / -1; padding-left:21px !important}
  .tasks td.c-pri{padding-left:21px !important}
  .drawer footer{flex-wrap:wrap}
  .toast{bottom:16px}
}
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{animation-duration:.001ms !important; animation-delay:0s !important; transition-duration:.001ms !important}
}

/* ---------- app states ---------- */
.btn:disabled{opacity:.55; cursor:progress}
.boot{min-height:100vh; min-height:100dvh; display:grid; place-items:center; color:var(--graphite)}
.boot p{margin:0}
.boot .btn{margin-top:16px}
