/* Control panel. Shares the marketing site's tokens so the two don't drift apart. */
:root{--ink:#0B0B12;--paper:#FBFAF8;--paper-2:#F3F1EC;--text:#14141C;--muted:#5C5C6E;
  --line:#E4E0D8;--violet:#6D4AFF;--violet-2:#9B7CFF;--emerald:#0FA968;--amber:#B87A00;--rose:#D93A63;
  --sans:'Plus Jakarta Sans',ui-sans-serif,system-ui,-apple-system,'Segoe UI',Roboto,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;--r:12px}
*{box-sizing:border-box}
body{margin:0;font-family:var(--sans);font-size:15px;line-height:1.55;color:var(--text);background:var(--paper-2);-webkit-font-smoothing:antialiased}
a{color:var(--violet)}
h1,h2,h3{margin:0;letter-spacing:-.02em;line-height:1.2}
h1{font-size:1.5rem}h2{font-size:1.12rem}h3{font-size:.95rem}
:where(a,button,input,select,textarea):focus-visible{outline:2px solid var(--violet);outline-offset:2px;border-radius:6px}
code,pre{font-family:var(--mono)}

.adm-head{background:var(--ink);color:#fff;position:sticky;top:0;z-index:20}
.adm-head .in{max-width:1220px;margin-inline:auto;padding:0 20px;display:flex;align-items:center;gap:6px;height:56px}
.adm-brand{font-weight:800;letter-spacing:-.03em;text-decoration:none;color:#fff;display:flex;align-items:center;gap:9px;margin-right:12px}
.adm-mark{width:22px;height:22px;border-radius:7px;background:linear-gradient(140deg,var(--violet),var(--violet-2) 55%,#10D68A)}
.adm-head nav{display:flex;gap:2px;flex-wrap:wrap}
.adm-head nav a{color:#B9B9CC;text-decoration:none;font-size:.9rem;font-weight:600;padding:7px 13px;border-radius:999px}
.adm-head nav a:hover{background:rgba(255,255,255,.09);color:#fff}
.adm-head nav a[aria-current]{background:rgba(255,255,255,.14);color:#fff}
.adm-who{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:.86rem;color:#B9B9CC}
.adm-who form{margin:0}
.adm-who button{font:inherit;background:none;border:0;color:#B9B9CC;cursor:pointer;padding:6px 10px;border-radius:999px}
.adm-who button:hover{background:rgba(255,255,255,.09);color:#fff}

.wrap{max-width:1220px;margin-inline:auto;padding:24px 20px 64px}
.page-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:20px}
.page-head .sp{margin-left:auto}
.card{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:20px}
.card+.card{margin-top:16px}
.card h2{margin-bottom:14px}
.split{display:grid;grid-template-columns:1.55fr 1fr;gap:16px;align-items:start}
.g2{display:grid;grid-template-columns:1fr 1fr;gap:16px}
@media(max-width:900px){.split,.g2{grid-template-columns:1fr}}

.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:20px}
@media(max-width:760px){.kpis{grid-template-columns:repeat(2,1fr)}}
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:16px 18px}
.kpi small{display:block;font-size:.72rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);font-weight:700}
.kpi b{font-size:1.8rem;font-weight:800;letter-spacing:-.03em;line-height:1.15;display:block;margin-top:3px}
.kpi.warn b{color:var(--rose)}

.tbl{width:100%;border-collapse:collapse;font-size:.92rem}
.tbl th,.tbl td{text-align:left;padding:11px 12px;border-bottom:1px solid var(--line);vertical-align:top}
.tbl thead th{font-size:.72rem;text-transform:uppercase;letter-spacing:.07em;color:var(--muted);background:var(--paper-2)}
.tbl tbody tr:hover{background:#FAF9F6}
.tbl a.row{font-weight:700;text-decoration:none;color:var(--text)}
.tbl a.row:hover{color:var(--violet)}
.sub{color:var(--muted);font-size:.84rem}
.scroll{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r);background:#fff}
.scroll .tbl{min-width:700px}

.chip{display:inline-block;font-size:.7rem;font-weight:800;letter-spacing:.04em;text-transform:uppercase;padding:3px 9px;border-radius:999px;white-space:nowrap}
.s-ready,.s-live,.s-done{background:var(--emerald);color:#fff}
.s-pending,.s-provisioning,.s-running{background:rgba(184,122,0,.16);color:var(--amber)}
.s-unreachable,.s-failed{background:rgba(217,58,99,.13);color:var(--rose)}
.s-suspended,.s-retired,.s-deleted{background:rgba(20,20,28,.08);color:var(--muted)}
.dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px}

label{display:block;font-size:.82rem;font-weight:700;margin-bottom:5px}
input[type=text],input[type=password],input[type=email],input[type=search],input[type=number],input[type=date],input[type=tel],input[type=url],input[type=time],input[type=datetime-local],select,textarea{
  font:inherit;width:100%;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:#fff;color:var(--text);appearance:none}
textarea{min-height:76px;resize:vertical}
input:focus,select:focus,textarea:focus{outline:0;border-color:var(--violet);box-shadow:0 0 0 3px rgba(109,74,255,.13)}
.field{margin-bottom:14px}
.err{color:var(--rose);font-size:.82rem;font-weight:600;margin-top:4px}
.hint{color:var(--muted);font-size:.82rem;font-weight:500}

.btn{display:inline-flex;align-items:center;gap:7px;font:inherit;font-weight:700;font-size:.9rem;padding:10px 18px;border-radius:999px;border:1px solid transparent;cursor:pointer;text-decoration:none}
.btn-primary{background:var(--violet);color:#fff}.btn-primary:hover{background:#5B39F5}
.btn-ghost{background:#fff;border-color:var(--line);color:var(--text)}.btn-ghost:hover{border-color:var(--text)}
.btn-sm{padding:6px 13px;font-size:.82rem}
.btn-danger{background:#fff;border-color:rgba(217,58,99,.4);color:var(--rose)}
.row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}

.filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:16px}
.filters a{text-decoration:none;font-size:.84rem;font-weight:700;padding:7px 13px;border-radius:999px;background:#fff;border:1px solid var(--line);color:var(--muted)}
.filters a[aria-current]{background:var(--ink);border-color:var(--ink);color:#fff}
.filters form{margin-left:auto;display:flex;gap:8px}

.dl{display:grid;grid-template-columns:140px 1fr;gap:9px 16px;font-size:.9rem;margin:0}
.dl dt{color:var(--muted);font-weight:600}
.dl dd{margin:0;word-break:break-word}

.log{list-style:none;margin:0;padding:0}
.log li{position:relative;padding:0 0 16px 24px;border-left:2px solid var(--line)}
.log li:last-child{padding-bottom:0;border-left-color:transparent}
.log li::before{content:'';position:absolute;left:-6px;top:4px;width:10px;height:10px;border-radius:50%;background:var(--violet);border:2px solid #fff}
.log li.bad::before{background:var(--rose)}
.log li.ok::before{background:var(--emerald)}
.log b{display:block;font-size:.9rem}
.log .meta{color:var(--muted);font-size:.8rem}

.flash{background:rgba(15,169,104,.1);border:1px solid rgba(15,169,104,.3);color:#0B6B43;padding:11px 16px;border-radius:9px;margin-bottom:18px;font-size:.9rem;font-weight:600}
.flash.bad{background:rgba(217,58,99,.1);border-color:rgba(217,58,99,.3);color:#A32348}
.empty{text-align:center;padding:40px 20px;color:var(--muted)}

.token{background:var(--ink);color:#E9E9F5;border-radius:10px;padding:16px;font-family:var(--mono);font-size:.8rem;line-height:1.7;white-space:pre-wrap;word-break:break-all;margin:12px 0}
.note{background:rgba(245,158,11,.10);border:1px solid rgba(245,158,11,.28);color:#7c4a03;padding:12px 14px;border-radius:10px;font-size:.86rem;margin-bottom:14px}

.bar{height:6px;border-radius:999px;background:var(--paper-2);overflow:hidden;margin-top:5px}
.bar i{display:block;height:100%;background:var(--emerald)}
.bar i.hot{background:var(--amber)}.bar i.full{background:var(--rose)}

.auth{min-height:100dvh;display:grid;place-items:center;padding:24px;background:var(--ink)}
.auth-card{width:100%;max-width:420px;background:#fff;border-radius:18px;padding:32px;box-shadow:0 30px 70px -30px rgba(0,0,0,.7)}
.auth-card h1{font-size:1.35rem;margin-bottom:6px}
.auth-card>p{color:var(--muted);font-size:.9rem;margin:0 0 22px}
.auth-brand{display:flex;align-items:center;gap:10px;font-weight:800;letter-spacing:-.03em;margin-bottom:20px;font-size:1.15rem}
.auth-err{background:rgba(217,58,99,.1);border:1px solid rgba(217,58,99,.3);color:#A32348;padding:10px 14px;border-radius:9px;font-size:.87rem;font-weight:600;margin-bottom:16px}

/* File inputs — the browser default ("Choose file · No file chosen") is the one control that
   gives away an otherwise styled form. ::file-selector-button is standard and lets the button
   match the rest without any JavaScript. */
input[type=file] {
  font: inherit; font-size: .9rem; width: 100%;
  padding: 10px 12px;
  border: 1px dashed var(--line); border-radius: 9px;
  background: #fff; color: var(--muted);
  cursor: pointer;
  transition: border-color .15s, background .15s;
}
input[type=file]:hover { border-color: var(--violet); background: rgba(109,74,255,.03); }
input[type=file]:focus-visible { outline: 0; border-color: var(--violet); box-shadow: 0 0 0 3px rgba(109,74,255,.13); }
input[type=file]::file-selector-button {
  font: inherit; font-weight: 700; font-size: .84rem;
  padding: 7px 15px; margin: -2px 12px -2px 0;
  border: 0; border-radius: 999px;
  background: var(--ink); color: #fff; cursor: pointer;
  transition: background .15s;
}
input[type=file]::file-selector-button:hover { background: var(--violet); }

/* Read-only endpoint, shown for copying into another console. */
.copyable {
  display: flex; align-items: center; gap: 10px;
  padding: 9px 10px 9px 13px;
  border: 1px solid var(--line); border-radius: 9px; background: var(--paper-2);
}
.copyable code {
  flex: 1; min-width: 0; font-size: .85rem; color: var(--text);
  overflow-x: auto; white-space: nowrap; scrollbar-width: none;
}
.copyable code::-webkit-scrollbar { display: none; }
.copyable .btn { flex: none; background: #fff; }

/* One-line create form: label above input, wraps on narrow screens. */
.row-form { display: flex; gap: 10px; flex-wrap: wrap; align-items: flex-end; }
.row-form label { display: flex; flex-direction: column; gap: 5px; font-size: .8rem; font-weight: 600; flex: 1; min-width: 120px; }
.row-form input, .row-form select { width: 100%; }
.row-form .btn { flex: none; }
tr.off { opacity: .5; }

/* Native <dialog>. The browser handles the backdrop, Esc and focus, so this is only paint. */
dialog {
  border: 0; padding: 0; border-radius: 16px; width: min(560px, calc(100vw - 32px));
  background: #fff; color: var(--ink, #14141c); box-shadow: 0 30px 70px -20px rgba(0,0,0,.45);
}
dialog::backdrop { background: rgba(11,11,18,.55); backdrop-filter: blur(2px); }
dialog header {
  display: flex; align-items: center; gap: 12px;
  padding: 18px 20px; border-bottom: 1px solid var(--line, #e7e4de);
}
dialog header h2 { font-size: 1.05rem; margin: 0; }
dialog header .x {
  margin-left: auto; background: none; border: 0; font-size: 1.5rem; line-height: 1;
  cursor: pointer; color: #8b8b9c; padding: 0 4px;
}
dialog header .x:hover { color: var(--ink, #14141c); }
.dlg-body { padding: 20px; }
.dlg-body .form-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
.dlg-body label { display: flex; flex-direction: column; gap: 6px; font-size: .82rem; font-weight: 600; }
.dlg-body input, .dlg-body select { width: 100%; }
.dlg-body .hint { margin-top: 14px; }
dialog footer {
  display: flex; justify-content: flex-end; gap: 10px;
  padding: 16px 20px; border-top: 1px solid var(--line, #e7e4de); background: #faf9f7;
  border-radius: 0 0 16px 16px;
}
/* A <td> must stay a table cell — display:flex on one drops it out of the row box and the
   borders stop lining up. Flex an inner wrapper instead. */
.row-actions > div { display: flex; gap: 6px; align-items: center; justify-content: flex-end; }
.row-actions form { margin: 0; }
@media (max-width: 560px) { .dlg-body .form-grid { grid-template-columns: 1fr; } }

/* Date fields. appearance:none above removes WebKit's built-in indicator, so the calendar
   button is restored and tinted rather than left invisible. */
input[type=date] { min-height: 41px; }
input[type=date]::-webkit-calendar-picker-indicator {
  cursor: pointer; opacity: .5; padding: 2px; border-radius: 4px;
}
input[type=date]::-webkit-calendar-picker-indicator:hover { opacity: 1; background: rgba(109,74,255,.1); }
input[type=date]::-webkit-datetime-edit { color: var(--text); }
input[type=date]:invalid::-webkit-datetime-edit { color: #9a97a3; }

/* Checkbox with an explanation under it, inside the dialog grid. */
.dlg-body .check {
  grid-column: 1 / -1; flex-direction: row; align-items: flex-start; gap: 10px;
  margin-top: 14px; font-weight: 500; cursor: pointer;
}
.dlg-body .check input { width: auto; margin-top: 2px; flex: none; }
.dlg-body .check b { display: block; font-size: .86rem; }
.dlg-body .check em { display: block; font-style: normal; font-size: .82rem; color: var(--muted); margin-top: 2px; }
.dlg-body code { font-size: .8rem; word-break: break-all; }

/* The share link for a private coupon, inside a table cell: one line, never wrapping, so the
   row keeps the height of every other row. */
.privlink {
  display: block; max-width: 320px; margin-top: 3px;
  font-size: .78rem; color: var(--muted); text-decoration: none;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.privlink:hover { color: var(--violet); text-decoration: underline; }
/* Actions sit with the row's first line rather than floating at its top. */
.tbl td.row-actions { vertical-align: middle; }
