:root{--p:#0b3d91;--p2:#072a66;--acc:#f28c00;--ok:#0a7d32;--warn:#a85d00;--bad:#c62828;--bg:#eef1f5;--card:#fff;--line:#c9d1dc;--txt:#111;--mut:#4d5563;--r:12px;--tap:56px}
*{box-sizing:border-box}
html{-webkit-text-size-adjust:100%}
body{margin:0;font:18px/1.45 system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;color:var(--txt);background:var(--bg);padding-bottom:env(safe-area-inset-bottom)}
a{color:var(--p)}
.hdr{position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:6px;background:var(--p);color:#fff;padding:calc(6px + env(safe-area-inset-top)) 8px 6px;min-height:60px;box-shadow:0 2px 6px rgba(0,0,0,.25)}
.hdr h1{flex:1;font-size:19px;margin:0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:700}
.hdr-btn{min-width:var(--tap);height:48px;border:0;border-radius:10px;background:rgba(255,255,255,.14);color:#fff;font-size:30px;line-height:1;display:flex;align-items:center;justify-content:center;text-decoration:none;cursor:pointer}
.hdr-btn:active{background:rgba(255,255,255,.3)}
.net-dot{display:none;background:var(--acc);color:#000;font-weight:800;font-size:13px;padding:4px 8px;border-radius:999px}
body.offline .net-dot{display:inline-block}
main{max-width:860px;margin:0 auto;padding:12px 12px 110px}
.card{display:block;background:var(--card);border:1px solid var(--line);border-radius:var(--r);padding:14px;margin:0 0 12px;color:inherit;text-decoration:none}
a.card:active,.tile:active{background:#e3eaf7}
h1,h2,h3{line-height:1.2}.hero h1{margin:.2em 0 .1em;font-size:26px}
h3{margin:.1em 0 .5em;font-size:19px}
.muted{color:var(--mut)}.small{font-size:15px}.center{text-align:center}.mt{margin-top:14px}
.stack{display:flex;flex-direction:column;gap:10px}
.row{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}
.row-btns{display:flex;gap:10px;flex-wrap:wrap}.row-btns>*{flex:1 1 140px}
.btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%;min-height:var(--tap);padding:10px 16px;margin:0 0 10px;border:2px solid var(--p);border-radius:var(--r);background:#fff;color:var(--p);font:inherit;font-weight:700;text-decoration:none;cursor:pointer;text-align:center;-webkit-tap-highlight-color:transparent}
.btn:active{transform:scale(.99);background:#e3eaf7}
.btn[disabled]{opacity:.45}
.btn-primary{background:var(--p);color:#fff}.btn-primary:active{background:var(--p2)}
.btn-lg{min-height:64px;font-size:20px}
.btn-danger{border-color:var(--bad);color:var(--bad)}
.btn-ghost{border-color:transparent;background:transparent}
.btn-outline{border-style:dashed}
.btn-photo{margin-top:8px}
.form .field{margin:0 0 14px}
.field label,.lbl{display:block;font-weight:700;margin:0 0 5px;font-size:16px}
input[type=text],input:not([type]),input[type=date],input[type=time],input[type=search],input[type=email],input[type=password],input[inputmode],select,textarea{width:100%;min-height:var(--tap);padding:10px 12px;font:inherit;color:#000;background:#fff;border:2px solid #8792a2;border-radius:10px}
textarea{min-height:110px;resize:vertical}
input:focus,select:focus,textarea:focus{outline:3px solid var(--acc);outline-offset:1px;border-color:var(--p)}
.hint{display:block;color:var(--mut);font-size:14px;margin-top:4px}
.form-section{margin:20px 0 10px;padding-top:12px;border-top:2px solid var(--line);color:var(--p)}
.form-section:first-child{margin-top:0;border:0;padding:0}
.checkline{display:flex;align-items:center;gap:12px;min-height:var(--tap);font-weight:600;cursor:pointer}
.checkline input{width:30px;height:30px;flex:0 0 30px;accent-color:var(--p)}
.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{position:relative}.chip input{position:absolute;opacity:0;inset:0}
.chip span{display:flex;align-items:center;min-height:52px;padding:8px 16px;border:2px solid #8792a2;border-radius:999px;background:#fff;font-weight:600;cursor:pointer}
.chip input:checked+span{background:var(--p);border-color:var(--p);color:#fff}
.chip input:focus-visible+span{outline:3px solid var(--acc)}
.filters{margin:6px 0 12px}
.sticky-actions{position:sticky;bottom:calc(8px + env(safe-area-inset-bottom));z-index:5;margin-top:10px}
.sticky-actions .btn{box-shadow:0 4px 14px rgba(0,0,0,.25)}
.badge{display:inline-block;padding:3px 10px;border-radius:999px;font-size:14px;font-weight:800;white-space:nowrap;border:1px solid transparent}
.b-ok{background:#d9f2e1;color:#05551f}.b-pendente{background:#fff0d1;color:#7a4400;border-color:#e7b25b}.b-atraso{background:#c62828;color:#fff}.b-info{background:#e5eaf2;color:#33415a}.b-na{background:#eee;color:#666}.b-demo{background:var(--acc);color:#000}.b-st{background:#e5eaf2;color:#1b2b4a}
.demo-banner{background:repeating-linear-gradient(45deg,#ffe2b3,#ffe2b3 12px,#ffd08a 12px,#ffd08a 24px);color:#4a2a00;font-weight:800;padding:10px 12px;border-radius:var(--r);margin:0 0 12px;border:2px solid #e39b2d;font-size:15px}
.note{background:#e7eef9;border-left:6px solid var(--p);padding:10px 12px;border-radius:8px;margin:0 0 12px;font-size:15px}
.warn{color:#8a3b00;background:#fff2df;padding:8px 10px;border-radius:8px;font-weight:600}
.obra-card .oc-top{display:flex;gap:8px;justify-content:space-between;align-items:flex-start}
.oc-badges{margin-top:8px;display:flex;gap:6px;flex-wrap:wrap}
.bar{height:14px;background:#d8dee8;border-radius:999px;overflow:hidden;margin:8px 0 4px}.bar span{display:block;height:100%;background:var(--p)}
.bar.fin span{background:var(--ok)}
.bars{display:grid;grid-template-columns:80px 1fr;align-items:center;gap:0 10px;font-size:14px;font-weight:700;color:var(--mut)}
.kpis{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}
@media(min-width:620px){.kpis{grid-template-columns:repeat(4,1fr)}}
.kpis.three{grid-template-columns:repeat(3,1fr);margin-bottom:12px}
.kpis>div{background:#f5f7fb;border:1px solid var(--line);border-radius:10px;padding:10px;display:flex;flex-direction:column}
.kpis .k{font-size:14px;color:var(--mut);font-weight:700}.kpis .v{font-size:28px;font-weight:800;color:var(--p)}.kpis .v.sm{font-size:19px}.kpis .s{font-size:14px;color:var(--mut)}
.v.red{color:var(--bad)!important}.v.amber{color:var(--warn)!important}.v.green{color:var(--ok)!important}
.tiles{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin:0 0 12px}
@media(min-width:620px){.tiles{grid-template-columns:repeat(3,1fr)}}
.tile{display:flex;flex-direction:column;justify-content:center;gap:4px;min-height:96px;padding:12px;background:#fff;border:2px solid var(--line);border-radius:var(--r);text-decoration:none;color:var(--txt);font:inherit;text-align:left;cursor:pointer}
.tile .ti{font-size:28px}.tile .tl{font-weight:800;line-height:1.2}.tile .tx{font-size:14px;color:var(--mut);font-weight:700}
.small-tiles .tile{min-height:70px}
.tasks-card .mini{margin:8px 0 0;padding:0;list-style:none}.mini li{padding:5px 0;border-top:1px solid #e6e9ef;font-size:16px}
.list .item{display:flex;flex-direction:column;gap:4px}
.item.closed{opacity:.7}
.dl{display:grid;grid-template-columns:minmax(120px,40%) 1fr;gap:6px 12px;margin:0}.dl dt{color:var(--mut);font-weight:700;font-size:15px}.dl dd{margin:0;font-weight:600}
.tabs{display:flex;gap:6px;margin:0 0 12px;overflow-x:auto}
.tab{flex:1;min-height:52px;display:flex;align-items:center;justify-content:center;padding:6px 12px;border:2px solid var(--p);border-radius:10px;font-weight:800;text-decoration:none;white-space:nowrap;background:#fff}
.tab.on{background:var(--p);color:#fff}
.table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch}
.tbl{border-collapse:collapse;width:100%;font-size:15px}.tbl th,.tbl td{border-bottom:1px solid #dde2ea;padding:8px 6px;text-align:left;vertical-align:top}.tbl th{background:#f0f3f8}.tbl .r{text-align:right;white-space:nowrap}.tbl tr.cap td{font-weight:800;background:#f6f8fb}
.meas .m-cap{font-weight:800;color:var(--p);padding:12px 2px 4px;border-bottom:2px solid var(--line)}
.m-row{display:flex;gap:10px;align-items:center;padding:10px 2px;border-bottom:1px solid #e3e7ee}
.m-row.exc{background:#fff0f0}.m-row.exc .acc{color:var(--bad);font-weight:800}
.m-desc{flex:1;min-width:0;font-size:16px}
.m-in{display:flex;align-items:center;gap:6px;flex:0 0 132px}.m-in input{text-align:right;font-weight:800;font-size:20px;padding:8px}
.search{margin-bottom:6px}
.grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.cl-item .cl-txt{margin:0 0 10px;font-size:17px}.ref{display:inline-block;font-size:13px;color:var(--mut);background:#eef1f6;border-radius:6px;padding:1px 6px}
.tri{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.tri-b{position:relative}.tri-b input{position:absolute;opacity:0;inset:0}
.tri-b span{display:flex;align-items:center;justify-content:center;min-height:60px;border:3px solid #8792a2;border-radius:12px;font-weight:900;font-size:20px;background:#fff;cursor:pointer}
.t-OK input:checked+span{background:var(--ok);border-color:var(--ok);color:#fff}
.t-NOK input:checked+span{background:var(--bad);border-color:var(--bad);color:#fff}
.t-NA input:checked+span{background:#5f6673;border-color:#5f6673;color:#fff}
.tri-b input:focus-visible+span{outline:3px solid var(--acc)}
details{margin-top:10px}summary{min-height:44px;display:flex;align-items:center;font-weight:700;color:var(--p);cursor:pointer}
.photos{display:grid;grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:8px;margin-top:6px}
.thumb{position:relative;aspect-ratio:4/3;border-radius:8px;overflow:hidden;border:1px solid var(--line)}.thumb img{width:100%;height:100%;object-fit:cover;display:block}
.thumb-del{position:absolute;top:4px;right:4px;width:40px;height:40px;border-radius:50%;border:0;background:rgba(0,0,0,.65);color:#fff;font-size:18px}
.photo-full{max-width:100%;max-height:75vh;display:block;margin:0 auto 10px}
.gps-box{display:flex;flex-direction:column;gap:6px}.gps-val{font-weight:700}
.grp{margin:18px 0 8px;color:var(--p)}
.duty{display:flex;flex-direction:column;gap:4px;border-left-width:8px}
.d-atraso{border-left-color:var(--bad)}.d-pendente{border-left-color:#e39b2d}.d-ok{border-left-color:var(--ok)}.d-info,.d-na{border-left-color:#9aa5b5}
.did{font-weight:900;color:var(--mut)}
.chart{width:100%;height:auto;background:#fff}
.legend{display:flex;flex-wrap:wrap;gap:12px;font-size:14px;margin-top:6px}.legend i{display:inline-block;width:14px;height:14px;border-radius:3px;margin-right:5px;vertical-align:-2px}
.logo-prev{max-width:160px;max-height:90px;display:block;margin:6px 0;border:1px solid var(--line)}
#toast{position:fixed;left:50%;bottom:calc(84px + env(safe-area-inset-bottom));transform:translateX(-50%) translateY(20px);background:#111;color:#fff;padding:12px 18px;border-radius:12px;font-weight:700;opacity:0;pointer-events:none;transition:.2s;z-index:50;max-width:92vw;text-align:center}
#toast.show{opacity:1;transform:translateX(-50%)}
dialog{border:0;border-radius:16px;padding:0;width:min(560px,94vw);max-height:90vh}
dialog::backdrop{background:rgba(0,0,0,.55)}
.modal-body{padding:18px}
.update{position:sticky;top:60px;z-index:9;width:100%;min-height:52px;border:0;background:var(--acc);font:inherit;font-weight:800}
.error{border-color:var(--bad)}
@media (prefers-contrast: more){:root{--line:#555;--mut:#222}}
@media print{.hdr,.btn,.sticky-actions{display:none}}

/* ---- Conta e equipa ---- */
.hdr-sync { font-size: 20px; text-decoration: none; }
.hdr-sync.s-erro { background: #c62828; }
.hdr-sync.s-offline, .hdr-sync.s-idle { opacity: .75; }
.team-card { display: flex; flex-direction: column; gap: 4px; text-decoration: none; color: inherit; border-left: 6px solid #0b3d91; }
.warn-card { border-left: 6px solid #b26a00; background: #fff6e5; }
.linkbox { width: 100%; font: 14px/1.4 ui-monospace, monospace; word-break: break-all; }
.small-row { gap: 10px; padding: 6px 0; border-bottom: 1px solid #e3e7ee; }
.small-row select { max-width: 50%; min-height: 48px; }
.member .row-btns select { min-height: 48px; flex: 1 1 160px; }
input.num { width: 90px; text-align: right; min-height: 44px; }
/* só leitura: esconder ações de escrita (o servidor também recusa) */
body.ro #view .sticky-actions, body.ro #view .btn-danger, body.ro #view #new-auto, body.ro #view [data-new], body.ro #view label.btn-photo,
body.ro #view #add-art, body.ro #view #to-livro, body.ro #view #all-ok, body.ro #view #nc, body.ro #view [data-gps], body.ro #view .thumb-del,
body.ro #view a.btn-primary[href$="/new"], body.ro #view a[href$="/editar"].tile { display: none !important; }
body.ro #view::before { content: "Só consulta — não pode alterar esta obra"; display: block; background: #eef1f5; border: 2px solid #c9d1dc; border-radius: 10px; padding: 10px 14px; margin-bottom: 12px; font-weight: 700; }
