/* Phase 3C-1 visual refinement #2: tighten the approved dashboard geometry without redesigning it. */
@media (min-width:1281px){
  body.predictionLabPage .plDashboard{align-items:stretch}
  body.predictionLabPage .plColumn{align-self:stretch;display:flex;flex-direction:column;gap:12px}
  body.predictionLabPage .plColumn>.plPanel:last-child{flex:1}

  /* Compress Build enough to keep all three stacks visually balanced. */
  body.predictionLabPage .plBuild{padding:13px 14px}
  body.predictionLabPage .plBuild .plSectionTitle{margin-bottom:9px}
  body.predictionLabPage .plBuild .plDrawBar{padding:8px 10px;margin-bottom:7px;gap:9px;grid-template-columns:minmax(165px,1fr) auto auto}
  body.predictionLabPage .plBuild .plDrawBar>div:first-child{gap:4px}
  body.predictionLabPage .plBuild .plTabs{margin-bottom:7px;gap:5px}
  body.predictionLabPage .plBuild .plTabs button{padding:6px 7px}
  body.predictionLabPage .plBuild .plComposerMain,body.predictionLabPage .plBuild .plComposerBonus{padding:10px}
  body.predictionLabPage .plBuild .plBalls--composer{min-height:45px}
  body.predictionLabPage .plBuild .plBall{width:38px;height:38px;flex-basis:38px;font-size:.82rem}
  body.predictionLabPage .plBuild .plComposer small{font-size:.62rem;line-height:1.32}
  body.predictionLabPage .plBuild .plComplete{margin:8px 0 4px;gap:8px}
  body.predictionLabPage .plBuild .plCompleteActions{gap:6px}
  body.predictionLabPage .plBuild .plButton{padding:7px 10px;font-size:.68rem}
  body.predictionLabPage .plBuild .plStrategyPrompt{margin:2px 0 5px}
  body.predictionLabPage .plBuild .plStrategies{gap:5px}
  body.predictionLabPage .plBuild .plStrategies button{min-height:70px;padding:7px}
  body.predictionLabPage .plBuild .plStrategies button>span svg{width:18px;height:18px}
  body.predictionLabPage .plBuild .plStrategies button>b{margin-top:3px}
  body.predictionLabPage .plBuild .plStrategies button>small{margin-top:2px;font-size:.52rem}
  body.predictionLabPage .plBuild .plBuildFooter{margin-top:7px;gap:6px}
  body.predictionLabPage .plBuild .plCurrentSet,body.predictionLabPage .plBuild .plControlToggle{padding:8px}
  body.predictionLabPage .plBuild .plSubmitRow{margin-top:7px;gap:6px}
  body.predictionLabPage .plBuild .plSubmitRow small{font-size:.6rem}

  /* Keep the two experimental lines visually intact. */
  body.predictionLabPage .plControl{display:flex;flex-direction:column}
  body.predictionLabPage .plControl .plVersus{grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);gap:7px}
  body.predictionLabPage .plControl .plVersus article{padding:9px;min-width:0}
  body.predictionLabPage .plControl .plVersus .plBalls{flex-wrap:nowrap;gap:4px;overflow:visible}
  body.predictionLabPage .plControl .plVersus .plBall{width:31px;height:31px;flex:0 0 31px;font-size:.68rem}
  body.predictionLabPage .plControl .plVersus>span{width:32px;height:32px;font-size:.72rem}
  body.predictionLabPage .plControl .plExperimentSummary{margin:8px 0}
  body.predictionLabPage .plControl .plProgress{margin-top:auto}

  /* Stretch lower panels rather than leaving a dark void before Achievements. */
  body.predictionLabPage .plDebrief,body.predictionLabPage .plBattles{display:flex;flex-direction:column}
  body.predictionLabPage .plDebrief .plDebriefBottom{margin-top:auto}
  body.predictionLabPage .plBattles .plBattleChart{margin-top:auto}
}

/* Cleaner gauge internals: number, label, and interpretation occupy dedicated zones. */
body.predictionLabPage .plGauge{overflow:hidden}
body.predictionLabPage .plGauge:after{z-index:1;opacity:.82}
body.predictionLabPage .plGauge strong,body.predictionLabPage .plGauge span,body.predictionLabPage .plGauge small{position:absolute;left:50%;z-index:3;transform:translateX(-50%);width:86%;margin:0;text-align:center;text-shadow:0 1px 2px #06101a,0 0 6px #06101a}
body.predictionLabPage .plGauge strong{top:31%;font-size:1.25rem;line-height:1}
body.predictionLabPage .plGauge span{top:54%;font-size:.53rem;line-height:1.05;letter-spacing:.01em}
body.predictionLabPage .plGauge small{top:70%;font-size:.49rem;line-height:1.05}
body.predictionLabPage .plGauge--hero strong{top:29%;font-size:2.05rem}
body.predictionLabPage .plGauge--hero span{top:55%;font-size:.59rem}
body.predictionLabPage .plGauge--hero small{top:70%;font-size:.54rem}

/* Locked lifecycle: unreached steps read as future states, not completed states. */
body.predictionLabPage .plLifecycle>span:not(.isDone):not(.isCurrent){background:#091827;color:#688093;border-color:#29445a;box-shadow:none}
body.predictionLabPage .plLifecycle>span:not(.isDone):not(.isCurrent) small{color:#6f8798}
body.predictionLabPage .plLockedGrid{grid-template-columns:.62fr 1.6fr .62fr}

/* Empty Debrief still previews the satisfying result geometry. */
body.predictionLabPage .plGhostBalls{display:flex;gap:6px;align-items:center;min-height:44px;opacity:.55}
body.predictionLabPage .plGhostBall{display:grid;place-items:center;width:34px;height:34px;border-radius:50%;border:1px dashed #35536a;color:#49647a;background:#081725;font-size:.6rem}
body.predictionLabPage .plGhostBall--bonus{border-color:#70483f;color:#80544c;margin-left:5px}
body.predictionLabPage .plEmptyReveal{font-size:.58rem;color:#6f8799;margin-top:6px;line-height:1.35}

/* Method Battle empty state looks like a dormant analytical chart, not missing content. */
body.predictionLabPage .plChartPlaceholder{position:relative;overflow:hidden;min-height:176px}
body.predictionLabPage .plEmptyChart{width:100%;height:100%;min-height:145px;display:flex;flex-direction:column;justify-content:flex-end;gap:8px;padding:8px 10px}
body.predictionLabPage .plEmptyChart__legend{display:flex;gap:10px;flex-wrap:wrap;justify-content:center;color:#7790a3;font-size:.52rem}
body.predictionLabPage .plEmptyChart__legend span{display:flex;align-items:center;gap:4px}
body.predictionLabPage .plEmptyChart__legend i{width:7px;height:7px;border-radius:50%;border:1px solid #496b82;background:#16364b}
body.predictionLabPage .plEmptyChart strong{font-size:.7rem;color:#a8bdca;text-align:center}
body.predictionLabPage .plEmptyChart small{font-size:.56rem;color:#6f8799;text-align:center}

/* Locked achievements should look collectible, not disabled. */
body.predictionLabPage .plAchievementGrid article{opacity:.78;background:linear-gradient(180deg,#0a1a2a,#081725);border-color:#24445c}
body.predictionLabPage .plAchievementGrid article>span{background:linear-gradient(135deg,#29445f,#13263a);color:#7895ab;box-shadow:inset 0 0 0 1px rgba(126,164,191,.08)}
body.predictionLabPage .plAchievementGrid article:nth-child(2n)>span{background:linear-gradient(135deg,#33435f,#18283a)}
body.predictionLabPage .plAchievementGrid article:nth-child(3n)>span{background:linear-gradient(135deg,#274d4c,#142b35)}
body.predictionLabPage .plAchievementGrid article b{color:#c5d2dc}
body.predictionLabPage .plAchievementGrid article small{color:#71889a}
body.predictionLabPage .plAchievementGrid article.isUnlocked{opacity:1}

/* Instrument dock: stronger Lab identity without changing destinations. */
body.predictionLabPage .plInstrumentStrip a{display:flex;align-items:center;justify-content:center;gap:7px}
body.predictionLabPage .plInstrumentStrip a svg{width:14px;height:14px;color:#6cc9eb}

@media(max-width:1280px){
  body.predictionLabPage .plControl .plVersus .plBalls{flex-wrap:wrap}
  body.predictionLabPage .plGauge strong,body.predictionLabPage .plGauge span,body.predictionLabPage .plGauge small{position:absolute}
}
