GPUI Kit v0.6.0
v0.6.0 is a major expansion of the project since v0.5.0. The project is now GPUI Kit: a layered toolkit for building desktop applications with GPUI. This release introduces an unstyled foundation crate, a single-dependency facade, a scriptable application runtime, a substantially expanded component set, richer text editing and rendering, motion, accessibility, and new developer tooling.
This release note focuses on user-visible additions, improvements, API changes, and deprecations. It intentionally omits fixes made while the new v0.6.0 features were being developed.
GPUI Kit and the new crate architecture
The repository and ecosystem are now named GPUI Kit, and the documentation has moved to gpui-kit.com. GPUI Component remains the styled component layer within the toolkit. (#2927)
The new architecture separates reusable behavior from presentation:
gpui-kitis the recommended facade for applications. It re-exports GPUI and the enabled Kit layers, providesapplication(),init(), and anactions!macro, and keeps matching GPUI dependencies together.gpui-baseprovides unstyled behavior, state, interaction, and infrastructure primitives. It includes text editing and rich text, selection, dock layout, virtual lists, dialogs, popovers, controls, motion, history, and navigation foundations.gpui-componentremains the complete styled UI system and builds ongpui-base.gpui-shellis a new scriptable application runtime that lets a Rust host expose GPUI capabilities to JavaScript. (#2821)gpui-fpsadds a real-time FPS and resource HUD, including CPU, memory, GPU, and frame-tail reporting. (#2704)gpui-wryis now the standalone WebView integration crate.
Applications may continue depending directly on gpui-component, or adopt the new facade:
[dependencies]
gpui-kit = "0.6"use gpui_kit::*;
use gpui_kit::component::Root;
fn main() {
gpui_kit::application().run(|cx| {
gpui_kit::init(cx);
// Open windows and build the application here.
});
}New components and application building blocks
The styled component library has grown well beyond the v0.5.0 surface:
- Application structure:
Commandpalette,NativeMenu,StatusBar,Pagination,Stepper,HoverCard,AlertDialog,FocusTrap, and a redesigned declarativeDialogAPI. - Data entry and display:
Combobox,Rating,ProgressCircle, a new lightweight declarativeTable, and multi-row headers, cell selection, custom row heights, resizing constraints, and batched export forDataTable. - Communication UI: composable
Message,MessageScroller,Bubble,Attachment, andMarkercomponents for chat and assistant-style interfaces. (#2832) - Loading and feedback:
Shimmer, animated progress states, configurable notification placement and width, dismiss callbacks, and optional OS notification-center delivery. - Navigation:
NavStackprovides browser-style push, back, and forward navigation with animated transitions. (#2922)
Existing controls received broader composition and interaction APIs, including context menus for sidebar and tree items, async submenus, collapsible sidebar modes, animated tabs and tooltips, programmatic resizable panels, reverse sliders, configurable calendar week starts, accessible labels and control IDs, and drag-and-drop support for list items.
Text editing, rich text, and selection
Text editing is now split into purpose-built controls:
Input/InputStatefor single-line text, masks, validation, and number entry.Textarea/TextareaStatefor multiline text, rows, soft wrapping, auto-grow, and chat-style submit behavior.Editor/EditorStatefor code editing, highlighting, line numbers, folding, decorations, diagnostics, search, replacement, and LSP integration. (#2691)
The editor adds transaction-based undo, code folding, inline completions, semantic tokens, document colors, configurable wrapping indent, selection APIs, readonly mode, replace/replace-all actions, and broader syntax highlighting. Tree-sitter language support is now split into per-language Cargo features, so applications can select only the grammars they need.
TextView now lives in gpui-base, with the existing gpui_component::text API retained as a compatibility facade. Rich text gains incremental Markdown parsing, inline and local images, Markdown extensions/plugins, math blocks, table actions and horizontal scrolling, source-preserving copy, link-click handling, multi-click selection, drag auto-scroll, and max_lines. A new SelectableText element participates in window-level selection without requiring a rich-text document. (#2881)
Window-level TextSelection can combine selection across multiple TextView and SelectableText regions, enabling document-like selection and copying across independently rendered elements.
Docking, layout, and scrolling
Docking now has a reusable pure-data layout foundation in gpui-base. It supports serializable tiles, tab groups, split resizing, drag/drop placement reporting, undo/redo, animated drop placeholders, snapping neighboring panel edges, and LayoutChanged events. This makes dock layout state usable independently of the styled dock UI.
Scrolling behavior has been revised for better interoperability between nested scroll containers. Highlights include explicit Scrollable identity, axis locking for trackpad gestures, improved scrollbar visibility transitions, responsive Markdown tables, and width-aware virtual-list measurement.
Motion and visual system
gpui-base::motion introduces a layered animation system with keyframes, timing functions, spring motion, presence transitions, staggered animation, reveal helpers, and interpolation. Components now use spring transitions where targets can change during an active animation. (#2866)
The theme system adds gradient backgrounds, global radius consistency, configurable focus rings, selection and Markdown-table semantic colors, custom primary-button and switch colors, and improved dark-mode syntax highlighting. Form controls, popovers, tabs, sliders, and scrollbars have been visually refined for clearer interaction states.
Charts and visualization
Charts gain:
SankeyChartandRadarChart.- Candlestick charts.
- Interactive hover tooltips.
- Negative bar values and a value axis.
- Arbitrary fills such as gradients, per-bar corner radii, grid and x-axis options.
- Pie-chart leader-line labels and Radar-chart element labels.
- More efficient Sankey topology and deduplicated, value-indexed band scales.
Accessibility and platform integration
Accessibility information is now exposed across the component set, including roles, labels, values, toggle state, and stable control IDs. Buttons and checkboxes support role overrides and presentational roles, while editable controls expose their values to accessibility clients.
Native integration expands with OS-native application and context menus, menu item images, improved Linux client-side decorations, window-manager-aware title-bar controls, notification-center bridging, and an owned raw Wry WebView handle.
Performance and developer experience
- Large editor documents now use a SumTree-based wrapping cache, incremental foreground parsing, bounded syntax injections, and cheaper rewrapping and outdent paths.
- Large
TextViewreplacements are parsed off the UI thread, while Markdown blocks are shared instead of cloned each frame. - Dock, input, notification, color-picker, chart tooltip, and shell rendering paths avoid redundant work and unnecessary rerenders.
- The new
gpui-fpsHUD reports presented frames and process resource use for profiling live applications. - The documentation site now includes English and Chinese references for GPUI Base, GPUI Shell, the component library, design guidance, coding guidance, and runnable examples.
- A distributable GPUI Kit skill bundles the design and coding guides for coding agents.
Breaking API changes and migration
Input, Textarea, and Editor are separate APIs
InputState is now single-line only. Migrate multiline inputs to TextareaState and code editors to EditorState:
- use gpui_component::input::{Input, InputState};
+ use gpui_component::input::{Textarea, TextareaState};
- InputState::new(window, cx).multi_line(true).auto_grow(3, 8)
+ TextareaState::new(window, cx).auto_grow(3, 8)- InputState::new(window, cx).code_editor("rust")
- Input::new(&state)
+ EditorState::new("rust", window, cx)
+ Editor::new(&state)Input-only adornments such as prefix, suffix, the mask toggle, and the clear button are not properties of Textarea or Editor; compose those actions around the control instead.
Table names
The former stateful Table is now DataTable. Table names the new declarative table element. (#2075)
- use gpui_component::table::Table;
+ use gpui_component::table::DataTable;The selector-column option was renamed from row_selector to row_header. (#2366)
Divider is now Separator
The module, types, and DescriptionList method were renamed. (#2335)
- gpui_component::divider::Divider
+ gpui_component::separator::Separator
- DescriptionList::divider()
+ DescriptionList::separator()List and table pagination delegates
ListDelegate::is_eof and TableDelegate::is_eof were renamed to has_more, with the semantics made explicit and the default set to false. (#1757)
WebView moved to gpui-wry
The gpui-component webview feature was removed. Depend on the standalone gpui-wry crate instead. (#1759)
History is split by purpose
The former undo-oriented History<T: HistoryItem> API and HistoryItem trait were removed. Use:
History<T>for browser-style navigation with back/forward semantics.UndoHistory<T>for grouped undo/redo transactions. (#2923)
Dock construction and extension APIs were redesigned
Dock persistence keeps the v0.5.0 JSON shape, but the Rust construction and extension APIs changed as the dock was split into an unstyled data/behavior layer and a styled renderer. (#2772)
DockItemwas replaced by the pure-dataDockLayoutbuilder.- Styled applications should wrap panels with
panel_handleand use thepanel_view,tile_view,add_panel_view, andadd_tile_viewentry points. - The old
Paneltrait is split betweengpui_base::dock::Panelfor behavior andgpui_component::dock::Panelfor presentation. - The entity formerly named
TabPanelis nowgpui_base::dock::TabGroup; styledTabPanelis a renderer. - The tiles entity is now
TilesState;Tilesis its renderer. StackPaneland the publicDockentity were removed. Manage layouts throughDockAreaandDockPlacement.- Placement-specific accessors such as
left_dock()and setters such asset_left_dock()were replaced bylayout(placement),set_dock,set_dock_size,is_dock_open, andremove_dock. DockEvent::DragDrop(item)is nowDockEvent::DragDrop { item, target }, exposing where a host drag item landed. (#2661)
Dialog and chart tooltip construction
Dialog::new(window, cx)is nowDialog::new(cx). The declarative dialog API usestrigger,content,DialogHeader,DialogTitle,DialogDescription, andDialogFooter. (#2067)- Low-level chart tooltip construction now uses
Tooltip::new(cursor, bounds);Tooltip::position()andTooltipPositionwere removed.TooltipState::newno longer takes a position argument, andCrossLineis dashed by default. (#2500)
Smaller source-level changes
popover_stylemoved from theStyledExttrait toThemeStyled. (#2726)ScaleBandcategorical domains now requireEq + Hashrather thanPartialEq; the bound also applies to the band type used byBarChartandCandlestickChart. (#2885)- Boolean readers were normalized:
can_go_to_definition()is nowhas_definition(), while dock readers such ascan_zoom()andcan_close()are nowis_zoomable()andis_closable(). (#2810) - The default wrapping indent for multiline editors is now
WrappingIndent::Same. Editornow defaults to the theme's monospace font and derives row height from its configured font size. Explicit.font_family()and.text_size()overrides still take precedence. (#2794)
Public seam structs now use builders and accessors
Several public context and snapshot structs now have private fields so they can evolve compatibly. Replace struct literals and direct field reads with their constructors, builders, and accessors. (#2706)
Affected APIs include:
InputContextMenuCapabilitiesInputPresentationCalendarItemStateComboboxTriggerCtx, renamed toComboboxTriggerContextsetting::RenderOptions
For example:
- capabilities.disabled
- capabilities.selection
+ capabilities.is_disabled()
+ capabilities.has_selection()
- CalendarItemState { kind, active, .. }
+ CalendarItemState::new(kind).active(active)GPUI and package names
- The workspace now targets the
gpui-pre0.3.x family rather than GPUI 0.2.x, bringing the corresponding upstream GPUI API changes. - The assets package is now
gpui-kit-assets(Rust pathgpui_kit_assets) instead ofgpui-component-assets. - The project uses Rust edition 2024.
Deprecated APIs
animation::Transitionis retained as a deprecated alias; useanimation::EffectTransition. This is distinct from the newmotion::Transitiontiming policy.EasingError::InvalidBezierXis retained for source compatibility; useEasingError::InvalidBezierControlPoint.AlertDialog::overlay_closableis deprecated because alert dialogs intentionally cannot be dismissed by pressing the backdrop.Root::clear_text_selectionand the window text-selection extension methodsselected_text,has_text_selection,clear_text_selection, andend_text_selectionare deprecated; use the correspondinggpui_base::TextSelectionAPIs.SearchableListDelegate::sectionis deprecated; implementrender_section_headerto receiveWindowandAppaccess.
Thanks to all contributors
@zanmato @FlyingYu-Z @duanebester @stayhydated @CherryWorm @Moulberry @stippi
And thanks to all our first-time contributors:
- @orbisai0security made their first contribution in #1678
- @amiyzku made their first contribution in #1749
- @18o made their first contribution in #1753
- @TajangSec made their first contribution in #1772
- @gjfei made their first contribution in #1783
- @PleaseDont made their first contribution in #1797
- @vdualb made their first contribution in #1799
- @Nareshix made their first contribution in #1831
- @doubo6sir made their first contribution in #1848
- @yoogoc made their first contribution in #1871
- @elliottminns made their first contribution in #1917
- @fhluo made their first contribution in #1949
- @leoliu0605 made their first contribution in #1946
- @z-jxy made their first contribution in #1984
- @scottcg made their first contribution in #1985
- @PRRPCHT made their first contribution in #1970
- @Hizome made their first contribution in #1916
- @joris-gallot made their first contribution in #2041
- @suxiaoshao made their first contribution in #2084
- @tristanpoland made their first contribution in #2085
- @mengh04 made their first contribution in #2096
- @lockedmutex made their first contribution in #2052
- @sassman made their first contribution in #2093
- @jacobtread made their first contribution in #2103
- @RivTian made their first contribution in #2104
- @ruri4 made their first contribution in #2142
- @niteshbalusu11 made their first contribution in #2154
- @KlausUllrich made their first contribution in #2144
- @jstnd made their first contribution in #2204
- @dunkmann00 made their first contribution in #2206
- @xrtxn made their first contribution in #2210
- @nihalar made their first contribution in #2218
- @boboshan made their first contribution in #2230
- @ScottCUSA made their first contribution in #2239
- @lizhuangs made their first contribution in #2244
- @VOID404 made their first contribution in #2212
- @lurenjia534 made their first contribution in #2265
- @elcoosp made their first contribution in #2274
- @glani made their first contribution in #2278
- @BeratHundurel made their first contribution in #2286
- @regexident made their first contribution in #2310
- @Third-Thing made their first contribution in #2321
- @laojianzi made their first contribution in #2329
- @hewigovens made their first contribution in #2327
- @HuaGu-Dragon made their first contribution in #2354
- @Libadoxon made their first contribution in #2383
- @gaoyia made their first contribution in #2396
- @hlcfan made their first contribution in #2417
- @PeterDaveHello made their first contribution in #2427
- @mike-marcacci made their first contribution in #2414
- @panzhifu made their first contribution in #2433
- @jayson-saavylab made their first contribution in #2454
- @linyisu made their first contribution in #2455
- @Xemorr made their first contribution in #2485
- @Vanuan made their first contribution in #2504
- @berestadev made their first contribution in #2519
- @cyfung1031 made their first contribution in #2509
- @gintsgints made their first contribution in #2545
- @MSIsunny made their first contribution in #2540
- @amos-aios made their first contribution in #2554
- @MuNeNiCK made their first contribution in #2570
- @sh4den made their first contribution in #2574
- @LumenLib made their first contribution in #2587
- @nuskey8 made their first contribution in #2601
- @Ziqi-Yang made their first contribution in #2592
- @wabzqem made their first contribution in #2585
- @zzfn made their first contribution in #2613
- @railapex made their first contribution in #2638
- @bws428 made their first contribution in #2641
- @cdbkk made their first contribution in #2645
- @ItsCacia made their first contribution in #2655
- @sagarkarn made their first contribution in #2662
- @narma made their first contribution in #2369
- @Camork made their first contribution in #2746
- @MohamedAffes0 made their first contribution in #2736
- @jarviisha made their first contribution in #2775
- @Oluwasetemi made their first contribution in #2786
- @Lay523 made their first contribution in #2791
- @thedavidweng made their first contribution in #2805
- @geoffbeier made their first contribution in #2806
- @Butch78 made their first contribution in #2823
- @duo made their first contribution in #2827
- @setsun made their first contribution in #2851
- @jlucaso1 made their first contribution in #2884
- @timty made their first contribution in #2876
- @emmanuel-defreitas made their first contribution in #2872
- @wyhaya made their first contribution in #2880
Thank you for helping make GPUI Kit better! ❤️