345:
${doc.title}
346:
${doc.role || ''}
347:
${doc.path || ''}
349:
${st}
353: const phPct = Math.round((phIdx / G.phases.length) * 100);
357:
${ph.step} / ${cat.title} / ${bucket}
358:
${ph.step}${bucket}
361:
${ph.step}/${cat.title}
363:
${BUCKET_DESC[bucket]}
367:
Phase ${phIdx + 1} of ${G.phases.length}
374:
${bucket}
377:
378:
Authority Documents — ${cat.title}
379: ${items || '
No documents registered for this category.
'}
388: (r.label || r.subcategory || r.component || '').toLowerCase().includes(name)
415: const ph10 = G.phases.find(p => p.id === 'phase-10');
417: G.openPhases.add('phase-10');
418: G.sel.phaseId = 'phase-10';
419: G.sel.catId = null; G.sel.bucket = null;
442:/* ── CAT CARD CLICK (phase overview) ─────────────── */
447: G.sel.phaseId = cc.dataset.ph;
449: G.sel.bucket = null;
450: G.openPhases.add(cc.dataset.ph);
456: G.sel.phaseId = bc.dataset.ph;
458: G.sel.bucket = bc.dataset.bk;
459: G.openPhases.add(bc.dataset.ph);
=== ACTIVE panel.runtime.fix TREE LOGIC ===
67: state.openPhases = new Set();
72: function phaseOfCategory(cat) {
75: if (!m) return normStageKey("phase-01");
76: return normStageKey("phase-" + String(parseInt(m[0], 10)).padStart(2, "0"));
79: function categoriesForPhase(phaseId) {
81: const key = normStageKey(phaseId);
87: return normStageKey(doc && doc.phase) === key;
90: const badgeHit = phaseOfCategory(cat) === key;
102: function phaseStatusClass(phaseId) {
103: const roll = stageRollup(phaseId);
110: const phases = (state.hubIndex && Array.isArray(state.hubIndex.phases)) ? state.hubIndex.phases : [];
111: if (!phases.length) {
112: els.stageNav.innerHTML = '
MISSING hub phases / hubIndex binding
';
120: function renderBuckets(phaseId, catId) {
122: '
',
123: BUCKETS.map(function (bucket) {
125: '
',
126: '