Trimmed the tooltips, gathered every explainer into one file, and reworked the Inspect cards - #35
Open
CodyCBakerPhD wants to merge 54 commits into
Open
Trimmed the tooltips, gathered every explainer into one file, and reworked the Inspect cards#35CodyCBakerPhD wants to merge 54 commits into
CodyCBakerPhD wants to merge 54 commits into
Conversation
Every ⓘ popover and hover title is cut back to what it has to say, hardest on Compare Quality, where the segments, cache and best-square explainers ran to three or four paragraphs each. A size factor now reads "original 2.4× larger" or "encoded 1.3× larger" rather than "2.4× reduction", so which way it points is on the readout instead of being left to the reader. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
|
CodyCBakerPhD
marked this pull request as ready for review
August 29, 2026 16:20
The teaching copy was spread across the tab that happened to show it: the container preamble sat in the container knowledge base, the Reencode tab's three teach boxes and the Full Analysis intro were written inline, and the atom-map hints and chart captions lived with their renderers. All of it now lives in lib/explainers, sectioned by where it appears, so the whole of what the app teaches can be read and edited in one place. What stays with its renderer is the text that is not teaching: labels, status and error lines, and the per-codec, per-container and per-tag knowledge-base records. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The last edit left CONTAINER_PREAMBLE's third line without its closing quote, which took the whole build down, and OVERALL_BITRATE_INFO's formula reading "× 8 ÷, where duration is in seconds". Both repaired, wording left as written. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…ses in The copy file now runs tab by tab left to right and card by card down each page, so an entry is found by remembering where it is read rather than by grepping. Copy shown on two tabs sits where it first appears. The knowledge bases' prose came with it: the container records, the codec descriptions, the metadata tag seeds and the encoder-signature hints. What is left in lib/codecKb, lib/containerKb and lib/metadataTagKb is the lookup and the parsing that reads those tables, and ContainerInfo moves to lib/types so the copy and the lookup do not import each other. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…he overview Faststart is a statement about where moov sits relative to mdat, so the badge and its explainer now sit on the MP4 Box / Atom Structure card, above the map that draws that order, rather than in the file overview. This File's Container is gone as a card of its own: its explainer reads in the Video Container Overview, whose grid drops the Type row the explainer's first words already say. The Full Analysis document follows the same layout. The MIME Type readout gains an ⓘ for its codecs parameter, with the shapes H.264, HEVC, AV1, VP9 and the audio codecs take. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…ne row The heading reads "Video Container Overview: MP4", the way the absorbed card's did, so the container is still named when the educational text that also names it is switched off. The card's four figures now share one row: the three short ones take the width they need and the MIME type takes what is left, instead of wrapping onto a line of its own. Below 820px it falls back to the auto-filled columns, with the MIME type spanning the row it lands on. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…aching is on The cards read measurement first: the overview's grid, the bitrate figures and their plot, the atom map, and this file's GOP lengths now come before the prose about them rather than after two paragraphs of it. The MIME type's explainer is a teach box under those figures rather than an ⓘ, being a worked example and a list of codec-string shapes — more than a tooltip should hold — and its readout keeps the row it shares with the other three. Educational mode reads in a wider column, since that is the mode carrying the teaching text: capped so the fixed corner watermarks keep their margins, and below the width that allowance needs they give way to the column instead, the trade the page already makes on a narrower screen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The entry described the codec-string list the explainer carried before it was rewritten as a definition of the media type. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…s apart A teach box can carry its own emoji instead of the 💡 every one of them showed: 🎥 for what this file's container is, 🎨 for chroma subsampling, 🚀 for faststart, 🗺️ for the atom map, 🔑 for the GOP, 📦 for container-vs-codec, and so on down the tabs. A card of stacked boxes now has something to tell them apart by at a glance; anything unmarked keeps the 💡 that ties back to the Educational switch. The MIME type reads from an ⓘ again, now that its explainer is a sentence, and the overview's four figures sit 36px apart rather than crowding into one run. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
A card's readings were plain text under plain labels, which read as a paragraph rather than as the figures pulled out of the file. Each value now sits on a rounded tint — the accent one for the headline figures, the sunken one for the monospaced strings — hugging the value rather than running the column's width, and pulled back 8px so it still lines up with the label above it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…ss zoom The Video Track card explained chroma subsampling by naming yuv420p, which it had never read anywhere: true of nearly every delivery file, but an assumption, and an odd one beside a Color Space the same card reported as undeclared. lib/chromaFormat reads the format out of the container's codec configuration — avcC, hvcC, av1C, vpcC — and falls back to what the codec parameter string settles on its own (H.264 outside the High profiles is 4:2:0 by inference, AV1 states its profile, VP9's long form carries the field). The card reports it as a figure of its own, and the explainer teaches the idea without putting a format on a file that states none. The atom map's breadcrumb could also grow forever: a zoomed view still draws the ancestors of what was zoomed to, each spanning the whole of it, and clicking one pushed a crumb for the view already on screen — which is how a file with one video track offered an endless path of traks. A block that would not narrow the view is no longer a way further in. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The container records now write "None, this is an audio-only format."; the test asked for a lowercase "none", which is the copy's business rather than the knowledge base's. It matches either way now. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The readings sat as plain text on a tint. Each one is now a card in the shape the demo tiles use — recessed panel, soft border — which is a different treatment from the teach boxes' tinted, accent-edged callouts, so a figure and an explainer never read as the same kind of thing. A value that is really a string out of the file keeps its code inset inside that card. The MP4 record's "See the Atom Map for this file's layout" is a link now. containerExplainer takes the href, since the page anchors that map under the Inspect card's heading and the document under its own section title. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
It was reusing --field, which sits a hair off --sunken: against the card the value now lives in, the inset all but vanished in the dark theme while reading fine in the light one. It has its own token now — white where the card is pale, near-black where the card is dark — and a hairline border, so a codec string or a MIME type reads as code in both. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The legend always listed all five marks. A progressive file has no moof to explain, and at forty-odd boxes nothing is narrow enough to collapse into an "N boxes" run either, so two of the five rows described marks that were not on the map — which is exactly the pair a reader has no way to go looking for. It now reads off the rects, so it also follows a zoom into one family's subtree, and a fragmented recording still gets both rows since that is the file they were written for. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
"A box's color is the top-level box it belongs to; each row down is one level in" is gone, with the rule that styled it in the page and in the document. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
Both cards already list the parsed profile and level, and the chroma format read out of the codec configuration, as figures of their own; the teach boxes under them restated the same values. The boxes now explain only what the figures do not: what the format is, and what 4:2:0 asks of the file's dimensions, which stays wherever 4:2:0 is the format in play. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Its first paragraph repeated the container overview's description of the box tree, and its second repeated the readout under the map, which says what hovering and clicking do. The faststart explainer stays; the copy itself stays in explainers for the Full Analysis document, which has no map or readout of its own. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
…e Educational switch Each figure card now takes the width its own label and value need. The auto-filled 150px columns gave a "2.1" the same card as a codec string, and stretched the MIME type's card far past the code inset inside it. Inspect now reads overview, video track, atom map, GOP/keyframe, bitrate, audio: the keyframe structure follows the box order that decides it, and the audio track comes last, after everything about the video. The Full Analysis document is reordered to match. The Educational switch moves out of the first card on Inspect and Reencode and into the tab bar beside Full Analysis, where it reads as the one control for the whole app that it always was. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
It follows Compare Quality on the tab row, separated by the bar's own gap, and Full Analysis keeps the right edge to itself. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The switch sits beside the light/dark toggle: both are preferences for the whole app, so they read as a pair, and the tab row goes back to being navigation. On a narrow header it keeps its 🎓 and drops the word. On the GOP card, the histogram's caption goes (the heading names it and hovering a bar reports its own count), the seeking test's description is set as a teach box rather than bare body text in a size of its own, and its results are spaced off the Run button. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Its axes already name both quantities and hovering a point reports its timestamp, the same reasons the GOP histogram's caption went. The Full Analysis document keeps a caption, minus the hover clause, since a figure there has neither axes hover nor anything else to explain it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
A letter sits where its font puts it: the italic serif i leaned right of its advance box and hung its dot high, so it rode off-centre in the circle, and differently again wherever Georgia was not installed. Two shapes in a square viewBox are centred by construction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
A plural subject with a singular verb, and a space before a full stop. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
The frame-order shorthand said nothing the badge beside it did not, on the page and in the document alike. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The box order it named is what the explainer under it is for, and the map beside it draws. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The column widened only while the teaching text was on, so with it off a row of eight figure cards wrapped the last one onto a line of its own. The width is the page's now, which also retires the body class main.ts kept in step with the switch, and the narrow-screen block that traded the fixed watermarks for it covers everyone rather than duplicating the one below it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The page's column now takes the width the Educational switch used to grant it, so the point where the fixed corner marks give way to it is 1560px for everyone, not only while teaching was on. The smoke test read 1440 as wide enough to frame the page, which it no longer is; it reads a 1680 viewport instead, and the test for the narrow fallback reads 1440, the common laptop. The demos page and the sweep matrix keep their own allowance in step, since it is the same marks they are clearing. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
Plural subject to match the list it sits in, and a comma before the clause about what it bars. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The five com.apple.quicktime.* entries are not four-character atoms: they are reverse-DNS names an mdta handler declares in a keys atom, with the values in a parallel ilst. They sat in a table whose own comment said four characters each, so they are a table of their own now, with an origin of their own, loaded into the same lookup. The 0xA9 note went to six of the fourteen © atoms and not the rest, so whoever hovered ©wrt first never saw it; the teach box above the table says it once. The two Copyright atoms both read Copyright in the UI, which looked like a duplicate row: ©cpy names QuickTime's, and cprt says it is the form MP4 standardized. The rest of the table is grouped by subject. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Signed-off-by: Cody Baker <51133164+CodyCBakerPhD@users.noreply.github.com>
Both cards lead with a heading and a button that say what they do. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
A card reading Try It on a Sample, with the sample itself in a separate card below, read as two unrelated sections. The comparison is now that card's result, under a heading of the same rank as the ones already inside it; a host marked ab-inline is what tells the A/B panel it is nested rather than a card of its own, so Compare Quality keeps its standalone section. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The output was out.reencoded.mp4 whatever the source was, including the files being moved into a different container on the way. One helper names it now: video-reencoded.mp4 for an MP4 that comes back an MP4, and video-transcoded.mp4 for anything else, keeping the source's own base name where the file has one. The command shown on the page says the same as the file the page saves. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The ternary picking its rank took renderAbResult one step past the complexity ceiling; the decision is a function of the host, so it reads as one. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The whole-file encode counted its own percentage next to a bar showing it, then said Done. under a bar that was already full; it now ends the way a sample run does, with the bar filled in the colour for a good outcome. The note while a chosen square is re-encoded for the A/B window goes for the same reason. The teach box over that square's command goes too. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
A finished square's tooltip listed the change, the factor, the projected size and the time, all of which are on the square. It keeps only what the face cannot show — what pressing it will cost — and an aria-label carries the full reading for anyone who cannot see the face. The ⓘ on the best square, and the three on the estimate's figures, are gone with the copy behind them. Estimate Detail was six cards wrapping wherever the last one stopped fitting, leaving one alone on a second line. It breaks where it means something now: what was sampled and what that stretch came to, then what it projects the file to. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The command under them shows the flags, and what disabling B-frames buys is the GOP card's to explain. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The command under the form already carries -g, spelled out; the line restating how it was arrived at is the GOP card's ground. The kernel field disappeared at full resolution, so the tab read as missing a setting the sweep offers: it stays on show now, disabled until a resolution asks something of it. The preset explainer loses its closing recommendation. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
The default is the app's own; whose baseline it came from is not what the option needs to say. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
Reading a square back from an earlier run of the same file is how a sweep should behave; the tick that turned it off, and the paragraph explaining when to, are gone, along with the flag they set. The footer's Clear sweep cache button is still what forgets a file's measurements. The settings bar counted the axes and left the multiplication to the reader; it works it out now. The scaler explainer takes the wording from the tab. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014HCSc95n7mZd6YRTb6XSdS
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.
Every ⓘ popover and hover title is cut back to what it has to say, and copy that repeated a figure shown right beside it is gone entirely: the codec box no longer restates the profile and level, the chroma box no longer names the format, the atom map no longer re-explains the box tree, the two plots on the GOP card drop their captions, and a finished sweep square's tooltip no longer lists the change, the factor, the projected size and the time that are printed on its face. Progress notes stop narrating the bar beside them — no
Encoding… 45%, noDone.under a full bar.A size factor now reads
original 2.4× largerorencoded 1.3× largerinstead of2.4× reduction/1.3× inflation, so which file the factor belongs to is on the readout rather than left to the reader. Matrix squares widen by 24px to hold it.All of the app's teaching copy now lives in
src/lib/explainers.ts, ordered as the app reads: tab by tab left to right, card by card down each page, with copy shown on two tabs sitting where it first appears. The knowledge bases' prose came with it — the container records, codec descriptions, metadata tag seeds and encoder-signature hints — leavingcodecKb,containerKbandmetadataTagKbholding only the lookup and parsing that read those tables.ContainerInfomoves tolib/typesso the copy and the lookup do not import each other. The QuickTime tag table splits in two: the four-characterilstatoms, grouped by subject, and the reverse-DNS keys anmdtahandler declares, which are a table and an origin of their own;©cpyandcprtno longer both render as plain "Copyright".Inspect is reorganized. Each card leads with what it measured and reads its teaching text under that, and every figure sits on a tinted card as wide as its own label and value, with
<code>values inset on a background that holds up in either theme. The faststart badge and explainer move to the MP4 Box / Atom Structure card, above the map that draws the box order they report. This File's Container folds into Video Container Overview, which names the container in its heading, drops the Type row, and sets its four figures on one line with an explainer for the MIME type beneath them. The panel reads overview, video track, atom map, GOP/keyframe, bitrate, audio — the keyframe structure follows the box order that decides it, and the audio track comes last. The page takes a wider column whatever the Educational switch says, so a row of figures is not left wrapping one card onto a line of its own; the cap leaves the fixed corner watermarks their margins. The Full Analysis document follows the same layout and order.The Video Track card now reports the chroma format it read out of the file's codec configuration record (
avcC,hvcC,av1C,vpcC), falling back to what the codec parameter string settles on its own, and stays quiet where neither says — rather than namingyuv420pon every file, as the explainer used to.On the atom map, the container explainer's mention of the Atom Map links to that section, zooming stops at a box that already fills the view instead of taking click after click on the same range, and the legend keys only the box families it actually drew.
The two encoding tabs are tightened as well. A sample run's Side-by-Side comparison sits in the Try It on a Sample card that produced it. A saved encode is named for what it went through —
video-reencoded.mp4, orvideo-transcoded.mp4where the container changed — and the command says the same. The builder keeps its Scaler field on show at every resolution, inert until one resamples, and drops the GOP equation and the flag notes on its checkboxes. The sweep's settings bar works its axes out to a total (2 × 5 × 2 = 20), the Reuse earlier measurements tick is retired in favour of always reading back what an earlier run of the file measured, and Estimate Detail reads as two lines: what was sampled, then what it projects to.Two controls move. The Educational switch is one fixture in the header beside the light/dark toggle, a preference next to a preference, rather than one instance in the first card of Inspect and another in Reencode. And the ⓘ button's "i" is drawn rather than typed: a letter sits where its font puts it, so the italic serif one rode off-centre in its circle, differently again wherever Georgia is not installed.
Prompts