Port · Parity: every page matches gpui 0.2.2's; the rules re-tested

Every page and scripted state was shot with gpui 0.2.2 and with the
port, light and dark, full width and at 280px, judged pair by pair by
agents with skeptics, and every page's log diffed. What differed is
fixed, each with a test that fails without it where the test platform
can show it:

- The gallery's harness takes posted mouse moves (gpui_macos listens
  to a tracking area), posts each drag move twice (it no longer
  replays a held drag), and waits three frames before each shot.
- Rolling digits: a block column, so taffy 0.13 lends the cell no
  baseline, and a line of whole device pixels, since gpui snaps each
  length on its own. DescriptionList's row aligns ends.
- Margins that taffy 0.13 collapses through a plain block: the
  drawer's pull and snap, the stagger and transition rise, the dialog
  and palette rises, the fullscreen dialog's slide.
- An Input keeps room to type in a squeezed row; the field rows drop
  w_full, whose reason was taffy 0.9's.

AGENTS.md's rules that named gpui 0.2.2 or taffy 0.9 were re-tested
against both sources and rewritten, and new ones say what the port
changed. TASKS.md's tags follow: what the new gpui makes possible is
prove. Captions, doc comments and README say what holds now.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-29 10:39:55 -04:00
1 parent 3189df013f
commit 3f1597fa28
44 files changed
+535 -138

No files matched your search

+3 -3
View File
@@ -17,7 +17,7 @@
- [x] Show / When — native `.when()` / `.when_some()`
- [x] For / Each — native `.children(iter)`
- [x] Fragment — native: children take iterators
- [x] VisuallyHidden — blocked: gpui 0.2.2 has no accessibility tree
- [ ] VisuallyHidden — prove: gpui builds an AccessKit tree on macOS, Windows and Linux, not the web, from elements with an id and a `role`; a box that draws nothing, with an `aria_label`, must reach the macOS tree with its label
- [x] FocusRing
- [x] FocusScope / FocusTrap
- [x] ClickOutside — native `on_mouse_down_out`
@@ -129,7 +129,7 @@
- [x] TrayIcon / TrayMenu — macOS `NSStatusItem`; other systems get an error
- [x] DockBadge — macOS dock tile; other systems get an error
- [x] JumpList — native `cx.set_dock_menu()`
- [x] SystemNotification — blocked: an unbundled app has no notification center; gpui 0.2.2 has no API
- [ ] SystemNotification — prove: on macOS `cx.show_system_notification` posts only from an app bundle; unbundled, as `cargo run` starts it, gpui logs and drops the call, so Ely must check the bundle identifier and fail loud. A bundled gallery must post one and hand its response to the owner through `on_system_notification_response`
- [x] MultiWindow Manager
- [x] WindowSwitcher
- [x] QuickLauncher → `navigation::QuickLauncher` (T07c): a SearchPalette in an always-on-top window
@@ -205,7 +205,7 @@
- [x] RadioCard
- [x] Switch / Toggle
- [x] Select
- [x] NativeSelect — blocked: gpui 0.2.2 has no native popup menu
- [x] NativeSelect — blocked: gpui has no native popup menu
- [x] Combobox
- [x] Autocomplete → `forms::Combobox::free`
- [x] MultiSelect
+2 -2
View File
@@ -27,7 +27,7 @@
## T11c Motion · Presence & order — `src/motion`
- [x] Transition — fade, slide, scale, collapse → `motion::Transition` fades, rises and slides; collapse is `layout::Collapsible`; scale is blocked: gpui 0.2.2 transforms only icons
- [x] Transition — fade, slide, scale, collapse → `motion::Transition` fades, rises and slides; collapse is `layout::Collapsible`; scale is blocked: gpui transforms only svgs
- [x] AnimatePresence → `motion::AnimatePresence`
- [x] Motion → gpui's `with_animation`, timed by `motion::duration` and eased by the curves in `motion`
- [x] Spring → `motion::spring`
@@ -46,7 +46,7 @@
- [x] Shake → `motion::Shake`
- [x] ParticleBackground → `motion::ParticleBackground`
- [x] AnimatedGradient — slow tonal drift → `motion::AnimatedGradient`
- [x] Lottie Player — blocked: gpui 0.2.2 paints paths without the clip masks, mattes, blend modes and radial gradients Lottie files lean on, so frames would come out wrong
- [x] Lottie Player — blocked: gpui paints paths without the clip masks, mattes, blend modes and radial gradients Lottie files lean on, so frames would come out wrong
## T12a Data Display · People & numbers — `src/data_display`
+8 -8
View File
@@ -225,12 +225,12 @@
- [x] DragGhost → DragPreview (native)
- [x] Sortable / SortableContext → `motion::Reorder`
- [x] Resizable
- [x] Rotatable — an svg: gpui 0.2.2 turns no other element
- [x] Rotatable — an svg: gpui turns no other element
- [x] Selectable / SelectionArea
- [x] RubberBandSelection → `interaction::SelectionArea`
- [x] LongPress → `primitives::Pressable`
- [x] DoubleClick — native `ClickEvent::click_count`
- [x] Gesture — prove: wheel zoom through `layout::Viewport`, two-finger swipe through `lists::SwipeableListItem`; pinch blocked, gpui 0.2.2 forwards no magnify event
- [ ] Gesture — prove: wheel zoom through `layout::Viewport`, two-finger swipe through `lists::SwipeableListItem`; pinch is not yet shown: gpui hands a trackpad magnify to `on_pinch` as a `PinchEvent`, and `layout::Viewport` must zoom about the pointer on one
- [x] PanZoom → `layout::Viewport`
## T38b Interaction · Keys, scroll and focus
@@ -269,7 +269,7 @@
- [x] IconThemeProvider → `primitives::IconTheme`, an owner's rules by name and extension over `file_icon`
- [x] Platform Style → `theme::Platform`, the theme's `platform`: the window buttons Ely draws, the title bar, key caps
- [x] VibrancyBackground / Acrylic → `shell::Vibrancy` in a window opened `WindowBackgroundAppearance::Blurred`
- [ ] Mica — blocked: gpui 0.2.2's one blur, `Blurred`, is acrylic on Windows
- [ ] Mica — prove: a window opened `WindowBackgroundAppearance::MicaBackdrop` or `MicaAltBackdrop` gets a DWM backdrop from Windows 11 build 22621, none on older builds, in silence, and plain transparency on macOS; `shell::Vibrancy` must show Mica through its `glass` on Windows 11, where the capture harness does not run
## T40a i18n — `src/i18n`
@@ -280,12 +280,12 @@
## T40b a11y — `src/i18n`
- [ ] LiveRegion / Announcer — blocked: gpui 0.2.2 has no accessibility tree; AppKit's announcement request needs none, but no process here is trusted to observe VoiceOver take it
- [ ] LiveRegion / Announcer — prove: gpui has no live setter, but `a11y_synthetic_children` hands over the element's own AccessKit node, which takes `set_live`; on macOS AccessKit then posts an announcement of the node's value when it appears and each time the value changes. A box with an id, a `role` and its words in `aria_value` must show each new value in the macOS tree. Neither that tree nor `Window::debug_a11y_tree_json` shows the live flag, and no process here is trusted to observe VoiceOver take the announcement
- [x] SkipLink → `i18n::SkipLink`: a Tab stop in flow that shows only while focused, raised over the page, and hands focus to its target
- [ ] AccessibleIcon — blocked: no accessibility tree
- [ ] AriaLabel helper — blocked: no accessibility tree
- [ ] AccessibleIcon — prove: an svg makes no node, so an `Icon` takes its name from a box around it with an id, `role(Role::Image)` and an `aria_label`; that box must reach the macOS tree with its name
- [ ] AriaLabel helper — prove: gpui's own `aria_label`, on an element with an id and a `role`; plain strings make no node, so a control's name goes on its box. A labeled button must reach the macOS tree with its name
- [x] KeyboardNavigationHelper → `interaction::RovingFocus`
- [ ] ScreenReaderOnly — blocked: no accessibility tree
- [ ] ScreenReaderOnly → VisuallyHidden (prove)
- [x] ColorBlindSafe Palette → `Theme::set_color_blind_safe`: chart hues fitted to stay apart under Machado's simulated protanopia, deuteranopia and tritanopia, each 3:1 on its page
## T41a Maps · View — `src/maps`
@@ -343,7 +343,7 @@
- [x] WebView — proven: `wry` 0.57 lays a child WKWebView over the window → `misc::WebView`, an address or the owner's HTML, following its box each frame and hidden out of view; it draws above gpui and ignores its clipping, and a press anywhere gpui draws, or the view leaving, hands the keyboard back. macOS only
- [x] IframeEmbed / EmbedCard → `misc::IframeEmbed`, a page in a frame of its own under its address, with Open in browser; EmbedCard is `chat::LinkPreviewCard`
- [x] HTMLPreview → `misc::WebView`
- [x] PrintButton — blocked: gpui 0.2.2 has no print API
- [x] PrintButton — blocked: gpui has no print API
- [x] ShareSheet → `buttons::ShareButton`
## T42g Misc · Export and import