← back to Ticket System
board: add ⤓/⤒ icon toggle to flip nav bar above/below toolbar
1ccfb2d0643c9d7e6eb650a09184d6c20a9fe221 · 2026-09-11 12:35:56 -0700 · Steve Abrams
The nav bar rides its own .topnav strip; the toggle button on that strip
switches its position (top ⇄ below the toolbar) via a .nav-below class on
the sticky wrapper (pure CSS flex order). Choice persists to tkNavPos and
is cleared by Reset. Verified with a headless click + reload test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QMDd11h9e9gLvFRu28oknU
Files touched
Diff
commit 1ccfb2d0643c9d7e6eb650a09184d6c20a9fe221
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Fri Sep 11 12:35:56 2026 -0700
board: add ⤓/⤒ icon toggle to flip nav bar above/below toolbar
The nav bar rides its own .topnav strip; the toggle button on that strip
switches its position (top ⇄ below the toolbar) via a .nav-below class on
the sticky wrapper (pure CSS flex order). Choice persists to tkNavPos and
is cleared by Reset. Verified with a headless click + reload test.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01QMDd11h9e9gLvFRu28oknU
---
board.html | 26 ++++++++++++++++++++------
1 file changed, 20 insertions(+), 6 deletions(-)
diff --git a/board.html b/board.html
index 605a796a..dde57d68 100644
--- a/board.html
+++ b/board.html
@@ -14,10 +14,14 @@
*{box-sizing:border-box}
body{margin:0;font:14px -apple-system,BlinkMacSystemFont,sans-serif;background:var(--bg);color:var(--ink)}
header{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line);background:var(--bg)}
- .stickytop{position:sticky;top:0;z-index:8;background:var(--bg)}
- /* ticket nav bar — full-width strip across the very top */
- .globalnav.topnav{width:100%;border:0;border-bottom:1px solid var(--line);border-radius:0;background:var(--bg);padding:8px 14px;gap:6px;overflow-x:auto}
- .globalnav.topnav button{padding:8px 14px;font-size:11px}
+ .stickytop{position:sticky;top:0;z-index:8;background:var(--bg);display:flex;flex-direction:column}
+ /* ticket nav bar — full-width strip across the very top; ⤓ Nav toggles it below the toolbar */
+ .topnav{display:flex;align-items:center;gap:10px;width:100%;padding:8px 14px;border-bottom:1px solid var(--line);background:var(--bg);overflow-x:auto}
+ .topnav .globalnav{border:0;background:transparent;padding:0;border-radius:0;gap:6px}
+ .topnav .globalnav button{padding:8px 14px;font-size:11px}
+ .navpos{margin-left:auto;flex:0 0 auto;border:1px solid var(--line);background:var(--card);color:var(--mut);padding:6px 10px;border-radius:8px;font:700 10px/1 ui-monospace,Menlo,monospace;letter-spacing:.06em;text-transform:uppercase;cursor:pointer}
+ .navpos:hover{color:var(--ink);border-color:var(--ink)}
+ .stickytop.nav-below .topnav{order:2}
h1{font-size:15px;margin:0;letter-spacing:.06em;white-space:nowrap}
.pill{display:inline-flex;align-items:center;gap:5px;font-size:11px;color:var(--mut);background:var(--card);border:1px solid var(--line);border-radius:20px;padding:3px 9px;cursor:pointer;user-select:none}
.pill b{color:var(--ink)} .pill.on{outline:1px solid var(--acc)}
@@ -111,7 +115,10 @@
@media(max-width:900px){.catalog-grid{grid-template-columns:repeat(2,minmax(180px,1fr))}.globalnav{order:10;width:100%}.kvrow{align-items:flex-start;flex-direction:column}.kvrow h3{width:auto;flex:auto}}
</style></head><body>
<div class="stickytop">
-<nav class="globalnav topnav" aria-label="Fleet viewer"><button data-section="all">All</button><button data-section="open">Open</button><button data-section="blocked">Blocked</button><button data-section="doing">Doing</button><button data-section="agents">Agents</button><button data-section="skills">Skills</button></nav>
+<div class="topnav">
+ <nav class="globalnav" aria-label="Fleet viewer"><button data-section="all">All</button><button data-section="open">Open</button><button data-section="blocked">Blocked</button><button data-section="doing">Doing</button><button data-section="agents">Agents</button><button data-section="skills">Skills</button></nav>
+ <button id="navPosBtn" class="navpos" title="Move nav bar below the toolbar" aria-label="Toggle nav bar position">⤓ Nav</button>
+</div>
<header>
<h1>FLEET TICKETS</h1>
<select class="gsel" id="view" title="Separate actionable work from recurring registries">
@@ -357,6 +364,13 @@ function initSectionTabs(){
initSectionTabs();
function setLayout(layout){LAYOUT=layout;save('tkLayout',LAYOUT);syncUrl();document.querySelectorAll('[data-layout]').forEach(b=>b.classList.toggle('on',b.dataset.layout===LAYOUT));if(SECTION==='agents'||SECTION==='skills')renderCatalog();else{const agent=window.NavAgent&&window.NavAgent.instances&&window.NavAgent.instances[0];if(agent&&agent.setView)agent.setView(LAYOUT==='kv'?'list':'grid');}}
document.querySelectorAll('[data-section]').forEach(b=>b.onclick=()=>setSection(b.dataset.section));document.querySelectorAll('[data-layout]').forEach(b=>b.onclick=()=>setLayout(b.dataset.layout));
+// nav-bar position toggle (top ⇄ below the toolbar), persisted like other view settings
+let NAVPOS=LS('tkNavPos','top');
+function setNavPos(pos){NAVPOS=(pos==='bottom'?'bottom':'top');save('tkNavPos',NAVPOS);
+ const st=document.querySelector('.stickytop'); if(st)st.classList.toggle('nav-below',NAVPOS==='bottom');
+ const b=document.getElementById('navPosBtn'); if(b){b.textContent=NAVPOS==='top'?'⤓ Nav':'⤒ Nav';b.title=NAVPOS==='top'?'Move nav bar below the toolbar':'Move nav bar above the toolbar';}}
+{const _npb=document.getElementById('navPosBtn'); if(_npb)_npb.onclick=()=>setNavPos(NAVPOS==='top'?'bottom':'top');}
+setNavPos(NAVPOS);
document.querySelectorAll('[data-section]').forEach(b=>b.classList.toggle('on',b.dataset.section===SECTION));document.querySelectorAll('[data-layout]').forEach(b=>b.classList.toggle('on',b.dataset.layout===LAYOUT));
// ── selection action bar ──
function syncBar(){const n=SEL.size;$('#seln').textContent=n;$('#actionbar').classList.toggle('show',n>0);}
@@ -428,7 +442,7 @@ $('#colsBtn').onclick=e=>toggleMenu('#colmenu',e.currentTarget);
$('#pillsBtn').onclick=e=>toggleMenu('#pillmenu',e.currentTarget);
$('#detBtn').onclick=e=>toggleMenu('#detmenu',e.currentTarget);
$('#dmBtn').onclick=()=>{DM_ON=DM_ON?0:1;save('tkDM',DM_ON);$('#dmBtn').classList.toggle('off',!DM_ON);dmPanel(LASTMSG);};
-$('#resetBtn').onclick=()=>{['tkCols','tkOrder','tkWid','tkDens','tkPills','tkDet','tkDM','tkGroup','tkView','tkSortKey','tkSortDir','tkTheme','tkSection','tkLayout','tkSectionOrder','tkCatalogSort','tkCatalogDir','tkCatalogCols','tkRunProfile','tkRunProfileDefaultV2'].forEach(k=>localStorage.removeItem(k));location.reload();};
+$('#resetBtn').onclick=()=>{['tkCols','tkOrder','tkWid','tkDens','tkPills','tkDet','tkDM','tkGroup','tkView','tkSortKey','tkSortDir','tkTheme','tkSection','tkLayout','tkSectionOrder','tkCatalogSort','tkCatalogDir','tkCatalogCols','tkRunProfile','tkRunProfileDefaultV2','tkNavPos'].forEach(k=>localStorage.removeItem(k));location.reload();};
document.addEventListener('click',e=>{if(!e.target.closest('#colmenu,#colsBtn'))$('#colmenu').classList.remove('show');if(!e.target.closest('#pillmenu,#pillsBtn'))$('#pillmenu').classList.remove('show');if(!e.target.closest('#detmenu,#detBtn'))$('#detmenu').classList.remove('show');});
function dmPanel(mm){
if(!DM_ON){$('#dmwrap').innerHTML='';return;}
← ae20b9e2 board: move ticket nav bar to a full-width strip across the
·
back to Ticket System
·
TK-11372: independent re-verification of the fix by a second 92526783 →