Skip to content

GPUI Kit v0.7.1

Latest

Choose a tag to compare

@huacnlee huacnlee released this 05 Oct 02:36
· 44 commits to main since this release
87d10ae

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 speech feature to capture audio with SpeechState, start and stop sessions with SpeechButton, and display levels with SpeechWaveform. Applications can supply a SpeechRecognizer and AudioInput; 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::new shares ColorPickerState with the compact picker, and supports placeholder and accessible-name overrides. ColorPicker now 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; PlotAppearScope remembers 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_hover and Textarea::on_token_hover report token entry and exit with InlineTokenHoverEvent, 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::source exposes the source of the rendered snapshot, and range_for_source converts Markdown source byte ranges into rendered ranges for RangeHighlight. (#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_text and 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_sizes restores 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::choose exposes that activation path; activate_choice continues 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_label provides 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_ring is off by @madcodelife in #3299
  • chart: Add appear motion to Plot and 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 DataTable and keep menu highlights on key presses by @madcodelife in #3307
  • plot: Keep finished appears across remounts with PlotAppearScope by @madcodelife in #3308
  • kit: Point the hidden gpui re-export at the Kit itself by @huacnlee in #3306
  • dock: Add DockArea::set_split_sizes to 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 SpeechWaveform at 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

Full Changelog: v0.7.0...v0.7.1