The Smooooth release
This is a big release!
- Arbitrary text selection. You can now select text, and hit ctrl+c to copy it to the clipboard. This works just about everywhere, although there a re a few widgets were it isn't yet implemented.
Screen.Recording.2025-02-16.at.11.59.14.mov
- Smoother scrolling, for Kitty, Ghostty, and some other terminals.
- New content system
- Many fixes, see the full changelog below...
Breaking change: Strings returned from render() and other places will now be interpreted with Content.from_markup, rather than Rich.from_markup. This may result in slightly different colors, and emoji codes (like ":smiley:") will no longer be processed automatically. If you want to restore the old behavior you can return Rich.from_markup("Your output here") rather than string literal.
Why 2.0.0 ?
It took us more than 3 years to get to 1.0. But a couple of months to get to 2.0? Why?
We follow Semver which says that after 1.0, all breaking changes bump the major version number. We have some breaking changes here, which will be trivial to fix -- if they effect you at all. But a breaking change is a breaking change!
2.0.0 - 2024-02-16
Added
- Added
Select.type_to_searchwhich allows you to type to move the cursor to a matching option #5403 - Added
from_app_focustoFocusevent to indicate if a widget is being focused because the app itself has regained focus or not #5379 - Added
Blurredmessage toInputwidget (matchingSubmittedandChanged) to make it easier to synchronize withvalidate_onparameter when set to 'blur'. - Added
Offset.transpose#5409 - Added
screen--selectioncomponent class to define style for selection #5409 - Added
Widget.select_containerproperty #5409 - Added
Widget.select_all#5409 - Added
Region.bottom_right_inclusive#5409 - Added double click to select, triple click to select all in container #5409
- Added arbitrary text selection #5409
- Added Widget.ALLOW_SELECT classvar for a per-widget switch to disable text selection #5409
- Added Widget.allow_select method for programmatic control of text selection #5409
- Added App.ALLOW_SELECT for a global switch to disable text selection #5409
- Added
DOMNode.query_ancestor#5409 - Added selection to Log widget #5467
- Added
text-wrapandtext-overflowCSS values #5485 - Added Textual markup to replace Rich markup #5485
- Added
Content.from_markup#5485
Fixed
- Fixed
Pilot.clicknot working withtimesparameter #5398 - Fixed select refocusing itself too late #5420
- Fixed layout of the keys in the help panel when a key has a tooltip but no description #5436
- The content of an
Inputwill now only be automatically selected when the widget is focused by the user, not when the app itself has regained focus (similar to web browsers). #5379 - Updated
TextAreaandInputbehavior when there is a selection and the user presses left or right #5400 - Footer can now be scrolled horizontally without holding
shift#5404 - Modified _on_blur method in
Inputto post aBlurredmessage - Fixed Log widget not refreshing on resize #5460
- Fixed special case with calculating the height of a container where all children have dynamic heights #5463
- Fixed scrollbars ignoring background opacity #5458
- Fixed
Headericon showing command palette tooltip when disabled #5427
Changed
- Breaking change: OptionList no longer supports
Separator, a separator may be specified withNone - Implemented smooth (pixel perfect) scrolling on supported terminals. Set
TEXTUAL_SMOOTH_SCROLL=0to disable.
Removed
- Breaking change: Removed
wrapargument from OptionList (use CSStext-wrap: nowrap; text-overflow: ellipses) - Breaking change: Removed
tooltipargument from OptionList. Usetooltipattribute orwith_tooltip(...)method.