*{box-sizing:border-box}body{margin:0;font:13px/1.35 system-ui,-apple-system,Segoe UI,Roboto,sans-serif;color:#1d232b;background:#f4f6f8}
button{font:inherit;padding:5px 10px;border:1px solid #c6ccd3;background:#fff;border-radius:5px;cursor:pointer}button:hover{background:#eef2f6}
button.primary{background:#1a73e8;color:#fff;border-color:#1a73e8}button.danger{color:#b3261e;border-color:#e3b2ae}
button.tog.on{background:#1d232b;color:#fff}input,select,textarea{font:inherit;padding:4px 6px;border:1px solid #c6ccd3;border-radius:4px}
header{display:flex;gap:14px;align-items:center;padding:8px 12px;background:#fff;border-bottom:1px solid #dde2e7;flex-wrap:wrap}
.brand{font-size:15px}.grp{display:flex;gap:5px;align-items:center}.grp.right{margin-left:auto}.chk{display:flex;gap:3px;align-items:center}
#rangeLabel{font-weight:600;margin-left:6px}.live{color:#bbb}.live.on{color:#2e7d32}
main{display:flex;height:calc(100vh - 50px)}
@media (min-width: 769px) { body:not(.login){display:flex;flex-direction:column;height:100vh} header{flex:none} main{flex:1;min-height:0;height:auto} }
aside{width:290px;min-width:290px;border-right:1px solid #dde2e7;background:#fff;overflow:auto;padding:10px}
aside h2{font-size:14px;margin:0 0 4px}.pill{background:#1a73e8;color:#fff;border-radius:10px;padding:0 7px;font-size:11px}
.muted{color:#6b7480}.small{font-size:11px;margin-bottom:6px}
.inc,.asgc{border:1px solid #d5dbe1;border-left:5px solid #9aa4ae;border-radius:6px;padding:7px 8px;margin:8px 0;cursor:pointer;background:#fbfcfd}
.inc:hover,.asgc:hover{border-color:#1a73e8}.inc .t,.asgc .t{font-weight:600}.inc .hrs,.asgc .hrs{float:right;font-weight:700}.badge{display:inline-block;font-size:10px;padding:0 5px;border-radius:3px;background:#fff3cd;color:#7a5b00;border:1px solid #f0d58a;margin-left:4px}
.badge.stale{background:#fde7e7;color:#8a1c1c;border-color:#f2b8b8}
#boardWrap{flex:1;overflow:auto;position:relative}
#board{display:grid;position:relative;min-width:100%}
.hd{position:sticky;top:0;z-index:5;background:#fff;border-bottom:1px solid #dde2e7;text-align:center;font-weight:600;padding:3px 0;white-space:nowrap;overflow:hidden}
.hd.day{border-left:2px solid #9aa4ae}.hd.lane{font-size:11px}.hd.lane i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:3px;vertical-align:middle}
.hd.corner{left:0;z-index:7}
.times{position:sticky;left:0;z-index:4;background:#fff;border-right:1px solid #dde2e7}
.times div{position:absolute;right:4px;font-size:10px;color:#6b7480;transform:translateY(-6px)}
.lane{position:relative;border-left:1px solid #e7ebef;background:repeating-linear-gradient(to bottom,#fff 0,#fff 31px,#dfe4e9 31px,#dfe4e9 32px,#fff 32px,#fff 63px,#eef1f4 63px,#eef1f4 64px)}
.lane.dayStart{border-left:2px solid #9aa4ae}.lane.unassigned{background-color:#fafafa}
.lane.dropHover{outline:2px dashed #1a73e8;outline-offset:-2px}
.ev{position:absolute;left:2px;right:2px;border-radius:4px;color:#fff;padding:2px 4px;font-size:11px;overflow:hidden;cursor:grab;box-shadow:0 1px 2px rgba(0,0,0,.25);user-select:none;touch-action:none}
.ev .tt{font-weight:600;word-break:break-word}.ev .hl{font-size:10px;opacity:.95}.ev.block{background-image:repeating-linear-gradient(45deg,rgba(255,255,255,.18) 0 6px,transparent 6px 12px)}
.ev .rz{position:absolute;left:0;right:0;bottom:0;height:7px;cursor:ns-resize}.ev.ghost{opacity:.55;pointer-events:none;outline:2px solid #1d232b}
.ev.dark{color:#1d232b}
.drawer{position:fixed;top:50px;right:0;bottom:0;width:min(760px,100vw);background:#fff;border-left:1px solid #c6ccd3;box-shadow:-4px 0 16px rgba(0,0,0,.12);overflow:auto;padding:14px 16px;z-index:20}
.drawer h3{margin:0 0 4px;font-size:17px}.kv{display:grid;grid-template-columns:110px 1fr 110px 1fr;gap:3px 10px;margin:8px 0}.kv b{color:#6b7480;font-weight:500}
table.lines{width:100%;border-collapse:collapse;margin-top:8px}table.lines th,table.lines td{border-bottom:1px solid #e7ebef;padding:6px 5px;vertical-align:top;text-align:left}
table.lines th{font-size:11px;color:#6b7480}.story{background:#f6f8fa;border-left:3px solid #9aa4ae;padding:4px 6px;margin:3px 0;white-space:pre-wrap}.story .by{font-size:10px;color:#6b7480}
.cls{font-size:10px;font-weight:700;padding:1px 5px;border-radius:3px;text-transform:uppercase}.cls.complete{background:#e3f4e6;color:#1e6b2e}.cls.partial{background:#fff3cd;color:#7a5b00}.cls.none{background:#e8eefc;color:#1a4fb3}
.hlin{width:62px}.reason{font-size:10px;color:#6b7480;margin-top:2px}.total{font-size:15px;font-weight:700;margin:10px 0}
.place{background:#f0f5ff;border:1px solid #c9d8f5;border-radius:6px;padding:10px;margin:10px 0;display:flex;gap:8px;flex-wrap:wrap;align-items:end}
.place label,.form label{display:flex;flex-direction:column;font-size:11px;color:#6b7480;gap:2px}
#modalBack{position:fixed;inset:0;background:rgba(20,25,30,.35);display:flex;align-items:center;justify-content:center;z-index:30}
.card{background:#fff;border-radius:8px;padding:16px 18px;box-shadow:0 8px 30px rgba(0,0,0,.2);min-width:340px;max-width:92vw;max-height:90vh;overflow:auto}
.form{display:grid;gap:8px}.row{display:flex;gap:8px;flex-wrap:wrap;align-items:end}.btns{display:flex;gap:6px;flex-wrap:wrap;margin-top:10px}
#toast{position:fixed;bottom:16px;left:50%;transform:translateX(-50%);background:#1d232b;color:#fff;padding:7px 14px;border-radius:6px;opacity:0;transition:opacity .2s;z-index:50;pointer-events:none}#toast.on{opacity:.95}
body.login{display:flex;align-items:center;justify-content:center;height:100vh}body.login form{display:grid;gap:10px;width:320px}body.login h1{font-size:18px;margin:0}body.login label{display:grid;gap:3px}.err{color:#b3261e}
.x{float:right}
#modalBack[hidden],.drawer[hidden]{display:none}
.off{position:absolute;left:0;right:0;background:repeating-linear-gradient(135deg,rgba(90,100,110,.16) 0 5px,rgba(90,100,110,.26) 5px 10px);pointer-events:none;z-index:0}
.off.all::after{content:"OFF";position:absolute;top:6px;left:0;right:0;text-align:center;font-size:10px;color:#5f6b76;font-weight:700}
.ev{z-index:1}
.ev.appt{color:#fff}.apptlbl{font-size:9px;font-weight:800;background:rgba(255,255,255,.25);padding:0 3px;border-radius:2px}
.nicon{font-size:10px;margin-right:2px}.lane.appts{background-color:#fbf7f5}
.dsince{color:#0b5394;font-weight:600}.dsince.unk{color:#a15c00}.ssince{cursor:help;margin-top:4px}.sswhy summary{cursor:pointer}
#tip{position:fixed;z-index:60;max-width:460px;overflow:hidden;background:#1d232b;color:#fff;padding:8px 10px;border-radius:6px;font-size:12px;white-space:pre-wrap;box-shadow:0 4px 14px rgba(0,0,0,.3);pointer-events:none}#tip[hidden]{display:none}
.hd{height:26px;line-height:20px;text-overflow:ellipsis}.hd.lane{top:0}
body.viewonly .ev{cursor:pointer}body.viewonly .ev .rz{display:none}body.viewonly .inc{cursor:pointer}
a.rolink{color:inherit;text-decoration:underline;text-underline-offset:2px;cursor:pointer}.inc a.rolink,.asgc a.rolink,.drawer a.rolink,#modal a.rolink{color:#1a5fd0}
.todo{background:#fff8e6;border:1px solid #f0dca0;border-radius:6px;padding:6px 10px;margin:8px 0}.todo ul{margin:4px 0 0;padding-left:18px}
.drawer.wide{width:min(980px,100vw)}.agrp{margin:12px 0;border:1px solid #dde2e7;border-radius:6px}.ahd{background:#f4f6f8;padding:6px 10px;border-bottom:1px solid #dde2e7}
.ahd i{display:inline-block;width:11px;height:11px;border-radius:2px;margin-right:5px;vertical-align:middle}
.arow{display:flex;gap:10px;justify-content:space-between;padding:7px 10px;border-bottom:1px solid #eef1f4}.arow:last-child{border-bottom:0}.arow.done{opacity:.6}
.ainfo{flex:1;min-width:0}.aact{display:flex;gap:4px;flex-wrap:wrap;align-items:start;justify-content:end;max-width:400px}.aact select{max-width:100px}
.flag{font-size:10px;font-weight:700;padding:1px 6px;border-radius:3px;text-transform:uppercase}.fl-ns{background:#fde7e7;color:#8a1c1c}.fl-mm{background:#fff3cd;color:#7a5b00}.fl-un{background:#ece6f6;color:#4b2a85}.fl-ok{background:#e3f4e6;color:#1e6b2e}
.rv{font-size:10px;color:#6b7480}

.ev.off{background-image:repeating-linear-gradient(45deg,rgba(0,0,0,.28) 0 6px,rgba(255,255,255,.12) 6px 12px);opacity:.85}
.igrp{margin:6px 0;border-top:1px solid #e3e7eb}.igrp>summary{cursor:pointer;font-weight:700;padding:6px 2px;list-style:none;user-select:none}.igrp>summary::before{content:'▸ ';color:#667}.igrp[open]>summary::before{content:'▾ '}
.igrp .gcount{font-weight:600}.grpwhy{color:#5a6570;font-style:italic}.inc .grpwhy{margin-top:2px}.badge.manual{background:#e8f0fe;color:#1a4fb0;border-color:#b7cdf5}.grpbox{margin:6px 0;padding:6px 8px;background:#f5f7fa;border-radius:5px}
.gbadge{display:inline-block;color:#fff;font-size:10px;font-weight:700;padding:0 5px;border-radius:3px;vertical-align:1px;letter-spacing:.2px}.gdot{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px;vertical-align:-1px}
.nsbox{margin:8px 0;padding:7px 9px;background:#fde7e7;border:1px solid #f3b4b4;border-radius:5px;color:#6d1515}.chkbox{margin:8px 0;padding:7px 9px;background:#fff8e1;border:1px solid #f0d58a;border-radius:5px}.chkbox ul{margin:4px 0 0 16px;padding:0}
.fl-ns{font-size:11px!important;box-shadow:0 0 0 1px #d64545}
.fl-om{background:#eceff1;color:#455a64}
/* quiet connection-lost indicator (board keeps showing the last data, retries in the background) */
.netpill { background: #fff4d6; color: #7a5a00; border: 1px solid #f0d28a; border-radius: 10px; padding: 1px 8px; font-size: 12px; margin-right: 6px; }
.netpill[hidden] { display: none; }
/* Users screen: invite + tech links */
.linkbox { display: flex; gap: 6px; align-items: center; margin-top: 4px; flex-wrap: wrap; }
.linkbox input { width: 340px; font-family: monospace; font-size: 11px; }
.techlink { margin-top: 12px; padding: 8px 10px; border: 1px solid #d5dbe1; border-radius: 6px; background: #f7f9fb; }
/* time off: Sick / Vacation */
.hd.lane.tolink { cursor: pointer; } .hd.lane.tolink:hover { text-decoration: underline; background: #eef3f8; }
.ev.to-sick { background: #b42318 !important; background-image: repeating-linear-gradient(45deg, rgba(0,0,0,.25) 0 6px, rgba(255,255,255,.10) 6px 12px) !important; color: #fff; opacity: .9; }
.ev.to-vac { background: #0b6e8a !important; background-image: repeating-linear-gradient(45deg, rgba(0,0,0,.25) 0 6px, rgba(255,255,255,.10) 6px 12px) !important; color: #fff; opacity: .9; }
.ev.to-sick .tt, .ev.to-vac .tt { font-weight: 800; letter-spacing: .5px; } .toicon { font-size: 14px; }
.pop { position: fixed; z-index: 60; width: 380px; max-height: 80vh; overflow: auto; padding: 10px 12px; box-shadow: 0 8px 28px rgba(0,0,0,.25); background: #fff; border-radius: 8px; }
.pop label { display: block; margin: 4px 0; font-size: 12px; } .pop .row { display: flex; gap: 8px; } .pop .row label { flex: 1; }
.pop input[type=date], .pop input[type=time], .pop #toNote { width: 100%; box-sizing: border-box; }
.pophd { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; } .pophd i { width: 10px; height: 10px; border-radius: 50%; display: inline-block; } .pophd .linkbtn { margin-left: auto; }
.tobig { display: flex; gap: 8px; margin: 8px 0; } .tobig button { flex: 1; font-size: 17px; font-weight: 700; padding: 12px 6px; border-radius: 8px; border: 0; color: #fff; cursor: pointer; }
.tobig .tosick { background: #b42318; } .tobig .tovac { background: #0b6e8a; } .tobig button:hover { filter: brightness(1.1); }
.towarn { background: #fff4d6; border: 1px solid #f0d28a; border-radius: 6px; padding: 6px 8px; font-size: 12px; margin: 6px 0; } .towarn ul { margin: 4px 0 6px 16px; padding: 0; }
.tosum { font-size: 12px; margin: 6px 0; padding: 4px 6px; background: #f7f9fb; border-radius: 4px; }
.tolist { margin: 4px 0; padding-left: 16px; } .tolist li { margin: 3px 0; }
.tob { font-weight: 700; font-size: 11px; padding: 0 5px; border-radius: 3px; color: #fff; white-space: nowrap; } .tob.sick { background: #b42318; } .tob.vacation { background: #0b6e8a; }
.linkbtn { background: none; border: 0; color: #1565c0; cursor: pointer; padding: 0 2px; font-size: 12px; }
.btnlink { display: inline-block; padding: 4px 10px; border: 1px solid #c5ced6; border-radius: 4px; text-decoration: none; color: #222; background: #fff; align-self: flex-end; }
.ev.to-sick, .ev.to-vac { pointer-events: auto; cursor: pointer; }
.pop .row[hidden] { display: none; }
.ev.to-gen { background: #5f6b76 !important; background-image: repeating-linear-gradient(45deg, rgba(0,0,0,.25) 0 6px, rgba(255,255,255,.10) 6px 12px) !important; color: #fff; opacity: .9; pointer-events: auto; }
.ev.to-gen .tt { font-weight: 800; letter-spacing: .5px; }
/* side panel tabs: Incoming | Assigned not scheduled */
.stabs { display: flex; gap: 4px; margin: -2px 0 8px; } .stabs button { flex: 1; font-size: 12px; padding: 5px 4px; border: 1px solid #c5ced6; background: #f3f5f7; border-radius: 5px; cursor: pointer; }
.stabs button.on { background: #1a73e8; color: #fff; border-color: #1a73e8; } .pill.red { background: #c62828; } .stabs button.on .pill.red { background: #fff; color: #c62828; }
#asgPane[hidden], #incPane[hidden] { display: none; }
.asgc.sched { opacity: .75; cursor: pointer; } .asgc.nsched { border-left: 4px solid #c62828; }
.asec { margin: 8px 0 4px; } .asec2 { margin: 10px 0; } .asec2 summary { cursor: pointer; }
.lane.suggestLane { box-shadow: inset 0 0 0 3px rgba(26,115,232,.55); background-color: rgba(26,115,232,.06); }
.hd.lane.suggestLane { background: #dbe8fb; font-weight: 700; }
/* every block gets a clear black border; overlapping blocks sit side by side and are marked */
.ev { border: 2px solid #000; box-sizing: border-box; }
.ev.off { pointer-events: auto; position: absolute; } /* time-off / imported OFF blocks stay clickable (not just background bands) */
.ev.ovl { box-shadow: 0 0 0 2px #e53935, 0 1px 2px rgba(0,0,0,.25); z-index: 2; }
.ovlb { display: inline-block; background: #e53935; color: #fff; font-size: 9px; font-weight: 800; padding: 0 3px; border-radius: 3px; margin-right: 3px; line-height: 13px; vertical-align: top; }
/* dragging a job: the sidebar becomes a "send back" drop target */
aside.dropReady { outline: 3px dashed #1a73e8; outline-offset: -4px; background: #f3f8ff; position: relative; }
aside.dropReady::before { content: "↩ Drop here to send the job back (un-schedule)"; position: sticky; top: 0; display: block; z-index: 5; background: #1a73e8; color: #fff; font-weight: 700; font-size: 12px; text-align: center; padding: 8px 4px; border-radius: 4px; margin-bottom: 6px; }
aside.dropHot { background: #dbe8fb; outline-color: #0b57d0; outline-style: solid; }
aside.dropHot::before { background: #0b57d0; content: "↩ Release to send back"; }
/* current-time line */
.nowline { position: absolute; left: 0; right: 0; height: 0; border-top: 2px solid #ea4335; z-index: 4; pointer-events: none; }
.nowline.first::before { content: ""; position: absolute; left: -6px; top: -7px; width: 12px; height: 12px; border-radius: 50%; background: #ea4335; }
/* hand-entered jobs */
.nolink { display: inline-block; background: #fff; color: #b00020; border: 1px solid #b00020; font-size: 9px; font-weight: 800; padding: 0 3px; border-radius: 3px; line-height: 12px; vertical-align: top; }
.ev.unlinked { outline: 2px dashed #b00020; outline-offset: -4px; }
.linkok { color: #1b7f3a; font-weight: 600; } .linkno { color: #9a6700; }

/* + Decisiv job form */
.ferr { display: block; color: #b00020; font-size: 11px; min-height: 0; font-weight: 600; }
.ferr:empty { display: none; }
.req { color: #b00020; }
.djwarn { background: #fff4d6; border: 1px solid #e0b000; border-radius: 6px; padding: 6px 8px; font-size: 12px; }
.djwarn button { margin-left: 6px; font-size: 12px; padding: 1px 8px; }
#djForm .row label { flex: 1; }
.nolink.pend { color: #9a6700; border-color: #9a6700; }

/* Refresh from Decisiv */
#rfBox { gap: 6px; align-items: center; }
#rfInfo { color: #444; }
.rf.run { color: #1a73e8; font-weight: 600; } .rf.fail { color: #b00020; font-weight: 600; } .rf.idle { color: #666; }
.rf.cnt.warn { color: #9a6700; font-weight: 600; }
#btnRefresh:disabled { opacity: .55; cursor: not-allowed; }

/* converted appointment: tech-colored job with a small APPT badge in the corner */
.apptcorner { position: absolute; top: 1px; right: 2px; background: #795548; color: #fff; font-size: 8px; font-weight: 800; padding: 0 3px; border-radius: 3px; line-height: 11px; letter-spacing: .3px; pointer-events: none; }

/* Need more time */
.chips { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; margin-top: 3px; }
.chips button.on { background: #1a73e8; color: #fff; border-color: #1a73e8; }
.pushedb { position: absolute; bottom: 1px; right: 2px; background: #fff3cd; color: #7a5200; border: 1px solid #c99a00; font-size: 8px; font-weight: 800; padding: 0 3px; border-radius: 3px; line-height: 11px; pointer-events: none; }
.extb { background: #fff; color: #1a73e8; border-radius: 3px; padding: 0 3px; font-weight: 800; font-size: 9px; }
.trlist { max-height: 60vh; overflow: auto; margin-top: 6px; }
.treq { border: 1px solid #ddd; border-radius: 6px; padding: 6px 8px; margin-bottom: 6px; }
.treq.unread { border-color: #d93025; background: #fff6f5; } .treq.undone { opacity: .6; }
#trAlerts.on { background: #e6f4ea; border-color: #1b7f3a; }
/* Continue on another day: 'Continued' tag on the history block, '↩ from' tag on the copy (click = jump), hatched history */
.contb { position: absolute; bottom: 1px; left: 2px; z-index: 2; background: #fff; color: #0b57d0; border: 1px solid #0b57d0; font-size: 9px; font-weight: 800; padding: 0 4px; border-radius: 3px; line-height: 12px; text-decoration: none; white-space: nowrap; cursor: pointer; }
.contb:hover { background: #0b57d0; color: #fff; }
.contb.from { color: #1e7d32; border-color: #1e7d32; }
.contb.from:hover { background: #1e7d32; color: #fff; }
.ev.hist::before { content: ''; position: absolute; inset: 0; background: repeating-linear-gradient(135deg, rgba(255,255,255,.22) 0 6px, transparent 6px 12px); pointer-events: none; }
.ev.flash { animation: evflash 1.6s ease-out 2; z-index: 5; }
@keyframes evflash { 0% { box-shadow: 0 0 0 4px #ffeb3b, 0 0 12px 4px #ffeb3b; } 100% { box-shadow: 0 0 0 0 transparent; } }
.histnote { background: #eef3fd; border: 1px solid #c6d6f7; border-radius: 4px; padding: 4px 6px; }
.form label.radio { flex-direction: row; align-items: center; gap: 6px; font-size: 12px; color: #333; }

/* ---------- Pick a tech + phones / touch ---------- */
.phoneonly, .touchonly { display: none !important; }
#techPick { max-width: 150px; }
body.onetech .ev { font-size: 13px; padding: 3px 6px; } body.onetech .ev .hl { font-size: 12px; } body.onetech .hd.lane { font-size: 13px; }
.cardact { margin-top: 6px; } .cardact button { width: 100%; font-weight: 600; color: #1a73e8; border-color: #9cbcf0; background: #f3f8ff; }
/* tap dialogs (Schedule to…, Move to tech…, block actions) */
.techgrid { display: grid; grid-template-columns: repeat(auto-fill, minmax(130px, 1fr)); gap: 6px; }
.techgrid button { display: flex; align-items: center; gap: 6px; text-align: left; min-height: 40px; padding: 6px 8px; }
.techgrid button i { width: 12px; height: 12px; border-radius: 3px; flex: none; }
.techgrid button.on { outline: 3px solid #1a73e8; outline-offset: -1px; background: #eaf2ff; font-weight: 700; }
.techgrid button.sug { border-color: #1a73e8; } .techgrid .sugl { font-size: 10px; color: #1a5fd0; font-weight: 700; display: block; }
.techgrid button small { display: block; font-size: 10px; color: #6b7480; }
.sheetbtns { display: grid; gap: 6px; margin-top: 8px; } .sheetbtns button { min-height: 44px; text-align: left; font-size: 15px; padding: 8px 12px; }
.sheethd { border-left: 6px solid #9aa4ae; padding-left: 8px; }
@media (pointer: coarse) {
  .ev { touch-action: manipulation; } /* finger on a block still scrolls the board; tap opens its actions */
}
@media (max-width: 768px), (pointer: coarse) { .touchonly { display: block !important; } }
@media (max-width: 768px) {
  .phoneonly { display: inline-flex !important; align-items: center; gap: 4px; }
  body:not(.login) { display: flex; flex-direction: column; height: 100vh; height: 100dvh; overflow: hidden; }
  header { flex: none; gap: 6px; padding: 6px 8px; }
  header .brand, #rangeLabel { display: none; }
  header .grp { flex-wrap: wrap; gap: 4px; }
  header .mhide { display: none !important; }
  body.menuOpen header .mhide { display: flex !important; width: 100%; } body.menuOpen header label.mhide { width: auto; order: 9; }
  body.menuOpen header .grp.right { margin-left: 0; }
  body.menuOpen #btnMenu { background: #1d232b; color: #fff; }
  button, select, input:not([type=checkbox]):not([type=radio]) { min-height: 40px; }
  input, select, textarea { font-size: 16px; } /* no iOS zoom on focus */
  #datePick { width: 140px; } #techPick { max-width: 140px; }
  main { flex: 1; min-height: 0; height: auto; }
  aside { position: fixed; top: 0; bottom: 0; left: 0; width: min(380px, 92vw); min-width: 0; z-index: 22; transform: translateX(-105%); transition: transform .18s ease-out; box-shadow: 4px 0 18px rgba(0,0,0,.2); padding: 8px 10px 30px; }
  body.sideOpen aside { transform: none; }
  #sideClose { width: 100%; justify-content: center; margin-bottom: 8px; }
  #sideBack { position: fixed; inset: 0; background: rgba(20,25,30,.35); z-index: 21; display: none !important; }
  body.sideOpen #sideBack { display: block !important; }
  .stabs button { min-height: 40px; font-size: 14px; }
  .inc, .asgc { padding: 9px 10px; font-size: 14px; } .igrp > summary { padding: 10px 2px; }
  .ev { font-size: 12px; } .ev .hl { font-size: 11px; }
  .hd.lane { font-size: 12px; }
  .hd.day { overflow: visible; text-align: left; } .hd.day .dlbl { position: sticky; left: 58px; padding: 0 6px; } /* day name stays in view while scrolling sideways */
  #board { width: fit-content; min-width: 100%; } /* board as wide as its lanes, so the time column can stay stuck on the left */
  #tip { display: none !important; } /* hover details: tap a block instead */
  .drawer, .drawer.wide { top: 0; width: 100vw; padding: 10px 12px 40px; z-index: 26; }
  .drawer .kv { grid-template-columns: 96px 1fr; } .drawer table.lines, #modal table.lines { display: block; overflow-x: auto; }
  .aact { max-width: none; justify-content: start; } .arow { flex-direction: column; }
  #modalBack { align-items: flex-end; }
  .card { min-width: 0; width: 100vw; max-width: 100vw; max-height: 92vh; max-height: 92dvh; border-radius: 12px 12px 0 0; padding: 14px 12px 22px; }
  .row > label { flex: 1 1 130px; } .row input[type=date], .row input[type=time] { width: 100%; }
  .btns button { flex: 1 1 auto; }
  .pop { left: 6px !important; right: 6px; width: auto; top: 56px !important; max-height: calc(100dvh - 70px); }
  .linkbox input { width: 100%; }
  #toast { bottom: 20px; max-width: 92vw; text-align: center; }
}
/* Work Today: tabs in the tech popover, opened-day badge, action toast */
.poptabs{display:flex;gap:4px;margin:6px 0 8px}.poptabs button{flex:1;padding:6px;border-radius:6px;border:1px solid #c9d1d9;background:#f6f8fa;font-weight:600}
.poptabs button.on{background:#1d232b;color:#fff;border-color:#1d232b}
.tobig button.towork{background:#2e7d32;color:#fff;border:1px solid #1b5e20;font-weight:700}.tobig button.towork:disabled{background:#c8d3c9;color:#556;border-color:#aab}
.tob.work{background:#e8f5e9;color:#1b5e20}
.hd.lane.opened{box-shadow:inset 0 -3px 0 #43a047}.hd.lane .wtb{margin-right:2px}
#toast.act{pointer-events:auto;text-align:left;max-width:min(560px,94vw)}#toast.act ul{margin:4px 0 6px 18px;padding:0}
#toast .tact{background:#43a047;color:#fff;border:0;border-radius:4px;padding:3px 10px;font-weight:700}#toast .tx{background:none;color:#ccc;border:0}
/* collapsible jobs panel + header (desktop; phones keep the Jobs drawer and the ☰ Menu) */
@media (min-width: 769px) { aside{position:relative} }
.sidemin{position:absolute;top:6px;right:6px;padding:1px 7px;font-size:14px;line-height:18px;z-index:3}
.sidestrip{display:none}
.hdrmin{padding:1px 8px;font-size:13px}
@media (min-width: 769px) {
  body.sideMin aside{width:34px;min-width:34px;padding:4px 2px;overflow:hidden}
  body.sideMin aside > :not(.sidestrip){display:none !important}
  body.sideMin .sidestrip{display:flex;flex-direction:column;align-items:center;gap:8px;width:100%;height:100%;padding:8px 0;border:0;background:#f6f8fa;font-size:15px;font-weight:700}
  .sidestrip .vlbl{writing-mode:vertical-rl;font-size:12px;letter-spacing:1px}
  .stabs{padding-right:30px}
  body.hdrMin header{padding:3px 10px;gap:10px}
  body.hdrMin header .brand, body.hdrMin header .grp.acts, body.hdrMin #who, body.hdrMin #logout, body.hdrMin header label.chk{display:none !important}
  body.hdrMin header button, body.hdrMin header select, body.hdrMin header input{padding-top:2px;padding-bottom:2px}
}
@media (max-width: 768px) { .sidemin, .hdrmin, .sidestrip{display:none !important} }
/* jobs/blocks with no tech (the Unassigned column is gone): shown in Appointments, flagged */
.ev.notech{outline:2px dashed #b3261e;outline-offset:-2px}
/* Decisiv workflow notes (read-only copy) in the case drawer and the job dialog */
.wfbox{margin:8px 0;padding:6px 8px;border:1px solid #d5dbe1;border-radius:6px;background:#fafbfc;max-height:340px;overflow:auto}
.wftitle{margin-bottom:4px}
.wflbl{margin:4px 0 2px;color:#444}
.wfn{padding:4px 6px;margin:3px 0;border-left:3px solid #c9d1d9;background:#fff;font-size:12px}
.wfn.mine{border-left-color:#2e7d32;background:#eef7ee}
.wfh{font-size:11px;color:#333}
.wft{white-space:pre-wrap;word-break:break-word}
/* ---- Not completed: tab cards, calendar mark, bell (admin/editor only) ---- */
.ncc{border:1px solid #f1b5b0;border-left:5px solid #d93025;border-radius:6px;padding:7px 8px;margin:8px 0;cursor:grab;background:#fff8f7}
.ncc:hover{border-color:#d93025}.ncc .t{font-weight:600}.ncc .hrs{float:right;font-weight:700}
.ncc.handled{background:#fbfcfd;border-left-color:#e8a0a0}.ncc .handledby{color:#1e7e34;font-weight:600;margin-top:2px}
.ncc .ncnote{margin-top:2px;color:#444;font-style:italic}.ncc.ncflash{box-shadow:0 0 0 3px #ffeb3b}
.ncact{display:flex !important;gap:4px;margin-top:5px;flex-wrap:wrap}.ncact button{font-size:11px;padding:2px 6px}
.ncact .ncDone{border-color:#1e7e34;color:#1e7e34}
.ncbadge{display:inline-block;background:#d93025;color:#fff;font-size:9px;font-weight:700;line-height:12px;border-radius:3px;padding:0 3px;text-transform:uppercase;letter-spacing:.2px;vertical-align:1px}
.ev.ncblk{outline:3px solid #d93025;outline-offset:-1px;box-shadow:0 0 0 1px #fff inset}
.bellbox{position:relative}#btnBell{position:relative}
.belldrop{position:absolute;top:calc(100% + 6px);right:0;width:380px;max-height:70vh;overflow:auto;background:#fff;color:#222;border:1px solid #c5ced6;border-radius:8px;box-shadow:0 6px 24px rgba(0,0,0,.18);padding:8px 10px;z-index:200;text-align:left}
.belldrop .bdh{padding-bottom:6px;border-bottom:1px solid #eee;margin-bottom:6px}
.belldrop .bitem{position:relative;padding:6px 60px 6px 0;border-bottom:1px solid #f0f0f0}.belldrop .bitem a{color:#b3261e;font-weight:600;text-decoration:none}
.belldrop .bitem a:hover{text-decoration:underline}.belldrop .bclr{position:absolute;right:0;top:8px;font-size:11px;padding:2px 8px}
.belldrop .bhist{margin-top:8px}.belldrop .bh{padding:4px 0;border-bottom:1px dotted #eee}
@media (max-width:700px){.belldrop{position:fixed;left:6px;right:6px;width:auto;top:50px}}
.ncact button{width:auto;font-weight:600}
.bellbox[hidden],#tabNc[hidden],.belldrop[hidden]{display:none !important}
html body header .grp.bellbox[hidden]{display:none !important}
/* Customer Complaint table (hover, job, case) + story states like the Missing stories tab */
table.cc{border-collapse:collapse;width:100%;margin-top:4px;font-size:12px;white-space:normal}table.cc th,table.cc td{border-bottom:1px solid #e3e7eb;padding:2px 5px;text-align:left;vertical-align:top}
table.cc th{font-weight:600;color:#555;background:#f6f8fa}table.cc tr.ccdone td{color:#7a838c}
.cc-ok{color:#2e7d32;font-weight:600}.cc-miss{color:#c5221f;font-weight:700}.cc-inc{color:#a15c00;font-weight:700}
#tip table.cc{background:#fff;color:#222}#tip .cctodo{margin-top:6px;color:#222;white-space:normal}#tip .cctodo .muted{color:#6b5a2a}
.cls.incomplete{background:#fff3e0;color:#a15c00}
/* right-click Copy / Paste */
.copyb{position:absolute;bottom:1px;right:2px;z-index:2;background:#fff;color:#6a1b9a;border:1px solid #6a1b9a;font-size:9px;font-weight:800;padding:0 4px;border-radius:3px;line-height:12px;white-space:nowrap;max-width:calc(100% - 6px);overflow:hidden;text-overflow:ellipsis}
.copyb.to{color:#455a64;border-color:#455a64}.ev.copyblk{outline:2px dashed #6a1b9a;outline-offset:-2px}
.pop.ctxmenu{width:auto;min-width:200px;max-width:320px;padding:6px;display:flex;flex-direction:column;gap:3px}
.pop.ctxmenu .ctxit{text-align:left;padding:6px 8px;border:1px solid #dde2e7;background:#fff;border-radius:5px;cursor:pointer;font-size:13px}
.pop.ctxmenu .ctxit:hover:not([disabled]){background:#e8f0fe}.pop.ctxmenu .ctxit[disabled]{color:#999;cursor:default}

/* 10/26: side tabs stack onto rows so every tab (Dispatch / Triage / Quick Repair / Assigned / Not completed) is always visible */
.stabs{flex-wrap:wrap;row-gap:4px}
.stabs button{flex:1 1 auto;min-width:calc(33.33% - 4px);white-space:nowrap;display:inline-flex;align-items:center;justify-content:center;gap:3px}
.stabs button[hidden]{display:none}
span.pill.red{color:#fff} /* wip.css's global .red (red text) made the red count pills unreadable */

/* 10/26: future block of an RO that is closed in Decisiv */
.closedbadge{display:inline-block;background:#5f6368;color:#fff;font-size:9px;font-weight:700;line-height:12px;border-radius:3px;padding:0 3px;text-transform:uppercase;letter-spacing:.2px;vertical-align:1px}
.ev.closedblk{opacity:.6;background-image:repeating-linear-gradient(135deg,transparent 0 6px,rgba(0,0,0,.08) 6px 12px)}

/* 10/26: count badge on every side tab, right after the name on the right; grey when 0 (red-on-red stays fixed) */
.stabs button{justify-content:space-between;gap:6px;padding-left:7px;padding-right:5px}
.stabs .pill.tc{margin-left:auto;min-width:12px;text-align:center;line-height:16px}
.stabs button.on .pill.tc{background:#fff;color:#1a73e8}
.stabs button.on .pill.tc.red{color:#c62828}
.stabs .pill.tc.zero,.stabs button.on .pill.tc.zero,.stabs span.pill.red.tc.zero{background:#dfe3e8;color:#6b7680}
.stabs button.on .pill.tc.zero{background:rgba(255,255,255,.35);color:#fff}
/* 10/26 complaint text links to the Decisiv line page (stories); dotted = only the case page (line id not read yet) */
table.cc a.cclink{color:#0b57d0;text-decoration:underline}table.cc a.cclink:hover{color:#0842a0;background:#e8f0fe}table.cc a.cclink.cccase{text-decoration-style:dotted}table.cc tr.ccdone a.cclink{color:#5f7fb5}
.oncal{margin-top:3px;color:#1a4fb0;font-weight:600}.inc.oncalc{border-left-color:#1a73e8;background:#f4f8ff}

/* Parts EST tab: list not re-read in the latest pull (James 10/26) */
.warnnote{color:#8a5a00;background:#fff4d6;border:1px solid #f0d58a;border-radius:4px;padding:3px 6px}

/* 10/27: collapsed 'On calendar (n)' toggle under the Dispatch / Triage / Quick Repair / Road Test lists */
.oncalT{margin-top:8px;border-top:1px dashed #cfd8e3;padding-top:4px}.oncalT summary{cursor:pointer;padding:3px 0}.oncalT .inc{opacity:.85}
/* 10/27: tech notes in the bell */
.belldrop .tnsec{margin-bottom:10px;padding-bottom:6px;border-bottom:2px solid #e3e8ef}
.belldrop .tnitem{padding:6px 0;border-bottom:1px solid #f0f0f0}.belldrop .tnitem a{color:#1a5fb4}
.tn-text{white-space:pre-wrap;word-break:break-word;margin:3px 0;font-size:13px}
.belldrop .tnact{display:flex;gap:6px;margin-top:4px}.belldrop .tnrep{flex:1;min-width:0;font-size:12px;padding:3px 6px}.belldrop .tnh{font-size:12px;padding:2px 8px;white-space:nowrap}
.belldrop .tnre{font-size:11px;padding:1px 6px;margin-left:4px}
/* 10/27 (James t373u): Urgent waiting-list cards - checkbox upper-left, 'URGENT' upper-right; strong red so it stands apart from the
   pink 'not in latest pull' badge (kept white on red cards) and the blue 'on calendar' tint */
.inc{position:relative}.inc .urg{display:inline-flex;align-items:center;margin:-2px 6px 0 -2px;vertical-align:middle;cursor:pointer;padding:2px}
.inc .urg input{width:16px;height:16px;margin:0;cursor:pointer;accent-color:#b71c1c}
.inc.urgent,.inc.urgent.oncalc{background:#fdeaea;border-color:#c62828;border-left:6px solid #b71c1c;box-shadow:0 0 0 1px #c62828 inset}
.inc.urgent .t{padding-right:64px}.inc.urgent .badge.stale{background:#fff}
.inc .urgl{position:absolute;top:5px;right:6px;background:#b71c1c;color:#fff;font-size:11px;font-weight:800;letter-spacing:.06em;padding:1px 7px;border-radius:4px;line-height:16px}
.ev .urgb{display:inline-block;background:#b71c1c;color:#fff;font-weight:800;font-size:9px;line-height:12px;letter-spacing:.04em;padding:0 4px;border-radius:3px;margin-right:3px;vertical-align:1px;box-shadow:0 0 0 1px #fff}
@media (pointer:coarse){.inc .urg input{width:22px;height:22px}}
/* 10/27 (James t376u): Hours stepper right of End (− 8.50 +), 0.25 steps */
.hrsw{display:flex;align-items:stretch;gap:0}.hrsw .hrsi{width:62px;text-align:center;border-radius:0;margin:0;-moz-appearance:textfield}
.hrsw .hrsi::-webkit-inner-spin-button,.hrsw .hrsi::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
.hrsw .hrsb{min-width:28px;padding:0 6px;font-weight:700;font-size:15px;line-height:1;margin:0;border:1px solid #c4ccd4;background:#f3f5f7;cursor:pointer}
.hrsw .hrsb:first-child{border-radius:6px 0 0 6px;border-right:0}.hrsw .hrsb:last-child{border-radius:0 6px 6px 0;border-left:0}
.hrsw .hrsb:disabled{opacity:.5;cursor:default}
@media (min-width:769px){.row.trow{flex-wrap:nowrap}.row.trow label{min-width:0}.row.trow input[type=date]{max-width:150px}.row.trow input[type=time]{max-width:118px}}
@media (pointer:coarse){.hrsw .hrsb{min-width:40px;font-size:18px}.hrsw .hrsi{width:70px}}
/* 10/27 (James t375u): Waiter flag - blue label beside URGENT (card stays its normal colour unless urgent), chip on blocks, banner in popups */
.inc .flagls{position:absolute;top:5px;right:6px;display:flex;gap:4px}.inc .flagls .urgl{position:static}
.inc .wtrl{background:#1565c0;color:#fff;font-size:11px;font-weight:800;letter-spacing:.06em;padding:1px 7px;border-radius:4px;line-height:16px}
.inc .urg+.wtr{margin-left:-2px}.inc .wtr input{accent-color:#1565c0}
.inc.waiter .t{padding-right:72px}.inc.urgent.waiter .t{padding-right:140px}
.ev .wtrb{display:inline-block;background:#1565c0;color:#fff;font-weight:800;font-size:9px;line-height:12px;letter-spacing:.04em;padding:0 4px;border-radius:3px;margin-right:3px;vertical-align:1px;box-shadow:0 0 0 1px #fff}
.flagban{font-weight:800;letter-spacing:.05em;color:#fff;border-radius:6px;padding:6px 10px;margin:0 0 6px;font-size:14px}
.flagban.wtrban{background:#1565c0}.flagban.urgban{background:#b71c1c}
#drawer .flagban{margin:4px 90px 6px 0}
