v0.6.2
GPUI Kit v0.6.2
GPUI Kit v0.6.2 brings mobile application support for iOS and Android, three new components (Carousel, Empty, and InputGroup), a public editor search API, Markdown inline plugins, and motion sequencing. This release also cuts per-frame work in TextView, List, Plot, and Chart, and removes the dock's tiles canvas.
Mobile Applications
GPUI Kit applications can now be hosted by an external iOS or Android platform. Mobile builds keep GPUI and component initialization while leaving the desktop platform selector out, and gpui_kit::is_mobile() exposes the target check. On mobile, tooltips stay hidden and HoverCard opens and closes on tap. New mobile guides cover simulator setup, Swift UIView embedding, lifecycle and keyboard layout, and touch interactions. (#3045)
- Touch text selection: a long press in
Input,Textarea,Editor, or a selectableTextViewselects the word under the finger and shows draggable selection handles with an iOS-style edit menu (Cut, Copy, Paste, Select All). Double tap selects a word in editable text, Select All reaches past the viewport, and the menu returns after a scroll. (#3058, #3073, #3076, #3075, #3077) - iOS-like scroll bounce through the new
ScrollBouncewrapper ingpui-base, covering lists, scrollabledivs, touch release, momentum, and reduced motion. (#3067) - Scrollbars support touch dragging with a smaller resting thumb on mobile. (#3060, #3111)
- A long press opens a plot's tooltip on mobile. (#3078)
New Components
- Carousel: horizontal and vertical snapping, pointer and trackpad gestures, keyboard navigation, controlled selection, looping, optional pagination, and reduced motion. (#2867)
- Empty: composable empty states built from
Empty,EmptyHeader,EmptyMedia,EmptyTitle,EmptyDescription, andEmptyContent, imported fromgpui_kit::component::empty. (#3030) - InputGroup: inline addons, block toolbars, and textareas sharing one input frame through
InputGroup,InputGroupInput,InputGroupTextarea,InputGroupAddon,InputGroupButton, andInputGroupText. (#3042)
Editor and Text Input
- Editor search API is now public on the editor state:
set_search_query,close_search,next_search_match,previous_search_match, the replace methods, andsearch_session(), so an application can draw its own search bar. Match highlights show without the panel, and the search shortcut reaches the host view. (#2533) - Wrapped search matches stay visible with surrounding context. (#3013)
- Added
on_pastetoInput,Textarea, andEditorso applications can handle images and files from the clipboard instead of dropping them. (#3087) - Languages can register runtime parser factories through
LanguageRegistry::register_parser_factory, so a Tree-sitter grammar no longer has to be linked into the binary. (#3039) - Fixed text descender clipping. (#3023)
Markdown and Text Rendering
- Inline plugins through
MarkdownPluginand.plugin(...). Inline math parses by default, and the example adds[@user](mention:user)profile cards. Inline objects inherit surrounding formatting and links and participate in table column sizing. (#3031, #3070) - Streamed text fades in with
TextView::stream_fade(true), or with custom timing and a word-by-word reveal throughTextViewMotion. (#3082) - A Markdown image's
data:URL is decoded instead of fetched. (#3088) - Faster rendering: fewer and cheaper elements per Markdown frame, and a paragraph's shaped text and highlights are kept across frames. (#3090, #3115)
- Fixed inline-code layout in headings, list alignment, and inline-code fragments wrapping twice. (#3038, #3046)
Motion
Sequencechains transitions so a step starts when the previous one ends, each with its own duration, easing, and delay. (#3092)gpui_base::initreads the operating system's reduced-motion preference intoApp::reduce_motion, which every Base motion primitive already honors. (#3094)
Dock
- Removed the tiles canvas.
SplitandTabsare now the only container shapes; a freeform canvas is a panel the host implements.gpui_component::dock::Panel::title_barlets a panel that carries its own chrome opt out of the tab group's title bar. See Breaking Changes below. (#3036) - Added
DockArea::select_panelto display a tab byPanelIdwherever it sits, without moving it. (#3063)
Components
- Button: a ghost button hovers with
accentand presses withbutton_active, matching the outline button and other low-emphasis controls. (#3100) - Dialog: a dialog stays inside the window it opens in, and its own controls route to that dialog. (#3093, #3097)
- Menu: a submenu opens from a scrollable
PopupMenu, and shortcut hints paint on the frame the menu opens. (#3095, #3096) - Tab: fixed explicit scrolling to newly added tabs, and
flex_1()tabs fill the tab bar again. (#3021, #3032) - List and Table: dropped the outline from the selected item, row, and cell; keyboard row navigation stops when
row_selectableis off. (#3108, #3033) - Select: the search query clears when the menu closes. (#3050)
- Setting: fixed number step and clamping in the delegate, and preserved the selected page while searching. (#3099, #3104)
- Avatar: the initials fallback draws from an even OkLCH hue ring. (#3026)
- ColorPicker: fixed duplicate accessibility node IDs. (#3028)
- Chart and Plot: the hover animates, heavy geometry is cached, grids paint as quads, and tessellated line and area paths are cached. The chart gallery cards were reworked. (#3112, #3071)
- List: trimmed the per-frame cost of a scrolling list. (#3085)
- FPS: the readout leaves its own frame out of the readings, grades against the panel, and stops the clock while hidden. (#3025, #3029)
Documentation and Website
Added mobile guides, notification placement docs, and certified AI-facing consumer recipes. The website lets the browser draw emoji and CJK text the bundled fonts lack, skips the system font probe when no font is installed, and fixes the docs sidebar hover background. (#3062, #3109, #3057, #3106, #3044)
Thank you to everyone who contributed code, documentation, testing, and feedback!
What's Changed
- chore: Refresh the recipes lock for the
0.6.1version bump by @madcodelife in #3024 - carousel: Add a Carousel component by @suxiaoshao in #2867
- shell: switch to quickjs-jit 0.12.7 with upstream compatibility facade by @huacnlee in #2903
- fps: Leave the readout clock's own frame out of the readings by @madcodelife in #3025
- component: Fix text descender clipping by @huacnlee in #3023
- avatar: Draw the initials fallback from an even OkLCH hue ring by @madcodelife in #3026
- tab: Fix explicit scrolling to newly added tabs by @BeratHundurel in #3021
- editor: keep wrapped search matches visible with context by @hlcfan in #3013
- color_picker: Fix prevent duplicate accessibility node IDs by @huacnlee in #3028
- fps: Grade against the panel, and stop the clock while hidden by @madcodelife in #3029
- tab: Let
flex_1()tabs fill the tab bar again by @madcodelife in #3032 - table: Stop keyboard row navigation when
row_selectableis off by @madcodelife in #3033 - text_view: Add Inline plugin by @huacnlee in #3031
- chore: Fix inline flow lint. by @huacnlee in #3034
- empty: Add composable empty states by @suxiaoshao in #3030
- text: Fix inline-code heading layout and list alignment by @wabzqem in #3038
- dock: Remove the tiles canvas by @madcodelife in #3036
- website: fix docs sidebar hover background clipped on left edge by @Muhammad-Owais-Warsi in #3044
- highlighter: allow languages to register runtime parser factories by @feigeCode in #3039
- text: prevent inline-code fragments from wrapping twice by @wabzqem in #3046
- kit: Add support mobile applications in GPUI Kit by @huacnlee in #3045
- select: Clear the search query when the menu closes by @Muhammad-Owais-Warsi in #3050
- shell: validate default TextView link URLs by @lurenjia534 in #3048
- chore: Relax exact gpui-pre dependency pins when staging by @huacnlee in #3059
- mobile: Support mobile text selection and scrollbar dragging by @huacnlee in #3058
- scrollbar: Preserve thumb alignment and drag throttling for mobile support by @huacnlee in #3060
- docs: document notification placement by @Muhammad-Owais-Warsi in #3062
- test: adapt TextView settle check for GPUI 0.3.5 by @huacnlee in #3064
- chore: Fix release gpui scope staged GPUI clippy warnings by @huacnlee in #3065
- chroe: Allow upstream deprecations in GPUI release check by @huacnlee in #3066
- dock: Add
DockArea::select_panelto display a tab by panel identity by @kameron1979 in #3063 - website: Let the browser draw emoji and CJK text the bundled fonts lack by @huacnlee in #3057
- base: Add iOS like ScrollBounce by @huacnlee in #3067
- ci: Split checks into parallel jobs and stop recompiling GPUI per step by @huacnlee in #3068
- base: Walk rows, not characters, for Inline text line bounds by @huacnlee in #3070
- plot: Paint grids as quads and cache tessellated line and area paths by @huacnlee in #3071
- mobile: Add touch selection handles and an edit menu to Input and TextView by @huacnlee in #3073
- base: Give a double tap handles, and let Select All reach past the viewport by @huacnlee in #3076
- base: Bring the edit menu back after a scroll the container swallowed by @huacnlee in #3075
- base: Keep a finger's double tap out of read-only text by @huacnlee in #3077
- plot: Open a plot's tooltip with a long press on mobile by @huacnlee in #3078
- mobile: Size the dock title bar's buttons and Clipboard for a finger by @huacnlee in #3079
- dock: Revert the mobile title bar sizing by @huacnlee in #3080
- list: Trim what a scrolling list pays per frame outside GPUI by @huacnlee in #3085
- input: Add on_paste to handle images from clipboard instead of silently dropping them by @Muhammad-Owais-Warsi in #3087
- text: Fade streamed text in with
TextView::stream_fadeby @madcodelife in #3082 - text_view: Decode a Markdown image's
data:URL instead of fetching it by @huacnlee in #3088 - text_view: Build fewer, cheaper elements per Markdown frame by @huacnlee in #3090
- dialog: Keep a dialog inside the window it opens in by @huacnlee in #3093
- menu: Let a submenu open from a scrollable PopupMenu by @huacnlee in #3095
- menu: Paint a menu's shortcut hints on the frame it opens by @huacnlee in #3096
- base: Read the operating system's reduced-motion preference at init by @huacnlee in #3094
- motion: Chain transitions with
Sequenceso a step starts when the last one ends by @huacnlee in #3092 - button: Hover a ghost button with
accent, press it withbutton_activeby @madcodelife in #3100 - dialog: Route a dialog's own controls to that dialog by @IHadACookie in #3097
- setting: Fix delegate number step and clamp to InputState by @Muhammad-Owais-Warsi in #3099
- website: Skip the system font probe while no font is installed by @huacnlee in #3106
- setting: Preserve selected page identity when searching by @suxiaoshao in #3104
- input: Expose editor search API by @calmondev in #2533
- list, table: Drop the outline from the selected item, row and cell by @madcodelife in #3108
- docs: Certify AI-facing consumer recipes by @huacnlee in #3109
- input_group: Add InputGroup by @suxiaoshao in #3042
- scrollbar: Shrink the resting thumb on mobile by @huacnlee in #3111
- chart: Animate the hover, cache heavy geometry and rework the gallery cards by @huacnlee in #3112
- shell: update QuickJS JIT to 0.12.9 by @huacnlee in #3116
- text_view: Keep a paragraph's shaped text and rendered highlights across frames by @huacnlee in #3115
New Contributors
- @feigeCode made their first contribution in #3039
- @kameron1979 made their first contribution in #3063
- @calmondev made their first contribution in #2533
Full Changelog: v0.6.1...v0.6.2