Files
gpui-native-kit/docs/CHECKLIST.md
T
2026-11-07 19:30:04 +07:00

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

  • Menu platform chrome — overlay border gate; paddings, separators, and the row min-height through Theme::spacing and the stated menu row height.
  • Popover platform chrome — overlay border gate; the anchor gap through Theme::spacing.
  • Dialog platform chrome — overlay border gate.
  • Toast platform chrome — overlay border gate.
  • Tooltip platform chrome — overlay border gate.
  • 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 append with 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, KDE kdeglobals font=), per-source border + focus chrome (Theme::borders), and a per-platform spacing unit (Theme::spacing); overlay borders engage in dark mode, where the elevation shadow barely reads and floating layers separate by border instead. 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 with dense_padding_x instead of padding_x
  • Button loading state — .loading(true) shows the spinner in place of the icon and suppresses activation; Spinner gained a .color override 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 via Theme::borders.focus_ring; the shared focus_ring band 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
  • 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 list and uniform_list, platform autohide with a visibility override
  • 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-cmark blocks 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's list

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 — PanelDrag payload, 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
  • Component browser — the shell with the catalog in its sidebar, every element a dock panel