/* ============================================================
   ProjectTelemetry — Operations Module Styles
   assets/operations.css
   (Tasks, Daily Reports, Pre-Task/JHA)
   ============================================================ */

.op-toolbar { display:flex; align-items:center; gap:8px; margin-bottom:14px; flex-wrap:wrap; }
.op-filter-sel { padding:6px 10px; border:1.5px solid var(--bd); border-radius:5px; font-size:12px; font-family:Raleway,sans-serif; background:var(--bg); color:var(--ink); }
.op-loading { display:flex; justify-content:center; padding:40px 0; color:var(--ink-faint); }
.op-empty { text-align:center; padding:40px 20px; color:var(--ink-faint); }
.op-empty i { font-size:28px; display:block; margin-bottom:8px; }
.op-section-title { font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.05em; color:var(--ink-soft); margin:14px 0 8px; }

/* Task/report/JHA list rows — shared visual pattern */
.op-task-list { display:flex; flex-direction:column; gap:6px; }
.op-task-row { display:flex; align-items:center; justify-content:space-between; gap:10px; padding:10px 12px; background:var(--white); border:1px solid var(--bd); border-radius:8px; cursor:pointer; transition:border-color .12s; }
.op-task-row:hover { border-color:var(--accent); }
.op-task-overdue { border-left:3px solid #DC2626; }
.op-task-sub { background:var(--bg2, #F7F8FA); border-style:dashed; }
.op-sub-arrow { color:var(--ink-faint); font-size:14px; }
.op-deleg-tag { font-size:9px; font-weight:700; letter-spacing:.03em; text-transform:uppercase; color:var(--accent); background:var(--accent-bg); padding:1px 6px; border-radius:10px; }
.op-deleg-by { display:inline-flex; align-items:center; gap:3px; font-weight:600; color:var(--accent); }
.op-deleg-by i { font-size:13px; }
.op-deleg-name { text-decoration:underline; text-decoration-style:dotted; text-underline-offset:2px; cursor:pointer; }
.op-deleg-name:hover { text-decoration-style:solid; }
.op-detail-deleg { display:flex; align-items:center; gap:5px; font-size:12.5px; font-weight:600; color:var(--accent); margin-bottom:10px; }
.op-detail-deleg i { font-size:14px; }
/* Read-only task identity shown when delegating (title + description are fixed). */
.op-deleg-src { border:1px solid var(--bd); border-radius:8px; background:var(--bg2); padding:9px 11px; }
.op-deleg-src-title { font-size:14px; font-weight:600; color:var(--ink); }
.op-deleg-src-desc { font-size:12.5px; color:var(--ink-soft); margin-top:4px; white-space:pre-wrap; }
.op-task-main { flex:1; min-width:0; }
.op-task-title-row { display:flex; align-items:center; gap:6px; margin-bottom:4px; }
.op-task-title { font-size:13px; font-weight:600; color:var(--ink); }
.op-overdue-tag { font-size:9px; font-weight:700; color:#DC2626; text-transform:uppercase; }
.op-task-meta { display:flex; gap:12px; flex-wrap:wrap; font-size:11px; color:var(--ink-faint); }
.op-task-meta i { margin-right:3px; }
.op-task-detail-meta { display:flex; flex-direction:column; gap:4px; font-size:12px; color:var(--ink-soft); margin-bottom:10px; }
.op-task-detail-meta .faint { color:var(--ink-faint); margin-right:6px; }
/* Inline editing on the task-detail modal: the header title IS the input
   (dashed underline on hover says "tap to rename"), and a quiet Saving/Saved
   tick replaces the old Edit-button round trip. */
.op-d-title { border:none; background:transparent; padding:0; margin:0; flex:1; min-width:0;
  color:inherit; border-bottom:1px dashed transparent; border-radius:0; }
.op-d-title:hover { border-bottom-color:var(--bd); }
.op-d-title:focus { outline:none; border-bottom-color:var(--accent); }
.op-d-save { font-size:11px; color:var(--ink-faint); white-space:nowrap; flex:0 0 auto; }
.op-d-save.ok { color:#16A34A; }
.op-chip { background:var(--accent-bg); color:var(--accent); font-size:11px; font-weight:600; padding:3px 10px; border-radius:20px; }
.op-subtask-row { font-size:12px; color:var(--ink-soft); display:flex; align-items:center; gap:6px; }

/* Editable assignee control (task detail) */
.op-assign-editor { margin-bottom:12px; }
.op-assign-chips { display:flex; flex-wrap:wrap; gap:6px; margin-bottom:8px; }
.op-chip-rm { display:inline-flex; align-items:center; gap:4px; cursor:pointer; }
.op-chip-rm i { font-size:12px; opacity:.7; }
.op-chip-rm:hover { background:color-mix(in srgb, var(--danger,#DC2626) 14%, transparent); color:var(--danger,#DC2626); }
.op-assign-saving { margin-left:8px; color:var(--ink-faint); }
.op-ac-title { font-size:11px; font-weight:600; color:var(--muted); }
.op-ac-title::before { content:"· "; }

/* Searchable assignee picker — click a whole row to pick; no visible button */
.op-picker { border:1px solid var(--bd); border-radius:8px; overflow:hidden; }
.op-picker-search { display:flex; align-items:center; gap:6px; padding:6px 9px; border-bottom:1px solid var(--bd); background:var(--bg2); }
.op-picker-search i { color:var(--muted); font-size:15px; }
.op-picker-search input { flex:1; border:0; background:transparent; outline:none; font-size:13px; color:var(--tx); }
.op-picker-list { max-height:200px; overflow-y:auto; }
.op-picker-opt { position:relative; display:flex; align-items:center; gap:8px; padding:8px 12px; font-size:13px; cursor:pointer; background:transparent; }
.op-picker-opt + .op-picker-opt { border-top:1px solid var(--bd); }
.op-picker-opt:hover { background:var(--bg2); }
/* Whole row is the target — hide the native radio/checkbox; selection shows as a check. */
.op-picker-opt input { position:absolute; opacity:0; width:0; height:0; margin:0; pointer-events:none; }
.op-picker-opt:has(input:checked) { background:var(--bg2); }
.op-picker-opt:has(input:checked)::after { content:'✓'; margin-left:auto; color:var(--accent); font-weight:800; font-size:13px; }
/* Inline "add crew" rows: click to add, a + hint on the right. */
.op-pick-add { margin-left:auto; color:var(--muted); font-size:16px; }
.op-pick-click:hover .op-pick-add { color:var(--accent); }
.op-picker-none { padding:9px 10px; font-size:12px; color:var(--muted); }
.op-assign-picker { margin-top:6px; }

/* Daily report crew hours table */
.op-crew-table { width:100%; border-collapse:collapse; font-size:12px; margin-top:6px; }
.op-crew-table th { text-align:left; padding:6px 8px; background:var(--bg2); font-size:10px; font-weight:700; text-transform:uppercase; color:var(--ink-soft); }
.op-crew-table td { padding:6px 8px; border-bottom:1px solid var(--bd); vertical-align:middle; }
.op-hr-input { width:56px; padding:4px 6px; border:1px solid var(--bd); border-radius:4px; font-size:12px; text-align:center; }
.op-hr-note { width:100%; padding:4px 6px; border:1px solid var(--bd); border-radius:4px; font-size:11px; }

/* JHA detail fields */
.op-jha-field { margin-bottom:10px; }
.op-jha-field label { display:block; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-faint); margin-bottom:3px; }
.op-jha-field p { font-size:13px; color:var(--ink); white-space:pre-wrap; line-height:1.5; }

/* ── Task scheduling block (Man Loading, Slice 1) ─────────────── */
.op-sched { border:1px solid var(--bd); border-radius:8px; padding:10px 10px 4px; margin-bottom:10px; background:var(--bg2); }
.op-sched-hd { font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-soft); margin-bottom:8px; display:flex; align-items:center; gap:5px; }
.op-sched-hint { font-size:11px; color:var(--ink-faint); margin:2px 0 6px; }
.op-sched .field label { font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.03em; color:var(--ink-faint); }

/* Tasks portfolio dashboard (builds on .cd-* and .co-table) */
.tk-prio { font-size:10px; font-weight:800; text-transform:uppercase; letter-spacing:.03em; padding:2px 8px; border-radius:20px; white-space:nowrap; }
.tk-prio.neg { color:#B91C1C; background:color-mix(in srgb,#DC2626 13%,transparent); }
.tk-prio.warn { color:#B45309; background:color-mix(in srgb,#F59E0B 18%,transparent); }
.tk-prio.accent { color:var(--accent); background:var(--accent-bg); }
.tk-prio.muted { color:var(--ink-faint); background:var(--bg2); }
.tk-status { font-size:12px; color:var(--ink-soft); }
.tk-over { color:#DC2626; font-weight:700; }
.tk-over i { font-size:12px; vertical-align:-1px; }

/* ── Schedule (CPM + milestones + Gantt) ──────────────────── */
.sch-baseline { display:flex; justify-content:space-between; align-items:center; gap:12px; margin:14px 0 4px;
  padding:10px 14px; border:1px dashed var(--bd); border-radius:10px; font-size:12.5px; color:var(--ink-soft); }
.sch-baseline.set { border-style:solid; background:var(--bg2); }
.sch-baseline-l { display:flex; align-items:center; gap:7px; }
.sch-baseline-l i { color:var(--ink-faint); }
.sch-baseline-r { display:flex; gap:6px; flex:none; }
.sch-panel { border:1px solid var(--bd); border-radius:12px; background:var(--white); padding:14px 16px; margin-top:14px; }
.sch-panel-hd { display:flex; justify-content:space-between; align-items:center; margin-bottom:12px; font-size:13px; font-weight:600; color:var(--ink); }
.sch-panel-hd i { color:var(--ink-faint); margin-right:5px; }
.sch-mllink { font-size:12px; color:var(--accent); text-decoration:none; font-weight:500; display:inline-flex; align-items:center; gap:4px; }
.sch-mllink:hover { text-decoration:underline; }
.sch-hint { margin-top:10px; font-size:12px; color:var(--ink-soft); display:flex; align-items:center; gap:6px; }
.sch-hint a { color:var(--accent); }

/* Milestones */
.sch-ms-list { display:flex; flex-direction:column; gap:8px; }
.sch-ms { display:flex; align-items:center; gap:11px; padding:9px 12px; border:1px solid var(--bd); border-radius:10px; }
.sch-ms-i { width:32px; height:32px; border-radius:8px; display:flex; align-items:center; justify-content:center; flex:none; font-size:16px; }
.sch-ms-i.ok { background:rgba(5,150,105,.12); color:#059669; }
.sch-ms-i.neg { background:rgba(220,38,38,.12); color:#DC2626; }
.sch-ms-i.warn { background:rgba(202,138,4,.14); color:#B45309; }
.sch-ms-i.muted { background:var(--bg2); color:var(--ink-soft); }
.sch-ms-main { flex:1; min-width:0; }
.sch-ms-name { font-weight:600; font-size:13.5px; color:var(--ink); }
.sch-ms-sub { font-size:12px; color:var(--ink-soft); margin-top:1px; }
.sch-critflag { font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:.03em; color:#DC2626; background:rgba(220,38,38,.1); border-radius:4px; padding:1px 5px; }
.sch-ms-r { display:flex; align-items:center; gap:6px; flex:none; }
.sch-late { color:#DC2626; font-weight:600; } .sch-early { color:#059669; font-weight:600; }

/* ============================================================
   Interactive CPM Gantt (Man-Loading visual language)
   .sch-split = fixed WBS grid (left) + scrolling timeline (right)
   ============================================================ */
.sch-hint.neg { color:#DC2626; }
.sch-hint.neg i { color:#DC2626; }
/* The milestone panel. Tabs carry their own counts so "what is overdue" is
   answerable without clicking, and clickable so it is answerable in full. */
.sch-mspanel { margin-top:4px; }
.sch-mstabs { display:flex; flex-wrap:wrap; gap:6px; }
.sch-mstab { display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border:1px solid var(--bd); border-radius:20px; background:var(--white); cursor:pointer; font-size:12px; font-weight:600; color:var(--ink-soft); }
.sch-mstab:hover { background:var(--bg2); }
.sch-mstab.on { border-color:var(--accent); color:var(--accent); }
.sch-mstab-n { font-variant-numeric:tabular-nums; opacity:.7; }
.sch-msnone { font-size:12px; color:var(--ink-faint); padding:12px 2px; }

.sch-msstrip { display:flex; gap:7px; overflow-x:auto; padding:10px 2px 4px; margin-top:4px; -webkit-overflow-scrolling:touch; }
.sch-mschip { flex:none; display:inline-flex; align-items:center; gap:6px; padding:5px 10px; border:1px solid var(--bd); border-radius:20px; background:var(--white); cursor:pointer; font-size:12px; color:var(--ink); transition:background .12s, border-color .12s; }
.sch-mschip:hover { background:var(--bg2); }
.sch-mschip i { font-size:13px; }
.sch-mschip-n { font-weight:600; white-space:nowrap; }
.sch-mschip-d { color:var(--ink-soft); font-variant-numeric:tabular-nums; white-space:nowrap; }
.sch-mschip.ok    { border-color:rgba(5,150,105,.4); }  .sch-mschip.ok i    { color:#059669; }
.sch-mschip.neg   { border-color:rgba(220,38,38,.4); }  .sch-mschip.neg i   { color:#DC2626; }
.sch-mschip.warn  { border-color:rgba(202,138,4,.45); } .sch-mschip.warn i  { color:#B45309; }
.sch-mschip.muted i { color:var(--ink-faint); }

/* Toolbar uses the shared .mod-tb system (app.css). Baseline strip active toggle: */
.sch-baseline .on { background:var(--accent,#2563EB); color:#fff; border-color:var(--accent,#2563EB); }

/* Split shell */
.sch-split { display:flex; border:1px solid var(--bd); border-radius:12px; overflow:hidden; background:var(--white); height:min(66vh, 720px); }
.sch-grid { flex:none; overflow-y:auto; overflow-x:hidden; border-right:1px solid var(--bd); background:var(--white); scrollbar-width:none;
  /* Same momentum treatment as the timeline it scrolls with — this pane was
     the one scroller that never got it, so flicking the labels felt dead. */
  -webkit-overflow-scrolling:touch; overscroll-behavior-y:contain; }
.sch-grid::-webkit-scrollbar { display:none; }
.sch-ghead { display:flex; align-items:flex-end; position:sticky; top:0; z-index:6; background:var(--bg2); border-bottom:1px solid var(--bd); font-size:10.5px; font-weight:600; letter-spacing:.03em; text-transform:uppercase; color:var(--ink-faint); padding-bottom:6px; }
.sch-gbody { position:relative; }
.sch-grow { display:flex; align-items:center; border-bottom:1px solid var(--bd); cursor:pointer; transition:background .1s; }
.sch-grow:hover { background:var(--bg2); }
.sch-grow.crit { background:rgba(220,38,38,.035); }
.sch-grow.crit:hover { background:rgba(220,38,38,.07); }
.sch-grow.summ .sch-gtitle { font-weight:700; }
.sch-gname { flex:1; min-width:0; display:flex; align-items:center; gap:5px; font-size:12.5px; color:var(--ink); }
.sch-ghname { padding-left:28px; }
.sch-gtitle { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.sch-caret { width:16px; height:16px; flex:none; display:inline-flex; align-items:center; justify-content:center; border:none; background:none; color:var(--ink-soft); cursor:pointer; padding:0; }
.sch-caret:hover { color:var(--ink); }
.sch-caret-sp { width:16px; flex:none; }
.sch-sdot { width:7px; height:7px; border-radius:50%; flex:none; }
.sch-gcol { flex:none; text-align:right; font-size:11.5px; color:var(--ink-soft); padding-right:10px; font-variant-numeric:tabular-nums; white-space:nowrap; }
.sch-gdur   { width:42px; }
.sch-gdate  { width:58px; }
.sch-gfloat { width:44px; }
.sch-fl.tight { color:#B45309; background:rgba(202,138,4,.14); }

/* Timeline */
.sch-timeline { flex:1; min-width:0; overflow:auto; position:relative;
  /* Momentum on touch: keep the fling after the finger lifts (older iOS needs
     the -webkit- hint), and don't let a horizontal fling chain out to the
     browser's back-swipe.
     ★ Do NOT declare touch-action here. Setting an explicit pan value on the
     scroller killed the fling outright (patch 573 → reverted in 574); `auto`
     is what lets the compositor own the gesture. Restricting touch-action
     belongs on individual DRAGGABLE children, never on the scroll container. */
  -webkit-overflow-scrolling:touch; overscroll-behavior-x:contain; }
.sch-canvas { position:relative; }
.sch-thead { position:sticky; top:0; z-index:5; background:var(--bg2); border-bottom:1px solid var(--bd); }
.sch-thead .ml-months { position:absolute; left:0; top:0; height:24px; }
.sch-thead .ml-ticks  { position:absolute; left:0; top:24px; height:22px; }
.sch-tbody { position:relative; }
.sch-tbody.sch-drop-hot { box-shadow:inset 0 0 0 2px var(--accent); border-radius:4px; }
.sch-unsched { margin-top:14px; }
.sch-rowline { position:absolute; left:0; height:0; border-top:1px solid var(--bd); opacity:.55; }
.sch-tbody .ml-weekend { position:absolute; top:0; background:var(--bg2); opacity:.6; pointer-events:none; }
.sch-tbody .ml-today   { position:absolute; top:0; width:2px; background:#DC2626; opacity:.7; pointer-events:none; z-index:3; }

/* Bars */
.sch-bar { position:absolute; border-radius:4px; background:var(--barcol,var(--accent)); box-shadow:0 1px 2px rgba(0,0,0,.14); display:flex; align-items:center; overflow:hidden; cursor:pointer; z-index:2; -webkit-user-select:none; user-select:none; -webkit-touch-callout:none; }
.sch-bar-txt { font-size:11px; color:#fff; font-weight:600; padding:0 7px; white-space:nowrap; text-shadow:0 1px 1px rgba(0,0,0,.25); pointer-events:none; position:relative; z-index:2; }
.sch-bar-prog { position:absolute; left:0; top:0; bottom:0; background:rgba(255,255,255,.28); z-index:1; }
.sch-bar.crit { background:#DC2626; --barcol:#DC2626; box-shadow:0 1px 3px rgba(220,38,38,.4); }
.sch-bar.done { opacity:.9; }
.sch-bar.done::after { content:''; position:absolute; inset:0; background:repeating-linear-gradient(45deg, transparent, transparent 5px, rgba(255,255,255,.18) 5px, rgba(255,255,255,.18) 10px); }
.sch-bar.blocked { background:#B45309; --barcol:#B45309; }
.sch-bar-drag { box-shadow:0 4px 14px rgba(0,0,0,.28); z-index:20; opacity:.95; }
.sch-cap-start { box-shadow:-3px 0 0 0 var(--accent), 0 1px 3px rgba(0,0,0,.2) !important; }
.sch-cap-end   { box-shadow:3px 0 0 0 var(--accent), 0 1px 3px rgba(0,0,0,.2) !important; }
.sch-sumbar { position:absolute; height:8px; background:var(--ink-soft); border-radius:2px; z-index:2; }
.sch-sumbar::before, .sch-sumbar::after { content:''; position:absolute; bottom:-4px; width:0; height:0; border-left:5px solid transparent; border-right:5px solid transparent; border-top:6px solid var(--ink-soft); }
.sch-sumbar::before { left:0; } .sch-sumbar::after { right:0; }
.sch-blbar { position:absolute; height:4px; border-radius:2px; background:var(--ink-faint); opacity:.65; z-index:1; }
.sch-blbar.late  { background:#DC2626; opacity:.5; }
.sch-blbar.early { background:#059669; opacity:.5; }

/* Milestone diamonds */
.sch-diamond { position:absolute; z-index:4; transform:translateX(-50%); font-size:13px; line-height:1; pointer-events:none; }
.sch-diamond.ok i    { color:#059669; } .sch-diamond.neg i  { color:#DC2626; }
.sch-diamond.warn i  { color:#B45309; } .sch-diamond.muted i { color:var(--ink-faint); }

/* Dependency links */
.sch-link { stroke:var(--ink-faint); stroke-width:1.5; opacity:.75; }

/* Link editor popover */
.sch-linkpop { position:fixed; z-index:1000; background:var(--white); border:1px solid var(--bd); border-radius:10px; box-shadow:0 8px 28px rgba(0,0,0,.22); padding:10px 12px; font-size:12.5px; color:var(--ink); min-width:190px; }
.sch-lp-row { display:flex; align-items:center; gap:5px; margin-bottom:8px; }
.sch-lp-row > span:first-child { width:34px; color:var(--ink-soft); }
.sch-lp-t { border:1px solid var(--bd); background:var(--white); color:var(--ink-soft); font-size:11px; font-weight:600; border-radius:5px; padding:3px 7px; cursor:pointer; }
.sch-lp-t.on { background:var(--accent); color:#fff; border-color:var(--accent); }
.sch-lp-row input { border:1px solid var(--bd); border-radius:5px; padding:3px 6px; background:var(--white); color:var(--ink); }
.sch-lp-act { display:flex; justify-content:space-between; gap:8px; margin-top:4px; }
.sch-linkpop { min-width:224px; }   /* room for the full-word dependency labels */
.sch-lp-sel { flex:1; min-width:0; border:1px solid var(--bd); border-radius:5px; padding:4px 6px; background:var(--white); color:var(--ink); font-size:12px; font-family:inherit; cursor:pointer; }
.sch-lp-hint { font-size:10.5px; color:var(--ink-faint); margin:-3px 0 9px; line-height:1.35; }

/* Legend */
.sch-legend { display:flex; align-items:center; gap:14px; flex-wrap:wrap; margin-top:12px; font-size:11px; color:var(--ink-soft); }
.sch-lg { display:inline-flex; align-items:center; gap:5px; }
.sch-lg-sep { width:1px; height:14px; background:var(--bd); }
.sch-sw { width:16px; height:9px; border-radius:2px; background:var(--accent); display:inline-block; }
.sch-sw.crit { background:#DC2626; } .sch-sw.done { background:var(--accent); position:relative; overflow:hidden; }
.sch-sw.done::after { content:''; position:absolute; inset:0; background:repeating-linear-gradient(45deg, transparent, transparent 3px, rgba(255,255,255,.5) 3px, rgba(255,255,255,.5) 6px); }
.sch-sw.bl { background:var(--ink-faint); height:4px; }
.cd-empty.sm { padding:26px 16px; }
.cd-empty.sm i { font-size:26px; }

@media (max-width:900px){
  .sch-grid { width:210px !important; }
  .sch-gdate { display:none; }
  .sch-split { height:70vh; }
}

/* ── Punch List ────────────────────────────────────────────── */
.pn-pill { display:inline-block; font-size:11px; font-weight:600; border-radius:20px; padding:2px 9px; white-space:nowrap; }
.pn-pill.ok    { background:rgba(5,150,105,.12);  color:#059669; }
.pn-pill.accent{ background:var(--accent-bg);     color:var(--accent); }
.pn-pill.warn  { background:rgba(202,138,4,.14);  color:#B45309; }
.pn-pill.neg   { background:rgba(220,38,38,.12);  color:#DC2626; }
.pn-pill.muted { background:var(--bg2);           color:var(--ink-soft); }
.pn-prio { display:inline-block; font-size:10px; font-weight:700; text-transform:uppercase; letter-spacing:.03em; border-radius:4px; padding:1px 6px; background:var(--bg2); color:var(--ink-soft); }
.pn-prio.warn { background:rgba(202,138,4,.14); color:#B45309; }
.pn-prio.neg  { background:rgba(220,38,38,.12); color:#DC2626; }
.pn-muted { color:var(--ink-faint); }
.pn-tablewrap { overflow-x:auto; border:1px solid var(--bd); border-radius:12px; background:var(--white); margin-top:4px; }
.pn-table { width:100%; border-collapse:collapse; font-size:13px; min-width:640px; }
.pn-table thead th { text-align:left; padding:10px 14px; font-size:11px; font-weight:600; letter-spacing:.03em; text-transform:uppercase; color:var(--ink-faint); border-bottom:1px solid var(--bd); }
.pn-table td { padding:11px 14px; border-bottom:1px solid var(--bd); vertical-align:middle; }
.pn-table tbody tr:last-child td { border-bottom:none; }
.pn-row { cursor:pointer; transition:background .12s; }
.pn-row:hover { background:var(--bg2); }
.pn-c-num { font-weight:600; font-variant-numeric:tabular-nums; color:var(--ink-soft); white-space:nowrap; }
.pn-title-t { font-weight:600; color:var(--ink); }
.pn-title-sub { font-size:11.5px; color:var(--ink-soft); margin-top:1px; display:flex; align-items:center; gap:4px; }
.pn-title-sub i { font-size:12px; }
.pn-c-due { white-space:nowrap; font-variant-numeric:tabular-nums; }
.pn-c-due.over { color:#DC2626; font-weight:600; }
.pn-c-due.over i { font-size:12px; }

/* ── Quality & Safety ──────────────────────────────────────── */
.qs-subnav { display:flex; gap:4px; border-bottom:1px solid var(--bd); margin:14px 0 14px; }
.qs-subtab { background:none; border:none; padding:9px 14px; font-size:13px; font-weight:500; color:var(--ink-soft); cursor:pointer; border-bottom:2px solid transparent; margin-bottom:-1px; display:flex; align-items:center; gap:7px; }
.qs-subtab:hover { color:var(--ink); }
.qs-subtab.active { color:var(--accent); border-bottom-color:var(--accent); font-weight:600; }
.qs-count { font-size:11px; background:var(--bg2); border-radius:20px; padding:1px 7px; color:var(--ink-soft); }
.qs-subtab.active .qs-count { background:var(--accent-bg); color:var(--accent); }
.qs-sec-head { display:flex; justify-content:flex-end; margin-bottom:12px; }
.qs-fail { color:#DC2626; font-weight:600; }
.qs-osha { display:inline-block; font-size:9.5px; font-weight:700; letter-spacing:.03em; color:#DC2626; background:rgba(220,38,38,.1); border-radius:4px; padding:1px 5px; vertical-align:middle; }
.qs-item { display:flex; gap:6px; margin-bottom:6px; align-items:center; }
.qs-item .qs-i-desc { flex:1; padding:7px 9px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; }
.qs-item .qs-i-resp { width:100px; flex:none; padding:7px 8px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; }
.qs-item .qs-i-note { width:150px; flex:none; padding:7px 9px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; }

/* ============================================================
   Documents — specs / transmittals / photos (.doc-*)
   Specs & transmittals reuse .pn-table; the transmittal drawer
   reuses .dir-drawer; photos get a dedicated gallery + lightbox.
   ============================================================ */
/* .btn-xs / .btn-icon-sm sizing now lives in design-system.css (one source of truth) */

/* Transmittal item rows (drawer) */
.doc-tihead { display:flex; gap:6px; padding:0 2px 5px; font-size:11px; font-weight:600; letter-spacing:.02em; text-transform:uppercase; color:var(--ink-soft); }
.doc-tirow { display:flex; gap:6px; margin-bottom:6px; align-items:center; }
.doc-tirow .doc-ti-desc   { flex:1; padding:7px 9px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; }
.doc-tirow .doc-ti-ref    { width:100px; flex:none; padding:7px 9px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; }
.doc-tirow .doc-ti-copies { width:70px;  flex:none; padding:7px 8px; border:1px solid var(--bd); border-radius:7px; background:var(--white); color:var(--ink); font-size:12.5px; text-align:center; }

/* Photo gallery */
.doc-photo-bar { display:flex; align-items:center; gap:10px; margin:14px 0 6px; }
.doc-photo-up { cursor:pointer; }
.doc-photo-day { margin-top:18px; }
.doc-photo-date { font-size:12.5px; font-weight:600; color:var(--ink); padding-bottom:8px; border-bottom:1px solid var(--bd); margin-bottom:12px; }
.doc-photo-date span { color:var(--ink-soft); font-weight:400; }
.doc-photo-grid { display:grid; grid-template-columns:repeat(auto-fill, minmax(150px, 1fr)); gap:10px; }
.doc-photo { position:relative; border-radius:9px; overflow:hidden; cursor:pointer; background:var(--bg2); aspect-ratio:4/3; border:1px solid var(--bd); transition:transform .08s ease, box-shadow .12s ease; }
.doc-photo:hover { transform:translateY(-1px); box-shadow:0 4px 14px rgba(0,0,0,.12); }
.doc-photo img { width:100%; height:100%; object-fit:cover; display:block; }
.doc-photo-album { position:absolute; top:6px; left:6px; font-size:10px; font-weight:600; background:rgba(17,17,17,.72); color:#fff; padding:2px 7px; border-radius:12px; backdrop-filter:blur(2px); }
.doc-photo-cap { position:absolute; left:0; right:0; bottom:0; padding:14px 8px 6px; font-size:11px; color:#fff; background:linear-gradient(transparent, rgba(0,0,0,.68)); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }

/* Photo lightbox */
.doc-lb-ov { align-items:stretch; }
.doc-lb { display:flex; width:min(1080px, 94vw); max-height:90vh; margin:auto; background:var(--white); border-radius:12px; overflow:hidden; position:relative; }
.doc-lb-x { position:absolute; top:10px; right:10px; z-index:3; background:rgba(17,17,17,.55); color:#fff; }
.doc-lb-x:hover { background:rgba(17,17,17,.8); }
.doc-lb-img { flex:1; background:#0d0d0d; display:flex; align-items:center; justify-content:center; min-width:0; }
.doc-lb-img img { max-width:100%; max-height:90vh; object-fit:contain; display:block; }
.doc-lb-side { width:320px; flex:none; padding:20px; overflow-y:auto; border-left:1px solid var(--bd); }
.doc-lb-name { font-size:15px; font-weight:600; color:var(--ink); word-break:break-word; }
.doc-lb-sub { font-size:12px; color:var(--ink-soft); margin-top:3px; }
.doc-lb-meta { padding-bottom:16px; border-bottom:1px solid var(--bd); margin-bottom:16px; }
.doc-lb-edit .field { margin-bottom:10px; }
@media (max-width:900px) {
  .doc-lb { flex-direction:column; max-height:94vh; }
  .doc-lb-side { width:auto; border-left:none; border-top:1px solid var(--bd); }
  .doc-lb-img img { max-height:50vh; }
}

/* ── Delegation chain (Phase 9): who delegated whom, accept status ── */
.op-chip-by { opacity:.7; font-weight:500; font-size:10.5px; }
.op-chip-ok { box-shadow:inset 0 0 0 1.5px #22C55E55; }
.op-chip-ok::before { content:'\2713'; color:#16A34A; font-weight:700; margin-right:3px; }

/* Typed predecessor editor (task detail → schedule logic). */
.op-preds { margin-bottom: 12px; }
.op-pred-row { display:flex; align-items:center; gap:8px; padding:5px 9px; border:1px solid var(--bd); border-radius:7px; margin-bottom:5px; font-size:13px; }
.op-pred-name { flex:1; font-weight:600; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.op-pred-type { font-size:11px; color:var(--ink-faint); font-variant-numeric:tabular-nums; white-space:nowrap; }
.op-pred-x { border:none; background:transparent; color:var(--ink-faint); cursor:pointer; font-size:18px; line-height:1; padding:0 2px; }
.op-pred-x:hover { color:var(--danger,#DC2626); }
.op-pred-add { display:flex; gap:6px; align-items:center; flex-wrap:wrap; margin-top:6px; }
.op-pred-add select, .op-pred-add input { padding:6px 8px; border:1px solid var(--bd); border-radius:7px; font-size:12px; background:var(--bg1,var(--bg)); color:var(--ink); }
.op-pred-add #op-pred-task { flex:1; min-width:150px; }
.op-pred-add #op-pred-lag { width:60px; }

/* "Assigned to" as a descending delegation tree of offset cards */
.op-atree { display:flex; flex-direction:column; gap:6px; margin-bottom:10px; }
.op-anode { display:flex; flex-direction:column; gap:6px; position:relative; }
.op-anode[style*="margin-left"] { border-left:2px solid var(--bd); padding-left:10px; }
.op-acard { border:1px solid var(--bd); border-radius:9px; padding:7px 10px; background:var(--bg2); }
.op-acard.ok { border-color:color-mix(in srgb, var(--accent) 45%, var(--bd)); }
.op-acard-hd { display:flex; align-items:center; gap:8px; }
.op-acard-name { font-weight:600; color:var(--ink); }
.op-acard-acc { font-size:11px; color:#16A34A; display:inline-flex; align-items:center; gap:3px; }
.op-acard-rm { margin-left:auto; border:0; background:transparent; color:var(--ink-faint); cursor:pointer; padding:2px 4px; border-radius:5px; line-height:1; }
.op-acard-rm:hover { background:color-mix(in srgb, #DC2626 14%, transparent); color:#DC2626; }
.op-acard-by { display:flex; align-items:center; gap:4px; font-size:12px; color:var(--muted); margin-top:3px; }
.op-acard-by i { color:var(--accent); font-size:13px; }

/* Status label next to the task status dropdown */
.op-status-wrap { display:inline-flex; align-items:center; gap:6px; }
.op-status-lbl { font-size:11px; font-weight:700; text-transform:uppercase; letter-spacing:.04em; color:var(--ink-soft); }
/* Working-days summary + editor hand-off inside the schedule block. */
.op-wsched { display:flex; align-items:center; gap:10px; flex-wrap:wrap;
  margin-top:8px; padding-top:8px; border-top:1px dashed var(--bd); }
.op-wsched-txt { flex:1; min-width:0; font-size:11.5px; color:var(--ink-soft); }

/* Bars claim the touch gesture ONLY on a board where they can actually be
   dragged (.sch-drag). On a locked or read-only board — the master schedule
   is always read-only — a finger landing on a bar must pan the chart like
   anywhere else, or most of the surface becomes a dead zone. */
.sch-drag .sch-bar { touch-action:none; }
