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_requestedis 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.jsoncurrently 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, withGuppy.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 source | Guppy port/coverage | Status | Missing primitives / gaps | Verification |
|---|---|---|---|---|
examples/hello_world.rs | examples/hello_world.exs, test/guppy_test.exs template checks | supported | none known for static text/window open | automated IR/template tests; manual example smoke |
examples/scrollable.rs | examples/kanban_todo.exs, examples/super_demo.exs; native scroll tests | partial | GPUI parity for every scroll option not mapped; no default high-frequency coalescing planned from current measurements | Rust scroll-axis unit test; GPUI render smoke retains explicit scroll handles; manual kanban smoke |
examples/input.rs | examples/kanban_todo.exs, examples/super_demo.exs, examples/overlay_demo.exs; text input, textarea, radio, and select form-control tests | partial | text 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 incomplete | Rust 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.rs | examples/kanban_todo.exs, examples/super_demo.exs drag/drop callbacks | partial | native drag payload parity and drop target model are narrower than GPUI; no default event coalescing planned from current measurements | Elixir server routing tests cover drag_start/drag_move/drop payloads; manual kanban smoke |
examples/tab_stop.rs | text input/button/checkbox/div tab_index and tab_stop IR fields; root Tab/Shift-Tab focus traversal bindings | partial | GPUI tab grouping and edge-case parity remain narrow | IR validation; Rust GPUI render smoke retains focus handles and simulates Tab ordering |
examples/image/image.rs | examples/style_gallery.exs, examples/super_demo.exs, test/guppy_test.exs image template checks | partial | complete async image loading states and asset pipeline parity | automated IR/template tests; Rust image source/object-fit mapping tests; manual gallery smoke |
examples/svg/svg.rs | examples/style_gallery.exs, examples/super_demo.exs via icon/embedded image sources | partial | full SVG rendering controls and sizing parity | automated IR/template checks for icon/image; Rust embedded image-source mapping test; manual smoke |
examples/window_positioning.rs | window options validation in Guppy.Server tests; hidden native window smoke | partial | complete multi-display/window positioning behavior not covered in CI; display_id is matched only against active GPUI displays and unknown ids are ignored | automated option validation; display-id mapping tests; hidden-window native smoke with bounds/min-size/kind/decorations/background |
examples/active_state_bug.rs | style states on button/checkbox/div | partial | exact active state regression not ported | IR validation only |
examples/anchor.rs | Guppy.IR.popover/4, <popover>, examples/super_demo.exs, examples/overlay_demo.exs | partial | corner 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 missing | ExUnit IR/template/native hidden-window coverage; Rust popover keyboard/nested-overlay tests; manual super_demo/overlay_demo smoke |
examples/animation.rs | div-like opacity animation option; examples/super_demo.exs | partial | transform/SVG rotation, chained keyframes, easing choices, and completion callbacks are not exposed | IR/template/native hidden-window coverage; Rust opacity interpolation test; manual super_demo smoke |
examples/data_table.rs | Guppy.IR.data_table/3, <data_table />, examples/data_table_tree.exs | partial | first 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 deferred | ExUnit IR/template/server-routing tests; Rust native decode/render/keyboard event tests; benchmark build/validation scenarios; manual data_table_tree smoke |
examples/focus_visible.rs | focus_visible_style on div-like controls; Tab/Shift-Tab focus-visible state tracking | partial | exact 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 fields | IR/template/native hidden-window coverage; Rust simulated Tab/mouse focus-visible state coverage; docs/accessibility.md audit |
examples/file_dialog.rs | Guppy.open_file_dialog/0, Guppy.choose_directory_dialog/0, Guppy.save_file_dialog/0 | partial | Open/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 APIs | ExUnit server validation/routing/owner/filter tests; native deadline/liveness tests |
examples/gif_viewer.rs | image node | partial | animated GIF controls/loading states | manual only |
examples/gradient.rs | examples/style_gallery.exs; {:bg_linear_gradient, [angle: ..., from: ..., to: ...]} and bg-linear-gradient-[angle,color:stop,color:stop] style support | partial | first pass is background-only with exactly two stops; no multi-stop, radial, conic, border, text-gradient, or gradient animation support | ExUnit IR/template/class validation; Rust ETF decode and style mapping tests; manual style_gallery smoke |
examples/grid_layout.rs | display {:display, :grid}, catalog-backed grid_cols, grid_rows, col_span, row_span, full-span flags; examples/super_demo.exs | partial | start/end line placement and exact visual parity remain narrow | catalog/style helper tests, IR/component/native hidden-window coverage; manual super_demo smoke |
examples/image_gallery.rs | image node examples; catalog-backed object-*/grayscale image classes | partial | gallery layout primitives and loading states | image option/class tests; Rust image object-fit mapping tests; manual only |
examples/image_loading.rs | image node; catalog-backed object-*/grayscale image classes | partial | async loading/error state parity | image option/class tests; Rust image object-fit mapping tests; manual only |
examples/layer_shell.rs | none | out of scope | platform shell/layer APIs | none |
examples/list_example.rs | Guppy.IR.list/2, <list />, Guppy.IR.uniform_list/2, <uniform_list />, examples/super_demo.exs, examples/list_row_controls.exs | partial | variable-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 incomplete | ExUnit 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.rs | mouse event callbacks | partial | pressure payload is not exposed; basic mouse down/up/move payloads are routed | server routing tests cover pointer events; pressure explicitly deferred |
examples/move_entity_between_windows.rs | none | out of scope | direct GPUI entity migration conflicts with Elixir-owned IR/window ownership model | explicitly out of scope for current architecture |
examples/on_window_close_quit.rs | Guppy.close_window/2; native app activation/deactivation and window focus/blur/move/resize/close events | partial | close-request is intentionally informational today; no synchronous Elixir veto protocol; app hidden/unhidden lifecycle events remain deferred pending supported GPUI hooks | README documents semantics; server route tests cover lifecycle routing; Rust GPUI tests cover activation and resize event bridge |
examples/opacity.rs | style token {:opacity, value} | partial | exact visual parity not smoke-tested | IR/style validation |
examples/ownership_post.rs | Guppy.Server owner tracking | partial | direct GPUI entity ownership scenario not ported | server tests |
examples/painting.rs | Guppy.IR.canvas/2, <canvas />, examples/canvas_pattern.exs | partial | first 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 deferred | ExUnit 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.rs | none | out of scope | GPUI internal path benchmark; path drawing is not part of the first canvas pass | none |
examples/pattern.rs | Guppy.IR.canvas/2 :pattern_rect, examples/canvas_pattern.exs | partial | slash pattern painting is available inside canvas commands; general pattern background style ops and richer pattern controls remain deferred | ExUnit command validation; Rust native decode/render smoke; benchmark draw-command scenarios; manual canvas_pattern smoke |
examples/popover.rs | Guppy.IR.popover/4, <popover>, examples/super_demo.exs, examples/overlay_demo.exs | partial | close-on-outside-click, Escape close, positioning controls, and deferred priority are exposed; nested native overlays are rejected/documented until a full overlay stack model exists | ExUnit IR/template/native hidden-window coverage; Rust popover keyboard/nested-overlay tests; manual super_demo/overlay_demo smoke |
examples/set_menus.rs | Guppy.set_menus/1, Guppy.set_dock_menu/1, Guppy.set_app_badge/1, examples/menu_demo.exs | partial | app-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 deferred | ExUnit 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.rs | canonical {:shadow, value} styles and classes for none, 2xs, xs, sm, md, lg, xl, 2xl | partial | visual parity is not smoke-tested | catalog/style helper tests, IR/style validation, Rust native decode/render mapping |
examples/testing.rs | ExUnit/Rust tests | partial | GPUI test API parity not exposed | existing test suites |
examples/text.rs | text node with style-token support; Guppy.IR.rich_text/2 / <rich_text /> runs; practical multiline input via textarea | partial | advanced text layout controls and full editor parity incomplete | IR/template/native hidden-window coverage; Rust rich text highlight range tests; textarea example/manual smoke |
examples/text_layout.rs | text style tokens and rich text runs | partial | advanced layout measurement/wrapping parity | IR/style validation and native text/rich-run decode/render coverage |
examples/text_wrapper.rs | text style tokens | partial | wrapping measurement parity | IR/style validation and native text style decode/render coverage |
examples/tree.rs | Guppy.IR.tree/2, <tree />, examples/data_table_tree.exs | partial | first 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 deferred | ExUnit 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.rs | Guppy.IR.uniform_list/2, <uniform_list />, Guppy.IR.list/2, <list />, examples/super_demo.exs, examples/list_row_controls.exs | partial | uniform_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 controls | ExUnit IR/template/native hidden-window coverage; Rust list-state/render helper and row-control tests; manual super_demo/list_row_controls smoke |
examples/window.rs | window options | partial | full GPUI window API parity | option validation tests |
examples/window_shadow.rs | window decorations/background options | partial | full shadow/window-frame parity | option validation tests |
tests/action_macros.rs | actions / shortcuts IR fields and native shortcut matching tests | partial | Rust macro parity is out of scope; shortcut behavior still narrow | Rust shortcut unit tests |