Skip to content

feat(landing): shoot the screenshots instead of describing them - #28

Merged
datlechin merged 2 commits into
mainfrom
fix/workbench-screenshot-framing
Aug 18, 2026
Merged

feat(landing): shoot the screenshots instead of describing them#28
datlechin merged 2 commits into
mainfrom
fix/workbench-screenshot-framing

Conversation

@datlechin

Copy link
Copy Markdown
Member

Two commits. The first fixes what the layout was doing to the screenshots; the second replaces the screenshots.

The AI Assistant row had no assistant in it

workbench.tsx blows every shot up to 145% and clips it, so only 1/1.45 of the image, 69%, is ever on the page. Which 69% survived was decided by row parity, which is a fact about the layout and not about the picture. The AI assistant's panel lives on the right of its shot, and the right 31% is exactly what row 03 threw away. The row was captioned "AI Assistant" above a screenshot of a plain editor and result grid.

Anchoring is a property of the shot now.

Row 02 was rendering a 2432px image into 384px of cell

order-2 moves the copy cell past the shot in placement order but leaves the track sizes alone, so a fixed [minmax(0,24rem)_1fr] handed every even row's screenshot the 24rem track and its prose the 1fr one. Nothing in that window was legible. The column template flips with the row now.

This one is a bug rather than a choice: the comment in shotSources sizes the whole WebP ladder against "1216 CSS px at most", which is the wide track.

The screenshots

They were captured by hand, and it showed. The hero left a third of its frame as empty grid; the data grid shot left about sixty percent, and spent what was left on a filter bar the copy beside it never mentions. Column values were cut to deliver… and 2026-04-…. One timestamp read .961939+07, which dated the file and named the timezone of whoever took it.

They come off a UI test target now (TableProApp/TablePro#2176), against seeded MariaDB and PostgreSQL. Sixty orders, enough to fill the grid to its last visible row. Totals that are the sum of their order items, so the numbers survive a reader adding them up. São Paulo, Friedrichstraße and Marszałkowska spelled properly, next to notes carrying four-byte emoji.

Two alt texts stop being wishes

Four of them described pictures that were never taken: a SQL query in a shot that is only a data grid, a pending-changes count in a toolbar showing a filter bar, a before-and-after diff in a panel showing a chat.

Two are now true rather than reworded. Row 01 says a multi-statement query with its result tabs below, and the shot is two statements and a Result 1 / Result 2 tab bar. Row 02 says edits queue in memory until you save, and the shot is a cell holding 249.00 that has not reached the database, with the save control live beside it.

New guard

tests/Feature/Landing/ImageAssetsTest.php, which none of this had. It resolves every /images path the frontend names, checks every srcSet descriptor against the file's real width, checks every ladder derivative against the width in its own filename, and checks that a light shot and its dark twin came out the same size. Each is mutation-tested, and each counts what it checked so none can pass by matching nothing.

Page weight

The files are bigger. The hero's 1280w variant goes from 79 KB to 105 KB, and data-grid at 2432w from 103 KB to 230 KB. That is what a grid with thirty-one rows of text costs against one that was mostly empty. I would rather report the number than quietly drop WebP quality, which smears text.

Still open

The AI assistant shot is unchanged. It needs a conversation with a real provider, which needs an API key this repository does not have and should not have.

Separately, and not touched here: all 26 /{engine}-client pages serve this same MariaDB screenshot while their alt text says "connected to a {Engine} database".

The workbench cell blows every shot up to 145% and clips it, so only
1/1.45 of the image is ever on the page. Which 69% survived was decided
by row parity, which is a fact about the layout and not about the
picture: the AI assistant's panel lives on the right of its shot, and
the right 31% is exactly what row 03 threw away. The row was captioned
"AI Assistant" above a screenshot of a plain editor and result grid.
Anchoring is now a property of the shot.

The even row's grid template flips too. `order-2` moves the copy cell
past the shot in placement order but leaves the track sizes alone, so a
fixed `[minmax(0,24rem)_1fr]` handed row 02's screenshot the 24rem
track. It rendered a 2432px image into 384px of cell — `shotSources`
sizes the whole ladder against 1216 — and nothing in that window was
legible.

Four alt texts described pictures that were never taken: a SQL query in
a shot that is only a data grid, a pending-changes count in a toolbar
that shows a filter bar, a before-and-after diff in a panel that shows
a chat. They now describe what is actually in frame. The screenshots
are being re-shot against a real harness; when they land, the copy
these alts used to borrow from becomes true and they can go back.

ImageAssetsTest is the guard none of this had. It resolves every
/images path the frontend names, checks every srcSet descriptor against
the file's real width, checks every ladder derivative against the width
in its own filename, and checks that a light shot and its dark twin
came out the same size. Each one is mutation-tested; each counts what
it checked, so none can pass by matching nothing.
Every shot on this page was captured by hand: no script, no seed data,
no record of the window size. It showed. The hero left a third of its
frame as empty grid. The data grid shot left about sixty percent, and
spent what was left on a filter bar the copy beside it never mentions.
Column values were cut to `deliver…` and `2026-04-…`. One timestamp
read `.961939+07`, which dated the file and named the timezone of
whoever took it.

They come off a UI test target now, in the app repository, against a
docker-compose'd MariaDB and PostgreSQL seeded from a generator that
takes no random draws and calls no clock. Sixty orders, enough to fill
the grid to its last visible row; totals that are the sum of their
order items, so the numbers survive a reader adding them up; strings
short enough to render whole; and São Paulo, Friedrichstraße and
Marszałkowska spelled properly, next to notes carrying four-byte
emoji, because a grid of plain ASCII proves nothing about text
handling.

Two alt texts stop being wishes. Row 01 says a multi-statement query
with its result tabs below, and the shot is now two statements and a
Result 1 / Result 2 tab bar. Row 02 says edits queue in memory until
you save, and the shot is now a cell holding 249.00 that has not
reached the database, with the save control live beside it.

The files are bigger: the hero's 1280w variant goes from 79 KB to 105
KB, and data-grid at 2432w from 103 KB to 230 KB. That is what a grid
with thirty-one rows of text in it costs against one that was mostly
empty.

The AI assistant shot is unchanged. It needs a conversation with a real
provider, which needs an API key this repository does not have and
should not have.
@datlechin
datlechin merged commit 48d9fd7 into main Aug 18, 2026
5 checks passed
@datlechin
datlechin deleted the fix/workbench-screenshot-framing branch August 18, 2026 05:43
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