feat(studio): the Renders panel on the shared primitives - #3772
Draft
miguel-heygen wants to merge 1 commit into
Draft
feat(studio): the Renders panel on the shared primitives#3772miguel-heygen wants to merge 1 commit into
miguel-heygen wants to merge 1 commit into
Conversation
The four native selects become the shared Select, so no OS popup is left in the panel and the four controls read as the same control as everything around them. Disabled options survive the move: SelectOption gains a disabled flag, which is what keeps a resolution the composition cannot reach out of the keyboard's path while its label still explains why. Export drops its own type size. cn resolved that override by dropping the size recipe's step, which is what left the panel Export a type step below the header's; the computed-style table now reads 28px / 6px / 12px for both. Its two per-row siblings become IconButton with a Tooltip carrying what the title attribute used to say. The panel's colours move to the semantic tokens.
This was referenced Sep 8, 2026
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.
Lands unit U13 (Renders panel sweep) of the Studio design-system foundation. Stacked on the value-controls PR (#3626). Hex ratchet unchanged: the two touched files hold no colour literals; the raw palette classes removed here are the token gate's domain. Bundle +19.2 KiB gzipped (first consumer of Select), inside the 100 KB budget.
What
Unit U13 of the Studio design-system plan: the Renders panel sweep.
Select. No native<select>is left in the Renders tab.className. Both Exports now measure the same.IconButton, each wrapped in the sharedTooltipcarrying what thetitleattribute used to say.text-4,bg-input,border-border,danger,accent,text-step-*).SelectOptiongains an optionaldisabled, passed through to Base UI'sSelect.Item.Why
R8 asks for exactly one implementation of every control, and no native
<select>: a native popup is the operating system's, so its radius, surface and type belong to someone else and no token can reach them.AE3 asks that the header Export and the Renders Export share height, radius, fill and type size. They did not. The panel's Export carried its own type size in
className, andcnresolves that by dropping the size recipe's own step, so the two Exports sat a type step apart. The captured computed-style table, before and after:The
disabledflag onSelectOptionis not new behaviour, it is preserved behaviour. The Resolution list disables a preset that is not an exact integer upscale of the authored size, because the producer rejects that scale at render time. Without the flag the shared Select would have offered a choice that fails the render.How
Option lists become data (
FORMAT_OPTIONS,QUALITY_OPTIONS,FPS_OPTIONS, and the Resolution list built per render from the composition's dimensions), which is the shapeSelecttakes. EachonCommitkeeps the literal-union cast and the persistence side effect itsonChangehandler had. Frame rate crosses the string boundary explicitly:String(fps)in,Number(next)out.The quality option list also carried a
titlefield that nothing ever rendered; it is gone.Test plan
RenderQueue.test.tsx, all through the component's public render, driven with the pointer and key sequences a browser produces:w-full. Set equality, not "contains", so an extra class that displaces a recipe class fails. Proved non-vacuous by re-adding the type-size override: the assertion fails naming the dropped step.querySelector("select")returns null.isTypingTargetand by the playback-shortcut selector exactly as a native<select>is, and both are asserted true rather than merely equal."mov", the literal union member, not the"MOV (ProRes)"label. Read back through the real store, not a spy.landscape-4kpreset.disabledpass-through.Also run: the full Studio suite (440 files, 4841 tests, green, including the token gate and the hex ratchet),
typecheck, the Studio build,oxlint,oxfmt --check,fallow audit --base origin/main --fail-on-issues(exit 0), and the design-shots capture before and after against this branch's base.Bundle: the app's gzipped JS and CSS go from 1,573,539 to 1,593,184 bytes, +19,645 bytes (+19.2 KiB). This is the first consumer of
Selectin the shipped app, so it is where Base UI's select entry point lands. Nothing trimmed.Not covered
red-400,neutral-700,bg-red-500/10) are Tailwind palette classes, which the token gate governs, not the hex ratchet. The ratchet test fails on a fall as well as on a rise, and the suite is green, which is the evidence.<button>. It is an 80x45 media surface, not a control on the 24/28/32 grid, andIconButtonwould force it into a square.FormatInfoTooltipstays a local popover. Its content is a heading plus three descriptions, which the one-line sharedTooltipdoes not carry; the file already says so.FfmpegRequiredNotice.tsxis not in this unit's file list and is untouched. Its amber card still uses palette classes.