:root{font-family:system-ui,sans-serif;color:#162235;background:#eef6fb}*{box-sizing:border-box}body{margin:0}header{display:flex;justify-content:space-between;gap:1rem;padding:1rem 4vw;background:#123b57;color:white}.brand{font-size:1.3rem;font-weight:800;color:white;text-decoration:none}main{max-width:1200px;margin:auto;padding:1rem}section{background:white;border-radius:14px;padding:1rem;margin-bottom:1rem;box-shadow:0 4px 18px #1232}h1,h2{margin-top:0}small,span{display:block;color:#587084}form{display:flex;flex-wrap:wrap;gap:.75rem;align-items:end;margin:.75rem 0}label{display:grid;gap:.25rem;flex:1;min-width:150px}input,select,button{font:inherit;padding:.65rem;border:1px solid #9bb5c7;border-radius:8px}input,select{width:100%;max-width:100%}button{background:#1677a7;color:white;border:0;font-weight:700;cursor:pointer}.grid,.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:1rem}.card,article{display:block;padding:.75rem;border:1px solid #d5e4ed;border-radius:10px;text-decoration:none;color:inherit;margin:.5rem 0}.notice{padding:.8rem;background:#d7f5df;border-radius:8px;margin-bottom:1rem}.notice.bad{background:#ffd9d9}.map svg{width:100%;height:auto}.map .ocean{fill:#dff2fa}.map .land{fill:#b9d9c4;stroke:#8ab99b;stroke-width:2}.map .city-context circle{fill:#52788c;opacity:.55}.map .network-link{stroke:#187ca8;stroke-width:3}.map .network-link.failed{stroke:#d33;stroke-dasharray:8 5}.map .pop .pop-visual{fill:#ef476f;stroke:white;stroke-width:2;pointer-events:none}
.map .pop .pop-hit{fill:transparent}
.map .pop .pop-visual.chosen{fill:var(--map-highlight);stroke:#17384a;stroke-width:3}.map text{font-size:11px;font-weight:700;fill:#17384a;paint-order:stroke;stroke:#fff;stroke-width:3px}footer{text-align:center;padding:2rem;color:#587084}@media(max-width:600px){header{align-items:flex-start;flex-direction:column}.grid,.cards{grid-template-columns:1fr}form{display:grid}.map text{display:none}}
:root{--map-highlight:#f18f01}
.hint{color:#587084;margin:.25rem 0 .75rem}.map .city-context circle{cursor:pointer;transition:r .15s,opacity .15s}.map .city-context circle:hover,.map .city-context circle.chosen{fill:var(--map-highlight);opacity:1;r:6px}.map .pop circle{cursor:pointer}.map .pop circle:hover,.map .pop circle.chosen{fill:var(--map-highlight);stroke:#17384a;stroke-width:3}h3{margin-bottom:.25rem}
.map svg{background:#dff2fa url("assets/world-land.svg") center/100% 100% no-repeat}.map .ocean{fill:transparent}.map .land{display:none}
.map-stage{position:relative;overflow:hidden;border-radius:20px}.map-controls{position:absolute;z-index:3;top:.75rem;right:.75rem;display:grid;gap:.35rem}.map-controls button{width:2.6rem;height:2.6rem;padding:0;background:#fff;color:#17384a;border:1px solid #7898aa;box-shadow:0 2px 8px #1235;font-size:1.5rem;line-height:1}.map-controls button:disabled{opacity:.45;cursor:not-allowed}.map svg{cursor:grab;touch-action:none}.map svg.is-dragging{cursor:grabbing;user-select:none}
.map svg.has-inline-land-map{background:#dff2fa}.map .land-map{pointer-events:none}
.link-preview{stroke:#ef476f;stroke-width:3;stroke-dasharray:8 5;pointer-events:none}
.drag-status{position:absolute;z-index:3;left:50%;top:.75rem;transform:translateX(-50%);background:#123b57;color:white;font-size:.85rem;font-weight:700;padding:.5rem 1rem;border-radius:999px;box-shadow:0 2px 8px #1235;pointer-events:none;white-space:nowrap;max-width:90%;overflow:hidden;text-overflow:ellipsis}
.map .drag-valid{fill:#2ecc71!important;stroke:#17384a!important}
.map .drag-invalid{fill:#9aa7b0!important;stroke:#5a6670!important}
.build-mode{background:#fff4de;border:1px solid #f0c987;border-radius:10px;padding:.6rem .9rem;margin:.25rem 0 .75rem;display:flex;flex-wrap:wrap;gap:.5rem;align-items:center;justify-content:space-between}
.build-mode a{color:#8a5a00;font-weight:700;text-decoration:underline}
.place-dialog{width:min(760px,calc(100% - 2rem));max-height:85vh;overflow:auto;border:0;border-radius:16px;box-shadow:0 12px 50px #1238;padding:1.25rem}.place-dialog::backdrop{background:#102b3d99}.dialog-head{display:flex;justify-content:space-between;align-items:start;gap:1rem}.dialog-close{font-size:2rem;line-height:1;text-decoration:none;color:#587084}.danger{background:#b83232}
.eyebrow{text-transform:uppercase;font-size:.7rem;font-weight:700;letter-spacing:.04em;color:#7898aa;margin-bottom:.15rem}
.facts{display:flex;flex-wrap:wrap;gap:.4rem;margin-top:.35rem}
.fact{display:inline-block;background:#eef6fb;color:#36566c;font-size:.75rem;font-weight:700;padding:.2rem .55rem;border-radius:999px;border:1px solid #d5e4ed}
.fact.mine{background:#dff0ff;border-color:#9bc6ef;color:#124a7a}
.fact.down{background:#ffd9d9;border-color:#e59b9b;color:#8a1f1f}
.tabs{display:flex;flex-wrap:wrap;gap:.4rem;margin:.75rem 0 1rem;border-bottom:1px solid #d5e4ed;padding-bottom:.5rem}
.tabs a{text-decoration:none;color:#36566c;font-weight:700;font-size:.9rem;padding:.4rem .75rem;border-radius:8px}
.tabs a.on{background:#1677a7;color:white}
.bar{height:.5rem;background:#e4eef5;border-radius:999px;overflow:hidden;margin:.2rem 0 .6rem}
.bar i{display:block;height:100%;background:#1677a7;border-radius:999px}
.bar.warn i{background:#e0a21a}
.bar.bad i{background:#c0392b}
.port-list{list-style:none;margin:.2rem 0 .6rem;padding:0;font-size:.85rem;display:grid;gap:.15rem}
.port-list li{color:#587084}.port-list li b{color:#17384a;margin-right:.3rem}
.bar i.w0{width:0}.bar i.w5{width:5%}.bar i.w10{width:10%}.bar i.w15{width:15%}.bar i.w20{width:20%}.bar i.w25{width:25%}.bar i.w30{width:30%}.bar i.w35{width:35%}.bar i.w40{width:40%}.bar i.w45{width:45%}.bar i.w50{width:50%}.bar i.w55{width:55%}.bar i.w60{width:60%}.bar i.w65{width:65%}.bar i.w70{width:70%}.bar i.w75{width:75%}.bar i.w80{width:80%}.bar i.w85{width:85%}.bar i.w90{width:90%}.bar i.w95{width:95%}.bar i.w100{width:100%}

/* Colour and pattern both identify link types; zoom does not enlarge strokes. */
.map .network-link{fill:none;stroke:#187ca8;stroke-width:3;stroke-linecap:round;vector-effect:non-scaling-stroke}
.map .network-link.link-kind-dark-fiber{stroke:#7651a8;stroke-dasharray:9 5}
.map .network-link.link-kind-owned{stroke:#16845b;stroke-width:4}
.map .network-link.link-kind-subsea{stroke:#075fc4;stroke-width:5;stroke-dasharray:2 3}
.map .network-link.failed{stroke:#d33;stroke-width:4;stroke-dasharray:8 5}
.map-legend{display:flex;flex-wrap:wrap;gap:.45rem 1rem;list-style:none;margin:.7rem 0 0;padding:0;color:#38566a;font-size:.85rem}
.map-legend li{display:flex;align-items:center;gap:.4rem}
.link-swatch{display:inline-block;width:2.4rem;height:0;border-top:3px solid #187ca8}
.link-swatch.link-kind-dark-fiber,.link-swatch.link-kind-subsea,.link-swatch.failed{height:3px;border:0;background:repeating-linear-gradient(90deg,currentColor 0 8px,transparent 8px 13px);color:#7651a8}
.link-swatch.link-kind-subsea{height:5px;color:#075fc4}
.link-swatch.link-kind-owned{border-top-color:#16845b;border-top-width:4px}
.link-swatch.failed{height:4px;color:#d33}
.map .incident-marker{pointer-events:none}
.map .incident-marker circle{fill:#c62828;stroke:#fff;stroke-width:2;vector-effect:non-scaling-stroke}
.map .incident-marker text{fill:#fff;stroke:none;font-size:11px;font-weight:900;text-anchor:middle;dominant-baseline:central}
.customer-group{display:flex;align-items:center;gap:.45rem;margin-top:1rem;padding-bottom:.35rem;border-bottom:2px solid #d5e4ed}
.customer-group small{display:inline;color:inherit;font-size:.75rem}.customer-group.healthy{color:#16704b}.customer-group.risk{color:#9a6500}.customer-group.violation{color:#a52b2b}
.operations-dashboard h2 small{display:inline;font-size:.8rem}.warning-list{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:.65rem}.warning-item{border:1px solid #e0bd71;border-left:5px solid #d49513;border-radius:8px;padding:.65rem;text-decoration:none;background:#fff8e8;color:#694500}.warning-item span{margin-top:.2rem}.warning-item.notice{border-color:#8fbad0;border-left-color:#287da5;background:#eef8fc;color:#24566d}.warning-item.critical{border-color:#df8d8d;border-left-color:#c62828;background:#fff0f0;color:#8d2020}
.finance-summary{display:grid;grid-template-columns:repeat(auto-fit,minmax(145px,1fr));gap:.55rem;margin:.65rem 0}.finance-summary div{padding:.6rem;border-radius:8px;background:#eef6fb}.finance-summary b{display:block;font-size:.9rem}.finance-summary .positive{color:#16704b}.finance-summary .negative{color:#a52b2b}
.button-link{display:inline-block;padding:.65rem;color:#1677a7;font-weight:700}.search-results{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:.55rem}.search-results a{display:block;padding:.6rem;border:1px solid #d5e4ed;border-radius:8px;text-decoration:none;color:inherit}.search-results small{font-size:.7rem;text-transform:uppercase}.search-results b{display:block}
.onboarding ol{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:.65rem;list-style-position:inside;padding:0}.onboarding li{padding:.7rem;border:1px solid #9bc6ef;border-radius:9px;background:#eef8ff}.onboarding a{text-decoration:none;color:#124a7a}.onboarding b,.onboarding span{display:block}.onboarding span{margin:.25rem 0 0 1.25rem}
.impact-preview{padding:.45rem .6rem;border-radius:7px;background:#fff4de;color:#7a5100}.impact-preview.safe{background:#e7f7ec;color:#25613e}
.map-context{display:flex;gap:.35rem;margin:.4rem 0}.map-context a{padding:.4rem .7rem;border:1px solid #9bb5c7;border-radius:999px;text-decoration:none;color:#36566c}.map-context a.on{background:#1677a7;color:#fff;border-color:#1677a7}
.recent-actions ol{margin:0;padding-left:1.4rem}.recent-actions li{padding:.35rem 0;border-bottom:1px solid #e5eef3}.recent-actions li:last-child{border:0}.recent-actions time{font-weight:700;color:#36566c;margin-right:.4rem}
.link-details{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:.45rem;margin:.55rem 0}.link-details div{padding:.45rem;background:#eef6fb;border-radius:7px;overflow-wrap:anywhere}.link-details dt{font-size:.72rem;text-transform:uppercase;color:#587084}.link-details dd{margin:.15rem 0 0;font-weight:700}
.sla-insight{margin:.45rem 0;padding:.45rem .6rem;border-left:4px solid #6aa7c8;background:#eef8fc;color:#36566c;border-radius:0 6px 6px 0}

/* Mobile accessibility: roomy touch targets, bottom-sheet dialogs and safe wrapping. */
article,article b,article span,.card,.fact,.tabs a,.search-results a,.warning-item,.onboarding a{overflow-wrap:anywhere;word-break:break-word}
button,a.button-link,.dialog-close,.tabs a{min-height:44px;display:inline-flex;align-items:center;justify-content:center}
@media(max-width:700px){
 main{padding:.65rem}section{padding:.8rem;border-radius:10px}form{gap:.9rem;margin:1rem 0}button,input,select{min-height:48px}button{width:100%}.tabs{display:grid;grid-template-columns:repeat(3,1fr);gap:.25rem}.tabs a{padding:.55rem .25rem;text-align:center}.place-dialog{position:fixed;inset:auto 0 0 0;width:100%;max-width:none;max-height:90vh;margin:0;border-radius:18px 18px 0 0;padding:1rem}.dialog-close{min-width:48px;font-size:1.8rem}.warning-list,.search-results,.onboarding ol,.finance-summary{grid-template-columns:1fr}}

/* Map labels: hidden by default so busy regions stay readable, revealed on
   hover/selection, or always-on for a POP/city with no close neighbour. */
.map text.city-label,.map text.pop-label{opacity:0;transition:opacity .15s ease;pointer-events:none}
.map .city-context a:hover text.city-label,.map text.city-label.chosen,
.map .pop:hover text.pop-label,.map text.pop-label.always,.map text.pop-label.chosen{opacity:1}
