:root{--bg:#0b0e14;--surface:#131823;--surface-elevated:#1a2130;--border:#252f42;--text:#e6ecf5;--text-muted:#93a1b8;--accent:#38bdf8;--accent-soft:rgba(56,189,248,0.14);--green:#22c55e;--green-soft:rgba(34,197,94,0.14);--amber:#f59e0b;--amber-soft:rgba(245,158,11,0.15);--red:#ef4444;--red-soft:rgba(239,68,68,0.15);--radius:12px;--mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace}*,:after,:before{box-sizing:border-box}html{color-scheme:dark;scrollbar-gutter:stable}body{margin:0;min-block-size:100dvh;background:var(--bg);color:var(--text);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Noto Sans Thai,sans-serif;line-height:1.5;-webkit-font-smoothing:antialiased}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}.page-shell{max-inline-size:1240px;margin-inline:auto;padding-block:1.5rem 3rem;padding-inline:clamp(1rem,3vw,2rem);display:flex;flex-direction:column;gap:1.5rem}.topbar{display:flex;flex-wrap:wrap;align-items:safe center;justify-content:space-between;gap:1rem;-webkit-padding-after:1rem;padding-block-end:1rem;-webkit-border-after:1px solid var(--border);border-block-end:1px solid var(--border)}.topbar-title{min-inline-size:0}.topbar-title h1{margin:0;font-size:clamp(1.25rem,2.2vw,1.65rem);letter-spacing:-.02em}.topbar-subtitle{margin:.25rem 0 0;color:var(--text-muted);font-size:.875rem}.topbar-actions{display:flex;flex-wrap:wrap;align-items:safe center;gap:.625rem}.btn{display:inline-flex;align-items:center;justify-content:center;gap:.45rem;padding-block:.5rem;padding-inline:.9rem;border-radius:8px;border:1px solid var(--border);background:var(--surface-elevated);color:var(--text);font-size:.875rem;font-weight:500;cursor:pointer;transition:border-color .15s ease,background-color .15s ease}.btn:hover:not(:disabled){border-color:var(--accent)}.btn:disabled{opacity:.6;cursor:not-allowed}.btn-primary{background:var(--accent);border-color:var(--accent);color:#061019;font-weight:600}.btn-primary:hover:not(:disabled){background:#60ccf9}.kpi-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));grid-gap:1rem;gap:1rem}.kpi-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:1rem 1.15rem;display:flex;flex-direction:column;gap:.35rem;min-inline-size:0}.kpi-label{font-size:.8rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.04em}.kpi-value{font-size:1.55rem;font-weight:700;letter-spacing:-.02em}.kpi-meta{font-size:.8rem;color:var(--text-muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.section-header{display:flex;flex-wrap:wrap;align-items:safe center;justify-content:space-between;gap:.75rem;-webkit-margin-after:.85rem;margin-block-end:.85rem}.section-title{margin:0;font-size:1.05rem;font-weight:600}.prod-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));grid-gap:1rem;gap:1rem}.prod-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:1rem 1.15rem;display:flex;flex-direction:column;gap:.65rem;min-inline-size:0}.prod-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:.5rem}.prod-name{font-weight:600;font-size:1rem;min-inline-size:0;overflow-wrap:anywhere}.prod-meta{display:flex;flex-wrap:wrap;gap:.5rem;font-size:.8rem;color:var(--text-muted)}.badge{display:inline-flex;align-items:center;gap:.35rem;padding-block:.2rem;padding-inline:.55rem;border-radius:999px;font-size:.75rem;font-weight:600;white-space:nowrap}.badge-online,.badge-running{background:var(--green-soft);color:var(--green)}.badge-degraded,.badge-recent{background:var(--amber-soft);color:var(--amber)}.badge-offline{background:var(--red-soft);color:var(--red)}.badge-idle,.badge-neutral{background:rgba(147,161,184,.14);color:var(--text-muted)}.dot{inline-size:7px;block-size:7px;border-radius:50%;background:currentColor}.notice-banner{background:var(--amber-soft);border:1px solid rgba(245,158,11,.35);color:#fde68a;border-radius:var(--radius);padding:.85rem 1rem;font-size:.875rem}.ports-strip{display:flex;flex-wrap:wrap;flex-wrap:balance;gap:.5rem}.port-pill{display:inline-flex;align-items:center;gap:.4rem;padding-block:.3rem;padding-inline:.65rem;border-radius:8px;background:var(--surface);border:1px solid var(--border);font-family:var(--mono);font-size:.78rem}.port-num{color:var(--accent);font-weight:600}.toolbar{align-items:safe center;gap:.75rem}.tabs,.toolbar{display:flex;flex-wrap:wrap}.tabs{gap:.4rem}.tab-btn{padding-block:.4rem;padding-inline:.75rem;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text-muted);font-size:.825rem;cursor:pointer}.tab-btn[aria-pressed=true]{background:var(--accent-soft);border-color:var(--accent);color:var(--accent);font-weight:600}.search-input{-webkit-margin-start:auto;margin-inline-start:auto;min-inline-size:220px;flex:1 1 220px;max-inline-size:320px;padding-block:.45rem;padding-inline:.75rem;border-radius:8px;border:1px solid var(--border);background:var(--surface);color:var(--text);font-size:.875rem}.search-input:focus{outline:2px solid var(--accent);outline-offset:1px}.table-wrapper{overflow:auto;max-inline-size:100%;max-block-size:min(620px,75dvh);container-type:inline-size;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius)}.projects-table{inline-size:100%;border-collapse:separate;border-spacing:0;font-size:.875rem;--label-2:"Status";--label-3:"Tech";--label-4:"Ports / Branch";--label-5:"Last Activity";--label-6:"Path"}.projects-table caption{position:absolute;inline-size:1px;block-size:1px;overflow:clip;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.projects-table thead{position:-webkit-sticky;position:sticky;inset-block-start:0;z-index:2;background:var(--surface-elevated)}.projects-table td,.projects-table th{padding-block:.75rem;padding-inline:.9rem;text-align:start;-webkit-border-after:1px solid var(--border);border-block-end:1px solid var(--border);vertical-align:middle}.projects-table thead th{font-size:.75rem;text-transform:uppercase;letter-spacing:.04em;color:var(--text-muted);font-weight:600;white-space:nowrap}.projects-table tbody th{position:-webkit-sticky;position:sticky;inset-inline-start:0;z-index:1;background:var(--surface);font-weight:600;white-space:nowrap}.projects-table tbody tr:hover td,.projects-table tbody tr:hover th{background:rgba(255,255,255,.025)}.mono{font-family:var(--mono);font-size:.8rem}.muted{color:var(--text-muted)}@container (width < 700px){.projects-table,.projects-table tbody,.projects-table td,.projects-table th,.projects-table thead,.projects-table tr{display:block}.projects-table thead{display:none}.projects-table tbody{padding:.75rem}.projects-table tr{-webkit-margin-after:.85rem;margin-block-end:.85rem;border:1px solid var(--border);border-radius:10px;overflow:clip;background:var(--bg)}.projects-table tr:last-child{-webkit-margin-after:0;margin-block-end:0}.projects-table tbody th{position:-webkit-sticky;position:sticky;inset-block-start:0;z-index:2;background:var(--surface-elevated);-webkit-border-after:1px solid var(--border);border-block-end:1px solid var(--border)}.projects-table td{display:flex;justify-content:space-between;align-items:baseline;gap:.75rem;padding-block:.5rem}.projects-table td:before{font-size:.75rem;color:var(--text-muted);font-weight:600;flex-shrink:0}.projects-table td:nth-child(2):before{content:var(--label-2) ": "}.projects-table td:nth-child(3):before{content:var(--label-3) ": "}.projects-table td:nth-child(4):before{content:var(--label-4) ": "}.projects-table td:nth-child(5):before{content:var(--label-5) ": "}.projects-table td:nth-child(6):before{content:var(--label-6) ": "}}.login-shell{min-block-size:100dvh;display:grid;place-content:center;padding:1.25rem}.login-card{inline-size:min(400px,100%);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.75rem;display:flex;flex-direction:column;gap:1.15rem}.login-card h1{margin:0;font-size:1.35rem}.login-card p{margin:0;color:var(--text-muted);font-size:.9rem}.form-field{display:flex;flex-direction:column;gap:.4rem}.form-field label{font-size:.85rem;font-weight:500}.form-field input{padding-block:.6rem;padding-inline:.8rem;border-radius:8px;border:1px solid var(--border);background:var(--bg);color:var(--text);font-size:1rem}.form-field input:focus{outline:2px solid var(--accent);outline-offset:1px}.error-box{background:var(--red-soft);border:1px solid rgba(239,68,68,.4);color:#fecaca;padding:.6rem .8rem;border-radius:8px;font-size:.85rem}