@@ -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
22322244function 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.
22872292function 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