NSH 0.5.1
NSH 0.5.1 is a patch release of 0.5.0 with bug fixes only: no new features and no API changes, so apps built for 0.5.0 run unchanged. It collects the fixes made on main since 0.5.0 that are safe to take into the 0.5 line.
Most of the fixes concern details people meet every day: lists and scroll views that keep their place, text input that behaves as the platform's own, overlays and dialogs that keep the focus where it belongs, and Windows windows that redraw cleanly. The runtime also bounds what it reads from app values and returns memory it no longer needs.
Layout, lists, and scrolling
- Views made late get their layout at once. Inputs, scroll views, and paced views in list cells created after layout receive their content box, extent, and frame when they are made; a culled scroll view has its content size before its first scroll; rows in a list cell that waited appear at once. (#1682, #1794, #1800, #1823, #1812)
- Lists hold their place. The first visible row stays where it is while rows above it are measured, sticky rows stay below the list's built-in scroll bar, and JS work queued before binding the overscan is applied first. (#1704, #1909, #1861)
- Text and inline views. A padded label stays on one line at fractional pixel ratios, inline views sit on their wrapped line in headless layout, views inside text show their content in a scroll view, and views nested in culled inline attachments can be revealed. (#1705, #1787, #1948, #1742)
- Styles and hit testing.
hover:andactive:styles reach a nestedTextunder the pointer, headers and list content resolve their classes again when design tokens change, a child's hit slop takes touches outside its parent, a multiline input's parent stops at the input's maximum height, and unstyled component hosts lay out through to their single node. (#1859, #1769, #1751, #1788, #2016)
Overlays, focus, and accessibility
- Overlays and dialogs. Anchored overlays lay out within the room they are placed in, a submenu's first item lines up with its trigger,
HoverCardfollows the pointer only, bottom sheets and menus stay above the software keyboard, and dragging a sheet ends editing. On the web, an open dialog is removed with the subtree that held it; on Windows, a click on awindowDragview closes overlays. (#1938, #1825, #1695, #1872, #1856, #1693, #1658) - Focus. Removing an element with the focus inside reports the focus leaving, and macOS keeps the keyboard focus out of hidden views. (#1980, #1832)
- Screen readers and alerts. macOS reads an alert as it appears and as it changes, and shows alerts in front while the app's window is out of sight; Linux moves the screen reader to views that take no keyboard focus; the web keeps the typing field's focus when the screen reader moves. (#1699, #1697, #1851, #1848)
Text input
- Desktop. macOS clears stale undo actions before editor changes, keeps a growing multiline input's caret in view, and keeps typed quotes and dashes when
autoCorrectis off. Windows draws input text at the target's scale, scrolls multiline inputs with the wheel, and reports what an input method writes through TSF as it writes it. GPUI blurs the focused field once the mouse starts selecting text. (#1694, #1921, #1978, #1816, #1976, #1994, #1968) - Mobile and web. Android 15 keeps input text centered with natural carets and short text on one line; an input in a dialog dismisses its keyboard on Android; iOS keeps a long-press selection when the touch ends; the web turns autocorrection off with
autoCorrect={false}. (#1929, #1871, #2001, #1806, #1883) - Password inputs keep their behavior when the password is revealed. (#1828)
Components
RichEditor. An editor without a height sizes to its content, task items' text sits where it is drawn, the sink takes the root padding and fills the viewport, Enter on a checked task starts an unchecked one, a checkbox press survives a pointer that moves as it lands, code blocks show the selection, and the caret and presses follow an inline view's width. (#1690, #1706, #1702, #1797, #1798, #1837, #1894)Editor,TextView, andDiffView. The editor measures in the user's text size so rows fit their text;TextViewkeeps a bare URL in a link's text as text and sizes the app's own images against the text's width;DiffViewkeeps unwrapped lines on one row at larger text sizes. (#1808, #1715, #1782, #1804)TerminalandDataTable. The terminal sends Command's line editing keys as macOS terminals do, reports its first size even at 80 × 24, and keeps each character on its cells; scaled web scrollbars ofDataTablestay stable at rest. (#1633, #1638, #1649, #1721)
Windows
- Clean partial frames. Partial redraws no longer leave behind what was drawn before, in transparent and opaque windows alike; the first composed frame keeps its alpha, and views that cannot paint stay out of the frame. (#1993, #1995, #1975, #2020, #1973)
- Window and app lifecycle. Pressing a window's frame activates it, a closed app exits without tearing down its UI thread, a destroyed window releases its focused field before the thread exits, apps can save their state when the session ends, and the app goes to the background while the screen cannot be seen. (#1717, #1992, #1801, #1744, #1867)
Other platforms
- macOS. Leaving full screen comes before hiding a window, traffic lights keep their spacing with a custom offset, and text redraws when a layout animation grows its height. (#1772, #1907, #1758)
- Linux and the desktop runners. Flatpak and Snap browsers are found without
XDG_DATA_DIRS; the Windows and Linux runners leave an app's own logger in place. (#1908, #1703) - GPUI. Images and icons turn with their rotated views, and a clamped text's last line is cut at its box rather than after a word. (#1864, #1918)
- iOS. Large titles show expanded with the content below them, a page stays below its header after a headerless page is popped, and a blocking responder's drag no longer swipes its page back. (#1811, #1890, #1757)
- Android and mobile touch. A zoomed
Scrollin a pager pans before the pager pages, touches inside a scroll view survive scroll commands, a pan view keeps its drags from the scroll view under it, a tap goes through a scroll view once the keyboard is down, and only the tap is stopped in a scroll view with the keyboard up. A stack's screens take the app's own appearance, the development error screen stays clear of side insets, and Rust apps get the declared environment undernsh run. On the web, a pager turns its pages from a zoomableScrollunder the finger. (#1732, #1714, #1745, #1755, #1792, #1950, #1898, #1958, #1887)
Runtime reliability and memory
- Bounded reads of app values. The runtime bounds the array items it reads natively and what its decoders read of the values apps pass. (#1685, #1954)
- Memory and ownership. A cancelled task's timer is dropped at once, the animation graph keeps storage only for live nodes, a list's empty cell is disposed with its list, a root no longer takes its freed owner's reused slot, and a removed dialog's dismiss handler stays outside cycle collection. (#1866, #2005, #1990, #1991, #1698)
- Compiled JSX. A component's children stay apart when shown beside its own branch, and an
If's else expression follows what it reads. (#1941, #1943) - Hosts and grants. Calls stay on the page's host when the page passes parameters, and media files open under the host's narrower grant. (#1840, #1677)
Developer tooling and tests
- CLI and development. The spinner line is drawn in one write so it no longer flickers, a cross-built Windows package's update archive is named for Windows, and a reconnecting host catches up with the hot updates it missed. (#1733, #2021, #1983)
- Tests. Headless runs break the line on Shift+Return in a submitting multiline input, keep Tab inside the newest dialog and give the focus back when it closes (as the desktops do), settle a step once the engine has handled it, avoid false cover errors for wholly clipped targets, and keep removed views from hearing hover and keys. The macOS test agent's presses land where it aims on a locked screen. (#1679, #1696, #1771, #1862, #1735, #1750, #1729)
Upgrading from 0.5.0
Update the toolchain to 0.5.1 ( Thanks to everyone who contributed to this release:
@0xbentang @ahonn @akongG @Amamiya23 @BeADre @Blackman99 @blueberrycongee @ClarkThan @Cooooooker @cosformula @crizant @daoleno @dXnSix @hmziqrs @huacnlee @jcdiv47 @kim0 @LeeDashan @Liguoqiang-code @linyisu @LVtomatoJ @madcodelife @mengyinghu-sys @mliem2k @obito-t @richerfu @subframe7536 @sunfuze @tacshi @ttizze @Tzyito @villatothesea @wenlingang @WillisXue @YougLin-dev
nsh update) and rebuild; crates depending on 0.5 pick up 0.5.1 with cargo update. No code or configuration changes are needed. If your app worked around any of the behavior fixed here, check whether the workaround is still needed.
Contributors
What's Changed
What's Changed
New Contributors
New Contributors
Full Changelog: v0.5.0...v0.5.1