| 668 | } |
| 669 | |
| 670 | function approachGuide(ord) { |
| 671 | const order = ["Assessment", "P0 Build", "P1 Security", "P2 Runtime", "P3 Observability", "Validate"]; |
| 672 | const activeIdx = ord && ord.activeRank != null ? ord.activeRank : -1; |
| 673 | const flow = order |
| 674 | .map((name, i) => '<span class="fstep' + (i === activeIdx ? " on" : i < activeIdx ? " past" : "") + '">' + esc(name) + "</span>") |
| 675 | .join('<span class="farrow">›</span>'); |
| 676 | let body = "Work top-down and finish each phase before the next — e.g. don't upgrade the Java runtime (P2) while the build is still broken (P0). Steps in later phases are marked 🔒 until the current phase is done; <b>Continue here</b> always points to the safe next step."; |
| 677 | if (ord && ord.activePhase) body += " You're in <b>" + esc(ord.activePhase) + "</b>."; |
| 678 | return '<div class="card guide"><h2>Recommended approach</h2><div class="flow">' + flow + "</div><p class=\"muted\" style=\"margin:10px 0 0\">" + body + "</p></div>"; |
| 679 | } |
| 680 | function shortPhase(name) { |
| 681 | if (!name) return "the current phase"; |
| 682 | const m = String(name).match(/\bP[0-3]\b/i); |