feat: a demo is never ugly (audit integration) - #814
Conversation
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. Important Review skippedToo many files! This PR contains 538 files, which is 238 over the limit of 300. To get a review, reduce the PR to 300 files or fewer by splitting it into smaller PRs or changing its base branch. Usage-priced reviews support at most 300 files. ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Advanced Run ID: ⛔ Files ignored due to path filters (91)
📒 Files selected for processing (538)
You can disable this status message by setting the ✨ Finishing Touches 💡 1🛠️ Fix failing CI checks 💡
📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
33a94d8 to
1b904b2
Compare
|
Rebuilt on the current main (4e00f0a) from the latest head of every PR, review fixes included: 45 commits. Local checks on Windows are green:
New conflicts resolved here:
🤖 Generated with Claude Code |
1b904b2 to
4e00f0a
Compare
d2dabce to
cbf85dc
Compare
|
Tested the integration on Windows and everything I exercised looked good overall, except for one export-state issue: with a 640×360 source, README GIF requests 852×480 when selected directly but 640×360 after Studio → README GIF because the hidden MP4 quality state still affects GIF sizing. |
…click's impact The recorded visibility now gates `plan_cursor` itself, which every backend and drawing path goes through: flat sprite, 3D model and its shadow, click rings, motion-blur trail. It no longer gates `cursor_alpha`, which also weights the click impact on the screen plane: a visible click whose pointer an app hides on the next tick (dragging a numeric field) snapped the tilted screen back from ~1.8 degrees in one frame. Clicks made while hidden are still dropped at load. The trail no longer samples a hidden phase: on the first frame after the pointer reappeared it drew up to 16 copies from where it had been hidden. `cursor.rs` is back to rustfmt-clean.
…indow The Windows and macOS samplers fold a release into the press sample when both land in one tick, so a quick tap has no mouse-up even in a take that records them. It stayed "pressed" until the next click, and any later hidden sample (typing, leaving the display) dropped it from the suggestions. A press ended by its mouse-up is judged over the whole press; one without is judged by the 150 ms grace, as PipeWire takes already were. A mouse-up sample's own visibility no longer counts: it is sampled after the release.
…erspective 81a0918 sizes the 3D cursor to its flat size at the zoom focus under a fixed angle, where the iso plane's containment shrink used to make it ~18% smaller. Its Windows render test was updated for that, but the Linux and macOS twins of every_modelled_state_keeps_its_art_footprint_and_shadow still required that shrink (tilted body < 0.9 of the flat one) and failed on all six states. Both CI jobs have been red since, and cargo stopped before the integration tests and the napi build. The change is intended (commit message, updated render test and the new a_fixed_angle_keeps_the_cursor_size_at_the_zoom_focus unit test), so the test changes, not the code. It now checks what the plane still does to the model: at the focus, it keeps its flat size (0.85 to 1.15 of the body); away from it, the plane's perspective makes it bigger on the near side than on the far side (x1.47 to x1.57 on lavapipe, x1.0 to x1.1 for a model left facing the camera). Checked on lavapipe against three mutations, each failing all six states: model posed front-on on the same tip, model rotation dropped, focus size compensation removed.
…rner A toast could only be waited out. That is fine for a confirmation and wrong for an error: the 3s timer retires a long description before it has been read, and a run of failures stacks over the editor with nothing to clear it. Sonner ships a close button, so the work is where it puts one. Its default is the START side — top-LEFT in a left-to-right UI — and half outside the box, hanging off the corner like a badge. Nothing else here closes there: every dialog, pane and inspector puts its cross inside the top end corner, and a dismiss control that moves with the surface is one the eye has to hunt for. Three things had to move together, which is why this is a stylesheet block rather than one prop: - the side, through sonner's own custom properties; - the overhang, by dropping its `translate(35%, -35%)`; - `top`, which sonner hardcodes to 0 instead of exposing as a variable, so it takes a rule on the element. Flipped per direction rather than hard-coded to `right`. `ar` ships today and the app does not set `dir` yet — this must not be the thing that breaks when it does. The leading `html` in each selector is load-bearing too: sonner injects its stylesheet at runtime, after ours, so an override of equal specificity would lose on source order. Inside the box, sonner's bordered opaque chip stops making sense — it reads as a second surface floating on the toast — so the button is a plain icon that only gains weight on hover, and the toast reserves `padding-inline-end` so a long title cannot run under it. The label comes from our own strings: sonner's default is an untranslated "Close toast", and the rest of the app speaks 13 languages. The tests pin what jsdom can actually see — the button exists, and it carries the localized label — plus the three custom properties the placement rests on, in sonner's stylesheet and ours. That last one is the real guard: on an upgrade that renames them the override silently stops applying, the cross goes back to the top left, and every other test stays green. Also drops an unused `fireEvent` import in RightPanes.i18n.test.tsx that was failing this branch's "Typecheck (tests)" job. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The override clears sonner's chip border with `border-color: transparent`, but only at rest. Sonner's dark hover rule, `[data-sonner-toaster][data-sonner-theme=dark] [data-sonner-toast] [data-close-button]:hover`, is (0,5,0), which beats the base override's (0,4,1), and it sets `border-color: var(--normal-border-hover)`. So the ring the override exists to remove came back under the pointer, around a cross that has no border at rest. The hover rule already outranks sonner at (0,5,1) and reset only the background; it now resets the border too. Checked in a browser against sonner's injected stylesheet: the hovered border was rgb(64 64 64) before, transparent after. A contract test pins the reset in both rules. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ction Background is a section of Composition with its Animation row and a blur amount; shadow and click bounce are named levels; settings are free rows; cursor size shows no number. The timeline wears the app's candy cards: the clip in the brand's green with its real waveform, zooms in blue. The generator lifts the levels and bounds from the app, as before.
ChoiceRow for fixed choices, named levels, free rows, no hint text under settings, candy timeline pills with the clip in green and zooms in blue. tokens/v4.css re-exports the app's tokens verbatim again.
The showcase's export panel shows the named destinations and Advanced, and the caption display language is a row of buttons. The docs name the 3D camera, the speed preset row, the cursor settings, the export destinations and the background animation and blur.
…de and auto zoom page The product demo guide still listed speed presets from 0.25x to 5x and a field up to 100x, and the auto zoom page still called the 3D camera a tilt. Both fixed in every locale.
The editor places automatic zooms on every fresh take (#664), and #822 brought back "Auto-zoom after recording" in Record mode to turn it off. The site still said nothing is added until you run Auto-enhance. - Auto zoom page: intro, the after-take bullet with where to turn it off, and Getting started step 4. - Auto zoom page: --auto-zoom zooms last two seconds, as in the editor (the CLI took the editor's path in 6cf4e73), not 1 s or 5%. - Demo guide step 4 and the Getting started step of the seven comparison and platform pages: the first take opens with its zooms placed, rather than asking the reader to run a menu that now finds no room. - All seven locales, with the app's own labels (English ones in German, per TRANSLATING.md).
Since the pages were translated (f4cc9f8), fourteen of them were a U+0001 control character after the narrow no-break space, so the French site showed no punctuation there. Twelve end a question, two were semicolons, as in the English.
…ff canvas Two defects in the tilted framed-screen trail (mode 18), reported on #814. The bilinear quad_inverse returned (0,0,0) for a pixel with no preimage, past the warp's fold. Mode 18 took it for a plane point and quad_forward sent it to the screen's top-left corner: far background took that corner's colour, masked marker included. The inverse now flags it (ok = -1, apart from ok = 0, solved but outside the quad, which frame and shadow trails need). Mode 18 skips the tap; mode 8's per-pixel trail keeps its sharp sample. Callers testing ok < 0.5 are unchanged. Off-canvas taps re-read raw footage. They now sample it like mode 8, with its depth-of-field mb and camera lamp, and the pyramid gets its own slot (t5, binding 6, texture(5)) since mode 18 keeps slot 2 for its isolated render. Mode 8 and flat trails render byte-identical. D3D11 and lavapipe: far-background leak 354,205 px -> 0; normal vs padded canvas edge diff 89 -> 5. Metal mirrored, not compiled here.
AGENTS.md: the HUD's control row, the tray menu, the record-to-edit flow and Record mode as the v2 app has them, the grant for an installed build, and a pointer to running the pass on a CI artifact. Checklist: a section on getting, installing and launching each CI artifact, with where a packaged build logs. Checks rewritten where the v2 editor moved or dropped the control they named (top bar, transport, inspector, export dialog, clip and crop dialog, captions, autosave), and new checks for Record mode, automatic zooms after a take, the macOS permissions window and Apple's picker. The results log is untouched.
build.yml has built both macOS architectures on every run since the flag was lifted; the note still told readers the path is only exercised locally.
The macOS section still sent users to System Settings to grant Screen Recording and Accessibility by hand, and warned that macOS 15+ re-asks. - First launch opens the permissions window; it reopens from the menu bar icon (Permissions…). - macOS 15.2+: Apple's picker needs no Screen Recording; system audio asks for System Audio Recording Only. - macOS 13 to 15.1: own picker, Screen Recording covers system audio; the periodic alert is stated for 15.0 and 15.1 only. - Requirements: microphone needs macOS 15, recommended 15.2. - Same update in the 7 translations.
A take's first zoom was clamped to 0 s, so the video opened already zoomed in: 62% of 146 real takes did. The click on the HUD's Stop button zoomed the last second onto a button the video never shows: 47% ended that way. No automatic zoom now starts moving in before 2.5 s into the edit, or is still zooming out in its last second, and a click in the recording's last second is ignored. A zoom those bounds push off its own moment is dropped. The bounds belong to the edit: a cut may still land on a zoom.
…lick The pointer usually rests on the HUD's Stop button before the click. That still run is a dwell, and when another clip follows the take, the edit's own ending does not reach it, so it zoomed onto a button the video never shows. A dwell whose run holds an ignored click now goes with it.
One zoom per event made the camera come and go every 6 to 8 seconds: 7.6 zooms a minute on real demos, a fifth of them straight back in after zooming out, and pans at full zoom toward a point off screen. Zooms are now planned from clicks only, like Screen Studio, Cap and Tella: a still pointer says little about where the viewer looks. Clicks close in time that fit in one zoom share it; a zoom is in half a second before its first click and holds 1.5 s after its last; its depth, 1.25x to 1.8x, is the deepest that keeps its clicks in view. Two zooms keep at least 1.5 s of wide shot between them, or merge, or the lighter one goes, over the whole timeline and against the zooms already on it. Replayed on the 11 real demos over a minute: 7.6 -> 2.1 zooms a minute, no yo-yo, no blind pan, and the same 84% of clicks seen zoomed.
…ocale The auto-zoom page described the old pause detector: pauses of half a second to 2.6 seconds, two-second zooms at 1.8x, and no click data needed. It now describes the shot planner, and the CLI, timeline and demo-guide docs, the comparison and alternative pages and llms.txt say the zooms follow the recorded clicks. Same change in all seven translations.
Review of #873: the comparison tables and two intros still said zooms come from the recorded cursor, against the updated text on the same page. The demo guide now says clicks share a zoom only when they fit in it together, and that a zoom too close to one already placed also blocks a new one. The auto-zoom page says a zoom shifts or drops near the end of a clip. Same change in all seven translations.
…the frame The corner radius followed the camera's eased position, which covers 90% of the way in the first third of the lead-in: the corners were square for most of the growth and only rounded again at the very end of the return. The PiP bubble (corners and shadow) now runs on the linear phase of the transition: it holds through the first half of the lead-in and comes back in the first half of the lead-out.
The section that kept German docs on English interface labels waited for a release with the German interface. Releases ship it now, so German follows the same rule as every other locale.
Pages still sent Mac users to System Settings for Screen Recording and Accessibility before the first take. v2 opens a permissions window on first launch, and from macOS 15.2 the source is picked in Apple's system picker, with no Screen Recording grant. - Getting-started steps, the Mac page and the download footnote point at the permissions window. - Mac page: system audio asks for its own permission from 15.2, and Screen Recording covers it before that. - Quick start, Recording and the demo guide name Apple's picker on 15.2+; the Accessibility prompt is now the permissions window. - Same update in the 7 translations. German sections touched here use the app's German labels, which also carries over Recording's pending Share → Select and Rec → Record renames. - cli.md unchanged: `record` still enumerates sources, so it needs Screen Recording.
19eb252 to
e8b51be
Compare
Summary
Every change from the "a demo is never ugly" audit, gathered in one branch so they can be tested together and land on main as a whole. Each audit PR is merged into this branch in dependency order. From now on, review and functional testing happen here.
Merged PRs, in order: #766, #792, #793, #795, #796, #797, #798, #800, #799, #801, #802, #803, #804, #805, #806, #807, #808, #809, #810, #811, #812.
What it covers:
🤖 Generated with Claude Code