Repository navigation
Overlay chrome for the 1.0.0 card: run label, More menu, status row - #23
Merged
Merged
Conversation
Harrys76
force-pushed
the
wp28/overlay-chrome
branch
from
October 23, 2026 18:11
9fccb8e to
a7dded6
Compare
This was referenced Oct 23, 2026
Harrys76
force-pushed
the
wp28/overlay-chrome
branch
from
October 23, 2026 19:22
a7dded6 to
af9ac70
Compare
The header shows a run label ("Debug · VM", "Profile · no VM") in place
of the VM+, FRAME and DBG badges, and steps down by measuring its text:
without the "Sleuth" name, then the mode only, then the dot, which is
filled with the VM and a ring without it.
A More button replaces the theme button. Its panel inside the card holds
Startup, Rebuild stats, Hidden issues, Encyclopedia, Guide, Copy snapshot
and the Auto/Light/Dark theme segments, with values read once when it
opens. Back and Escape close a page, then the menu, then the card; a tap
on the scrim or the app closes it; the app and the card body are hidden
from screen readers while it is open. Keyboard focus moves to the first
row that can act and returns to More; the controls that take keyboard
focus draw an outline in keyboard mode.
The footer, the startup and rebuild stats banners, the confidence caption
and the frame-rate detail row are gone. The severity chips lead the
status row, with the frame rate at its end, and "Showing X of Y" follows
the severity filter only. The card is at least 320 px wide (less on
narrow screens), its background is opaque, and a new cardDivider token
draws the line under the status row.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…view Real scans cleared the seeded issues during the run, and the 800 x 600 surface left the list too little room to expand three cards. The benchmark now runs with no scan, on a 390 x 844 view, and reveals each card before tapping it. On this harness the previous card built 5 issue cards per title change and the new one builds 6, because the smaller chrome leaves the list room for one more row; the budgets are recorded from the new card. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The overlay sits above the app's WidgetsApp, so the default shortcuts for Tab, Shift+Tab, Enter and Space never reached it: focus moved into the More menu but could not move on or activate a row. The card's key handler now moves focus and invokes ActivateIntent while focus is in the card or its pages, leaves the keys to a WidgetsApp when one hosts the card, and leaves Enter and Space to a focused text field. The header's measured fit was cached by width, scale and run state only, so a theme change through Sleuth.updateTheme that grew the label font kept the old step and could overflow. The cache key now includes the theme, the text scaler and the inherited text style. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With a severity off, a scan that adds or removes that severity's last issue flips the "Showing X of Y" row while the shown cards stay the same. The list switched between standing alone and sitting in a Column under the row, so it was rebuilt from scratch: the scroll offset and each card's state were lost. The list now always sits in the Column, keyed, and only the row is inserted or removed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he shown width The overlay recorded the app's focused node only at the first menu opening, so after a tap on another app field closed the menu, reopening it kept the old node and closing the dashboard focused that one. Each opening now records the app node focused at that moment; with focus already in the overlay, the earlier node stays. A width stored by an older release (220 px) shows at the 320 px minimum but stayed 220 until the next commit, so the first Wider step or drag computed from 220 and changed nothing. A resize now starts from the stored width clamped to the current minimum and maximum. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From an iPhone walk of the 1.0.0 overlay: - Both visible severity chips could be turned off. OK has no chip without OK cards but stayed in the filter, so the list emptied while every chip read off. Turning a chip off is now refused when it would leave no card. Effects that surface once their cause's severity is off count as cards. - The frame rate's Semantics was not a container, so its label landed on the overlay's full-screen node and a screen reader read a screen-sized "60 frames per second". It is now its own node. - Rebuild stats read "No counts yet" in runs that never count rebuilds per route: debug runs, and profile runs without enableDeepDebugInstrumentation. It reads "Off" there (SleuthController.countsRouteRebuilds). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Harrys76
force-pushed
the
wp28/overlay-chrome
branch
from
October 26, 2026 16:45
af9ac70 to
15ca6a5
Compare
The theme switch moved from the header to the More menu, where it reads Auto, Light and Dark, but the library doc, Sleuth.updateTheme, SleuthThemeMode, OverlayUiState.themeMode and SleuthThemeData.brightness still described a header toggle. The library's feature list also promised a live FPS chart the overlay does not draw; it shows the frame rate. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.
Third PR of the 1.0.0 overlay stack, on top of #22. It changes the card's chrome: the header, the More menu, the status row and the card width. The issue cards themselves change in the next PR. No detection rule changes.
What changes
Run label. The header shows "Debug · VM" or "Profile · no VM" in place of the VM+, FRAME and DBG badges. It steps down by measuring its text with the chrome-clamped text scaler: without the "Sleuth" name, then the mode only, then the dot only. The dot is filled with the VM and a ring without it, so the state does not rest on colour. A screen reader hears "Debug run, no VM link" at every size.
More menu. A More button replaces the theme button. It opens a panel inside the card over a scrim, because the overlay sits outside the app's
Navigator. The rows, in order:Empty rows read "Not measured yet" and "No counts yet" and are disabled. Values are read once on open, and the panel is built only while it is open.
Closing, focus and semantics.
SleuthOverlayblocks the app's semantics and the card body sits inExcludeSemantics.checkboxActiveoutline while the keyboard drives focus (SleuthFocusInkWell). On iOS the selected theme segment carries the selected flag, asRawRadiodoes.WidgetsApp, so its default shortcuts never reached the overlay. The card's key handler, which already handled Escape, now moves focus and invokesActivateIntentwhile focus is in the card. It leaves the keys to aWidgetsAppwhen one hosts the card, and leaves Enter and Space to a focused text field.Removed from the front: the footer, the startup banner, the rebuild stats banner, the confidence caption and the frame-rate detail row.
Status row. The severity chips lead it ("2 critical", a filled icon while on, an outlined one and a
textQuaternaryoutline while off), with the frame rate at the end. The row keeps one line and its chips scroll sideways when they do not fit. "Showing X of Y" appears only under a severity filter, as a live region, with Show all; Show all and Reset move screen reader focus to the first chip. Hidden cards are counted in the menu.Width and grip. The card is at least 320 px wide, capped at the safe-area width less 16 px margins. Stored widths below that are raised at layout and on commit. Narrower is not offered at the minimum, nor Wider at the maximum. A maximized card draws only the grip's dots, under
IgnorePointer, and the list ends with 48 px of padding.Theme.
cardBackgroundis opaque in every preset and infromColorScheme. NewcardDividertoken: dark0xFF4B5563, light0xFFB4BAC4,borderin the high-contrast presets,outlineVariantfrom a scheme. Badge tokens the overlay no longer reads are documented as kept for custom themes.Copy snapshot failure offers Try again.
Denylist.
TweenAnimationBuilder(no longer used by the overlay) leaves the framework section, so an app's own uses count. A new audit test fails if the framework section grows past its 52 entries.Different from the plan
InkWells rather thanGestureDetectors, so they take keyboard focus like the other rows.InkWell's own focus fill comes fromThemeData.fallback()above the app'sMaterialAppand measures 1.04:1 on the dark card. Only the controls that take keyboard focus draw it: header buttons other than More and the chips are touch targets without focus, as before.Verification
fvm flutter analyze: 0 issues. Format check clean.fvm dart doc --dry-run: 0 warnings.fvm flutter test --exclude-tags benchmark: 4,865 passed.--tags benchmark --concurrency=1): 44 passed.SleuthOverlayabove the app'sMaterialApp, Space left to an overlay text field, the outline in keyboard mode only;cardDividerratios.Review
Codex reviewed the branch four times.
WidgetsApp. The tests that hosted the card in aMaterialApphid it. The new tests drive the keys throughSleuthOverlay.Sleuth.updateThemekept the old step and could overflow.Not in this PR
Fixes from the iPhone walk
Semanticswas not a container, so its label landed on the overlay's full-screen node and VoiceOver read a screen-sized "60 frames per second". It is now its own node.enableDeepDebugInstrumentation, the row said "No counts yet" forever. It reads "Off" there (SleuthController.countsRouteRebuilds).Doc comments (doc audit follow-up)
The theme switch moved from the header to the More menu (Auto, Light, Dark), but the public API docs still described a header toggle: the library doc,
Sleuth.updateTheme,SleuthThemeMode,OverlayUiState.themeModeandSleuthThemeData.brightness, plus three comments inSleuthControllerand one inSleuthOverlay. They now name Theme in the More menu. The library's feature list also promised a live FPS chart the overlay does not draw; it now says the frame rate.🤖 Generated with Claude Code