Files
gpui-native-kit/docs/CHECKLIST.md
T
2026-11-07 20:25:14 +07:00

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

  • 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 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 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
  • Menu platform chrome — the popup border behind Theme::borders.overlays (and dark mode); the panel padding and separator margins come from Theme::spacing, and every action row renders at the stated menu_item_height with 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 rides anchored().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
  • 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