/* Shared ops styles (ops-*) and alerts (al-, app lane). The pipeline, follow-ups and team rules moved to
   src/workspace/features/<feature>/ui/<feature>-ops.css; rules mixing two of them, and classes more than one
   screen uses (tm-table, tm-2, tm-req, te-lab, imp-more, fu-bar, fu-q), stay here. */
.ops-doc,.pl-full{--o-surface:var(--surface,var(--paper));--o-sunk:var(--bg-2,var(--soft));--o-hover:var(--hover,var(--soft));--o-act:var(--act,var(--staff));--o-act-soft:var(--act-soft,var(--staff-bg));--o-ai-soft:var(--ai-soft,var(--ai-bg))}
/* ---------- shared ---------- */
.ops-doc{width:100%;max-width:1200px;margin:0 auto;display:flex;flex-direction:column;gap:16px;min-width:0}
.ops-head{display:flex;align-items:center;flex-wrap:wrap;gap:8px;min-height:32px}
.ops-head h2,.pl-bar h2{margin:0 4px 0 0;font:600 18px/1.2 var(--display);letter-spacing:-.01em;white-space:nowrap}
.ops-acts{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.ops-acts .btn svg,.ops-row .btn svg{width:14px;height:14px;vertical-align:-2px;margin-right:4px}
.ops-cnt{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:999px;background:var(--o-sunk);color:var(--muted);font:500 12px/1 var(--body);font-variant-numeric:tabular-nums;white-space:nowrap}
.ops-cnt.bad{background:color-mix(in srgb,var(--bad) 13%,transparent);color:var(--bad)}
.ops-cnt.warn{background:color-mix(in srgb,var(--warn) 14%,transparent);color:var(--warn)}
.ops-cnt.good{background:color-mix(in srgb,var(--good) 13%,transparent);color:var(--good)}
.ops-cnt.ai{background:var(--o-ai-soft);color:var(--ai)}
.ops-cnt.act{background:var(--o-act-soft);color:var(--o-act)}
.ops-i{all:unset;box-sizing:border-box;width:24px;height:24px;border-radius:6px;display:inline-grid;place-items:center;color:var(--muted);cursor:help}
.ops-i:hover{background:var(--o-hover);color:var(--ink)}
.ops-i:focus-visible{outline:2px solid var(--o-act);outline-offset:1px}
.ops-i svg{width:15px;height:15px}
.ops-n{font:600 11px/1 var(--body);font-variant-numeric:tabular-nums;color:var(--muted);min-width:14px;text-align:center}
.ops-n.bad{color:var(--bad)}
.ops-n.warn{color:var(--warn)}
.ops-n.ai{color:var(--ai)}
.ops-n.act{color:var(--o-act)}
/* filter chips */
.ops-chips{display:flex;gap:8px;flex-wrap:wrap}
.ops-chip{display:inline-flex;align-items:center;gap:6px;height:28px;padding:0 10px;border:1px solid var(--line);border-radius:6px;background:var(--o-surface);color:var(--ink);font:500 13px/1 var(--body);cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s}
.ops-chip:hover{background:var(--o-hover)}
.ops-chip:focus-visible{outline:2px solid var(--o-act);outline-offset:1px}
.ops-chip[aria-pressed="true"]{background:var(--o-act-soft);border-color:var(--o-act);color:var(--o-act)}
.ops-chip[aria-pressed="true"] .ops-n{color:inherit}
.ops-chip.bad[aria-pressed="true"]{background:color-mix(in srgb,var(--bad) 12%,transparent);border-color:var(--bad);color:var(--bad)}
.ops-chip.close[aria-pressed="true"]{background:color-mix(in srgb,var(--warn) 13%,transparent);border-color:var(--warn);color:var(--warn)}
.ops-chip[disabled]{opacity:.45;cursor:default}
.ops-chip[disabled]:hover{background:var(--o-surface)}
/* compact selects */
.ops-sel{display:inline-flex}
.ops-sel select,.ops-inp{height:28px;border:1px solid var(--line);border-radius:6px;background:var(--o-surface);color:var(--ink);font:500 13px var(--body);padding:0 8px;cursor:pointer;max-width:200px}
.ops-sel select:hover,.ops-inp:hover{border-color:color-mix(in srgb,var(--ink) 30%,var(--line))}
.ops-sel select:focus-visible,.ops-inp:focus-visible{outline:2px solid var(--o-act);outline-offset:1px}
/* panels and rows */
.ops-panel{background:var(--o-surface);border:1px solid var(--line);border-radius:8px;min-width:0;overflow:hidden;padding-bottom:4px}
.ops-panel.ai{border-color:color-mix(in srgb,var(--ai) 35%,var(--line))}
.ops-ph{display:flex;align-items:center;gap:8px;height:40px;padding:0 16px;border-bottom:1px solid var(--line);font-size:13px}
.ops-panel.ai .ops-ph{background:var(--o-ai-soft);border-bottom-color:color-mix(in srgb,var(--ai) 25%,var(--line))}
.ops-ph-s{font-size:12px;color:var(--muted)}
.ops-ph .ops-n{margin-left:auto}
.ops-spark{width:8px;height:8px;background:var(--ai);transform:rotate(45deg);border-radius:1px;flex:none}
.ops-gl{display:flex;align-items:center;gap:8px;padding:16px 16px 6px;font:600 11px/1.2 var(--body);letter-spacing:.08em;text-transform:uppercase;color:var(--muted)}
.ops-ord{font:500 11px var(--mono);letter-spacing:0;color:var(--faint,var(--muted))}
.ops-gl .ops-n{font-family:var(--mono);font-weight:500;letter-spacing:0}
.ops-gl:first-child{padding-top:12px}
.ops-row{display:flex;align-items:center;gap:12px;min-height:44px;padding:6px 16px;min-width:0;transition:background .1s}
.ops-row[data-lead]{cursor:pointer}
.ops-row[data-lead]:hover{background:var(--o-hover)}
.ops-row:focus-visible{outline:2px solid var(--o-act);outline-offset:-2px}
.ops-main{display:flex;flex-direction:column;gap:1px;flex:1;min-width:0}
.ops-t{font:600 13px/1.35 var(--body);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ops-s{font-size:12px;line-height:1.35;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ops-ra{display:flex;align-items:center;gap:6px;flex:none}
.ops-dot{width:8px;height:8px;border-radius:50%;background:var(--good);flex:none}
.ops-dot.bad{background:var(--bad)}
.ops-dot.warn{background:var(--warn)}
.ops-dot.ai{background:var(--ai)}
.ops-av{width:22px;height:22px;border-radius:50%;display:inline-grid;place-items:center;background:var(--o-act-soft);color:var(--o-act);font:600 10px/1 var(--body);flex:none}
.ops-av.lg{width:32px;height:32px;font-size:13px}
.ops-empty{display:flex;flex-direction:column;align-items:center;gap:4px;padding:32px 16px;text-align:center;color:var(--muted)}
.ops-empty svg{width:24px;height:24px;opacity:.55;margin-bottom:4px}
.ops-empty b{font-size:13px;color:var(--ink)}
.ops-empty span{font-size:12px;max-width:34ch}
.ops-empty .btn{margin-top:8px}
/* hover-revealed secondary actions (always shown on touch) */
@media (hover:hover){.tb-plan .ops-ra,.al-row .ops-ra .ghost{opacity:0;transition:opacity .12s}
.tb-plan:hover .ops-ra,.tb-plan:focus-within .ops-ra,.al-row:hover .ops-ra .ghost,.al-row:focus-within .ops-ra .ghost{opacity:1}}
/* ---------- pipeline: full-bleed board ---------- */
#view[data-route="pipeline"]{padding:0;gap:0;overflow:hidden}
.ops-kes{font:600 15px/1 var(--display);letter-spacing:-.01em;font-variant-numeric:tabular-nums;color:var(--ink)}
.ops-kes small{font-size:.6em;font-weight:500;color:var(--muted);margin-right:3px;letter-spacing:.02em}
/* ---------- follow-ups ---------- */
/* ---------- team: a duty roster ---------- */
.tm-table{width:100%;border-collapse:collapse;font-size:13px}
.tm-table th{height:32px;padding:0 16px;text-align:left;font:600 11px var(--body);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);border-bottom:1px solid var(--line);white-space:nowrap}
.tm-table td{height:52px;padding:0 16px;border-bottom:1px solid var(--line);white-space:nowrap}
.tm-table tr:last-child td{border-bottom:0}
.tm-table .ops-inp{min-width:150px}
.ops-stamp{display:inline-block;font:500 10px/16px var(--mono);letter-spacing:.06em;text-transform:uppercase;padding:0 5px;border:1px solid var(--line-2,var(--line));border-radius:3px;color:var(--muted)}
.ops-stamp.act{border-color:color-mix(in srgb,var(--o-act) 50%,transparent);color:var(--o-act)}
/* ---------- alerts ---------- */
.al-grid{display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:16px;align-items:start}
.al-t{font:500 11px var(--mono);color:var(--muted);width:64px;flex:none;text-align:right;white-space:nowrap}
.al-line{margin:0;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:13px}
.al-line b{font-weight:600}
.al-row{min-height:40px}
.al-un{width:8px;height:8px;border-radius:50%;flex:none;border:1.5px solid var(--line)}
.al-un.on{border:0;background:var(--o-act)}
.al-un.on.bad{background:var(--bad)}
.al-un.on.warn{background:var(--warn)}
.al-row.read .al-line b{font-weight:500;color:var(--muted)}
.al-step{color:var(--o-act)}
.al-steps{list-style:none;margin:0;padding:8px 0 0;counter-reset:s}
.al-steps li{display:grid;grid-template-columns:20px minmax(0,1fr);gap:0 10px;padding:6px 16px;counter-increment:s;font-size:13px}
.al-steps li::before{content:counter(s);grid-row:span 2;width:20px;height:20px;border-radius:50%;background:var(--o-act-soft);color:var(--o-act);font:600 11px/20px var(--body);text-align:center}
.al-steps li b{font-weight:600}
.al-steps li span{font-size:12px;color:var(--muted)}
.al-note{margin:4px 0 8px;padding:0 16px;font-size:12px;color:var(--muted)}
/* ---------- responsive ---------- */
@media (max-width:1100px){.tb-grid,.al-grid{grid-template-columns:minmax(0,1fr)}}
@media (max-width:760px){.ops-head h2,.pl-bar h2{display:none}
/* the top bar already shows the page title on phones */
.ops-acts{margin-left:auto}
.ops-chips{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none}
.ops-chips::-webkit-scrollbar{display:none}
.ops-row{padding:8px 12px;flex-wrap:wrap;gap:4px 10px}
.ops-row .ops-main{flex-basis:calc(100% - 64px)}
.tb-row .ops-ra,.al-row .ops-ra{min-width:0;width:auto;order:4}
.tb-row+.tb-row::before,.al-row+.al-row::before{left:12px}
.al-t{width:auto;text-align:left}
.al-line{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;flex-basis:calc(100% - 150px)}
.al-row .ops-ra{margin-left:auto}}
/* inset hairlines between rows (start at the text column, not full-bleed) */
.ops-row{position:relative}
.ops-row+.ops-row::before{content:"";position:absolute;top:0;left:36px;right:16px;border-top:1px solid color-mix(in srgb,var(--line) 70%,transparent)}
.al-row+.al-row::before{left:100px}
@media (max-width:760px){.ops-row+.ops-row::before{left:12px;right:12px}}
/* ---------- follow-ups: the planner (week strip + agenda) ---------- */
/* ---------- imports ---------- */
.tm-req{margin:8px 0 0;padding:8px 12px;border-radius:6px;font-size:13px;background:color-mix(in srgb,var(--warn) 12%,transparent);color:var(--warn)}
/* all:unset drops position; the shell adds a 44px touch target via ::after{inset:-8px}, which must stay anchored to the control */
.ops-i,.pl-a,.pa-link,.pl-day,.pl-col>header{position:relative}
/* drag pickup and settle (MOTION.md): no hover transforms on cards */
/* unit inventory */
.ops-unit{display:inline-flex;align-items:center;gap:5px;align-self:flex-start;max-width:100%;font:500 11px/18px var(--mono);padding:0 6px;border:1px solid var(--line-2,var(--line));border-radius:3px;color:var(--ink-2,var(--ink));white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ops-unit i{width:6px;height:6px;border-radius:50%;background:var(--muted);flex:none}
.ops-unit i.st-held,.ops-unit i.st-hold{background:var(--o-act)}
.ops-unit i.st-reserved{background:var(--good)}
.ops-unit i.st-sold{background:var(--ink)}
.ops-unit.warn{border-color:color-mix(in srgb,var(--warn) 55%,transparent);color:var(--warn)}
.ops-unit.warn i{background:var(--warn)}
.ops-unit i.st-claimed{background:transparent;border:1px solid var(--muted)}
.ops-unit i.st-available{background:transparent;border:1px solid var(--good)}
/* team night pass: roles, routing footer, rotation, out of office */
.tm-table tfoot td{height:44px;padding:0 16px;border-top:1px solid var(--line-2,var(--line));background:var(--o-sunk);white-space:nowrap}
.te-lab{display:block;font:600 11px var(--body);letter-spacing:.06em;text-transform:uppercase;color:var(--muted);margin:4px 0}
/* import flow */
.imp-more{margin:8px 16px 12px}
.al-line .ops-s{white-space:normal}
/* follow-ups: modes, flow lanes, AI follow-ups */
.fu-bar{display:flex;gap:12px;align-items:center;flex-wrap:wrap}
.fu-q{width:240px;max-width:100%;height:30px}
/* batch 2: idle tones, ownership, hours, alert codes */
.hrs{padding:12px 16px}
.al-code{font:500 10px var(--mono);color:var(--muted);margin-right:6px}
.al-cat td{height:40px}
/* character pass (emil-polish review) */
.ops-c .ops-n{margin-left:6px;font-family:var(--mono);font-weight:500;color:inherit;opacity:.7}
button.chip.ops-c.bad.on,button.chip.ops-c.bad[aria-pressed="true"]{background:var(--bad);border-color:var(--bad)}
.ops-empty-a{margin-top:8px;display:flex;justify-content:center}
@media (max-width:760px){.ops-chips{padding-inline-end:16px;scroll-padding-inline:16px}
.ops-chips::after{content:"";flex:0 0 8px}
.pa-link,.pl-a,.pa-row .btn.sm,.pf-h .pa-link{position:relative}
.pa-link::after,.pl-a::after,.pa-row .btn.sm::after{content:"";position:absolute;inset:-8px -4px;min-height:40px}}
/* accessibility: focus targets and reduced motion */
.ops-row[role=link]:focus-visible,tr[data-lead]:focus-visible{outline:2px solid var(--o-act);outline-offset:-2px}
@media (prefers-reduced-motion:reduce){.ops-doc *,.pl-full *{transition:none!important;animation:none!important}}
/* week strip (POLISH pass 12): no rules, one total, amber dot when mostly AI */
/* Team on phone: a row per person, routing as its own card */
/* N5: real tap targets, not only aprons; Show-more stays on one line */
[data-act="impMore"]{white-space:nowrap}
#tm-mic.on{color:var(--o-act);background:color-mix(in srgb,var(--o-act) 10%,transparent)}
/* mobile shell pass: one strip for the head and the view switch; Alerts acknowledge in the group header; Team drops the 01 intro note */
.ops-strip{display:contents}
.al-allg{display:none}
@media (max-width:760px){.ops-strip,.ops-doc>.ops-head{position:relative}
.ops-strip{display:flex;align-items:center;gap:8px;flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scrollbar-width:none;min-height:44px;margin-bottom:4px;-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);padding-right:24px}
.ops-strip::-webkit-scrollbar{display:none}
.ops-strip>.ops-head{display:contents}
.ops-strip>.ops-head>h2{display:none}
.ops-strip>*,.ops-strip>.ops-head>*{flex:none}
.ops-strip .phead-a{flex-wrap:nowrap;margin-left:0}
.ops-strip>.seg{margin:0}
.ops-doc>.ops-head{flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;min-height:44px;-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);padding-right:24px}
.ops-doc>.ops-head::-webkit-scrollbar{display:none}
.ops-doc>.ops-head>*{flex:none}
.ops-doc>.ops-head .phead-a{flex-wrap:nowrap}
.ops-strip [data-act="alAll"]{display:none}
.al-allg{display:inline-flex;margin-left:auto;min-height:32px}
.ops-gl:has(.al-allg){align-items:center}
.ops-gl:has(.al-allg){padding-top:6px;padding-bottom:4px}
.al-allg{min-height:28px;margin-block:-4px}
.al-allg::after{content:"";position:absolute;inset:-4px -4px}
.al-allg{position:relative}
/* the sheet's primary (ops sheets) at the 44px primary size */
.modal:is([data-modalform^="pl"],[data-modalform^="imp"],[data-modalform="tmadd"],[data-modalform^="aw"],[data-modalform="erasecontact"],[data-modalform^="tm"]) button[type=submit]{min-height:44px}}
/* mobile pass 2: Follow-ups list within ~220px (day strip + filter chips only), Pipeline bar as one strip */
/* phone critic round 1 */
@media (max-width:760px){/* ~36px of the next stage shows */
/* Follow-ups: the selected filter uses the tint, not a third filled style; the chip row gets the fade cue */
.ops-chips{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);mask-image:linear-gradient(90deg,#000 calc(100% - 24px),transparent);padding-right:24px}
.ops-chips button.chip[aria-pressed="true"]{background:var(--o-act-soft);border-color:color-mix(in srgb,var(--o-act) 40%,transparent);color:var(--o-act)}
/* Alerts: the row opens the lead; Open hides, Acknowledge is a visible 32px check beside the title */
.al-row{flex-wrap:nowrap;align-items:flex-start;min-height:0}
.al-row .al-line{flex:1 1 0;min-width:0}
.al-row[data-lead] .ops-ra .btn:not(.ghost){display:none}
.al-row .ops-ra{order:0;margin-left:0;flex:none}
.al-row .ops-ra .ghost{opacity:1;font-size:0;width:32px;min-height:32px;padding:0;justify-content:center;position:relative}
.al-row .ops-ra .ghost::before{content:"✓";font-size:15px;line-height:1}
.al-row .ops-ra .ghost::after{content:"";position:absolute;inset:-7px}
/* from the padding box: 30 + 14 = 44px */
.al-row .ops-ra .ghost{z-index:1}
/* its 44px apron sits above the row edge and the next row's rule */
/* Team: the head's actions move to the top bar (+ and ⋯), so the head row goes */
[data-route="team"] .ops-doc>.ops-head{display:none}}
/* phone critic round 2: Alerts list sits flush under the strip; Pipeline bar padding halved */
@media (max-width:640px){section.ops-panel[aria-label="Alerts"]{border:0;border-radius:0;background:transparent;padding:0}
section.ops-panel[aria-label="Alerts"]>.ops-gl{padding-top:4px;padding-bottom:0;min-height:24px}
section.ops-panel[aria-label="Alerts"]>.ops-gl:has(.al-allg){padding-top:0;padding-bottom:0}}
/* founder P1: fixed stage widths on desktop; long text never widens a column (min-width:auto let a 90-char task line stretch "New" to 576px) */
