← back to Animals
auto-save: 2026-07-27T07:48:56 (1 files) — _nav5x.mjs
cc3bcfbf6f3102e40f138fe51279765b9ccb7dc1 · 2026-07-27 07:49:02 -0700 · Steve Abrams
Files touched
Diff
commit cc3bcfbf6f3102e40f138fe51279765b9ccb7dc1
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Mon Jul 27 07:49:02 2026 -0700
auto-save: 2026-07-27T07:48:56 (1 files) — _nav5x.mjs
---
_nav5x.mjs | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/_nav5x.mjs b/_nav5x.mjs
new file mode 100644
index 0000000..38c2ae1
--- /dev/null
+++ b/_nav5x.mjs
@@ -0,0 +1,42 @@
+import { chromium } from 'playwright';
+const URL='http://127.0.0.1:3333/approvals-slideshow';
+const errs=[], pageerrs=[];
+const b=await chromium.launch();
+const p=await b.newPage({viewport:{width:1280,height:1400}});
+p.on('console',m=>{if(m.type()==='error')errs.push(m.text());});
+p.on('pageerror',e=>pageerrs.push(String(e)));
+const R={};
+try{
+ await p.goto(URL,{waitUntil:'networkidle'});
+ R.sCount=await p.evaluate(()=>window.S?window.S.length:-1);
+ R.titleOK=/Gated Approvals/.test(await p.title());
+ // slide renders
+ R.slideHasContent=(await p.$eval('#slide',e=>e.innerText.trim().length)) > 0;
+ R.phaseBadge=await p.$eval('#badges',e=>e.innerText.trim()).catch(()=>'');
+ const c0=await p.$eval('#counter',e=>e.textContent);
+ // NAV: Next button (safe)
+ await p.click('nav button:has-text("Next")'); await p.waitForTimeout(150);
+ const c1=await p.$eval('#counter',e=>e.textContent);
+ R.nextAdvances=(c0!==c1);
+ // NAV: Prev button
+ await p.click('nav button:has-text("Prev")'); await p.waitForTimeout(150);
+ // NAV: keyboard right/left/g
+ await p.keyboard.press('ArrowRight'); await p.waitForTimeout(120);
+ const c2=await p.$eval('#counter',e=>e.textContent);
+ R.keyAdvances=(c2!==c1);
+ // GRID toggle via 'g'
+ await p.keyboard.press('g'); await p.waitForTimeout(400);
+ R.gridCards=await p.$$eval('.gcard',els=>els.length);
+ R.gridOn=await p.$eval('#grid',e=>e.classList.contains('on'));
+ // JUMP via clicking a grid card (safe nav)
+ await p.click('.gcard:nth-child(5)'); await p.waitForTimeout(300);
+ R.jumpClosedGrid=!(await p.$eval('#grid',e=>e.classList.contains('on')));
+ // ESC + Refresh button (safe)
+ await p.keyboard.press('g'); await p.waitForTimeout(200); await p.keyboard.press('Escape'); await p.waitForTimeout(150);
+ R.refreshBtnExists=await p.$('header button:has-text("Refresh")')?true:false;
+ // ASSERT the action bar exists but we NEVER click it
+ R.actionBarPresent=await p.$$eval('.actions button',els=>els.length);
+}catch(e){R.fatal=String(e.message||e);}
+await b.close();
+R.consoleErrors=errs; R.pageErrors=pageerrs;
+console.log(JSON.stringify(R,null,1));
← a7c20ed Pin autonomous Claude CLI invocation to Opus (--model opus)
·
back to Animals
·
auto-save: 2026-07-27T08:19:05 (1 files) — _nav5x.mjs 3a6991a →