Skip to content

Docs stills from the film kit, and retire the old captures that showed home paths - #393

Merged
MelbourneDeveloper merged 1 commit into
mainfrom
feature/doc-stills
Oct 18, 2026
Merged

MelbourneDeveloper merged 1 commit into
mainfrom
feature/doc-stills

Conversation

@MelbourneDeveloper

Copy link
Copy Markdown
Collaborator

TLDR

Every docs feature page and the launch post now show stills shot by the film kit. The 20 old captures, some showing a home directory, are deleted from the site.

Details

  • New stills (src/website/src/assets/screenshots/docs/*.webp, 18 files). films/doc-stills.mjs shoots them on demos/Shop.slnx in the same isolated editor as the films:
    • architecture: the log routed to both sidecars;
    • editors: the SharpLsp Command Palette;
    • configuration: sharplsp.toml;
    • completions: F# and C#;
    • hover: C# XML docs, beside the Processes view;
    • navigation and definition;
    • diagnostics: Roslyn and FCS;
    • refactoring: the F# missing-case fix and C# Generate method;
    • context menus, solution explorer, type members, code folding;
    • NuGet: browse, package details and installed.
  • Docs pages (en/ja/zh). All 10 feature pages swap their old PNG for the new still, rendered as <img> with width="2400" height="1500" and alt text that describes the frame in the page's language.
  • Launch post (en/ja/zh). All 12 figures use the new stills. Their alt text and the captions that no longer matched are rewritten:
    • Go to Definition now jumps to a declaration;
    • the Solution Explorer figure now shows type members;
    • the diagnostics figure now shows Roslyn and FCS errors.
  • Deleted. 20 unreferenced PNGs in src/website/src/assets/screenshots/. Eleventy still published them, and the hover capture's Profiler panel showed /Users/<name>/… paths and the old "Forge" name. Also deleted: docs/plans/SCREENSHOT-FIX-PLAN.md, now complete.
  • Kit.
    • film.mjs publishes a film's stills into screenshots/<stillsFolder> (default profiler), and a film with no clips publishes stills alone.
    • still(…, { hovering }) keeps a hover open.
    • window.dialogStyle: custom puts the save prompt in the workbench. reopen now answers it with "Don't Save" by role, and fails if an edited editor survives; before, a native prompt silently kept stale edits.
    • showLog and hidePanel move into kit/acts/language.mjs; configurationToml is exported for reuse.
  • Spec. [WEB-DESIGN-MEDIA] Capture now says no page shows a capture from any other source.

How Do The Automated Tests Prove It Works?

  • screenshots.spec.js › Docs stills, new: for each of the 10 pages in en, ja and zh, the page shows exactly one screenshots/docs/ still, the expected file, with width/height set, loaded at 2400px with real alt text (expectStills). For /blog/introducing-sharplsp/ in each language: twelve current stills, all loaded at full size with alt text, and no .png capture left.
  • expectStills moves from profiler-media.spec.js to the shared media.js, unchanged, so the profiler stills and the docs stills are checked by one helper.
  • npx playwright test locally: 703 passed, 11 skipped (by layout).
  • deslop .: 6.5% (threshold 6.65%).

…me paths

Every feature page's still and every figure in the launch post (en/ja/zh) is now
shot by films/doc-stills.mjs on the Shop demo, in the same isolated editor as
the films. The 20 old PNG captures, which showed another product's name and a
home directory in the Profiler panel, are deleted: no page used them, but the
site still served them.

- Each still is a 2400px WebP with width, height and alt text that describes
  the frame in the page's language; the launch post's captions now match their
  frames.
- The kit: a film may publish stills alone, into its own screenshots folder;
  a still can keep a hover open; workbench dialogs (window.dialogStyle custom)
  let reopen answer the save prompt, and it fails if an edited editor survives.
- SCREENSHOT-FIX-PLAN.md is complete (hover, diagnostics and definition are
  shown working, the pages are live) and is deleted.
@MelbourneDeveloper
MelbourneDeveloper enabled auto-merge (squash) October 18, 2026 13:51
@MelbourneDeveloper
MelbourneDeveloper merged commit fd96009 into main Oct 18, 2026
20 checks passed
@MelbourneDeveloper
MelbourneDeveloper deleted the feature/doc-stills branch October 18, 2026 13:56
MelbourneDeveloper added a commit that referenced this pull request Oct 19, 2026
## TLDR
Website films play in Windows Chrome and Edge again: every video lists
its H.264 MP4 before its VP9 WebM, and a new playback test proves frames
actually decode.

## Details
- **Root cause.** Windows Chrome/Edge accept the VP9 `<source>`, decode
one frame, then stop with `PIPELINE_ERROR_DECODE`, and never try the
next source. Every film listed WebM first, so every film failed there.
- **`src/_data/videos.json`**: all 18 films now list `["mp4", "webm"]`.
- **`video-figure.js`**: the VideoObject `contentUrl` points to the
first (preferred) encoding instead of the last, so search engines link
the MP4.
- **New `tests/video-playback.spec.js`**: plays 20 films across docs and
blog pages, then pauses, seeks to the middle and resumes. Each step
checks that the clock advances, frames decode
(`getVideoPlaybackQuality().totalVideoFrames`) and `video.error` stays
null. A served file and a resolved `play()` don't prove playback.
- **`tests/media.js`**: a new `expectFramesAdvance` helper, which also
catches decode errors raised after `play()` resolves.
- **`playwright.config.js`**: on Windows, the playback spec also runs on
installed Chrome and Edge, where the bug reproduced; bundled Chromium
and WebKit passed. The phone projects use installed Chrome there because
Windows WebKit rejects known-good H.264.
- **`docs/specs/DESIGN-SYSTEM.md` [WEB-DESIGN-MEDIA]** records the
MP4-first rule and the playback-test requirement.
- **Test expectations** in `profiler-media.spec.js` and
`site-videos.spec.js` now expect MP4 first.
- **Branch housekeeping.** This branch also merges the stale branches
`feature/narrated-doc-films`, `feature/doc-stills` and
`fix/382-netfx-review-findings` (all already squash-merged as #392, #393
and #385), plus `dependabot-upgrades`. None of them changes any file
against main:
- main already had every bump except TypeScript 7, which
typescript-eslint 8.72 does not support yet (peer range `<6.1.0`);
  - the `lspkit` pin stays on lspkit `main` (`ccc59bf`).

## How Do The Automated Tests Prove It Works?
- **`video-playback.spec.js`**: one test per film, named `<route> video
<n> decodes, pauses, seeks and resumes`. It runs on Chromium, iPhone SE
and iPhone 14 everywhere, and on Windows also on installed `chrome` and
`msedge`. Each film must:
- advance more than 1s and decode more than 5 new frames with `error ===
null`;
  - stay put while paused, so `currentTime` is unchanged after 250ms;
  - advance and decode again after seeking to `duration / 2`.
- **`site-videos.spec.js` › `expectDescribed`** asserts the VideoObject
`contentUrl` is the first listed source.
- **`profiler-media.spec.js`** asserts the hero film's `<source>` order
is MP4 then WebM.
- **The full website Playwright suite (`make _test-website`)** passes
locally, and Deslop reports 6.5% against the 6.65% threshold.

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant