docs: deploy-pages SHA fix, v1.2 screenshots, redesigned carousel + lightbox#13
Merged
Merged
Conversation
…ightbox
Three threads bundled into one PR because they all surfaced together
when the docs deployment failed and the homepage screenshot tour was
audited end-to-end.
CI:
.github/workflows/docs.yml pinned actions/deploy-pages to a SHA that
never existed in the action's history (typo: d6db90af... vs the real
v4.0.5 SHA d6db90164...). Docs deployment failed with "Unable to
resolve action ... unable to find version <sha>" on every push to
main. Fix is one character class in the SHA.
Screenshots:
scripts/screenshots/screenshots.mjs now seeds audit_payloads
alongside audit_events for the 20 most-recent events so the v1.2
drawer / compare / livetail / jsonb captures have meaningful
Request, Response, and Notifications content. The seeded
request_params include user.id and tenant fields that mirror a
realistic gateway-injected payload, plus credential-bearing headers
stored as [redacted] (matching the v1.2 auth.RedactHeaders
contract). Four new captures land per theme: audit-drawer,
audit-compare, audit-livetail, audit-jsonb. The eight existing
captures re-render with the richer payload data. Total 24 PNGs.
Makefile screenshots target now sources .env.dev for MCPTEST_DEV_KEY
so the script's API key matches the running binary's accepted file
key (was hardcoded "devkey-please-change", causing every captured
page to bounce to /login). New scripts/screenshots/README.md
documents the workflow including a regenerate-and-preview path.
Carousel + lightbox:
Slides ~30% smaller (min(40vw, 580px) vs min(56vw, 832px)) so
neighbor cards are always peeking in. Side-rail navigation buttons
flank the active slide instead of hiding in the header. Counter
under the stage shows the current/total. Click any slide to open a
near-full-screen lightbox with the same screenshot at object-fit:
contain over a deep-midnight backdrop with copper haze. ESC closes,
arrow keys step through inside the lightbox, backdrop click
dismisses, role=dialog + aria-modal + focus trap on the close
button + body-scroll lock. Reduced-motion media gates every
introduced transition.
Toolbar at the top of the lightbox is a flat ~3.5rem strip:
PORTAL eyebrow + tool name on one baseline, count + prev + next +
close on the right. Element-qualified selectors
(h3.plex-lightbox__title, span.plex-lightbox__eyebrow) tie with
Material's .md-typeset h3 specificity (0,1,1) and win on source
order, so Material's 1.6em h3 margin doesn't bloat the bar.
shots.js: subtle bug fixed in initial focus management
(closeBtns[0] was the backdrop div, not the close button; now
uses lightbox.querySelector("button[data-shots-close]") for the
focus target). Hide-after-fade timer cleanup moved into open() so
any reopen path cancels a pending hide rather than only the
per-frame click handler.
Docs prose:
docs/operations/inspection.md gets four inline screenshot embeds
(drawer in §2, compare in §4, jsonb in §5, livetail in §6) using
mkdocs-material's #only-light / #only-dark URL fragments for
theme-aware switching. mkdocs.yml nav adds inspection.md between
Audit Log and Portal in the Operations section. portal.md adds an
Audit inspection section linking to the inspection workflow.
Pre-commit gate: 1 review round, 1 BLOCKER (em-dashes throughout new
prose violated the project's no-em-dash hard rule). All ~22
em-dashes replaced with periods, semicolons, colons, or parens
before commit. Two MAJORs (Makefile error message, shots.js
_hideTimer race in non-frame-click reopen path) and four MINORs
(reduced-motion gate on slide transitions, body-scroll-lock edge
case with Material drawer, fragile selector strings, comment
accuracy) addressed in-tree.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three threads bundled because they all surfaced together when the v1.2 docs deployment failed and the homepage screenshot tour got audited end-to-end.
Summary
Fixes the docs deployment.
actions/deploy-pageswas pinned to a SHA that never existed in the action's history (d6db90af...); the realv4.0.5SHA isd6db90164.... Single-character-class diff in.github/workflows/docs.yml. Every push tomainsince the v1.2.0 release has been failing the Deploy Documentation workflow withUnable to resolve action ... unable to find version <sha>.Refreshed every existing screenshot, added 8 new ones for v1.2 features. Drawer (4 tabs), comparison page, live tail, JSONB filters. The screenshot script now seeds
audit_payloadsrows alongsideaudit_eventsso the new captures have meaningful content (real-looking request_params withuser.id+tenant, response_result viacallToolResultToMap,[redacted]headers matching the v1.2 redaction contract, progress notifications for the chatty tools).Redesigned the homepage carousel + added a lightbox. Slides ~30% smaller so neighbor cards are always peeking in. Side-rail navigation flanks the active slide instead of hiding in the header. Click any slide to open a near-full-screen lightbox over a deep-midnight backdrop with copper haze. ESC closes; arrow keys step through; backdrop-click dismisses.
role=dialog+aria-modal+ focus trap + body-scroll lock. Reduced-motion gates every introduced transition.Closes the broken docs CI; lays in the visuals the v1.2.0 release notes already promised.
Files
.github/workflows/docs.ymlscripts/screenshots/screenshots.mjs(+213),scripts/screenshots/README.md(new),Makefile(dev-secrets prereq + .env.dev sourcing formake screenshots)audit-compare,audit-drawer,audit-jsonb,audit-livetail× light + dark), 16 re-rendereddocs/overrides/home.html(+118),docs/javascripts/shots.js(+187),docs/stylesheets/extra.css(+503)docs/operations/inspection.md(4 inline embeds),docs/operations/portal.md(Audit inspection section),mkdocs.yml(nav adds inspection.md between Audit Log and Portal)Total: 32 files, +1052 / −107.
CI fix detail
actions/deploy-pages@d6db90af4856ee69a657050a5670eb98513188bawas a typo. The other three pinned actions on the workflow (actions/checkout,actions/setup-python,actions/upload-pages-artifact) all resolved cleanly. Verified via the GitHub API:The SHAs share the prefix
d6db90then diverge; looks like a hand-edited or copy-paste transcription error.Screenshot script changes
scripts/screenshots/screenshots.mjs:seed()now writesaudit_payloadsrows for the 20 most-recent events. Realistic shape:request_paramsincludesuser: {id, tenant}andrequest_id;response_resultis a JSON-shaped CallToolResult;request_headersshowsAuthorization: [redacted]/Cookie: [redacted]matching the v1.2 production redaction policy. Progress / chatty tools get notification arrays so the Notifications tab renders.DRAWER_TARGET_ID,COMPARE_A_ID,COMPARE_B_IDfrom the seeded data so the deep-link captures (/portal/audit?id=…,/portal/audit/compare?a=…&b=…) hit real rows.PAGESentries:audit-drawer,audit-compare,audit-livetail,audit-jsonb. Each has aprepfunction that drives the UI into the right state (open drawer via deep-link, toggle Live tail, expand the JSONB filter editor and add aparam.user.id=alicefilter that actually returns matches).pathcan now be a function so deep-link captures can read seed-time state.Makefile:make screenshotsnow declaresdev-secretsas a prereq and sources.env.devsoMCPTEST_DEV_KEYmatches the running binary's accepted file API key. Previous flow hardcodedSHOTS_API_KEY=devkey-please-change, which made every captured page bounce to/loginbecausemake devgenerates a random per-session key.SHOTS_API_KEY=…override still wins (e.g. for staging).scripts/screenshots/README.md(new): regenerate-and-preview workflow, the slug → screen mapping, and troubleshooting forPostgres connection failed, drawer-empty, and timeout cases.Carousel + lightbox detail
docs/overrides/home.html:auto | minmax(0, 1fr) | auto, with the rail buttons in the side columns. Old header arrows removed.<button>(not just a div) carryingdata-zoom-{title,body,light,dark,slug}so the lightbox JS can populate without re-fetching.01 / 11(tabular-nums DM Sans, copper accent on the current value).docs/stylesheets/extra.css:min(40vw, 580px)desktop,min(72vw, 480px)mobile (wasmin(56vw, 832px)/min(66vw, 704px)— 30% reduction). Inactive slides go toopacity: 0.5; transform: scale(0.96)so the active slide reads as the focal point without cards-fight-for-attention disorder.92vw × 90vhshell,object-fit: contain, deep-midnight backdrop with copper radial haze, samecubic-bezier(0.22, 1, 0.36, 1)easing as the carousel translate (one motion vocabulary).h3.plex-lightbox__titleandspan.plex-lightbox__eyebrowuse element-qualified selectors so they tie with Material's.md-typeset h3(specificity 0,1,1) and win on source order. Otherwise Material'smargin: 1.6em 0 0.8embloats the toolbar to ~25% of the viewport. Header is now ~3.5rem tall (7% of viewport on a 900px-tall window).@media (prefers-reduced-motion: reduce)gates every introduced transition: track, slide, rail, zoomhint, frame img, lightbox shell.docs/javascripts/shots.js:bindLightbox()handles open/close/prev/next, keyboard (ESC + arrow keys, captured on window so the modal owns dismissal), focus management (savesdocument.activeElementon open, focuses the close button, restores on close), and a clear-pending-hide-timer guard inopen()so re-opens during the 260ms close-fade don't yank the modal back to hidden.closeBtns[0]which selected the backdrop<div>(not focusable) instead of the close button. Now useslightbox.querySelector("button[data-shots-close]").Verification
make verify✓ (Go side untouched; all suites green).mkdocs build --strict✓ (zero warnings, no broken refs, inspection.md now in the nav).pnpm tsc --noEmit + pnpm build✓ (UI side untouched; sanity).make docs-serveconfirmed: side-rail nav advances slides, counter updates, click opens lightbox with correct content from data attributes, prev/next inside lightbox walks through, ESC + backdrop click dismiss cleanly, focus moves to close button on open and returns on close, body-scroll lock applies/releases.Pre-commit gate
One review round; one BLOCKER caught (em-dashes throughout new prose violated the project's no-em-dash hard rule), 2 MAJORs (Makefile error message, shots.js
_hideTimerrace in non-frame-click reopen path), 4 MINORs (reduced-motion gate on slide transitions, comment accuracy, README count clarification, fragile selectors). All addressed in-tree. Verdict CLEAN before commit.Test plan
make dev→make screenshotsregenerates all 24 PNGs without errors.make docs-serve, scroll to the carousel.