/* PROMISE COMPONENTS v1.0 — the canonical component vocabulary.
   Card #132235 · 1px #24374E · radius 12 · pad 24 · Inter · uppercase tight headers.
   Every important card shows source/evidence. Gold = emphasis only. */

.p-body{ font-family:var(--p-font); color:var(--p-text); background:var(--p-bg); -webkit-font-smoothing:antialiased; }

/* section header */
.p-sec{ display:flex; align-items:center; gap:12px; margin:var(--p-section) 0 14px; }
.p-sec .bar{ width:3px; height:14px; background:var(--p-muted); border-radius:2px; }
.p-sec .lbl{ font-size:11px; font-weight:700; letter-spacing:.18em; text-transform:uppercase; color:var(--p-text-2); }
.p-sec .rule{ flex:1; height:1px; background:var(--p-border); }

/* Card (base) — all cards share this */
.p-card{ background:var(--p-surface); border:1px solid var(--p-border); border-radius:var(--p-radius);
  padding:var(--p-pad); box-shadow:var(--p-shadow); }
.p-card.elev{ background:var(--p-surface-2); }
.p-card-h{ display:flex; justify-content:space-between; align-items:baseline; gap:12px; margin-bottom:16px; }
.p-card-h .t{ font-size:11px; font-weight:700; letter-spacing:.12em; text-transform:uppercase; color:var(--p-text-2); }
.p-card-h .src{ font-size:9px; color:var(--p-muted); letter-spacing:.02em; }

/* KPI card — numbers large and clean */
.p-kpi{ background:var(--p-surface); border:1px solid var(--p-border); border-radius:var(--p-radius); padding:20px 22px; }
.p-kpi b{ display:block; font-size:34px; font-weight:700; letter-spacing:-.01em; line-height:1; color:var(--p-text); font-variant-numeric:tabular-nums; }
.p-kpi b.gold{ color:var(--p-gold); } .p-kpi b.buy{ color:var(--p-buy); } .p-kpi b.red{ color:var(--p-blocked); }
.p-kpi span{ display:block; margin-top:10px; font-size:10px; letter-spacing:.08em; text-transform:uppercase; color:var(--p-muted); }

/* Decision card — decision visible in <2s */
.p-decision{ display:flex; align-items:center; gap:22px; flex-wrap:wrap; }
.p-decision .big{ font-size:46px; font-weight:700; letter-spacing:-.01em; line-height:1; }
.p-decision .big.BUY{ color:var(--p-buy); } .p-decision .big.WATCH{ color:var(--p-watch); }
.p-decision .big.BLOCKED,.p-decision .big.REJECT{ color:var(--p-blocked); } .p-decision .big.UNKNOWN{ color:var(--p-unknown); }

/* Badges — status + source + confidence */
.p-badge{ display:inline-flex; align-items:center; gap:6px; font-size:10px; font-weight:700; letter-spacing:.06em;
  text-transform:uppercase; padding:4px 10px; border-radius:6px; border:1px solid var(--p-border); color:var(--p-muted); }
.p-badge.BUY,.p-badge.buy{ color:var(--p-buy); background:rgba(46,139,87,.12); border-color:rgba(46,139,87,.5); }
.p-badge.WATCH,.p-badge.watch{ color:var(--p-watch); background:rgba(201,151,0,.12); border-color:rgba(201,151,0,.5); }
.p-badge.BLOCKED,.p-badge.REJECT,.p-badge.blocked{ color:var(--p-blocked); background:rgba(201,76,76,.12); border-color:rgba(201,76,76,.5); }
.p-badge.INFO{ color:var(--p-info); } .p-badge.UNKNOWN{ color:var(--p-unknown); }
.p-src{ font-size:9px; color:var(--p-muted); border:1px solid var(--p-border); border-radius:5px; padding:2px 7px; }
.p-conf{ font-size:9px; font-weight:700; letter-spacing:.05em; text-transform:uppercase; color:var(--p-gold); border:1px solid var(--p-gold-border); border-radius:5px; padding:2px 7px; }

/* Property card / Evidence card / Risk card share .p-card; helpers below */
.p-kv{ display:flex; justify-content:space-between; gap:14px; padding:9px 0; border-bottom:1px solid var(--p-border); font-size:12.5px; }
.p-kv:last-child{ border:0; } .p-kv .k{ color:var(--p-muted); } .p-kv .v{ color:var(--p-text-2); text-align:right; font-variant-numeric:tabular-nums; }
.p-evidence{ font-size:9px; color:var(--p-muted); margin-top:12px; line-height:1.6; }

/* Development Potential — standard block (lot/current/max/unused/coverage/FAR/setbacks/height/envelope/scenarios) */
.p-dev .p-grid{ margin-top:4px; }
.p-scn{ display:flex; gap:8px; flex-wrap:wrap; margin-top:14px; }
.p-scn .s{ font-size:10px; letter-spacing:.04em; text-transform:uppercase; color:var(--p-text-2);
  border:1px solid var(--p-border); border-radius:16px; padding:6px 12px; }
.p-scn .s.on{ color:var(--p-gold); border-color:var(--p-gold-border); }
.p-scn .s.off{ color:var(--p-unknown); }

/* Table — institutional, dense, sticky header, aligned */
.p-table{ width:100%; border-collapse:collapse; font-size:12.5px; }
.p-table thead th{ position:sticky; top:0; z-index:1; background:var(--p-bg-2); text-align:left;
  font-size:8.5px; letter-spacing:.07em; text-transform:uppercase; color:var(--p-muted);
  padding:10px 14px; border-bottom:1px solid var(--p-border); white-space:nowrap; }
.p-table td{ padding:10px 14px; border-bottom:1px solid var(--p-border); color:var(--p-text-2); }
.p-table tbody tr:last-child td{ border-bottom:0; }
.p-table td.num{ text-align:right; font-variant-numeric:tabular-nums; color:var(--p-text); }
.p-table tbody tr:hover td{ background:rgba(255,255,255,.02); }
.p-tablewrap{ background:var(--p-surface); border:1px solid var(--p-border); border-radius:var(--p-radius); overflow:hidden; }

/* Buttons */
.p-btn{ font-size:12px; font-weight:600; padding:9px 16px; border-radius:8px; cursor:pointer;
  border:1px solid var(--p-border); background:transparent; color:var(--p-text); }
.p-btn.primary{ background:var(--p-gold); color:var(--p-bg); border-color:var(--p-gold); }
.p-btn.danger{ background:var(--p-blocked); color:#fff; border-color:var(--p-blocked); }

/* States */
.p-empty,.p-blocked,.p-loading{ display:flex; align-items:center; gap:8px; font-size:12px; color:var(--p-muted); padding:16px 0; }
.p-empty .d,.p-loading .d{ width:6px; height:6px; border-radius:50%; background:var(--p-unknown); }
.p-blocked{ color:var(--p-blocked); } .p-blocked .d{ background:var(--p-blocked); }
.p-note{ font-size:9px; color:var(--p-muted); margin-top:12px; line-height:1.6; }


/* ---- PChart (promise_charts.js) — unified chart vocabulary. Tokens only. ---- */
.pc{ position:relative; }
.pc svg{ display:block; width:100%; height:auto; }
.pc .pc-grid{ stroke:var(--chart-grid); stroke-width:1; }
.pc .pc-axis{ fill:var(--chart-axis); font-family:var(--p-font); font-size:10px; }
.pc .pc-lbl{ fill:var(--p-text-2); font-family:var(--p-font); font-size:11.5px; }
.pc .pc-val{ fill:var(--p-text); font-family:var(--p-font); font-size:11.5px; font-weight:700; font-variant-numeric:tabular-nums; }
.pc-legend{ display:flex; flex-wrap:wrap; gap:6px 16px; margin-top:10px; }
.pc-legend .li{ display:inline-flex; align-items:center; gap:6px; font-size:10px; letter-spacing:.04em; text-transform:uppercase; color:var(--p-text-2); }
.pc-legend .sw{ width:9px; height:9px; border-radius:2px; flex:none; }
.pc-src{ display:flex; align-items:center; gap:8px; margin-top:10px; }
.pc-tip{ position:absolute; z-index:9999; pointer-events:none; max-width:280px;
  background:var(--chart-tooltip-bg); border:1px solid var(--chart-tooltip-border);
  border-radius:8px; padding:7px 10px; font-family:var(--p-font); font-size:11px;
  color:var(--p-text); box-shadow:var(--p-shadow); }
.pc-tip .k{ color:var(--p-muted); margin-right:6px; }
.pc-tip .v{ font-weight:700; font-variant-numeric:tabular-nums; }