:root{
  --bg:#f3f5f8; --panel:#ffffff; --ink:#1b2430; --muted:#5d6977; --line:#dce1e7; --line-strong:#a9b3bf;
  --empty:#eceef1; --accent:#1f5fbf; --accent-dk:#1a52a6; --warn:#b45309; --danger:#b42318; --ok:#15803d; --head:#e8eef6;
  --label-w:200px; --lane-h:34px;
}
*{box-sizing:border-box}
html,body{margin:0;height:100%}
body{background:var(--bg);color:var(--ink);font:14px/1.35 "Segoe UI",system-ui,-apple-system,Roboto,Arial,sans-serif}
button,select,input{font:inherit;font-size:13px;color:var(--ink)}
select,input[type=text],input[type=email],input[type=password],input[type=date],input:not([type]){padding:6px 8px;border:1px solid var(--line-strong);border-radius:7px;background:#fff}
[hidden]{display:none!important}
.muted{color:var(--muted)}

/* ---------- auth ---------- */
.auth{min-height:100%;display:flex;align-items:center;justify-content:center;padding:24px 16px}
.auth-card{width:100%;max-width:400px;background:var(--panel);border:1px solid var(--line);border-radius:14px;padding:28px 26px;box-shadow:0 10px 30px rgba(20,30,50,.08)}
.auth-card h1{font-size:21px;margin:10px 0 2px}
.auth-card form{display:flex;flex-direction:column;gap:10px;margin-top:18px}
.auth-card label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--muted)}
.auth-card input{padding:9px 10px;font-size:14px}
.auth-card .btn.primary{padding:10px;font-size:14px;margin-top:4px}
.auth-card .switch{font-size:13px;text-align:center;margin-top:6px}
.auth-card .switch a{color:var(--accent);cursor:pointer;text-decoration:underline}
.auth-err{color:var(--danger);font-size:13px;min-height:18px;margin-top:10px}
.fine{font-size:12px;color:var(--muted);margin:14px 0 0;border-top:1px solid var(--line);padding-top:12px}
.logo{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;border-radius:9px;background:var(--accent);color:#fff;font-weight:800;font-size:14px;letter-spacing:.5px}
.join-head{background:#eef4fd;border:1px solid #cfe0f7;border-radius:9px;padding:10px 12px;font-size:13.5px;margin-top:14px}

/* ---------- app shell ---------- */
.app{display:grid;grid-template-columns:minmax(0,1fr) 340px;height:100vh}
main{overflow:auto;padding:12px 16px 40px}
aside{border-left:1px solid var(--line);background:var(--panel);overflow:auto;position:relative}
.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:10px 16px;margin-bottom:12px}
.brand{display:flex;align-items:center;gap:10px;min-width:0}
.brand .logo{width:30px;height:30px;font-size:12px;border-radius:8px}
.brand h1{font-size:17px;margin:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:280px}
.datebox{display:flex;align-items:center;gap:6px}
.dow{font-weight:600;min-width:84px}
.actions{display:flex;gap:6px;margin-left:auto;flex-wrap:wrap;align-items:center}
.sync{font-size:12.5px;color:var(--muted);white-space:nowrap}
.sync.ok::before{content:"✓ ";color:var(--ok);font-weight:700}
.sync.saving{color:var(--accent)}
.sync.offline{color:var(--danger);font-weight:600}
.btn{padding:6px 11px;border-radius:7px;border:1px solid var(--line-strong);background:#fff;cursor:pointer;white-space:nowrap}
.btn:hover{background:#eef2f7}
.btn:disabled{opacity:.5;cursor:default}
.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.btn.primary:hover{background:var(--accent-dk)}
.btn.danger{color:var(--danger);border-color:#e3b2ac}
.btn.sm{padding:3px 8px;font-size:12px}
.icon{border:none;background:transparent;cursor:pointer;color:var(--muted);font-size:15px;padding:4px 7px;border-radius:6px}
.icon:hover{background:#eef1f5;color:var(--ink)}
.print-only{display:none}
.banner{background:#fff4e0;border:1px solid #f0c27a;color:#7a4a06;padding:8px 12px;border-radius:8px;margin-bottom:10px}
.role-pill{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;padding:2px 7px;border-radius:999px;background:#eef1f5;color:var(--muted)}

/* ---------- grid ---------- */
.sec{background:var(--panel);border:1px solid var(--line);border-radius:10px;margin-bottom:14px;overflow:hidden}
.sec-head,.row{display:grid;grid-template-columns:var(--label-w) minmax(0,1fr)}
.sec-head{background:var(--head);border-bottom:1px solid var(--line-strong)}
.sec-title{padding:8px 12px;font-weight:700;font-size:15px;align-self:center;border-right:1px solid var(--line-strong)}
.blocks{display:grid;grid-template-columns:repeat(6,1fr)}
.blocks div{text-align:center;font-weight:600;font-size:12.5px;padding:5px 0 1px;border-left:1px solid var(--line-strong)}
.hours{display:grid;grid-template-columns:repeat(24,1fr);font-size:10px;color:var(--muted)}
.hours span{padding:0 0 3px 3px;border-left:1px solid var(--line);overflow:hidden;white-space:nowrap}
.hours span:nth-child(4n+1){border-left-color:var(--line-strong)}
.row{border-top:1px solid var(--line)}
.sec-head + .row{border-top:none}
.rlabel{padding:4px 10px;display:flex;align-items:center;gap:6px;min-width:0;border-right:1px solid var(--line-strong);white-space:nowrap;overflow:hidden}
.rlabel b{font-weight:600}
.rlabel .sub{color:var(--muted);font-size:12px;overflow:hidden;text-overflow:ellipsis}
.rlabel .rr{margin-left:auto;font-size:10px;color:var(--muted);border:1px solid var(--line);border-radius:4px;padding:0 4px}
.row.vacant .rlabel{color:var(--muted)}
.row.vacant .rlabel b{font-weight:500}
.lane{position:relative;height:var(--lane-h);display:grid;grid-template-columns:repeat(24,1fr);background:var(--empty)}
.lane i{border-left:1px solid #dde1e6}
.lane i:nth-child(4n+1){border-left-color:var(--line-strong)}
.lane.drop-ok{box-shadow:inset 0 0 0 2px var(--accent)}
.lane.nodrop{background:#fbe3e1}
.now{position:absolute;top:0;bottom:0;width:2px;background:#d92d20;opacity:.7;pointer-events:none;z-index:3}
.counts{display:grid;grid-template-columns:repeat(24,1fr);height:var(--lane-h)}
.counts span{display:flex;align-items:center;justify-content:center;border-left:1px solid #dde1e6;font-weight:600;font-size:13px;font-variant-numeric:tabular-nums}
.counts span:nth-child(4n+1){border-left-color:var(--line-strong)}
.counts span.zero{color:#b8c0ca;font-weight:400}
.counts span.nowh{background:#fdecea}
.count-row.total{background:var(--head)}
.count-row.total .counts span{font-weight:800}
.count-sec .sec-title .sub{font-weight:400;font-size:12px;color:var(--muted);margin-left:4px}
.empty-layout{background:var(--panel);border:1px dashed var(--line-strong);border-radius:10px;padding:30px;text-align:center;color:var(--muted)}

.bar{position:absolute;top:3px;height:calc(var(--lane-h) - 6px);z-index:2;border-radius:6px;background:var(--c-bg);border:1px solid var(--c-bd);color:var(--c-ink);
  display:flex;align-items:center;gap:6px;padding:0 10px;overflow:hidden;white-space:nowrap;cursor:grab;font-size:12.5px;font-weight:600;touch-action:none;user-select:none}
.bar .bn{overflow:hidden;text-overflow:ellipsis;min-width:0}
.bar .bt{font-weight:400;opacity:.8;font-size:11.5px;flex-shrink:0}
.bar.short .bt{display:none}
.bar .h{position:absolute;top:0;bottom:0;width:9px;cursor:ew-resize;z-index:1}
.bar .h.l{left:0}.bar .h.r{right:0}
.bar:hover .h{background:linear-gradient(90deg,transparent 3px,var(--c-bd) 3px,var(--c-bd) 5px,transparent 5px)}
.bar.warn{outline:2px dashed var(--warn);outline-offset:-3px}
.bar .wi{color:var(--warn);flex-shrink:0}
.bar.moving{opacity:.3}
.grid.focus .bar:not(.hl){opacity:.25}
.grid.focus .bar.hl{box-shadow:0 0 0 2px var(--c-bd)}
.preview{position:absolute;top:3px;bottom:3px;z-index:4;border:2px dashed var(--accent);background:rgba(31,95,191,.12);border-radius:6px;
  font-size:12px;font-weight:700;color:var(--accent);display:flex;align-items:center;padding:0 8px;pointer-events:none;white-space:nowrap;overflow:hidden}

/* read-only (viewer role) */
body.readonly .bar{cursor:default}
body.readonly .bar .h,body.readonly .addform,body.readonly .grip,body.readonly [data-edit]{display:none}
body.readonly .card{cursor:default}

/* ---------- sidebar ---------- */
.side-head{padding:12px 14px 8px;display:flex;align-items:baseline;gap:10px;border-bottom:1px solid var(--line)}
.side-head h2{margin:0;font-size:16px}
.summary{color:var(--muted);font-size:12.5px}
.summary b{color:var(--accent)}
.addform{display:grid;grid-template-columns:1fr 84px;gap:6px;padding:10px 14px 12px;border-bottom:1px solid var(--line);background:#f8f9fb}
.addform .full{grid-column:1/-1}
.times{display:flex;align-items:center;gap:6px}
.times select{flex:1}
.cards{padding:4px 0 10px}
.card{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:8px;align-items:center;padding:8px 8px 8px 6px;margin:7px 12px;border:1px solid var(--line);
  border-left:5px solid var(--c-bd);border-radius:8px;background:#fff;cursor:grab;touch-action:none;user-select:none}
.card:hover{box-shadow:0 2px 10px rgba(0,0,0,.08)}
.card.done{opacity:.55;cursor:default}
.grip{color:#a3adb8;font-size:16px;line-height:1}
.cname{font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.role{font-size:10.5px;font-weight:700;padding:1px 5px;border-radius:4px;background:#eef1f5;color:var(--muted);margin-left:6px;vertical-align:1px}
.cmeta{font-size:12px;color:var(--muted);margin-top:1px}
.open{color:var(--accent);font-weight:700}
.mini{display:grid;grid-template-columns:repeat(24,1fr);gap:1px;margin-top:6px;height:7px}
.mini i{border-radius:1px}
.mini i.s{background:#dfe4ea}
.mini i.f{background:var(--c-bd)}
.empty{color:var(--muted);padding:16px 16px;font-size:13px}
details.saved{border-top:1px solid var(--line);padding:8px 14px 16px}
details.saved summary{cursor:pointer;font-weight:600;padding:4px 0}
.srow{display:grid;grid-template-columns:10px minmax(0,1fr) 70px auto auto;gap:6px;align-items:center;padding:4px 0}
.srow select{padding:3px 4px;font-size:12px}
.sname{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dot{width:10px;height:10px;border-radius:50%;background:var(--c-bd);display:inline-block;flex-shrink:0}
.unassign{display:none;position:sticky;top:0;z-index:5;margin:0;padding:12px;text-align:center;font-weight:700;color:var(--danger);background:#fdeceb;border-bottom:2px dashed var(--danger)}
aside.unassign-mode .unassign{display:block}
aside.over{background:#fdf3f2}
.phi-note{font-size:11.5px;color:var(--muted);padding:10px 14px 16px;border-top:1px solid var(--line)}

/* ---------- overlays ---------- */
.ghost{position:fixed;z-index:50;pointer-events:none;padding:6px 10px;border-radius:8px;background:var(--c-bg);border:1px solid var(--c-bd);color:var(--c-ink);
  font-weight:600;box-shadow:0 8px 20px rgba(0,0,0,.2);transform:translate(12px,12px);white-space:nowrap}
body.dragging,body.dragging *{cursor:grabbing!important;user-select:none}
body.resizing,body.resizing *{cursor:ew-resize!important;user-select:none}
#pop{position:fixed;z-index:60;background:#fff;border:1px solid var(--line-strong);border-radius:10px;box-shadow:0 12px 32px rgba(0,0,0,.2);padding:12px;min-width:250px;max-width:320px}
#pop.menu{padding:6px;min-width:220px}
.menu button{display:flex;width:100%;text-align:left;border:none;background:none;padding:8px 10px;border-radius:7px;cursor:pointer;gap:8px;align-items:center}
.menu button:hover{background:#eef2f7}
.menu button.danger{color:var(--danger)}
.menu hr{border:none;border-top:1px solid var(--line);margin:5px 4px}
.menu .who{padding:6px 10px 8px;font-size:12px;color:var(--muted)}
.pop-h{display:flex;align-items:center;gap:6px;font-size:15px}
.pop-sub{color:var(--muted);font-size:12.5px;margin:2px 0 8px}
.pop-warn{background:#fff4e0;color:#7a4a06;border-radius:6px;padding:6px 8px;font-size:12.5px;margin-bottom:8px}
.pop-row{display:flex;gap:8px;align-items:center;margin:8px 0}
.pop-row label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--muted);flex:1}
.pop-actions{display:flex;justify-content:space-between;gap:8px;margin-top:10px}
#toast{position:fixed;left:50%;bottom:22px;transform:translateX(-50%);background:#1b2430;color:#fff;padding:9px 16px;border-radius:8px;font-size:13px;z-index:90;
  opacity:0;transition:opacity .2s;pointer-events:none;max-width:90vw}
#toast.show{opacity:1}
#tip{position:fixed;z-index:80;background:#1b2430;color:#fff;font-size:12.5px;padding:7px 10px;border-radius:7px;pointer-events:none;max-width:300px;line-height:1.4}

/* modal */
#modal{position:fixed;inset:0;z-index:70;background:rgba(20,28,40,.45);display:flex;align-items:flex-start;justify-content:center;padding:40px 16px;overflow:auto}
.modal-card{background:#fff;border-radius:12px;width:100%;max-width:760px;padding:20px 22px;position:relative;box-shadow:0 20px 50px rgba(0,0,0,.25)}
.modal-card h2{margin:0 0 4px;font-size:18px}
.modal-card h3{font-size:14px;margin:18px 0 8px}
.modal-close{position:absolute;top:10px;right:10px}
.modal-foot{display:flex;justify-content:flex-end;gap:8px;margin-top:18px;border-top:1px solid var(--line);padding-top:14px}
table.tbl{width:100%;border-collapse:collapse;font-size:13px}
table.tbl th{text-align:left;font-size:12px;color:var(--muted);font-weight:600;padding:6px;border-bottom:1px solid var(--line)}
table.tbl td{padding:6px;border-bottom:1px solid var(--line);vertical-align:middle}
.linkbox{display:flex;gap:6px;margin-top:8px}
.linkbox input{flex:1;font-family:Consolas,monospace;font-size:12px}
.note{font-size:12.5px;color:var(--muted);margin:6px 0}
.inline{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.form-col{display:flex;flex-direction:column;gap:10px;max-width:340px}
.form-col label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--muted)}

/* area editor */
.le-sec{border:1px solid var(--line);border-radius:10px;margin:10px 0;background:#fafbfc}
.le-sec-head{display:flex;gap:6px;align-items:center;padding:8px 10px;background:var(--head);border-radius:10px 10px 0 0}
.le-sec-head input{flex:1;font-weight:700}
.le-row{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) 120px auto auto auto;gap:6px;align-items:center;padding:5px 10px}
.le-add{padding:6px 10px 10px}
.le-head{display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr) 120px 96px;gap:6px;padding:6px 10px 0;font-size:11.5px;color:var(--muted)}

/* ---------- report ---------- */
.app.report-mode{grid-template-columns:minmax(0,1fr)}
.app.report-mode aside,.app.report-mode #grid,.app.report-mode .datebox{display:none}
.rep-controls{display:flex;flex-wrap:wrap;gap:8px 14px;align-items:center;background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:10px}
.rep-controls label{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--muted)}
.seg{display:inline-flex;border:1px solid var(--line-strong);border-radius:7px;overflow:hidden}
.seg button{border:none;background:#fff;padding:6px 10px;cursor:pointer;border-left:1px solid var(--line)}
.seg button:first-child{border-left:none}
.seg button.on{background:var(--accent);color:#fff}
.rep-sum{display:flex;flex-wrap:wrap;gap:6px 18px;align-items:center;margin:4px 2px 10px;color:var(--muted);font-size:13px}
.rep-sum b{color:var(--ink)}
.legend{display:flex;align-items:center;gap:6px;margin-left:auto;font-size:12px}
.legend .ramp{width:140px;height:10px;border-radius:3px}
.rep-wrap{overflow:auto;background:var(--panel);border:1px solid var(--line);border-radius:10px;max-height:calc(100vh - 210px)}
table.heat{border-collapse:separate;border-spacing:2px;font-size:13px}
table.heat th{font-weight:600;font-size:12px;color:var(--muted);text-align:left;padding:4px 6px;background:#fff;position:sticky;top:0;z-index:2;vertical-align:bottom}
table.heat thead tr:nth-child(2) th{top:26px}
table.heat th.grp{text-align:center;color:var(--ink);border-bottom:2px solid var(--line-strong)}
table.heat th[data-sort]{cursor:pointer}
table.heat th[data-sort]:hover{color:var(--accent)}
table.heat th.sorted{color:var(--accent)}
table.heat th .v{writing-mode:vertical-rl;transform:rotate(180deg);white-space:nowrap;display:inline-block;max-height:150px;overflow:hidden;text-overflow:ellipsis}
table.heat td{padding:0 8px;height:30px;white-space:nowrap}
table.heat td.num{text-align:right;font-variant-numeric:tabular-nums}
table.heat td.hc{min-width:40px;padding:0;text-align:center;border-radius:4px;font-size:12px;font-weight:600;font-variant-numeric:tabular-nums;background:#f3f5f8}
table.heat td.name,table.heat th.name{position:sticky;left:0;background:#fff;z-index:1;font-weight:600}
table.heat th.name{z-index:3}
table.heat tbody tr:hover td.name{color:var(--accent)}
.rep-note{color:var(--muted);font-size:12px;margin:8px 2px}

/* ---------- display mode (unit TV / read-only screen) ---------- */
body.display .app{grid-template-columns:minmax(0,1fr)}
body.display aside,body.display .actions,body.display .datebox button{display:none}
body.display{--lane-h:40px;--label-w:220px}
body.display .bar{font-size:14px}
body.display .rlabel b{font-size:15px}
.exit-display{position:fixed;right:12px;bottom:12px;z-index:40;opacity:.35}
.exit-display:hover{opacity:1}

@media (max-width:900px){
  .app{grid-template-columns:1fr;height:auto}
  aside{border-left:none;border-top:1px solid var(--line)}
  main{overflow-x:auto}
  .grid{min-width:760px}
  .le-row{grid-template-columns:1fr 1fr;}
}
@media print{
  @page{size:landscape;margin:8mm}
  body{background:#fff}
  .app{display:block;height:auto}
  aside,.actions,.datebox,.now,.banner,#pop,#toast,.exit-display,.sync{display:none!important}
  .print-only{display:inline}
  main{overflow:visible;padding:0}
  :root{--lane-h:24px;--label-w:170px}
  .sec{break-inside:avoid;margin-bottom:8px;border-radius:0}
  .sec,.sec-head,.lane,.bar,.lane i{-webkit-print-color-adjust:exact;print-color-adjust:exact}
}
