feat(landing): shoot the screenshots instead of describing them - #28
Merged
Conversation
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.
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.
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.tsxblows 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-2moves 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
shotSourcessizes 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…and2026-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/imagespath the frontend names, checks everysrcSetdescriptor 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-gridat 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}-clientpages serve this same MariaDB screenshot while their alt text says "connected to a {Engine} database".