Skip to content

Commit fd5c5c4

Browse files
committed
feat(output): two-tier nav click handling + tooltips on subnav
1 parent 71afd1e commit fd5c5c4

1 file changed

Lines changed: 30 additions & 31 deletions

File tree

output-tab.js

Lines changed: 30 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2227,6 +2227,18 @@ function renderSubNav(actId) {
22272227
sub.innerHTML = tabs.length <= 1
22282228
? ''
22292229
: tabs.map((n) => `<button class="tab-btn" data-tab="${n}">${TAB_LABELS[n]}</button>`).join('');
2230+
2231+
// Mark scan buttons that have an explainer with a subtle ⓘ (per-render, so
2232+
// freshly-rendered subnav buttons get one; the tip listeners in initScanTips
2233+
// delegate from #act-subnav and survive this re-render).
2234+
sub.querySelectorAll('.tab-btn[data-tab]').forEach((btn) => {
2235+
if (explainerFor(btn.dataset.tab) && !btn.querySelector('.tip-i')) {
2236+
const i = document.createElement('span');
2237+
i.className = 'tip-i';
2238+
i.textContent = 'ⓘ';
2239+
btn.appendChild(i);
2240+
}
2241+
});
22302242
}
22312243

22322244
function show(n, { updateHash = true } = {}) {
@@ -2257,47 +2269,34 @@ function show(n, { updateHash = true } = {}) {
22572269
}
22582270
}
22592271

2260-
// Nav clicks: open/close a grouped menu, run-all, or switch tab.
2261-
document.querySelector('.tab-nav')?.addEventListener('click', e => {
2262-
const menuBtn = e.target.closest('.tab-menu-btn');
2263-
if (menuBtn) {
2264-
const menu = menuBtn.closest('.tab-menu');
2265-
const wasOpen = menu.classList.contains('open');
2266-
document.querySelectorAll('.tab-menu').forEach(m => m.classList.remove('open'));
2267-
if (!wasOpen) menu.classList.add('open');
2268-
return;
2269-
}
2270-
if (e.target.closest('#run-all-lenses')) { runAllLenses(); return; }
2271-
const btn = e.target.closest('[data-tab]');
2272-
if (btn) {
2273-
const n = Number(btn.dataset.tab);
2274-
show(n);
2275-
if (n === 19) renderConnections(lastData); // network tab — pull fresh on each open (like Similar)
2276-
// (canvas, tab 27, is dispatched inside show() so deep-link/restore paths render it too)
2277-
}
2272+
// Primary act row: clicking an act shows its first tab.
2273+
document.getElementById('act-nav')?.addEventListener('click', (e) => {
2274+
const btn = e.target.closest('.act-tab');
2275+
if (!btn) return;
2276+
const first = tabsForAct(btn.dataset.act)[0];
2277+
if (first != null) show(first);
22782278
});
22792279

2280-
// Close menus on an outside click.
2281-
document.addEventListener('click', e => {
2282-
if (!e.target.closest('.tab-nav')) document.querySelectorAll('.tab-menu').forEach(m => m.classList.remove('open'));
2280+
// Secondary row: clicking a tab switches panels (same contract as before).
2281+
document.getElementById('act-subnav')?.addEventListener('click', (e) => {
2282+
if (e.target.closest('#run-all-lenses')) { runAllLenses(); return; }
2283+
const btn = e.target.closest('[data-tab]');
2284+
if (!btn) return;
2285+
const n = Number(btn.dataset.tab);
2286+
show(n);
2287+
if (n === 19) renderConnections(lastData); // Connections: pull fresh on each open
22832288
});
22842289

22852290
// Scan explainers: a styled "when to use / skip" tooltip on each on-demand scan
22862291
// button, shown on hover OR keyboard focus. Static copy lives in explainers.js.
22872292
function initScanTips() {
22882293
const tip = document.getElementById('scan-tip');
2289-
const nav = document.querySelector('.tab-nav');
2294+
const nav = document.getElementById('act-subnav');
22902295
if (!tip || !nav) return;
22912296

2292-
// Mark scan buttons that have an explainer with a subtle ⓘ.
2293-
nav.querySelectorAll('.tab-btn[data-tab]').forEach(btn => {
2294-
if (explainerFor(btn.dataset.tab) && !btn.querySelector('.tip-i')) {
2295-
const i = document.createElement('span');
2296-
i.className = 'tip-i';
2297-
i.textContent = 'ⓘ';
2298-
btn.appendChild(i);
2299-
}
2300-
});
2297+
// ⓘ markers are added per-render in renderSubNav() so freshly-rendered
2298+
// subnav buttons get one; the listeners below delegate from the persistent
2299+
// #act-subnav element, so they survive each subnav re-render.
23012300

23022301
const showFor = (btn) => {
23032302
const e = explainerFor(btn.dataset.tab);

0 commit comments

Comments
 (0)