/* Apps pipeline additions. Use ONLY the dash variables (--bg --card --fg --mut --bd --ac --ok --warn --bad). */
.btn{display:inline-flex;align-items:center;gap:6px;margin:4px 6px 0 0}
.btn.bad{color:var(--bad);border-color:color-mix(in srgb,var(--bad) 45%,var(--bd))}
.btn.ok{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 45%,var(--bd))}
.nav .btn.on{background:var(--ac);border-color:var(--ac);color:#fff}
textarea,input,select{width:100%;background:var(--bg);color:var(--fg);border:1px solid var(--bd);border-radius:9px;padding:8px 10px;font:inherit}
label{display:block;margin:8px 0 4px;color:var(--mut);font-size:13px}
pre{white-space:pre-wrap;background:var(--bg);border:1px solid var(--bd);border-radius:10px;padding:12px}
table{border-collapse:collapse;width:100%}td,th{border-bottom:1px solid var(--bd);padding:8px 6px;text-align:left}th{color:var(--mut);font-weight:600;font-size:13px}
.state{display:inline-block;font-size:12px;border:1px solid var(--ac);border-radius:999px;padding:2px 9px;font-weight:600}
.login{max-width:380px;margin:60px auto}
/* Hamish panel: dashed divider between a report and its fix plan, and pill colours for plan status. */
.hamish-plan{border-top:1px solid var(--bd);margin-top:12px;padding-top:12px}
.pill.state.ok{border-color:color-mix(in srgb,var(--ok) 55%,var(--bd));color:var(--ok)}
.pill.state.bad{border-color:color-mix(in srgb,var(--bad) 55%,var(--bd));color:var(--bad)}

/* 0.1.18 read-only viewer (card #17): no forms or action buttons; the server answers 403 anyway */
html[data-role="viewer"] form[method="post"]:not([action="/logout"]) { display: none !important; }

/* 0.1.19-r5 Rollout progress page */
.rp h3{margin:0 0 8px}.rp-group{margin:14px 0 6px;color:var(--mut);font-size:13px;text-transform:none}
.rp-list{list-style:none;margin:0;padding:0}.rp-item{padding:8px 0;border-bottom:1px solid var(--bd);overflow-wrap:anywhere}
.rp-item:last-child{border-bottom:0}.rp-item .mut{font-size:13px;margin-top:2px}
.rp-phases{margin:0;padding-left:20px}.rp-phases li{padding:4px 0}
.pill.state.busy{border-color:color-mix(in srgb,var(--warn) 55%,var(--bd));color:var(--warn)}
/* card #15 live sandbox view */
iframe.live{display:block;width:100%;height:70vh;margin-top:10px;border:1px solid var(--bd);border-radius:12px;background:var(--bg);color:var(--fg)}
@media (max-width:700px){iframe.live{height:60vh}}
/* 0.1.19-r8 Hamish bubble (top right of a card) + summary */
.hamish-bubble{float:right;margin:0 0 6px 8px}.hamish-bubble .btn{border-radius:999px;margin:0}
.hamish-bubble.sm{float:none;display:inline-block;margin:0 8px 0 0}.hamish-bubble.sm .btn{padding:2px 10px;font-size:12px}
.hamish-bubble .btn.busy::after{content:"";width:12px;height:12px;border:2px solid var(--mut);border-top-color:transparent;border-radius:50%;animation:hspin .8s linear infinite}
@keyframes hspin{to{transform:rotate(360deg)}}
.hamish-summary{border-left:3px solid var(--ac)}.hamish-summary p{margin:6px 0}
/* 0.1.22 Failed & cancelled page (count on the tab, state filter, search) */
.nav .btn .count,.failed-filter .count{display:inline-block;min-width:18px;padding:0 6px;border-radius:999px;font-size:11px;line-height:18px;text-align:center;background:color-mix(in srgb,var(--mut) 22%,transparent);color:var(--fg)}
.nav .btn.on .count,.failed-filter .btn.on .count{background:rgba(255,255,255,.25);color:#fff}
.failed-filter .btn.on{background:var(--ac);border-color:var(--ac);color:#fff}
.failed-search{display:flex;gap:6px;align-items:center;margin-top:10px}.failed-search input{flex:1;min-width:0}.failed-search .btn{margin:0}
.failed-list td{vertical-align:top;overflow-wrap:anywhere}
