Skip to content

Commit d4c01aa

Browse files
authored
feat(wiki): collapsible Research Objective panel in campaign viz (#284)
The objective panel was always-on and obscured the graph. Make it collapsible (default collapsed); state is persisted in localStorage so the choice carries across reloads and across the Iterations/Knowledge views.
1 parent 2703822 commit d4c01aa

1 file changed

Lines changed: 39 additions & 8 deletions

File tree

scripts/visualize_campaign.py

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,10 +58,24 @@
5858
border: 1px solid #0f3460; border-radius: 6px; padding: 12px 14px;
5959
color: #e0e0e0; font-size: 12px; z-index: 50; max-width: 480px;
6060
}}
61+
.campaign-objective.collapsed {{ padding: 6px 12px; }}
62+
.campaign-objective .obj-header {{
63+
display: flex; align-items: center; justify-content: space-between;
64+
gap: 12px; cursor: pointer; user-select: none;
65+
}}
6166
.campaign-objective .obj-label {{
6267
color: #888; font-size: 10px; text-transform: uppercase;
63-
letter-spacing: 0.8px; margin-bottom: 6px;
68+
letter-spacing: 0.8px;
69+
}}
70+
.campaign-objective:not(.collapsed) .obj-header {{ margin-bottom: 6px; }}
71+
.campaign-objective .obj-toggle {{
72+
color: #888; font-size: 10px; transition: transform 0.15s;
73+
transform: rotate(180deg);
6474
}}
75+
.campaign-objective.collapsed .obj-toggle {{ transform: rotate(0deg); }}
76+
.campaign-objective .obj-header:hover .obj-label,
77+
.campaign-objective .obj-header:hover .obj-toggle {{ color: #ccc; }}
78+
.campaign-objective.collapsed .obj-body {{ display: none; }}
6579
.campaign-objective .obj-question {{
6680
color: #ccc; font-style: italic; line-height: 1.5; margin-bottom: 6px;
6781
}}
@@ -467,16 +481,22 @@
467481
468482
let currentView = "iterations";
469483
470-
// Render campaign objective box (bottom-left corner)
484+
// Render campaign objective box (top-center). Collapsible; persists across reloads via localStorage.
485+
const OBJECTIVE_COLLAPSED_KEY = "nous-viz-objective-collapsed";
486+
function toggleObjective() {{
487+
const box = document.getElementById("campaign-objective-box");
488+
if (!box) return;
489+
const nowCollapsed = !box.classList.contains("collapsed");
490+
box.classList.toggle("collapsed", nowCollapsed);
491+
try {{ localStorage.setItem(OBJECTIVE_COLLAPSED_KEY, nowCollapsed ? "1" : "0"); }} catch (e) {{}}
492+
}}
471493
if (campaignContext && (campaignContext.research_question || campaignContext.target_commit)) {{
472494
const box = document.getElementById("campaign-objective-box");
473495
if (box) {{
474-
let html = '';
496+
let bodyHtml = '';
475497
if (campaignContext.research_question) {{
476-
html += '<div class="obj-label">Research Objective</div>';
477-
html += '<div class="obj-question">' + campaignContext.research_question + '</div>';
498+
bodyHtml += '<div class="obj-question">' + campaignContext.research_question + '</div>';
478499
}}
479-
// Show runtime metadata line
480500
const metaParts = [];
481501
if (campaignContext.target_commit) {{
482502
const shortSha = campaignContext.target_commit.substring(0, 7);
@@ -488,9 +508,20 @@
488508
metaParts.push('<span class="obj-meta-item">nous <code>' + shortVer + '</code></span>');
489509
}}
490510
if (metaParts.length > 0) {{
491-
html += '<div class="obj-meta">' + metaParts.join(' &middot; ') + '</div>';
511+
bodyHtml += '<div class="obj-meta">' + metaParts.join(' &middot; ') + '</div>';
492512
}}
493-
box.innerHTML = html;
513+
box.innerHTML =
514+
'<div class="obj-header" onclick="toggleObjective()">' +
515+
'<span class="obj-label">Research Objective</span>' +
516+
'<span class="obj-toggle">&#9662;</span>' +
517+
'</div>' +
518+
'<div class="obj-body">' + bodyHtml + '</div>';
519+
let startCollapsed = true;
520+
try {{
521+
const stored = localStorage.getItem(OBJECTIVE_COLLAPSED_KEY);
522+
if (stored === "0") startCollapsed = false;
523+
}} catch (e) {{}}
524+
box.classList.toggle("collapsed", startCollapsed);
494525
box.style.display = "block";
495526
}}
496527
}}

0 commit comments

Comments
 (0)