Use this checklist once per milestone so timeline comparisons stay meaningful. Run a profile or release build, not debug.
- Open DevTools → Performance and start recording.
- Modal: open any screen that uses
showAppDialog; stop recording; note frame build/raster time around the transition. - Connections tree: expand/collapse a folder and a DB branch; note jank spikes.
- Heavy scroll: PostgreSQL/MySQL table view or Mongo documents list with many rows; scroll quickly for 2–3 seconds.
Save a screenshot or export the timeline when filing regressions. After UI changes, repeat the same steps and compare peak frame times and rebuild counts (Widget rebuild stats in DevTools).
To verify that the motion system conforms to the budget and does not cause jank at higher refresh rates:
- Vsync & Frame Budget: Confirm your monitor refresh rate.
- 60 Hz budget: 16.6 ms per frame
- 90 Hz budget: 11.1 ms per frame
- 120 Hz budget: 8.3 ms per frame
- 144 Hz budget: 6.9 ms per frame
- Hz Verification: Run the app with
--dart-define=QUERYA_REFRESH_OVERLAY=truein a debug/profile build. The floating overlay must show the correct target Hz.- Linux: overlay is query-only (
RefreshRate.enableis a no-op). Confirm the compositor/monitor is actually driving that Hz (Wayland/X11 settings); Querya cannot unlock a higher rate.
- Linux: overlay is query-only (
- Animation Smoothness (DevTools):
- Record the timeline in the Performance tab while triggering animations (dialog fade-in, tree expand/collapse, tab cross-fading, dropdown show).
- Ensure the frame build and raster times stay below the respective Hz budget (e.g., < 8.3 ms on a 120 Hz monitor).
- Reduced Motion:
- Turn on "Reduce Motion" in your OS settings or select Preferences → Appearance → Motion → Off (or Reduced for 50% speed).
- Verify that transitions complete instantly (0 ms for Off) or are appropriately shortened.
Repeat on a 120 Hz display (budget ≤ 8.3 ms build+raster). Prefer profile/release.
- Empty ↔ connected: open a connection from the empty hero, then disconnect back to empty —
QueryaSwitchingBodymorph; editor/workspace state should not remount-jank. - Tab strip: switch Server / SQL / History quickly — sliding pill should redirect without brick-wall jumps.
- Hero quick-start ↔ recent: with and without recent connections — FadeSlide + stagger first paint only.
- Results modes: idle → run (spinner) → grid; force an error — mode keys morph; scrolling the grid must not fade rows.
- Dialog / dropdown: open/close
showAppDialogand aQueryaDropdown— enter fade-slide, exit uses exit curve; Motion Off snaps. - Theme cross-fade: Preferences → enable Animate theme + Motion Full; switch dark/light — shadcn +
AnimatedQueryaThemelerp. Repeat with Motion Off (snap). Cost note: theme morph rebuilds app-wide InheritedTheme dependents every tick — keep Animate theme off by default (ThemeController); only enable for demos/profile. Never ship it default-on without a 120 Hz timeline. - Split settle: drag the connections sidebar handle and the SQL/results vertical split with a fling — mid-drag stays 1:1; release may soft-settle. Focus the handle — ring uses motion tokens (not mid-drag animation).