GPUI Compliance Matrix

Copy Markdown View Source

Source of truth: Guppy's active native dependency is gpui = "0.2.2" from crates.io (native/guppy_nif/Cargo.toml). The local ../zed/crates/gpui checkout is reference-only for discovering upstream examples and API direction; do not treat newer local APIs as supported unless they exist in gpui = 0.2.2.

Statuses:

  • supported: Guppy has a comparable primitive and an example or automated coverage.
  • partial: Guppy can express the core scenario but is missing GPUI details.
  • unsupported: Guppy does not yet expose the needed primitive.
  • out of scope: Not planned for the current Elixir-owned IR subset.

Missing or deferred primitive areas

These are the main primitive gaps visible from the current GPUI matrix. They are not active work unless explicitly prioritized.

Intentionally narrow parity areas:

  • window_close_requested is an informational event, not a synchronous close-veto protocol
  • async image loading/error-state APIs
  • complete SVG/image asset pipeline controls
  • full GPUI window API parity
  • exact focus-visible styling edge-case parity
  • full native drag/drop payload and drop-target parity
  • GPUI test API parity
  • data-table/tree selected_* fields are semantic state only; Guppy does not apply default native selection highlights unless Elixir supplies explicit row/cell/item styles. Keyboard-focused virtual rows/cells/items do get native focus-visible borders.
  • full GPUI style-surface parity is in progress; data/gpui_style_catalog.json currently catalogs GPUI 0.2.2 padding, margin, gap, size/aspect ratio, position/inset, display, visibility, overflow visible/clip/hidden/scroll, scroll behavior booleans, debug/debug-below flags, cursor, border width/style, border radius, named/hex/linear-gradient/pattern background/text/border/text-background/text-decoration/strikethrough color, opacity, scrollbar width, named/arbitrary shadow, flex grow/shrink/alignment/self-alignment/basis, core text/font size/line-height/weight/family/fallbacks/features/decoration/strikethrough, line clamp, grid count/span/full-span/line-placement helpers, and image-only object-fit/grayscale options, with Guppy.Style.p/1/m/1/gap/1/w/1/aspect_ratio/1/top/1/overflow_x_clip/0/allow_concurrent_scroll/0/restrict_scroll_to_axis/0/debug/0/debug_below/0/cursor_pointer/0/border/1/rounded/1/bg_red/0/bg_hex/1/text_bg/1/text_bg_hex/1/decoration_red/0/decoration_wavy/0/strikethrough_red/0/bg_linear_gradient/1/bg_pattern_slash/1/box_shadow/1/opacity/1/scrollbar_width/1/line_clamp/1/col_start/1/col_span_full/0/flex_basis/1/basis/1/flex_grow/1/flex_shrink/1/self_stretch/0/text_size/1/line_height_length/1/font_weight_value/1/font_family/1/font_fallbacks/1/font_features/1/disable_ligatures/0/shadow_md/0/flex_col/0/font_bold/0/grid_cols/1/object_cover/0-style helpers and spacing/size/aspect/position/display/scroll-behavior/debug/border/color/background-pattern/opacity/scrollbar/named-arbitrary-shadow/flex/grow/shrink/alignment/text/font-size/line-height/weight/fallbacks/features/decoration/strikethrough/line-clamp/grid/image classes normalizing to canonical tuple IR or image options decoded by native render
GPUI sourceGuppy port/coverageStatusMissing primitives / gapsVerification
examples/hello_world.rsexamples/hello_world.exs, test/guppy_test.exs template checkssupportednone known for static text/window openautomated IR/template tests; manual example smoke
examples/scrollable.rsexamples/kanban_todo.exs, examples/super_demo.exs; native scroll testspartialGPUI parity for every scroll option not mapped; no default high-frequency coalescing planned from current measurementsRust scroll-axis unit test; GPUI render smoke retains explicit scroll handles; manual kanban smoke
examples/input.rsexamples/kanban_todo.exs, examples/super_demo.exs, examples/overlay_demo.exs; text input, textarea, radio, and select form-control testspartialtext input/textarea expose change/focus/blur/context-menu callbacks and explicit shortcut actions; select supports arrows, Home/End, single-character typeahead, Escape close, disabled-option skipping, and list positioning; rich editor behavior and exact focus-visible edge-case parity remain incompleteRust retained-state/text-input focus/context-menu/radio/select keyboard/focus-visible unit tests; ExUnit IR/template/native hidden-window coverage; manual example smoke
examples/drag_drop.rsexamples/kanban_todo.exs, examples/super_demo.exs drag/drop callbackspartialnative drag payload parity and drop target model are narrower than GPUI; no default event coalescing planned from current measurementsElixir server routing tests cover drag_start/drag_move/drop payloads; manual kanban smoke
examples/tab_stop.rstext input/button/checkbox/div tab_index and tab_stop IR fields; root Tab/Shift-Tab focus traversal bindingspartialGPUI tab grouping and edge-case parity remain narrowIR validation; Rust GPUI render smoke retains focus handles and simulates Tab ordering
examples/image/image.rsexamples/style_gallery.exs, examples/super_demo.exs, test/guppy_test.exs image template checkspartialcomplete async image loading states and asset pipeline parityautomated IR/template tests; Rust image source/object-fit mapping tests; manual gallery smoke
examples/svg/svg.rsexamples/style_gallery.exs, examples/super_demo.exs via icon/embedded image sourcespartialfull SVG rendering controls and sizing parityautomated IR/template checks for icon/image; Rust embedded image-source mapping test; manual smoke
examples/window_positioning.rswindow options validation in Guppy.Server tests; hidden native window smokepartialcomplete multi-display/window positioning behavior not covered in CI; display_id is matched only against active GPUI displays and unknown ids are ignoredautomated option validation; display-id mapping tests; hidden-window native smoke with bounds/min-size/kind/decorations/background
examples/active_state_bug.rsstyle states on button/checkbox/divpartialexact active state regression not portedIR validation only
examples/anchor.rsGuppy.IR.popover/4, <popover>, examples/super_demo.exs, examples/overlay_demo.exspartialcorner anchors, optional position/offset, local/window position mode, snap-fit controls, Escape/outside close, and nested-overlay rejection are exposed; center/edge anchors and hover-driven anchor demo parity remain missingExUnit IR/template/native hidden-window coverage; Rust popover keyboard/nested-overlay tests; manual super_demo/overlay_demo smoke
examples/animation.rsdiv-like opacity animation option; examples/super_demo.exspartialtransform/SVG rotation, chained keyframes, easing choices, and completion callbacks are not exposedIR/template/native hidden-window coverage; Rust opacity interpolation test; manual super_demo smoke
examples/data_table.rsGuppy.IR.data_table/3, <data_table />, examples/data_table_tree.exspartialfirst pass covers semantic columns/rows/cells, weighted column sizing, semantic-only selected row/cell state, sort/context-menu/column-reorder/column-resize events, pinned columns rendered before unpinned columns, keyboard-actionable sortable/reorderable/resizable headers/rows/cells/context menus, native focus-visible borders for keyboard-focused retained headers/rows/cells, arrow-key focus movement across headers/table body rows/cells including header Home/End and body Home/End, Alt-Left/Alt-Right and pointer Alt-drag column reorder callbacks, Shift-Left/Shift-Right and pointer-drag column resize callbacks, between sortable headers and their body column, and between rows and first cells, a pinned header outside the virtualized body list, and virtualized rows; default native selection highlights, editing, horizontal-scroll frozen columns, and stateful cell controls remain deferredExUnit IR/template/server-routing tests; Rust native decode/render/keyboard event tests; benchmark build/validation scenarios; manual data_table_tree smoke
examples/focus_visible.rsfocus_visible_style on div-like controls; Tab/Shift-Tab focus-visible state trackingpartialexact GPUI input-modality edge cases remain narrow; GPUI 0.2.2 has no public element accessibility role/label/state API, so Guppy does not expose placeholder accessibility IR fieldsIR/template/native hidden-window coverage; Rust simulated Tab/mouse focus-visible state coverage; docs/accessibility.md audit
examples/file_dialog.rsGuppy.open_file_dialog/0, Guppy.choose_directory_dialog/0, Guppy.save_file_dialog/0partialOpen/save/choose support cancellation, default directories/names, extension allow-list filters, and logical owner_view_id liveness/ownership; GPUI 0.2.2 does not expose sheet-style owner-window APIsExUnit server validation/routing/owner/filter tests; native deadline/liveness tests
examples/gif_viewer.rsimage nodepartialanimated GIF controls/loading statesmanual only
examples/gradient.rsexamples/style_gallery.exs; {:bg_linear_gradient, [angle: ..., from: ..., to: ...]} and bg-linear-gradient-[angle,color:stop,color:stop] style supportpartialfirst pass is background-only with exactly two stops; no multi-stop, radial, conic, border, text-gradient, or gradient animation supportExUnit IR/template/class validation; Rust ETF decode and style mapping tests; manual style_gallery smoke
examples/grid_layout.rsdisplay {:display, :grid}, catalog-backed grid_cols, grid_rows, col_span, row_span, full-span flags; examples/super_demo.exspartialstart/end line placement and exact visual parity remain narrowcatalog/style helper tests, IR/component/native hidden-window coverage; manual super_demo smoke
examples/image_gallery.rsimage node examples; catalog-backed object-*/grayscale image classespartialgallery layout primitives and loading statesimage option/class tests; Rust image object-fit mapping tests; manual only
examples/image_loading.rsimage node; catalog-backed object-*/grayscale image classespartialasync loading/error state parityimage option/class tests; Rust image object-fit mapping tests; manual only
examples/layer_shell.rsnoneout of scopeplatform shell/layer APIsnone
examples/list_example.rsGuppy.IR.list/2, <list />, Guppy.IR.uniform_list/2, <uniform_list />, examples/super_demo.exs, examples/list_row_controls.exspartialvariable-height GPUI ListState rows support static/layout text/spacer/nested static div row IR plus explicit row-local button/checkbox/radio; row click/context-menu callbacks are mouse and keyboard actionable with Up/Down/Home/End row roving focus and native focus-visible borders for keyboard-focused rows; text-editor/overlay row controls and custom scrollbar parity remain incompleteExUnit IR/template/native hidden-window coverage; Rust list-state/render helper, row-control key/pruning/event tests; manual super_demo and list_row_controls smoke
examples/mouse_pressure.rsmouse event callbackspartialpressure payload is not exposed; basic mouse down/up/move payloads are routedserver routing tests cover pointer events; pressure explicitly deferred
examples/move_entity_between_windows.rsnoneout of scopedirect GPUI entity migration conflicts with Elixir-owned IR/window ownership modelexplicitly out of scope for current architecture
examples/on_window_close_quit.rsGuppy.close_window/2; native app activation/deactivation and window focus/blur/move/resize/close eventspartialclose-request is intentionally informational today; no synchronous Elixir veto protocol; app hidden/unhidden lifecycle events remain deferred pending supported GPUI hooksREADME documents semantics; server route tests cover lifecycle routing; Rust GPUI tests cover activation and resize event bridge
examples/opacity.rsstyle token {:opacity, value}partialexact visual parity not smoke-testedIR/style validation
examples/ownership_post.rsGuppy.Server owner trackingpartialdirect GPUI entity ownership scenario not portedserver tests
examples/painting.rsGuppy.IR.canvas/2, <canvas />, examples/canvas_pattern.exspartialfirst pass covers data-only rect, rounded_rect, and pattern_rect commands painted through GPUI canvas/PaintQuad plus coarse canvas click/context-menu callbacks; arbitrary custom elements, paths, text/image drawing, retained canvas resources, and fine-grained hit testing remain deferredExUnit command-schema/template tests; Rust native decode/op-specific rejection/render-click/context-menu/stateless-retention/deadline tests; benchmark draw-command scenarios; manual canvas_pattern smoke
examples/paths_bench.rsnoneout of scopeGPUI internal path benchmark; path drawing is not part of the first canvas passnone
examples/pattern.rsGuppy.IR.canvas/2 :pattern_rect, examples/canvas_pattern.exspartialslash pattern painting is available inside canvas commands; general pattern background style ops and richer pattern controls remain deferredExUnit command validation; Rust native decode/render smoke; benchmark draw-command scenarios; manual canvas_pattern smoke
examples/popover.rsGuppy.IR.popover/4, <popover>, examples/super_demo.exs, examples/overlay_demo.exspartialclose-on-outside-click, Escape close, positioning controls, and deferred priority are exposed; nested native overlays are rejected/documented until a full overlay stack model existsExUnit IR/template/native hidden-window coverage; Rust popover keyboard/nested-overlay tests; manual super_demo/overlay_demo smoke
examples/set_menus.rsGuppy.set_menus/1, Guppy.set_dock_menu/1, Guppy.set_app_badge/1, examples/menu_demo.exspartialapp-level menu bar replacement, Dock callback menus, app/app-owned badge labels, and macOS Services system submenu specs are supported; desktop notifications, per-window validation callbacks, and undo/redo edit actions remain deferredExUnit server/app validation/routing/owner-clear/restart tests; Rust menu/dock-menu decode/action identity/GPUI mapping/system-menu/shortcut/callback tests; Rust badge deadline test; manual menu_demo smoke
examples/shadow.rscanonical {:shadow, value} styles and classes for none, 2xs, xs, sm, md, lg, xl, 2xlpartialvisual parity is not smoke-testedcatalog/style helper tests, IR/style validation, Rust native decode/render mapping
examples/testing.rsExUnit/Rust testspartialGPUI test API parity not exposedexisting test suites
examples/text.rstext node with style-token support; Guppy.IR.rich_text/2 / <rich_text /> runs; practical multiline input via textareapartialadvanced text layout controls and full editor parity incompleteIR/template/native hidden-window coverage; Rust rich text highlight range tests; textarea example/manual smoke
examples/text_layout.rstext style tokens and rich text runspartialadvanced layout measurement/wrapping parityIR/style validation and native text/rich-run decode/render coverage
examples/text_wrapper.rstext style tokenspartialwrapping measurement parityIR/style validation and native text style decode/render coverage
examples/tree.rsGuppy.IR.tree/2, <tree />, examples/data_table_tree.exspartialfirst pass covers semantic node ids, Elixir-owned expansion/selection/context-menu state, item row styles, disclosure rows, flattened visible-node virtualization, keyboard-actionable Up/Down/Home/End focus movement, Left/Right parent-child focus movement, native focus-visible borders for keyboard-focused rows, plus select/toggle/context-menu events, and mouse select/toggle/context-menu events; default native selection highlights and GPUI element-level accessibility parity remain deferredExUnit IR/template/server-routing tests; Rust native decode/flatten/render/keyboard event tests; benchmark build/validation scenarios; manual data_table_tree smoke
examples/uniform_list.rsGuppy.IR.uniform_list/2, <uniform_list />, Guppy.IR.list/2, <list />, examples/super_demo.exs, examples/list_row_controls.exspartialuniform_list remains text-row focused with keyboard-actionable item click/context-menu callbacks, Up/Down/Home/End focus movement, and native focus-visible borders for keyboard-focused items; list covers variable-height static/layout row IR plus keyboard-actionable row click/context-menu callbacks and explicit button/checkbox/radio row controlsExUnit IR/template/native hidden-window coverage; Rust list-state/render helper and row-control tests; manual super_demo/list_row_controls smoke
examples/window.rswindow optionspartialfull GPUI window API parityoption validation tests
examples/window_shadow.rswindow decorations/background optionspartialfull shadow/window-frame parityoption validation tests
tests/action_macros.rsactions / shortcuts IR fields and native shortcut matching testspartialRust macro parity is out of scope; shortcut behavior still narrowRust shortcut unit tests