10 KiB
10 KiB
gpui-native-kit — checklist
The living queue. Every element lands through the review gate: API sketch →
implementation → tests → gallery panel → review. Conventions and rules live in
AGENTS.md; the gpui pin lives in the workspace Cargo.toml
(resolved in Cargo.lock, zed @ 504a7f2cf25b817cda3998cab93473adef15f93c).
signed
is the first downstream consumer; its screens drive the order.
Next
Queue — to follow
Platform metric adoption continues one component at a time; each stop goes through the review gate and a gallery pass.
- Alert platform chrome — overlay border gate.
- Combobox platform chrome — popup border behind
Theme::borders.overlays; the trigger follows the input stop's field treatment. - Command palette platform chrome — overlay border gate.
- Switch platform chrome — stated track and knob dims
(
switch_height/switch_width/switch_knob, inset and travel derived); borderless knob.
Gaps surfaced by the signed comparison; ordered by signed's usage.
- Virtual list — generic virtualized variable-height rows with a
scroll handle, promoted from the editor views' pattern over gpui's
list; signed's PR lists and commit diff drive it. - Editable code field — syntax-highlighted editable multiline field, the code view's highlighter over the input's editing model; signed's repo file browser.
- Dropdown menu — trigger button + popover + menu composite, three signed call sites; must stay a real component, not a wrapper.
- Motion easing helpers — cubic ease-out and lerp beside
theme::Motion; low priority, gpui's animation primitives cover most cases. - Markdown view follow-ups — streaming
appendwith a coalesced background parse, text selection with copy, per-block a11y roles, GFM alerts + table column alignment, per-fence highlight reuse,soft_break_as_hard_break; ranked notes in markdown-view-comparison.md. - Editor follow-ups — language detection by file path, meta line overlay, per-view config overrides (line height, gutter visibility).
- Pickers — Calendar / DatePicker, TimeField, ColorPicker (decide at unit time).
- Layout follow-ups — persistence, pane zoom, bottom dock, collapse-to-edge; each waits for a real consumer.
- Platform screenshot passes — a Linux run (Omarchy / KDE / GNOME) and the first Windows hardware build, side by side with macOS.
Landed
theme (crates/theme)
- Theme engine — resolve overlay chain, OKLCH accent ramps, presets,
per-platform elevation stacks,
titlebar_height, size table (Sizable) - Platform sources — macOS (NSColor), Windows 11 (UISettings), GNOME (portal), KDE (kdeglobals), Omarchy (colors.toml), neutral fallback; live watchers for each
- Platform metric fidelity — stated control/input/menu-row/switch
metrics and the full radius ladder per platform, Linux root fonts
(GNOME gsettings
font-name, KDEkdeglobals font=), per-source border + focus chrome (Theme::borders), and a per-platform spacing unit (Theme::spacing); overlay borders engage in dark mode, where floating layers separate by border instead of shadow — dark elevation shadows are dropped entirely, since they only muddied the dark scrim. Components adopt the tokens one by one (see Next and Queue)
icons (crates/icons)
IconRole+ bundled Lucide fallback, Segoe Fluent codepoints (Windows), freedesktop theme walker (Linux/Omarchy)
core (crates/core)
- Button platform chrome — every variant always paints the hairline
border, sized outside the stated control height (
BORDER_WIDTH); where the platform paints no border (Theme::borders.buttons, ghost) the border takes the fill's color and disappears, so sizes match across platforms; icon-bearing buttons pad withdense_padding_xinstead ofpadding_x - Button loading state —
.loading(true)shows the spinner in place of the icon and suppresses activation; Spinner gained a.coloroverride for accent-filled surfaces - Input platform chrome — the field always paints the hairline border,
sized outside the stated field height; where the platform paints no
border (
Theme::borders.fields) it takes the field's fill; focus recolors the border on Windows / KDE and paints the accent ring on macOS / GNOME viaTheme::borders.focus_ring; the sharedfocus_ringband paints at half ink (every focusable control picks it up) - Input prefix / suffix — elements docked inside the field's edges, typically small ghost buttons; a docked click activates the control without reaching the field's caret handler, and the text region shrinks to make room
- Select platform chrome — the trigger takes the input treatment: the
hairline border always painted, sized outside the stated field height
and taking the fill's color where the platform paints none; open
recolors the border on Windows / KDE and paints the accent ring on
macOS / GNOME, so the trigger matches a focused field; the menu
popup's border sits behind
Theme::borders.overlays, disappearing into the surface where the platform paints none - Menu platform chrome — the popup border behind
Theme::borders.overlays(and dark mode); the panel padding and separator margins come fromTheme::spacing, and every action row renders at the statedmenu_item_heightwith content centered, so the stated metric is the whole row; rows carry debug selectors for headless geometry tests - Popover platform chrome — the panel border behind
Theme::borders.overlays(and dark mode); the anchor gap is the spacing unit and ridesanchored().offset, not a margin, so the window-edge clamp stays intact; the panel carries a debug selector - Dialog platform chrome — the panel border behind
Theme::borders.overlays(and dark mode), taking the surface color where the platform paints none - Toast platform chrome — the pill border behind
Theme::borders.overlays(and dark mode), taking the surface color where the platform paints none; the pill rides the popover elevation, so dark mode's no-shadow rule applies to it too - Tooltip platform chrome — the panel border behind
Theme::borders.overlays(and dark mode), taking the surface color where the platform paints none, and riding the popover elevation for the light-mode shadow; anchored tooltips hang below the hovered parent (Tooltip::anchored(text, id)) so they never cover it — the element records its painted bounds withrecord_anchor_bounds(Buttondoes), the panel hangs below that with the spacing gap, and it flips above the parent when it would overflow the window bottom (the panel records its own height after the first frame); unanchored tooltips fall back to the cursor-offset wrapper - Button, Checkbox, Switch, Radio + RadioGroup, Toggle, Link, Slider, Progress, Avatar (image + seeded pixel-art fallback)
- Spinner — painted ring + rotating-icon variant, indeterminate and
determinate; replaces
Tab::busy's placeholder - Input — single-line, password with reveal, multiline, undo/redo, actions + key context, caret blink
- ScrollArea, Popover, Menu, Tooltip, Dialog / AlertDialog, Toast, Alert + alerts stack
- Select, Segmented, ContextMenu, EmptyState, Badge
- Field — label / description / error around any control, block and settings-row variants
- Status dot — colored state bead, Badge's variant vocabulary, optional screen-reader label
- Combobox — type-to-filter picker with a caller-owned matcher, create / keep / revert blur modes
- Command palette — filtered actions; the matcher stays caller-owned
- Scrollbar — overlay thumbs for gpui's
listanduniform_list, platform autohide with avisibilityoverride - Clipboard button — copies a value, confirms with a brief check mark that reverts itself
- Separator — horizontal and vertical hairline rules; menu separators stay menu-scoped
data (crates/data)
- List, Tree, Tabs (underline default + signed pill), Sidebar (scrolls internally)
editor (crates/editor)
- Code view — tree-sitter highlighted, virtualized rows with a gutter and the overlay scrollbar; per-language grammar features, roles map to the theme's semantic palette at render
- Code view interactions — active line, text selection with copy, incremental line re-highlight
- Diff view — unified rows via
similar, highlighted with the code view's palette; change washes from the ramps,scroll_to_first_change - Markdown view —
pulldown-cmarkblocks rendered as formatted text: headings, emphasis runs, ordered/task lists, quotes, fenced code highlighted with the code view's palette, tables, clickable links; virtualized variable-height rows over gpui'slist
layout (crates/layout)
- ResizeHandle
- Shell — left/right sidebar regions + center, application-owned
LayoutState - Window frame — client-side decorations under
Decorations::Client - Dock — pane tree, panel registry, tab context menus
- Drag-to-split —
PanelDragpayload, edge + center drop zones - Titlebar + window controls — app-owned window dragging, per-platform
buttons,
Theme::titlebar_height - Sidebar auto-open —
PanelDescriptor::right_sidebar+DockSidebar - Resizable group — stacked panes with drag dividers outside the dock, per-pane floors, double-click reset, keyboard steps
gallery (examples/gallery)
- Component browser — the shell with the catalog in its sidebar, every element a dock panel