Skip to main content

docs/gpui-compliance.md

# GPUI Compliance Matrix

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 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                                                                                                                                                                      |