Repository navigation
GPUI Kit v0.7.1
GPUI Kit v0.7.1 adds speech input and ColorSelect, and gives charts an initial draw-in animation. It improves IME editing, inline-token interactions, Markdown source mapping and streaming, keyboard focus, and table rendering. This release pins the GPUI snapshot dependencies to 0.3.8.
New components and charts
- Speech input: enable the
speechfeature to capture audio withSpeechState, start and stop sessions withSpeechButton, and display levels withSpeechWaveform. Applications can supply aSpeechRecognizerandAudioInput; native system recognition is available on supported macOS and Windows configurations, while Linux needs an application recognizer. (#3333) - Speech waveform: levels are sampled once per 80 ms, and the waveform starts empty and scrolls smoothly from the trailing edge using its own playhead. (#3352)
- ColorSelect: use a framed color field with a swatch, hex value and caret in forms.
ColorSelect::newsharesColorPickerStatewith the compact picker, and supports placeholder and accessible-name overrides.ColorPickernow applies its root style refinements. (#3289) - Chart appear motion: built-in charts draw their data in on first paint, with reduced-motion support. Use
.appear(false)to opt out or.appear_key(...)to replay;PlotAppearScoperemembers completed animations across virtual-list remounts while the scope remains painted. Existing custom plots retain their behavior unless they opt in. (#3296, #3308)
Editor and text input
- Inline-token hover:
Input::on_token_hoverandTextarea::on_token_hoverreport token entry and exit withInlineTokenHoverEvent, so applications can anchor tooltips or previews without changing selection. JavaScript bindings expose the same interaction. (#3346) - Fixed IME candidate positioning before repaint and grouped rewrites of a typed character, including Korean IME input, into the typing undo step. (#3297, #3341)
- Fixed Textarea row-based height, text clipping in short single-line frames, and consistency between soft wrapping and horizontal scrolling. (#3330, #3343, #3358)
- Fixed completion-prefix measurement and stale trigger offsets, Kotlin syntax-query compilation, and stale syntax-injection ranges. (#3363, #3367, #3317)
- Fixed mask validation for non-ASCII characters, including Chinese literal separators and characters matched by
*. (#3369)
Markdown and text rendering
- Source-based highlights:
RenderedText::sourceexposes the source of the rendered snapshot, andrange_for_sourceconverts Markdown source byte ranges into rendered ranges forRangeHighlight. (#3281) - Scrollable code blocks: a code-block style with vertical scrolling and a height cap now provides its own scrollbar, handles nested wheel scrolling and keeps code actions pinned. (#3322)
- Improved streaming through incremental prefix updates in
TextViewState::set_textand by committing valid background parse results overtaken by newer chunks. (#3294, #3344) - Fixed CJK punctuation wrapping, inherited text colors in filled containers, and ragged GFM table rows; scroll-table column measurements are reused. (#3293, #3329, #3365, #3318)
Dock and controls
- Dock:
DockArea::set_split_sizesrestores a split's proportions in place, without rebuilding panels, and reports one layout change. (#3314) - Questionnaire: choosing a single-choice answer now confirms the item and advances or submits after a brief feedback pause.
QuestionnaireState::chooseexposes that activation path;activate_choicecontinues to change the answer without confirming. Arrow-key selection, multiple-choice toggles and freeform typing do not auto-advance. (#3350) - Keyboard focus: borderless buttons show a legible focus line, DataTable shows keyboard focus, and popup menus preserve a single keyboard highlight. (#3299, #3300, #3307)
- Control sizing: control text follows the Input/Select size ladder, OtpInput follows interface zoom, and Large Switch uses a larger track. (#3287)
- Clipboard: buttons have a localized accessible name by default;
accessibility_labelprovides a contextual override. (#3354) - Slider: touch drags on the track move the thumb. (#3313)
- Radio: disabled controls stay disabled inside RadioGroup. (#3331)
- Shimmer: the default highlight remains visible on foreground text in dark mode. (#3328)
- Command: item-row corners stay concentric with the frame. (#3285)
Runtime, platform and documentation
-
GPUI snapshot: exact snapshot dependencies are updated to
=0.3.8, with continuation-indent API adaptation preserving the previous wrapping behavior. (#3370) -
Web runtime: target-specific Instant handling avoids a touch-related wasm panic. (#3271)
-
Scrolling: phaseless mouse wheels continue scrolling after an edge bounce. (#3316)
-
Shell: QuickJS JIT is updated to 0.12.11. (#3338)
-
Kit macros: the hidden GPUI re-export points at Kit, keeping generated paths consistent. (#3306)
-
Documentation: release snapshots drive onboarding dependency versions; setup documents the macOS font-kit requirement, and skill examples correct app startup, async and Select re-entrancy usage. (#3284, #3356, #3339, #3345, #3351)
Behavior changes
Charts animate on first paint by default; disable this with .appear(false). Non-interactive built-in charts now retain an element ID for animation and caches, while remaining non-interactive. (#3296)
let chart = LineChart::new(data).interactive(false);
- assert!(Plot::id(&chart).is_none());
+ assert!(Plot::id(&chart).is_some());
+ assert!(!Plot::interactive(&chart));Single-choice Questionnaire activation now confirms by default. Applications that need to change an answer without confirmation can continue to call activate_choice. (#3350)
Thank you to everyone who contributed code, documentation, testing, and feedback!
What's Changed
- command: Keep item row radius concentric with the frame by @madcodelife in #3285
- website: Follow release versions and highlight diffs by @huacnlee in #3284
- base: Gate GlobalState's Instant by target to fix a wasm touch panic by @yoyo930021 in #3271
- color_picker: Add ColorSelect, a framed field that opens the picker by @huacnlee in #3289
- text: Keep inline flow lines within the wrap width for CJK punctuation by @madcodelife in #3293
- button: Show keyboard focus on borderless variants when
focus_ringis off by @madcodelife in #3299 - chart: Add appear motion to
Plotand every chart by @madcodelife in #3296 - text: parse prefix extensions incrementally in TextViewState::set_text (#3291) by @Yi-111-a in #3294
- button: Keep the focus line off text and legible on fills by @madcodelife in #3300
- website: Fit StatusBar demo sections to narrow windows by @ihavecoke in #3301
- docs: Update gpui-kit dependency version to 0.7 in READMEs by @obito-t in #3304
- website: Keep box-drawing glyphs in the gallery font subsets by @ihavecoke in #3305
- table, menu: Show keyboard focus on
DataTableand keep menu highlights on key presses by @madcodelife in #3307 - plot: Keep finished appears across remounts with
PlotAppearScopeby @madcodelife in #3308 - kit: Point the hidden gpui re-export at the Kit itself by @huacnlee in #3306
- dock: Add
DockArea::set_split_sizesto restore a split's slot sizes by @IHadACookie in #3314 - component: Align control text sizes with Input and Select by @huacnlee in #3287
- scroll_bounce: Let phaseless wheels scroll again after bouncing at an edge by @ylinwind in #3316
- highlighter: Clip stale injection ranges to char boundaries before slicing by @huacnlee in #3317
- slider: Let a touch drag on the track move the thumb by @Bombatomica64 in #3313
- chore: upgrade notify to 8.2 and harden theme watching by @orielhaim in #3320
- shell: update QuickJS JIT to 0.12.11 by @huacnlee in #3338
- docs: Document macOS font-kit requirement by @huacnlee in #3339
- text: Avoid remeasuring scroll-table column widths by @lurenjia534 in #3318
- markdown: add source & range_for_source by @tidely in #3281
- text_view: Let fenced code blocks scroll inside a height cap by @jarviisha in #3322
- shimmer: Keep the default highlight visible on foreground text in dark mode by @Bombatomica64 in #3328
- text_view: Follow the container's text color so rich text reads in filled bubbles by @Bombatomica64 in #3329
- input: Make rows set the height of a plain Textarea again by @Bombatomica64 in #3330
- radio: Keep a disabled Radio disabled inside a RadioGroup by @Bombatomica64 in #3331
- input: Keep a single-line Input's text from being clipped in a short frame by @huacnlee in #3343
- website: Fix bold labels in Chinese numbered lists by @ihavecoke in #3342
- skills: Fix async and app startup examples that don't compile by @AncientPixel in #3345
- questionnaire: Confirm a single-choice item when a choice is chosen by @madcodelife in #3350
- skills: Fix the Select re-entrancy test examples by @AncientPixel in #3351
- speech: Add speech input by @madcodelife in #3333
- input: Group IME rewrites of the typed character into one undo step by @insd47 in #3341
- text: Commit background parses that a newer streamed chunk overtook by @FenjuFu in #3344
- input: fall back to last caret for IME candidate bounds before repaint (#3286) by @Yi-111-a in #3297
- website: Fail a docs test on a hand-written GPUI Kit version by @Yi-111-a in #3353
- website: Match onboarding dependencies to release snapshots by @huacnlee in #3356
- clipboard: Add accessibility_label to name the icon button by @counterbeing in #3354
- input: report inline token hover for tooltips and previews by @Muhammad-Owais-Warsi in #3346
- input: Keep horizontal scrolling and soft wrapping consistent by @suxiaoshao in #3358
- editor: Measure the completion prefix from the typed text and drop stale trigger offsets by @abderbejaoui in #3363
- highlighter: Make the Kotlin query compile against its grammar by @PieWhite in #3367
- text_view: normalize GFM table rows to the header column count by @kossoy in #3365
- input: Count characters, not bytes, when validating a mask pattern by @kevin9327 in #3369
- speech: Pace
SpeechWaveformat one bar per 80 ms and scroll it smoothly by @madcodelife in #3352 - kit: Update GPUI to gpui-pre 0.3.8 and prepare v0.7.1 by @huacnlee in #3370
New Contributors
- @yoyo930021 made their first contribution in #3271
- @Bombatomica64 made their first contribution in #3313
- @orielhaim made their first contribution in #3320
- @AncientPixel made their first contribution in #3345
- @insd47 made their first contribution in #3341
- @FenjuFu made their first contribution in #3344
- @counterbeing made their first contribution in #3354
- @abderbejaoui made their first contribution in #3363
- @PieWhite made their first contribution in #3367
- @kevin9327 made their first contribution in #3369
Full Changelog: v0.7.0...v0.7.1