Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
920 commits
Select commit Hold shift + click to select a range
9a2264a
perf(rating): skip redundant hover repaints (#3270)
huacnlee Sep 27, 2026
66a9faa
input: Refresh an open code action menu on a new request (#3274)
huacnlee Sep 27, 2026
a06974a
perf(command): skip remeasuring unchanged rows (#3268)
huacnlee Sep 27, 2026
f180d29
perf(menu): fix DropdownMenu memory leak (#3267)
huacnlee Sep 27, 2026
872d6c4
text_view: Avoid quadratic Markdown source mapping (#3273)
lurenjia534 Sep 27, 2026
5059de4
docs(input): context_menu(false) also turns off a custom menu (#3275)
huacnlee Sep 27, 2026
169fe05
input: Paste from the context menu on the wasm (#3244)
Muhammad-Owais-Warsi Sep 27, 2026
73e421f
base: Center the Dialog popup by default and keep presses on it (#3277)
huacnlee Sep 27, 2026
f197a19
base: Center a single-line Input in its frame by default (#3278)
huacnlee Sep 27, 2026
5b55691
perf: reduce redundant work in six components (#3279)
huacnlee Sep 27, 2026
98e566c
select: Truncate overflowing option labels with an ellipsis (#3280)
huacnlee Sep 27, 2026
e774d9c
plot: Move plot primitives to gpui-base (#3258)
huacnlee Sep 27, 2026
bcc20cf
release: Skip Kit compatibility checks when publishing GPUI (#3282)
huacnlee Sep 28, 2026
12d278a
popover: Apply trigger_style to the trigger container (#3245)
Yi-111-a Sep 28, 2026
501cdba
kit: Update GPUI to gpui-pre 0.3.7 (#3283)
huacnlee Sep 28, 2026
0c830f4
Bump v0.7.0
huacnlee Sep 28, 2026
71bf31a
command: Keep item row radius concentric with the frame (#3285)
madcodelife Sep 28, 2026
adde487
website: Follow release versions and highlight diffs (#3284)
huacnlee Sep 28, 2026
5a3892c
base: Gate GlobalState's Instant by target to fix a wasm touch panic …
yoyo930021 Sep 28, 2026
17b2c6a
color_picker: Add ColorSelect, a framed field that opens the picker (…
huacnlee Sep 28, 2026
56dc964
text: Keep inline flow lines within the wrap width for CJK punctuatio…
madcodelife Sep 28, 2026
db8c62b
button: Show keyboard focus on borderless variants when `focus_ring` …
madcodelife Sep 28, 2026
c06d463
chart: Add appear motion to `Plot` and every chart (#3296)
madcodelife Sep 28, 2026
2960200
text: parse prefix extensions incrementally in TextViewState::set_tex…
Yi-111-a Sep 28, 2026
eb6c13a
button: Keep the focus line off text and legible on fills (#3300)
madcodelife Sep 28, 2026
9fda5d5
website: Fit StatusBar demo sections to narrow windows (#3301)
ihavecoke Sep 28, 2026
25d59c0
docs: Update gpui-kit dependency version to 0.7 in READMEs (#3304)
obito-t Sep 28, 2026
cb12d20
website: Keep box-drawing glyphs in the gallery font subsets (#3305)
ihavecoke Sep 29, 2026
cc83991
table, menu: Show keyboard focus on `DataTable` and keep menu highlig…
madcodelife Sep 29, 2026
2ec5696
plot: Keep finished appears across remounts with `PlotAppearScope` (#…
madcodelife Sep 29, 2026
caf830c
kit: Point the hidden gpui re-export at the Kit itself (#3306)
huacnlee Sep 29, 2026
11b04d9
dock: Add `DockArea::set_split_sizes` to restore a split's slot sizes…
IHadACookie Sep 29, 2026
4708780
component: Align control text sizes with Input and Select (#3287)
huacnlee Sep 29, 2026
0d887f1
scroll_bounce: Let phaseless wheels scroll again after bouncing at an…
ylinwind Sep 29, 2026
4f861e8
highlighter: Clip stale injection ranges to char boundaries before sl…
huacnlee Sep 29, 2026
9c369db
slider: Let a touch drag on the track move the thumb (#3313)
Bombatomica64 Sep 29, 2026
201b55a
chore: upgrade notify to 8.2 and harden theme watching (#3320)
orielhaim Sep 30, 2026
eb1316f
shell: update QuickJS JIT to 0.12.11 (#3338)
huacnlee Sep 30, 2026
912f8a9
docs: Document macOS font-kit requirement (#3339)
huacnlee Sep 30, 2026
ec6b87f
text: Avoid remeasuring scroll-table column widths (#3318)
lurenjia534 Oct 1, 2026
15da283
markdown: add source & range_for_source (#3281)
tidely Oct 1, 2026
21113ca
text_view: Let fenced code blocks scroll inside a height cap (#3322)
jarviisha Oct 1, 2026
b4c7cbd
shimmer: Keep the default highlight visible on foreground text in dar…
Bombatomica64 Oct 1, 2026
0b8a653
text_view: Follow the container's text color so rich text reads in fi…
Bombatomica64 Oct 1, 2026
eb0cc13
input: Make rows set the height of a plain Textarea again (#3330)
Bombatomica64 Oct 1, 2026
1be572b
radio: Keep a disabled Radio disabled inside a RadioGroup (#3331)
Bombatomica64 Oct 1, 2026
3a14284
input: Keep a single-line Input's text from being clipped in a short …
huacnlee Oct 1, 2026
f6438b8
website: Fix bold labels in Chinese numbered lists (#3342)
ihavecoke Oct 2, 2026
5d426c3
skills: Fix async and app startup examples that don't compile (#3345)
AncientPixel Oct 2, 2026
2188a98
questionnaire: Confirm a single-choice item when a choice is chosen (…
madcodelife Oct 2, 2026
f89c5cc
skills: Fix the Select re-entrancy test examples (#3351)
AncientPixel Oct 2, 2026
0790ad3
speech: Add speech input (#3333)
madcodelife Oct 2, 2026
21252d8
input: Group IME rewrites of the typed character into one undo step (…
insd47 Oct 2, 2026
a4ba683
text: Commit background parses that a newer streamed chunk overtook (…
FenjuFu Oct 2, 2026
73ef866
input: fall back to last caret for IME candidate bounds before repain…
Yi-111-a Oct 2, 2026
3467e64
website: Fail a docs test on a hand-written GPUI Kit version (#3353)
Yi-111-a Oct 2, 2026
2c5162f
website: Match onboarding dependencies to release snapshots (#3356)
huacnlee Oct 3, 2026
edd5d3a
clipboard: Add accessibility_label to name the icon button (#3354)
counterbeing Oct 3, 2026
d89a9b2
input: report inline token hover for tooltips and previews (#3346)
Muhammad-Owais-Warsi Oct 3, 2026
3a39e9d
input: Keep horizontal scrolling and soft wrapping consistent (#3358)
suxiaoshao Oct 3, 2026
4c7f135
editor: Measure the completion prefix from the typed text and drop st…
abderbejaoui Oct 4, 2026
42fbb97
highlighter: Make the Kotlin query compile against its grammar (#3367)
PieWhite Oct 5, 2026
1269b7a
text_view: normalize GFM table rows to the header column count (#3365)
kossoy Oct 5, 2026
6150a8c
input: Count characters, not bytes, when validating a mask pattern (#…
kevin9327 Oct 5, 2026
4890b1c
speech: Pace `SpeechWaveform` at one bar per 80 ms and scroll it smoo…
madcodelife Oct 5, 2026
87d10ae
kit: Update GPUI to gpui-pre 0.3.8 and prepare v0.7.1 (#3370)
huacnlee Oct 5, 2026
8d8cc67
text_view: Improve default typography (#3371)
madcodelife Oct 5, 2026
af78e93
text_view: Include block plugins in mouse selections (#3373)
lurenjia534 Oct 6, 2026
7eb5209
kit: Add optional gpui-fast backend (#3375)
huacnlee Oct 6, 2026
c0bebdc
tooltip: Make show delay and grace period configurable with `TooltipD…
madcodelife Oct 6, 2026
bf44ad7
docs: Explain recovering focus when the focused element stops renderi…
AncientPixel Oct 7, 2026
9808ec1
diff: Add readonly patch viewer (#3378)
huacnlee Oct 7, 2026
c1bda59
kit: Use one Windows manifest with GPUI Fast (#3380)
huacnlee Oct 7, 2026
6bb649e
test: Add find_all and configurable clicks to the UI test harness (#3…
AncientPixel Oct 7, 2026
4921e5b
test: Make Progress and TitleBar findable in UI tests (#3383)
AncientPixel Oct 7, 2026
114d707
input: Preserve selection, focus ring and context menu actions (#3382)
lurenjia534 Oct 7, 2026
dc00da1
diff: Add a Git history example and complete review APIs (#3388)
huacnlee Oct 7, 2026
29c0457
webview: Compose native views with the GPUI Fast backend (#3389)
ihavecoke Oct 7, 2026
58d078b
text_view: Ignore gestures that stay inside one block plugin (#3390)
ylinwind Oct 7, 2026
9acf47c
text_view: Round the first and last table rows to the frame radius (#…
ihavecoke Oct 7, 2026
56c5eb4
webview: Support Linux on X11 and rename the crate to gpui-webview (#…
huacnlee Oct 7, 2026
917610a
webview: Require GPUI Fast for gpui-webview (#3398)
huacnlee Oct 7, 2026
bd8ed21
resizable: Let an application build its own resize handle (#3302)
ihavecoke Oct 7, 2026
1af2d1f
menu: Open a context menu with a long press on touch (#3393)
Bombatomica64 Oct 7, 2026
3cc2d0d
text_view: Keep narrow table columns on one line (#3399)
madcodelife Oct 8, 2026
c8fdf33
kit: Extend UI testing with semantic queries and Linux rendering (#3402)
huacnlee Oct 8, 2026
952202f
settings: Keep focus rings inside the list viewport (#3394)
lurenjia534 Oct 8, 2026
72ec173
scrollable_mask: Keep rounded scroll-table corners clean at any scrol…
ihavecoke Oct 8, 2026
3751aef
dialog: Add margin_top to AlertDialog (#3404)
xxww0098 Oct 8, 2026
c7b5b48
input: Add InputState::add_selection for programmatic multi-cursor (#…
sola-ryu Oct 8, 2026
ab7b54f
text_selection: Stop writing selection state on every frame (#3407)
huacnlee Oct 8, 2026
636e088
table: Make the sort icon a labelled button (#3396)
AncientPixel Oct 8, 2026
29399be
table: Report visible row ranges of one row or none (#3397)
AncientPixel Oct 8, 2026
6baad8b
dialog: Support configurable entrance animations (#3405)
xxww0098 Oct 8, 2026
296fe2f
docs: Explain the open_dialog builder and footer contracts (#3406)
xxww0098 Oct 8, 2026
59cba65
dock: Hand the focus to the tab that replaces a closed one (#3409)
sola-ryu Oct 8, 2026
1e41f17
dropdown_button: Add A11y names for the menu trigger (#3410)
sola-ryu Oct 8, 2026
2ef9968
text, resizable: Stop notifying state that did not change (#3418)
huacnlee Oct 8, 2026
32529dc
editor: Add on-demand completion commands (#3411)
sola-ryu Oct 8, 2026
099aff5
tab: Add `Folder` variant (#3415)
madcodelife Oct 8, 2026
288767c
table: Clear a right-clicked cell's outline on the next click (#3413)
sola-ryu Oct 8, 2026
02daace
tab: Scroll a clicked tab into view with the next one peeking (#3419)
madcodelife Oct 8, 2026
37cad32
table: Allow a header row height separate from the body (#3420)
xhofe Oct 9, 2026
9c4b175
menu: Focus a context menu before its first frame (#3422)
madcodelife Oct 9, 2026
0bbd987
text: Preserve logical selection across presentation changes (#3421)
TomiXRM Oct 9, 2026
ed27c62
text: Keep inline HTML mark highlights in Markdown (#3425)
henrikogaard Oct 10, 2026
75fc4ed
input: Anchor completion/code-action popups to the current frame's ca…
sola-ryu Oct 11, 2026
a25598e
input: Run custom context menu builders after releasing the input (#3…
costajohnt Oct 11, 2026
5e1da31
motion: Keep cubic-bezier anticipation and overshoot in Easing (#3432)
costajohnt Oct 11, 2026
1ccf011
input: Keep auto-grow rows fitted when the limits change (#3430)
sneffets Oct 11, 2026
4e2a00e
text: Paint TextView selection under the glyphs (#3439)
cesartalen Oct 12, 2026
45b0bbf
base: read the pointer only under hovered text, and ask no frame for …
sunli829 Oct 12, 2026
90c7a69
chore: Restore default codegen units and stop optimizing proc macros …
huacnlee Oct 12, 2026
1e7ffaa
kit: Update GPUI to gpui-pre 0.3.9 (#3459)
huacnlee Oct 12, 2026
369f7a8
button: Keep the hover style registered while selected or disabled (#…
madcodelife Oct 12, 2026
aa626f2
diff: Wrap the next-change key once the list is scrolled to its end (…
Smokanci Oct 13, 2026
16e963c
shell: Ship gpui-shell as an installable runtime with run, new and pa…
huacnlee Oct 13, 2026
a1ac7d9
shell: Show each release's Shell pages for the binary it ships (#3479)
huacnlee Oct 13, 2026
ce09848
table: Don't stop event propagation in `set_selected_row` (#3469)
shreeve Oct 13, 2026
29eaf42
sidebar: Name the submenu caret button for assistive tech (#3470)
noosxe Oct 13, 2026
7f1bf0c
table: Select the first or last row on Home and End in row mode (#3471)
shreeve Oct 13, 2026
507e82b
input: Skip the notify in `set_line_number` when nothing changes (#3475)
shreeve Oct 13, 2026
19603b1
input: Clamp the vertical scroll offset in all layout modes (#3477)
shreeve Oct 13, 2026
efd2e67
table: Restore the default column resize protection (#3472)
shreeve Oct 13, 2026
8173d61
resizable: Add `ResizablePanel::fixed` to keep a panel's size on cont…
shreeve Oct 13, 2026
a861eba
tests: Build each crate's integration tests as one binary (#3481)
sunli829 Oct 13, 2026
61a01b9
input: Let `Editor` take a size, as `Textarea` does (#3480)
shreeve Oct 13, 2026
b02dc60
message_scroller: Add `logical_scroll_top` to read the reading positi…
UncertaintyDeterminesYou4ndMe Oct 13, 2026
7a20941
shell: Add `bundle` to package an application, and a `dev` command (#…
huacnlee Oct 13, 2026
8d4907d
table: Add `DataTable::fixed_cols_border` (#3482)
shreeve Oct 13, 2026
dff65ed
input: Add `EditorState::wrap_row_count` and `prewrap` (#3483)
shreeve Oct 13, 2026
9fdc9d7
input: Expose the editor display map instead of a row count wrapper (…
huacnlee Oct 13, 2026
4ee8201
input: Keep a scroll over text that can scroll, even at its end (#3484)
shreeve Oct 13, 2026
5b5566e
docs: Add Home and End selecting the first and last row (#3486)
shreeve Oct 13, 2026
7d7580f
tooltip: Keep a pressed trigger's tooltip dismissed until the pointer…
alex-vas Oct 13, 2026
af2f4c2
table: Fit a column to its content on double-click of its resize hand…
miimsam Oct 13, 2026
c5f8eca
slider: Add accessibility labels (#3494)
lurenjia534 Oct 13, 2026
859729d
tests: Keep the WebSocket pending-read test pumping until its server …
madcodelife Oct 14, 2026
595266c
shell: Fix the runtime gaps found by the gpui-shell benchmark apps (#…
huacnlee Oct 14, 2026
72747ee
shell: Strip symbols from release builds (#3507)
huacnlee Oct 14, 2026
d23fdc9
tooltip: Fix direction-dependent switching between triggers (#3501)
mrkishi Oct 14, 2026
20676e3
shell: Fix a Wayland crash when activating the window at launch (#3508)
huacnlee Oct 14, 2026
607f589
shell: Fold script failures to one line and explain what failed (#3509)
huacnlee Oct 14, 2026
14c26d3
scroll: Bounce scrollable content like NSScrollView, by default on ma…
shreeve Oct 14, 2026
a0230db
highlighter: Add syntect as a lighter syntax highlighting backend (#3…
huacnlee Oct 14, 2026
baf03ed
webview: Clip native views without resizing the page (#3499)
superoskin Oct 14, 2026
1188c11
input: Fix the caret flashing off on click, and draw it crisp at 1px …
huacnlee Oct 14, 2026
50dac1c
shell: Fix more runtime gaps found by the benchmark apps (#3510)
huacnlee Oct 14, 2026
6220fc1
shell: Gate the process probe helper to Unix (#3530)
huacnlee Oct 15, 2026
60c292d
focus_trap: Keep focus contained and preserve accessibility (#3443)
ruiyangke Oct 15, 2026
70465ac
select: Correct keyboard confirmation and item reconciliation (#3446)
ruiyangke Oct 15, 2026
9b76551
scroll: Scroll horizontal strips with a vertical mouse wheel (#3518)
KingEmma7 Oct 15, 2026
1a01f92
shell: Add WebView and WebViewState to the component catalog (#3532)
huacnlee Oct 15, 2026
1b6059c
window_border: Don't offer resizing for a window that isn't resizable…
CodeName-Anti Oct 15, 2026
b914e5a
shell: Accept a Background in bg and add a shadow style (#3534)
huacnlee Oct 16, 2026
2963d6d
base: Mark disabled controls disabled on their accessibility node (#3…
huacnlee Oct 16, 2026
e929d98
table: Add `TableState::select_on_modifier_click` (#3523)
shreeve Oct 16, 2026
319b56c
scrollbar: Leave presses and hover over an occluding element to it (#…
lukelast Oct 16, 2026
1319484
input: Let the textarea scrollbar drag reach the content end (#3527)
dannyward630 Oct 16, 2026
8a83be7
base: Skip shared heading callbacks when comparing text styles (#3536)
KlausUllrich Oct 16, 2026
9ad9d92
shell: Add script methods to MessageScrollerState (#3541)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
3aeb5e7
shell: Let an embedding host extend the gpui-component catalog (#3542)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
747bf66
shell: Declare the component catalog under its registry's module spec…
UncertaintyDeterminesYou4ndMe Oct 16, 2026
b539b2f
shell: Let a script release retained component state (#3544)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
cbb6e38
docs: Correct three gpui-shell script-facing docs (#3545)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
4dda232
dock: Report the user's dock toggles with DockToggleEvent (#3546)
IHadACookie Oct 16, 2026
0164091
shell: Keep a list's reading position when its item count changes (#3…
UncertaintyDeterminesYou4ndMe Oct 16, 2026
16a7488
shell: Let a script textarea submit on Enter (#3550)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
6b104d1
input: Name the clear button for screen readers (#3554)
Bombatomica64 Oct 16, 2026
83e84e4
input: Report a masked input as a password field to screen readers (#…
Bombatomica64 Oct 16, 2026
7a279cd
input: Keep the text on Android's back button with clean_on_escape (#…
Bombatomica64 Oct 16, 2026
4c46923
input: Name the mask toggle (#3562)
counterbeing Oct 16, 2026
ce04080
shell: Add `on_visible_range_change` to report what a list shows (#3549)
UncertaintyDeterminesYou4ndMe Oct 16, 2026
eec1208
diff: Keep the row-height hint after the list lays out at a new width…
zzfn Oct 16, 2026
f8cf0bd
input: Tell the platform's keyboard how to assist each input (#3557)
Bombatomica64 Oct 16, 2026
d4c5681
website: Link to Native Shell from the nav and READMEs (#3571)
Copilot Oct 17, 2026
14f5933
shell: Act on the link itself for lstat, readlink, unlink, rmdir and …
zzfn Oct 17, 2026
e0375e2
tests: Fix gpui-shell path assertions on Windows and report script bu…
Elitelord Oct 17, 2026
2062380
input: share display_map and prewrap across text modes (#3564)
TomiXRM Oct 17, 2026
2154ba8
table: Let DataTable turn off its focus ring with focus_ring(false) (…
abduladnan-mt7 Oct 17, 2026
3a1eaf1
website: Update Native Shell domain and add project logos (#3579)
huacnlee Oct 17, 2026
114c0d9
text: Keep `<pre>` text as text through the HTML minifier (#3570)
UncertaintyDeterminesYou4ndMe Oct 18, 2026
49fb39e
text: Keep whitespace in `<pre><code>` through the HTML minifier (#3581)
madcodelife Oct 18, 2026
86b4ac5
tree: select and toggle entries on click instead of mouse down (#3567)
kevin9327 Oct 18, 2026
45c70d4
text: editor_host, a public API for external editors (#3580)
wabzqem Oct 18, 2026
e949d3e
setting: Name bool fields after their setting's title (#3524)
Elitelord Oct 18, 2026
41acc8a
shell: Add `with_follow_mode` to make a list follow its tail (#3548)
UncertaintyDeterminesYou4ndMe Oct 18, 2026
7f46cdf
text: Break the line where an HTML `<br>` stands (#3569)
UncertaintyDeterminesYou4ndMe Oct 18, 2026
f7a1dfb
tooltip: Dismiss the tooltip when its trigger is removed (#3528)
dux-web Oct 18, 2026
e971783
tab: Draw the sliding indicator on the frame after a bar's first (#3574)
H1X4Dev Oct 18, 2026
f68b254
table: Cover DataTable builder and focus ring configuration (#3572)
YidaWeng Oct 18, 2026
4cf4de5
slider: Write the indicator's bounds only when they moved (#3575)
H1X4Dev Oct 18, 2026
8aa9f29
list: Notify from set_searchable only when it changes (#3576)
H1X4Dev Oct 18, 2026
9254c58
setting: Name dropdown, number and text fields after their setting's …
madcodelife Oct 18, 2026
f692bb8
ci: Quote the tooltip test command so the workflow parses (#3592)
madcodelife Oct 18, 2026
5591a65
tests: Accept USERPROFILE as the default home variable on Windows (#3…
Elitelord Oct 18, 2026
f8c8678
webview: Support gpui-pre and make `gpui-fast` optional again (#3591)
madcodelife Oct 19, 2026
57aff71
motion: Preserve transition and presence duration precision (#3590)
TomiXRM Oct 19, 2026
af456dd
popover: Preserve keyboard activation in content (#3586)
TomiXRM Oct 19, 2026
2eedb69
text: Add SelectionFormat::SourceAcrossStyles (#3517)
stippi Oct 19, 2026
85c05bf
release: Publish GPUI with crates.io wgpu 30.0.1 (#3600)
huacnlee Oct 19, 2026
eb80cbf
input: Let hosts choose how completion labels are highlighted (#3496)
xhofe Oct 19, 2026
6706b21
input: keep caret rows visible in constrained viewports (#3583)
TomiXRM Oct 19, 2026
0660be4
input: anchor custom search queries to the viewport (#3584)
TomiXRM Oct 19, 2026
74939dc
tab_bar: run a tab's own on_click from the overflow menu (#3568)
kevin9327 Oct 19, 2026
2c11365
text: Prevent stale selections from returning after remount (#3588)
TomiXRM Oct 19, 2026
d476c76
text: Copy the current TextView selection before repaint (#3589)
TomiXRM Oct 19, 2026
1676826
release: Prepare v0.8.0 (#3602)
huacnlee Oct 19, 2026
6c13c1f
typos: Ignore the two release-notes contributor handles (#3608)
noosxe Oct 20, 2026
77ff6f7
dock: Read the legacy empty `StackPanel` as an empty split (#3610)
obito-t Oct 20, 2026
4abf41c
input: align accessibility semantics with editor focus (#3585)
TomiXRM Oct 20, 2026
41b6352
dialog: Animate the exit to match the entrance (#3603)
YidaWeng Oct 20, 2026
ade05d0
input: Measure the horizontal scroll extent from laid-out lines (#3604)
YidaWeng Oct 20, 2026
4d63c73
button: preserve Tab traversal when the focused control becomes disab…
TomiXRM Oct 20, 2026
f5480ca
table: Apply Column::text_right and text_center in DataTable (#3617)
Elitelord Oct 21, 2026
8b3631f
diff: Let the application supply the syntax highlighter (#3618)
bcl-dev Oct 21, 2026
da8b2ba
scroll: Expose the last horizontal strip scroll step a mask claimed (…
yuanzhuang-svg Oct 22, 2026
a64a609
story: Add an application-owned completion menu to the Input story (#…
noosxe Oct 22, 2026
296be84
scroll: Scroll content past a scrollable's maximum size (#3613)
UncertaintyDeterminesYou4ndMe Oct 22, 2026
07dc43d
theme: Let applications tune the scrollbar idle hold and fade-out (#3…
ganeshmshetty Oct 22, 2026
978522a
input: Ask for the virtual keyboard when an input is tapped (#3623)
Bombatomica64 Oct 22, 2026
c565782
sheet, notification: Keep out from under the system bars and the keyb…
Bombatomica64 Oct 22, 2026
47ae1ef
scrollable_mask: Dispatch the overscroll steps of the scroll claim te…
madcodelife Oct 23, 2026
219fc1a
resizable: Read active drag state when mouse events arrive (#3629)
huacnlee Oct 23, 2026
0121c36
input: Lay out tabs to tab stops in the code editor (#3622)
claudio-azevedo Oct 23, 2026
7c0746e
input: Ask scroll containers to reveal a focused input (#3625)
Bombatomica64 Oct 23, 2026
47e5a89
text: Release the shaped text of dropped text views at the next frame…
TastyCZ Oct 23, 2026
9b59188
locales: Add Brazilian Portuguese (pt-BR) (#3638)
sergiobalecho95 Oct 23, 2026
90d8517
color_picker: Round hex channels instead of truncating them (#3640)
boboshan Oct 23, 2026
f209867
scroll: Ignore rounding in the part of a packet the text did not use …
Tryanks Oct 23, 2026
e692bcb
scroll: Throw the edge on release only when it is stretched (#3631)
Tryanks Oct 23, 2026
9da3516
dialog: add centered() to seat a dialog in the middle of the window (…
mastro993 Oct 23, 2026
627ba35
input: Let an editor supply its own scrollbar (#3644)
boboshan Oct 23, 2026
25aae91
text: Add linked plain text and tracked text decorations (#2842)
weskor Oct 23, 2026
ecd2c8f
color_picker: Keep the first hex edit after a programmatic value (#3641)
boboshan Oct 23, 2026
74b105c
website: Fix OtpInput examples and event documentation (#3645)
SandmeyerX Oct 24, 2026
ae8d232
focus_trap: End the Tab search at the first repeated stop (#3642)
boboshan Oct 24, 2026
afeb1fb
toolbar: Grow with content taller than the bar (#3651)
AncientPixel Oct 24, 2026
d2b473b
hover_card: Apply trigger_style to the trigger container (#3653)
AncientPixel Oct 24, 2026
75e146c
command: Pad the empty list only while the empty state shows (#3654)
AncientPixel Oct 24, 2026
3b2f7bf
toolbar: Keep focus where it was when blank toolbar space is clicked …
AncientPixel Oct 24, 2026
cf5b863
scroll_bounce: Avoid false overscroll at large offsets (#3661)
superoskin Oct 24, 2026
40c3e50
text: Keep a drag that starts in a table cell in that cell (#3646)
watzon Oct 24, 2026
c297ddf
time_field: Focus the first segment when the field is pressed outside…
ylinwind Oct 24, 2026
f8e09e8
typos: Preserve valid Portuguese translations (#3664)
huacnlee Oct 24, 2026
11345ec
text: Support inline code style overrides (#3663)
citizenhicks Oct 24, 2026
0119807
table: Expose DataTable's structure and cells to assistive technology…
Elitelord Oct 24, 2026
69a2077
button: Expose accessible names in the script API (#3665)
huacnlee Oct 24, 2026
f8f5e4a
text: Preserve sparse Markdown table rows (#3673)
lurenjia534 Oct 24, 2026
7b14e03
test: Read accessibility descriptions and placeholders in element sna…
boboshan Oct 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
The diff you're trying to view is too large. We only load the first 3000 changed files.
248 changes: 248 additions & 0 deletions .agents/COMPONENT_TEST_RULES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,248 @@
# GPUI Component Testing Rules

## Testing Principles

### 1. **Simplicity First**

- Avoid excessive simple tests
- Focus on complex logic and core functionality

### 2. **Builder Pattern Testing**

- Every component should have a `test_*_builder` test for coverage of the builder pattern
- Tests should cover all major configuration options
- Use method chaining to demonstrate complete API usage

#### Example:

```rust
#[gpui::test]
fn test_button_builder(_cx: &mut gpui::TestAppContext) {
let button = Button::new("complex-button")
.label("Save Changes")
.primary()
.outline()
.large()
.tooltip("Click to save")
.compact()
.loading(false)
.disabled(false)
.selected(false)
.on_click(|_, _, _| {});

// Assert all key properties
assert_eq!(button.label, Some("Save Changes".into()));
assert_eq!(button.variant, ButtonVariant::Primary);
assert!(button.outline);
assert_eq!(button.size, Size::Large);
}
```

### 3. **Complex Logic Testing**

- Test conditional branching logic
- Test state transitions and interactions
- Test edge cases

#### Example:

```rust
#[gpui::test]
fn test_button_clickable_logic(_cx: &mut gpui::TestAppContext) {
// Test behavior under multiple conditions
let clickable = Button::new("test").on_click(|_, _, _| {});
assert!(clickable.clickable());

let disabled = Button::new("test").disabled(true).on_click(|_, _, _| {});
assert!(!disabled.clickable());

let loading = Button::new("test").loading(true).on_click(|_, _, _| {});
assert!(!loading.clickable());
}
```

### 4. **Helper Method Testing**

- Test component helper methods and validation logic
- Combine related tests into a single function

#### Example:

```rust
#[gpui::test]
fn test_button_variant_methods(_cx: &mut gpui::TestAppContext) {
// Test variant check methods
assert!(ButtonVariant::Link.is_link());
assert!(ButtonVariant::Text.is_text());
assert!(ButtonVariant::Ghost.is_ghost());

// Test related logic
assert!(ButtonVariant::Link.no_padding());
assert!(ButtonVariant::Text.no_padding());
}
```

## What NOT to Test

### ❌ Anti-patterns to Avoid

1. **Simple getter/setter tests**

```rust
// ❌ Don't write tests like this
#[gpui::test]
fn test_button_with_label(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").label("Click Me");
assert_eq!(button.label, Some("Click Me".into()));
}
```

2. **Individual property tests**

```rust
// ❌ Don't write separate tests for each property
#[gpui::test]
fn test_button_disabled(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").disabled(true);
assert!(button.disabled);
}

#[gpui::test]
fn test_button_selected(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").selected(true);
assert!(button.selected);
}
```

_These should be merged into the builder pattern test_

3. **Individual size/variant tests**

```rust
// ❌ Don't write separate tests for each size
#[gpui::test]
fn test_button_xsmall(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").xsmall();
assert_eq!(button.size, Size::XSmall);
}

#[gpui::test]
fn test_button_small(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").small();
assert_eq!(button.size, Size::Small);
}
```

## Test File Structure

```rust
#[cfg(test)]
mod tests {
use super::*;

// 1. Builder pattern test (required)
#[gpui::test]
fn test_component_builder(_cx: &mut gpui::TestAppContext) {
// Test complete method chaining
}

// 2. Complex logic test (if applicable)
#[gpui::test]
fn test_component_complex_logic(_cx: &mut gpui::TestAppContext) {
// Test conditional branches, state transitions, etc.
}

// 3. Helper method test (if applicable)
#[gpui::test]
fn test_component_helper_methods(_cx: &mut gpui::TestAppContext) {
// Test helper methods
}
}
```

## Test Count Guidelines

| Component Type | Recommended Tests | Notes |
| ----------------- | ----------------- | -------------------------------- |
| Simple component | 1-2 tests | Builder + complex logic (if any) |
| Medium component | 2-3 tests | Builder + logic + helper methods |
| Complex component | 3-5 tests | Based on actual complexity |

## Real-world Examples

### Button Component (3 tests)

- `test_button_builder` - Complete configuration test
- `test_button_clickable_logic` - Click logic test
- `test_button_variant_methods` - Variant method test

### ButtonIcon Component (2 tests)

- `test_button_icon_builder` - Complete configuration test
- `test_button_icon_variant_types` - Variant type test

### ButtonGroup Component (1 test)

- `test_button_group_builder` - Complete configuration test (covers all important features)

### DropdownButton Component (1 test)

- `test_dropdown_button_builder` - Complete configuration test

### Toggle Component (2 tests)

- `test_toggle_builder` - Toggle configuration test
- `test_toggle_group_builder` - ToggleGroup configuration test

## GPUI Test Usage

### When to Use `#[gpui::test]`

- When testing UI component rendering
- When testing window-dependent behavior
- When testing interactive elements that require event handling

### When NOT to Use `#[gpui::test]`

- For pure logic tests that don't involve rendering
- For utility function tests
- For simple data structure tests
- For validation logic that doesn't require app context

#### Example:

```rust
// ✅ Use regular Rust test for simple logic
#[test]
fn test_button_variant_conversion() {
let rounded: ButtonRounded = px(5.0).into();
assert!(matches!(rounded, ButtonRounded::Size(_)));
}

// ✅ Use gpui::test for component behavior
#[gpui::test]
fn test_button_builder(_cx: &mut gpui::TestAppContext) {
let button = Button::new("test").large();
assert_eq!(button.size, Size::Large);
}
```

## Summary

✅ **DO**:

- Test complete builder patterns
- Test complex business logic
- Test conditional branches and state transitions
- Combine related tests
- Use regular `#[test]` when GPUI context is not needed

❌ **DON'T**:

- Test simple property setters
- Write separate tests for each property/size/variant
- Test obvious functionality
- Over-fragment tests
- Use `#[gpui::test]` unnecessarily

**Goal**: Cover the most critical functionality with minimal tests while keeping code clean and maintainable.
76 changes: 76 additions & 0 deletions .agents/commands/release-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
# Release Notes

Write release notes using the input supplied by the user: either a tag such
as `v0.6.2`, or the auto-generated "## What's Changed" list copied from the
GitHub release draft. When no input is supplied, use the `version` in the
workspace `Cargo.toml` with a `v` prefix.

## Gather

1. Read the previous release with `gh release view <previous-tag> --json body -q .body`
to match its structure, tone, and section names. The previous tag is
`git describe --tags --abbrev=0 <tag>^` (or the latest published release
when `<tag>` does not exist yet).
2. If no "What's Changed" list was pasted, generate it:

```bash
gh api repos/longbridge/gpui-kit/releases/generate-notes \
-f tag_name=<tag> -f previous_tag_name=<previous-tag> -q .body
```

Keep this list, its "New Contributors" section, and the "Full Changelog"
line verbatim; they close the notes.
3. Read the body of every PR that adds a component, a public API, a platform,
or a behavior change, with `gh pr view <n> --json title,body`. Take API
names, method names, and `## Breaking Changes` diff blocks from the PR
text; never invent a name from the title alone. Fix-only PRs can be
summarized from their titles.

## Write

Produce one Markdown document in this shape, in English:

```markdown
# GPUI Kit <tag>

<Two or three sentences: the headline features first, then what else the
release improves.>

## <Theme>

- **<Feature>**: what a consumer can now do, with the API in backticks.
([#123](https://github.com/longbridge/gpui-kit/pull/123))
- Fixed ... ([#124](...), [#125](...))

...

## Breaking Changes <!-- only when a PR has one -->

<One sentence per change naming the PR, then its diff block.>

Thank you to everyone who contributed code, documentation, testing, and feedback!

## What's Changed
<verbatim list>

## New Contributors
<verbatim list>

**Full Changelog**: <verbatim line>
```

Rules:

- Group by product area, ordered by significance: headline features (new
platforms, new components), then editor and text input, Markdown and text
rendering, motion, dock, other components (one bold component name per
bullet), shell, runtime and platform, documentation and website. Drop a
section that has nothing to say; merge small ones.
- Every bullet cites its PR numbers as `[#n](https://github.com/longbridge/gpui-kit/pull/n)`
at the end, in parentheses. Combine PRs that land one change into one bullet.
- Leave out chores, CI, lockfile refreshes, test-only changes, and a PR that
reverts another PR in the same release (leave both out).
- Bold the feature, not the sentence; write what it does for an application,
not what the diff touched.
- Do not create or edit the GitHub release unless asked. Save the document to
the scratchpad and show it, so it can be pasted into the release draft.
Loading