artifacts: demo scrollbar death, figure natural sizing + fullscreen, downloads, invert toggles (release polish 7)

- demo iframe: scrolling=no (the bridge auto-sizes; a scrollable iframe
  trapped the wheel) + content-box so the bridge height is the viewport
- figures: svgNaturalWidth hug + center (w-fit max-w-full mx-auto),
  full-width fallback for viewBox-only svgs
- fullscreen: MermaidOverlay figure mode (raw svg, white stage, invert
  carried); openFigure context; figureFocus rides the mermaid Esc layer
- downloads: figure.svg + <slug>.html (raw pre-bridge), shared download.ts
- invert: manual ContrastIcon toggle on both cards — invert(1)
  hue-rotate(180deg) on the white-bearing element, default off, no
  detection, no theme wiring (owner rulings 2026-10-07)

1433 tests green; live smoke passed (hug/center measured, filters verified,
downloads fired, Esc closed; wheel-chaining structurally sound)
This commit is contained in:
amosblomqvist
2026-10-07 13:45:03 +03:00
parent a763b9fc5c
commit 4070cc7926
7 changed files with 289 additions and 28 deletions
+6 -1
View File
@@ -160,7 +160,12 @@ describe("mermaid expand — the context seam", () => {
// owner is chat.tsx — geometry covered by the tests above.
const opened: string[] = [];
const html = renderToStaticMarkup(
<SessionMermaidContext.Provider value={{ openMermaid: (chart) => void opened.push(chart) }}>
<SessionMermaidContext.Provider
value={{
openMermaid: (chart) => void opened.push(chart),
openFigure: () => {},
}}
>
<div />
</SessionMermaidContext.Provider>,
);