NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #97 most downloaded on PyPI
Modern Text User Interface framework
Last release 3 months ago
30 Jun 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 60 of the last 60 stable releases
1 version withdrawn
withdrawn after publishing
5 years old
254 releases · first in 2021
One column per quarter.
Fixed smooth scrolling breaking mouse support in VSCode (and probably others) https://github.com/Textualize/textual/pull/5549
Fixed traceback from OptionList in Command Palette https://github.com/Textualize/textual/pull/5544
Fixed OptionList.add_options exhausting iterator https://github.com/Textualize/textual/pull/5540
Fixed escape tags in Content markup https://github.com/Textualize/textual/pull/5536
A small hotfix:
Breaking change: Strings returned from render() and other places will now be interpreted with Content.from_markup, rather than Rich.from_markup. This…
This is a big release!
https://github.com/user-attachments/assets/91ff4d9e-9d1d-4023-aa52-66bc52bd56f8
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.
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!
Select.type_to_search which allows you to type to move the cursor to a matching option https://github.com/Textualize/textual/pull/5403from_app_focus to Focus event to indicate if a widget is being focused because the app itself has regained focus or not https://github.com/Textualize/textual/pull/5379Blurred message to Input widget (matching Submitted and Changed) to make it easier to synchronize with validate_on parameter when set to 'blur'.Offset.transpose https://github.com/Textualize/textual/pull/5409screen--selection component class to define style for selection https://github.com/Textualize/textual/pull/5409Widget.select_container property https://github.com/Textualize/textual/pull/5409Widget.select_all https://github.com/Textualize/textual/pull/5409Region.bottom_right_inclusive https://github.com/Textualize/textual/pull/5409DOMNode.query_ancestor https://github.com/Textualize/textual/pull/5409text-wrap and text-overflow CSS values https://github.com/Textualize/textual/pull/5485Content.from_markup https://github.com/Textualize/textual/pull/5485Pilot.click not working with times parameter https://github.com/Textualize/textual/pull/5398Input will 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). https://github.com/Textualize/textual/pull/5379TextArea and Input behavior when there is a selection and the user presses left or right https://github.com/Textualize/textual/pull/5400shift https://github.com/Textualize/textual/pull/5404Input to post a Blurred messageHeader icon showing command palette tooltip when disabled https://github.com/Textualize/textual/pull/5427Separator, a separator may be specified with NoneTEXTUAL_SMOOTH_SCROLL=0 to disable.wrap argument from OptionList (use CSS text-wrap: nowrap; text-overflow: ellipses)tooltip argument from OptionList. Use tooltip attribute or with_tooltip(...) method.Breaking change: Change default quit key to ctrl+q https://github.com/Textualize/textual/pull/5352
If you have been following along, this is a relatively modest release. Fixes and some small features.
However, as a 1.0.0 release this is a big milestone for us at Textualize!
A big thank you to @darrenburns @davep @rodrigogiraoserrao and the many community contributors for this release!
Note that 1.0.0 doesn't mean that we are done. Far from it! Watch this space.
See the accompanying blog post for this release...
App.clipboard https://github.com/Textualize/textual/pull/5352system boolean to Binding, which hides the binding from the help panel https://github.com/Textualize/textual/pull/5352chain attribute on Click events https://github.com/Textualize/textual/pull/5369times parameter to Pilot.click method, for simulating rapid clicks https://github.com/Textualize/textual/pull/5369Input widget https://github.com/Textualize/textual/pull/5340ctrl+q https://github.com/Textualize/textual/pull/5352ctrl+shift+k now deletes the current line in TextArea, and ctrl+x will cut
the selection if there is one, otherwise it will cut the current line https://github.com/Textualize/textual/pull/5374Fixes an issue related to docked widgets.
Fixes an issue related to docked widgets.
Breaking change: Document.query_syntax_tree signature changed https://github.com/Textualize/textual/pull/5320
This release updates the tree-sitter dependency to add support for syntax highlighting in Python 3.13
See below for the full update
[!NOTE]
This release will probably be the last before 1.0! Consider it a Release Candidate.
TextArea.update_highlight_query https://github.com/Textualize/textual/pull/5320syntax extras) https://github.com/Textualize/textual/pull/5320Document.query_syntax_tree signature changed https://github.com/Textualize/textual/pull/5320TextArea.register_language signature changed https://github.com/Textualize/textual/pull/5320SyntaxAwareDocument.language_name property removed https://github.com/Textualize/textual/pull/5320TextArea https://github.com/Textualize/textual/pull/5320TextArea.update_highlight_query https://github.com/Textualize/textual/pull/5320Input widget now supports text selection via mouse and keyboard https://github.com/Textualize/textual/pull/5340Input https://github.com/Textualize/textual/pull/5340Input.selection reactive attribute for reading and updating the current selection https://github.com/Textualize/textual/pull/5340Input.select_on_focus (default True) to enable/disable selecting all text in an Input on focus https://github.com/Textualize/textual/pull/5340Input.replace, Input.insert, Input.delete, Input.delete_selection for editing text https://github.com/Textualize/textual/pull/5340Input.selected_text property for getting the currently selected text https://github.com/Textualize/textual/pull/5340Input can now be scrolled independently of cursor position (hold shift and scroll with the mouse wheel in supported environments) https://github.com/Textualize/textual/pull/5340Input reactive attributes view_position, cursor_position (now exists as a property which proxies to the Input.selection reactive attribute), https://github.com/Textualize/textual/pull/5340Input.restrict now checked on all edit operations (rather than just on insert) https://github.com/Textualize/textual/pull/5340syntax extras) https://github.com/Textualize/textual/pull/5320Document.query_syntax_tree signature changed https://github.com/Textualize/textual/pull/5320TextArea.register_language signature changed https://github.com/Textualize/textual/pull/5320SyntaxAwareDocument.language_name property removed https://github.com/Textualize/textual/pull/5320TextArea https://github.com/Textualize/textual/pull/5320Fixed excessive rendering of the OptionList https://github.com/Textualize/textual/pull/5311
Some minor fixes here.
Mostly a bugfix release, as we prepare for 1.0. Some minor API change, that is unlikely to impact anyone.
Mostly a bugfix release, as we prepare for 1.0. Some minor API change, that is unlikely to impact anyone.
Widget.anchor https://github.com/Textualize/textual/pull/5290ListView not updating its index or highlighting after removing items https://github.com/Textualize/textual/issues/5114ListView.pop now returns AwaitComplete rather than AwaitRemove https://github.com/Textualize/textual/pull/5135ListView.remove_items now returns AwaitComplete rather than AwaitRemove https://github.com/Textualize/textual/pull/5135Fixed offset not being applied to grid layout https://github.com/Textualize/textual/pull/5281
Two extra-sneaky bugs fixed.
This version adds support for `position:absolute` in the CSS.
This version adds support for position:absolute in the CSS.
Also in this release is a game added to the demo. Play the game by running the following command:
python -m textual.demo.game
<img width="1519" alt="Screenshot 2024-11-24 at 12 18 10" src="https://github.com/user-attachments/assets/60b179a3-191c-4503-8660-084a52ec8956">
position CSS rule. https://github.com/Textualize/textual/pull/5278Widget.set_scroll https://github.com/Textualize/textual/pull/5278Select.selection https://github.com/Textualize/textual/pull/5278Updated the tutorial (text and code) https://github.com/Textualize/textual/pull/5257
a to add stopwatches in the tutorial app https://github.com/Textualize/textual/pull/5257Fixed visibility glitch for widgets with an offset https://github.com/Textualize/textual/pull/5253
A couple of hot-fixes.
Just a tweak to the demo. ## [0.86.1] - 2024-11-16 ### Fixed - Tweaks to demo
Just a tweak to the demo.
Breaking change: Removed App.dark reactive attribute https://github.com/Textualize/textual/pull/5087
This is a large release!
v0.86.0 Adds an entirely new theming system and an updated demo (Run python -m textual).
The new theming system standardizes the look-and-feel of widgets. This should mean they will look pretty when used in combination, and you will need less tweaking of your UI. If your app already has a customized look and feel, you may need to make a few style changes. Let us know if you need any help with that (jump on the Discord server).
Here's what the demo looks like now:
<img width="1416" alt="Screenshot 2024-11-16 at 18 52 01" src="https://github.com/user-attachments/assets/b97356f9-e865-4a46-b7c7-c3c730a88a31">
https://github.com/user-attachments/assets/2ed5d4a6-b70a-4c7c-a7a2-31dee24800c1
Use the command palette to switch themes...
TextArea mouse selection with tab characters https://github.com/Textualize/textual/issues/5212Tabs not updating the highlighting after removing a tab https://github.com/Textualize/textual/issues/5218App.theme reactive attribute https://github.com/Textualize/textual/pull/5087variant parameter to Label widget for quick access to common styles https://github.com/Textualize/textual/pull/5087App.get_theme which returns a theme by name https://github.com/Textualize/textual/pull/5087App.register_theme and App.unregister_theme https://github.com/Textualize/textual/pull/5087App.theme_changed_signal https://github.com/Textualize/textual/pull/5087App.available_themes property which returns a mapping of theme names to Theme instances https://github.com/Textualize/textual/pull/5087App.current_theme property which returns the currently active theme object https://github.com/Textualize/textual/pull/5087App.get_theme_variable_defaults which returns a mapping of theme variables to their default values https://github.com/Textualize/textual/pull/5087App.search which allows bringing up a fuzzy search list of commands on-demand https://github.com/Textualize/textual/pull/5087App.search_themes which allows bringing up a fuzzy search list of themes on-demand https://github.com/Textualize/textual/pull/5087textual.theme.ThemeProvider, a command palette provider which returns all registered themes https://github.com/Textualize/textual/pull/5087Widget.is_scrolling https://github.com/Textualize/textual/pull/5238Tree.add_json https://github.com/Textualize/textual/pull/5238Driver.process_event is now Driver.process_message https://github.com/Textualize/textual/pull/5217Driver.send_event is now Driver.send_message https://github.com/Textualize/textual/pull/5217can_focus and can_focus_children parameters to scrollable container types. https://github.com/Textualize/textual/pull/5226textual.lazy.Reveal https://github.com/Textualize/textual/pull/5226Screen.action_blur https://github.com/Textualize/textual/pull/5226Click events can now be used with the on decorator to match the originally clicked widget https://github.com/Textualize/textual/pull/5238App.dark reactive attribute https://github.com/Textualize/textual/pull/5087App.HOVER_EFFECTS_SCROLL_PAUSE https://github.com/Textualize/textual/pull/5238An interim fix, for broken focus-within pseudo-selector
An interim fix, for broken focus-within pseudo-selector
Hotfix to fix saving screenshots on Windows
Hotfix to fix saving screenshots on Windows
This versions updates the demo app. The previous demo was written quite a while ago and needed a refresh. It's not *quite* finished (there are plenty
This versions updates the demo app. The previous demo was written quite a while ago and needed a refresh. It's not quite finished (there are plenty more widgets to cover), but it is still a bug improvement over the old one.
python -m textual
Give it a shot, we think it is pretty fun to play with.
https://github.com/user-attachments/assets/6a1742ba-bdb1-4d2b-ab5c-0f9abaf4b503
There are a number of other updates in this release, and some under-the-hood changes for even smoother updates and optimizations. See below for the full list...
Enjoy!
App.open_url automatically https://github.com/Textualize/textual/pull/5113*) will now not match widgets with the class -textual-system (scrollbars, notifications etc) https://github.com/Textualize/textual/pull/5113Screen.can_view and Widget.can_view to Screen.can_view_entire and Widget.can_view_entire https://github.com/Textualize/textual/pull/5174open_links to Markdown and MarkdownViewer widgets https://github.com/Textualize/textual/pull/5113App.DEFAULT_MODE https://github.com/Textualize/textual/pull/5113Containers.HorizontalGroup and Containers.VerticalGroup https://github.com/Textualize/textual/pull/5113$, £, €, (, ) symbols to Digits https://github.com/Textualize/textual/pull/5113Button.action parameter to invoke action when clicked https://github.com/Textualize/textual/pull/5113immediate parameter to scroll methods https://github.com/Textualize/textual/pull/5164textual._loop.loop_from_index https://github.com/Textualize/textual/pull/5164min_color and max_color to Sparklines constructor, which take precedence over CSS https://github.com/Textualize/textual/pull/5174python -m textual, not quite finished but better than the old one https://github.com/Textualize/textual/pull/5174Screen.can_view_partial and Widget.can_view_partial https://github.com/Textualize/textual/pull/5174App.is_web property to indicate if the app is running via a web browser https://github.com/Textualize/textual/pull/5128Enter and Leave events can now be used with the on decorator https://github.com/Textualize/textual/pull/5159This was mainly a hotfix for a potential infinite loop in the TextArea, although there are a few fun additions: see below
This was mainly a hotfix for a potential infinite loop in the TextArea, although there are a few fun additions: see below
RadioSet not being scrollable https://github.com/Textualize/textual/issues/5100background-tint CSS rule https://github.com/Textualize/textual/pull/5117:first-of-type, :last-of-type, :odd, and :even pseudo classes https://github.com/Textualize/textual/pull/5139The Digits widget can now display A-F, so you can use hex!
The Digits widget can now display A-F, so you can use hex!
<img width="925" alt="Screenshot 2024-10-10 at 17 51 02" src="https://github.com/user-attachments/assets/98d6bf95-ca07-4e04-a1c3-c6faac72ebff">
See below for the full changes.
Region.constrain https://github.com/Textualize/textual/pull/5097Screen.ALLOW_IN_MAXIMIZED_VIEW will now default to App.ALLOW_IN_MAXIMIZED_VIEW https://github.com/Textualize/textual/pull/5088.-textual-system will now be included in the maximize view by default https://github.com/Textualize/textual/pull/5088Widget.absolute_offset public https://github.com/Textualize/textual/pull/5097Region.inflect will now assume that margins overlap https://github.com/Textualize/textual/pull/5097Pilot.click and friends will now accept a widget, in addition to a selector https://github.com/Textualize/textual/pull/5095Breaking change: Widget.set_loading no longer return an awaitable https://github.com/Textualize/textual/pull/5079
The highlight of this release is the new keymap support, which enables dynamic configuration of keys -- so you can now provide a way for users of your app to customize key bindings.
Keymaps aren't documented beyond the API level at the moment. That will happen in a few releases. In the meantime, @darrenburns has written up this new feature (which he also implemented) on his blog. Check it out:
https://darren.codes/posts/textual-keymaps/
See below for the full changes:
DOMNode.is_on_screen property https://github.com/Textualize/textual/pull/5063Widget.set_loading no longer return an awaitable https://github.com/Textualize/textual/pull/5079Mostly tree related fixes and a updates. Enjoy.
Mostly tree related fixes and a updates. Enjoy.
x_axis and y_axis parameters to Widget.scroll_to_region https://github.com/Textualize/textual/pull/5047Tree.move_cursor_to_line https://github.com/Textualize/textual/pull/5052x_axis and y_axis parameters to Widget.scroll_to_region https://github.com/Textualize/textual/pull/5047Tree.move_cursor_to_line https://github.com/Textualize/textual/pull/5052Screen.pop_until_active https://github.com/Textualize/textual/pull/5069Couple of crash fixes, see below for details...
Couple of crash fixes, see below for details...
Breaking change: Changed how scrollbars are rendered so they work in ansi mode (will break snapshots) https://github.com/Textualize/textual/pull/5023
This is a large release!
The feature I am most excited about is the new MaskedInput widget, a contribution by Angelo Mottola. Here's a quick preview:
https://github.com/user-attachments/assets/c5256c50-f673-4f91-947d-7803e5c8d263
Here's the full release notes...
MaskedInput widget https://github.com/Textualize/textual/pull/4783"none" value added to dock, hatch and split styles https://github.com/Textualize/textual/pull/4982"none" added to box and border style properties (e.g widget.style.border = "none") https://github.com/Textualize/textual/pull/4982ansi_color switch to App to permit ANSI (themed) colors https://github.com/Textualize/textual/pull/5000:ansi pseudo class https://github.com/Textualize/textual/pull/5000-ansi-scrollbar style to widgets https://github.com/Textualize/textual/pull/5000App.INLINE_PADDING to define the number of spaces above inline apps https://github.com/Textualize/textual/pull/5000nocolor psuedoclass when NO_COLOR env var is setBINDING_GROUP_TITLE now defaults to None https://github.com/Textualize/textual/pull/5023TreeNode.siblings, TreeNode.next_sibling, TreeNode.previous_sibling, TreeNode.is_collapsed https://github.com/Textualize/textual/pull/5023Tree.center_scroll https://github.com/Textualize/textual/pull/5023Tree.unselect https://github.com/Textualize/textual/pull/5023scrollbar-size-vertical changed to 2 in inline styles to match Widget default CSS (unlikely to affect users) https://github.com/Textualize/textual/pull/4982Toast https://github.com/Textualize/textual/pull/4984RichLog result in slightly different semantics, see docstrings for details https://github.com/Textualize/textual/pull/4978enabled switch to filters (mostly used internally) https://github.com/Textualize/textual/pull/5000BINDING_GROUP_TITLE now defaults to None https://github.com/Textualize/textual/pull/5023RichLog.write not respecting width parameter https://github.com/Textualize/textual/pull/4978RichLog writing at wrong width when write occurs before width is known (e.g. in compose or on_mount) https://github.com/Textualize/textual/pull/4978RichLog.write incorrectly shrinking width to RichLog.min_width when shrink=True (now shrinks to fit content area instead) https://github.com/Textualize/textual/pull/4978dark reactive on startup https://github.com/Textualize/textual/pull/4989DataTable cached height issue on re-populating the table when using auto-height rows https://github.com/Textualize/textual/pull/4992inline_no_clear=True https://github.com/Textualize/textual/issues/5019Fixed broken updates when non active screen changes https://github.com/Textualize/textual/pull/4957
A hotfix
Breaking change: DOMNode.query_one will not raise TooManyMatches https://github.com/Textualize/textual/pull/4950
This release optimizes query_one and changes the semantics a little. query_one will no longer raise a TooManyMatches if there is more than a single widget matching the selector. For the old behavior, you can use the new query_exactly_one method.
See also https://textual.textualize.io/guide/devtools/#serve
Check below for the full details!
DOMNode.check_consume_key https://github.com/Textualize/textual/pull/4940App.ESCAPE_TO_MINIMIZE, App.screen_to_minimize, and Screen.ESCAPE_TO_MINIMIZE https://github.com/Textualize/textual/pull/4951DOMNode.query_exactly_one https://github.com/Textualize/textual/pull/4950SelectorSet.is_simple https://github.com/Textualize/textual/pull/4950DOMNode.query_one will not raise TooManyMatches https://github.com/Textualize/textual/pull/4950This release adds a new `maximize` method, which you can use to temporarily full the screen with any given widget. This can be great for allowing the
This release adds a new maximize method, which you can use to temporarily full the screen with any given widget. This can be great for allowing the user to focus on a particular view.
You can maximize via the command palette, or you can bind a key with the action screen.maximize.
Here are some screenshots of this feature in action:
<img width="1302" alt="Screenshot 2024-08-27 at 13 17 19" src="https://github.com/user-attachments/assets/febf001d-ad6d-4751-b5a4-7e957b0b6e05">
<img width="1302" alt="Screenshot 2024-08-27 at 13 17 24" src="https://github.com/user-attachments/assets/98684073-9e4f-44cc-9e67-d26d5ae3f6c3">
<img width="1302" alt="Screenshot 2024-08-27 at 13 17 30" src="https://github.com/user-attachments/assets/aeac55d6-df53-408a-b1d8-648a0ef35c45">
Screen.maximize, Screen.minimize, Screen.action_maximize, Screen.action_minimize, Widget.is_maximized, Widget.allow_maximize. https://github.com/Textualize/textual/pull/4931Widget.ALLOW_MAXIMIZE, Screen.ALLOW_IN_MAXIMIZED_VIEW classvars https://github.com/Textualize/textual/pull/4931There are a number of other smaller changes, fixes, and a few breaking changes. See the detailed release notes below:
This is quite a large release!
We've done a lot of work on the command palette to make it easier to work with and use.
We've also added a "help panel" which you can summon from the command palette. This will give you context sensitive help, and a summary of all the key bindings. Here it is in action:
https://github.com/user-attachments/assets/e954325a-7a2a-4a9b-b3a4-43ff80405967
Also in the command palette is a "save screenshot" command, which will save a screenshot of the current screen. Very handy for adding to documentation.
There are a number of other smaller changes, fixes, and a few breaking changes. See the detailed release notes below:
tooltip to Binding https://github.com/Textualize/textual/pull/4859show_command_palette=False to disable) https://github.com/Textualize/textual/pull/4867TOOLTIP_DELAY to App to customize time until a tooltip is displayedRegion.get_spacing_between https://github.com/Textualize/textual/pull/4876App.COMMAND_PALETTE_KEY to change default command palette key binding https://github.com/Textualize/textual/pull/4867App.get_key_display https://github.com/Textualize/textual/pull/4890DOMNode.BINDING_GROUP https://github.com/Textualize/textual/pull/4906DOMNode.HELP classvar which contains Markdown help to be shown in the help panel https://github.com/Textualize/textual/pull/4915App.get_system_commands https://github.com/Textualize/textual/pull/4920ctrl+p https://github.com/Textualize/textual/pull/4867ctrl_to_caret and upper_case_keys from Footer. These can be implemented in App.get_key_display.SystemCommands to SystemCommandsProvider https://github.com/Textualize/textual/pull/4920ClassicFooter widget (please use new Footer widget) https://github.com/Textualize/textual/pull/4921Screen instances in App.SCREENS and App.MODESvalidate_on value isn't a set https://github.com/Textualize/textual/pull/4868Input.cursor_blink having no effect on the blink cycle after mounting https://github.com/Textualize/textual/pull/4869App.MODES being the same for all instances -- per-instance modes now exist internallyMostly fixes, but there are some refactored code in this release related to key handling and bindings. If you encounter an issues, let us know!
Mostly fixes, but there are some refactored code in this release related to key handling and bindings. If you encounter an issues, let us know!
Size.cip_size, which was a clone of crop_sizeDOMNode._automatic_refresh to DOMNode.automatic_refresh to allow for customization https://github.com/Textualize/textual/pull/4847Size.cip_size, which was a clone of crop_sizeDOMNode._automatic_refresh to DOMNode.automatic_refresh to allow for customization https://github.com/Textualize/textual/pull/4847ESCDELAY env var when detecting escape keys https://github.com/Textualize/textual/pull/4848Fixed issue with Enter events causing unresponsive UI https://github.com/Textualize/textual/pull/4833
https://www.youtube.com/watch?v=BgNTBgJjIRI&ab_channel=LyricsDope
https://www.youtube.com/watch?v=BgNTBgJjIRI&ab_channel=LyricsDope
App.open_url to open URLs in the web browser. When running via the WebDriver, the URL will be opened in the browser that is controlling the app (web side not yet live) https://github.com/Textualize/textual/pull/4819Widget.is_mouse_over https://github.com/Textualize/textual/pull/4818node attribute to events.Enter and events.Leave https://github.com/Textualize/textual/pull/4818events.Enter and events.Leave events now bubble. https://github.com/Textualize/textual/pull/4818Widget.mouse_over to Widget.mouse_hover https://github.com/Textualize/textual/pull/4818mutate_reactive and data binding https://github.com/Textualize/textual/pull/4828Mostly fixes and a small (potentially breaking) change.
Mostly fixes and a small (potentially breaking) change.
Screen.dismiss with no arguments will invoke the screen callback with None (previously the callback wasn't invoke at all). https://github.com/Textualize/textual/pull/4795This is a rather large release. Lots of fixes and enhancements, including optimizations to the DataTable.
This is a rather large release. Lots of fixes and enhancements, including optimizations to the DataTable.
There's also a rather nifty addition to the ProgressBar widget. Checkout the gradient:
https://github.com/user-attachments/assets/adee9cf8-ace6-4ca0-b9fe-13861a9c0bcf
We've also polished the API docs, which should hopefully make them easier to navigate...
https://textual.textualize.io/api/app/
TextArea.line_number_start reactive attribute https://github.com/Textualize/textual/pull/4471TextArea.matching_bracket_location property https://github.com/Textualize/textual/pull/4764DOMNode.mutate_reactive https://github.com/Textualize/textual/pull/4731textual.color.Gradient https://github.com/Textualize/textual/pull/4739textual.color.Gradient.get_rich_color https://github.com/Textualize/textual/pull/4739Widget.remove_children now accepts an iterable if widgets in addition to a selector https://github.com/Textualize/textual/issues/4735ValueError with improved error message when number of cells inserted using DataTable.add_row doesn't match the number of columns in the table https://github.com/Textualize/textual/pull/4742Tree.move_cursor to programmatically move the cursor without selecting the node https://github.com/Textualize/textual/pull/4753Footer component style handling of padding for the key/description https://github.com/Textualize/textual/pull/4651StringKey is now exported from data_table https://github.com/Textualize/textual/pull/4760TreeNode.add and TreeNode.add_leaf now accepts before and after arguments to position a new node https://github.com/Textualize/textual/pull/4772gradient parameter to the ProgressBar widget https://github.com/Textualize/textual/pull/4774Tabs where disabled tabs could still be activated by clicking the underline https://github.com/Textualize/textual/issues/4701DataTable poor performance on startup and focus change when rows contain multi-line content https://github.com/Textualize/textual/pull/4748Tree and DirectoryTree horizontal scrolling off-by-2 https://github.com/Textualize/textual/pull/4744Tree.select_node sends NodeSelected message https://github.com/Textualize/textual/pull/4753CommandPalette not focusing the input when opened when App.AUTO_FOCUS doesn't match the input https://github.com/Textualize/textual/pull/4763SelectionList.SelectionToggled will now be sent for each option when a bulk toggle is performed (e.g. toggle_all). Previously no messages were sent at all. https://github.com/Textualize/textual/pull/4759TreeNodeSelected messages are now posted before TreeNodeExpanded messages
when an expandable node is selected https://github.com/Textualize/textual/pull/4753Markdown.LinkClicked.href is now automatically unquoted https://github.com/Textualize/textual/pull/4749Tree and DirectoryTree will no longer linger after the mouse leaves the widget https://github.com/Textualize/textual/pull/4766A fixes release. The largest of which is a refactor to the logic of removing widgets, which should resolve some instability on shutdown in particular.
A fixes release. The largest of which is a refactor to the logic of removing widgets, which should resolve some instability on shutdown in particular.
Nothing published for this version
Nothing published for this version
Breaking change: App.push_screen now returns an Awaitable rather than a screen. https://github.com/Textualize/textual/pull/4672
App.push_screen now returns an Awaitable rather than a screen. https://github.com/Textualize/textual/pull/4672Screen.dismiss now returns an Awaitable rather than a bool. https://github.com/Textualize/textual/pull/4672Markdown.LinkClicked message https://github.com/Textualize/textual/issues/4683Fixed erroneous mouse 'ButtonDown' reporting for mouse movement when any-event mode is enabled in xterm. https://github.com/Textualize/textual/pull/36
Added App.simulate_key https://github.com/Textualize/textual/pull/4657
A fix with API tweak
App.simulate_key https://github.com/Textualize/textual/pull/4657App.check_bindings is now privateApp.action_check_bindings is now App.action_simulate_keyAdded ContentSwitcher.add_content
ContentSwitcher.add_contentWe've had to revert the VIM keys in the DataTable for now.
We've had to revert the VIM keys in the DataTable for now.
The highlight of this release is support for extended keys. More modern terminals will now have access to a greater number of keys, and modifiers.
The highlight of this release is support for extended keys. More modern terminals will now have access to a greater number of keys, and modifiers.
There are also a number of quality of life improvements for the DataTable, Tree. And some fixes.
ctrl+pageup/ctrl+pagedown will scroll page left/right in DataTable https://github.com/Textualize/textual/pull/4633g/G will scroll to the top/bottom of the DataTable https://github.com/Textualize/textual/pull/4633hjkl key bindings to move the cursor in DataTable https://github.com/Textualize/textual/pull/4633home and end now works horizontally instead of vertically in DataTable https://github.com/Textualize/textual/pull/4633Tree and DirectoryTree nodes now have a bigger click target, spanning the full line https://github.com/Textualize/textual/pull/4636App.CLOSE_TIMEOUT https://github.com/Textualize/textual/pull/4635get_content_height will now return 0 if the renderable is Falsey https://github.com/Textualize/textual/pull/4617
A few additions and changes
get_content_height will now return 0 if the renderable is Falsey https://github.com/Textualize/textual/pull/4617Screen.dismiss is now a noop if the screen isn't active. Previously it would raise a ScreenStackError, now it returns False. https://github.com/Textualize/textual/pull/4621Screen.is_activeicon reactive to Header widget https://github.com/Textualize/textual/pull/4627time_format reactive to Header widget https://github.com/Textualize/textual/pull/4627tooltip parameter to input widgets https://github.com/Textualize/textual/pull/4625A hotfix for https://github.com/Textualize/textual/issues/4607
A hotfix for https://github.com/Textualize/textual/issues/4607
Fixed hot reloading with hatch rule https://github.com/Textualize/textual/pull/4606
The highlight of this release is the new hatch style which can fill a widget's background with a repeating character.
The highlight of this release is the new hatch style which can fill a widget's background with a repeating character.
<img width="1057" alt="Screenshot 2024-06-05 at 12 17 53" src="https://github.com/Textualize/textual/assets/554369/ba9cda83-5958-43bc-956c-f28c71b46af5">
See the docs on hatch
While this could have been a minor release, there are enough accumulated changes and fixes under the hood that it felt worthy of a bump.
While this could have been a minor release, there are enough accumulated changes and fixes under the hood that it felt worthy of a bump.
Markdown.goto_anchor no longer scrolling the heading into view https://github.com/Textualize/textual/pull/4583Fixed issue with bindings not refreshing https://github.com/Textualize/textual/pull/4571
Another hotfix, see below
Another hotfix for DataTables not appearing in tabbed content.
Another hotfix for DataTables not appearing in tabbed content.
Styles.is_auto_width and Style.is_auto_heightAdded immediate switch to Signal.publish
immediate switch to Signal.publishFixes and a change to provide a helpful message to a common error
Fixes and a change to provide a helpful message to a common error
Footer grid size https://github.com/Textualize/textual/pull/4545Hotfix for an issue that broken non-app links.
Hotfix for an issue that broken non-app links.
Hotfix for https://github.com/Textualize/textual/pull/4543
Hotfix for https://github.com/Textualize/textual/pull/4543
Breaking change: New Footer (likely a drop in replacement, unless you have customized styles) https://github.com/Textualize/textual/pull/4537
This release adds an updated footer, and some style tweaks to Markdown.
This may impact you if you have customized the Footer. So please check your apps!
Added start and end properties to Markdown Navigator
start and end properties to Markdown NavigatorWidget.anchor, Widget.clear_anchor, and Widget.is_anchored https://github.com/Textualize/textual/pull/4530Fixes a with auto columns in gutter.
Fixes a with auto columns in gutter.
Breaking change: Actions (as used in bindings) will no longer check the app if they are unhandled. This was undocumented anyway, and not that useful.…
The highlight of this release is the ability to implement "dynamic actions", so you can provide logic about which bindings should be displayed. See the docs for details: https://textual.textualize.io/guide/actions/#dynamic-actions
App.get_default_screen https://github.com/Textualize/textual/pull/4520DOMNode.check_action https://github.com/Textualize/textual/pull/4516"focused" action namespace so you can bind a key to an action on the focused widget https://github.com/Textualize/textual/pull/4516App.namespace_bindings to active_bindingsFixes a dev dependency being in the wrong place.
Fixes a dev dependency being in the wrong place.
Thanks to @davidbrochart for pointing this out.
A small-ish release. A new method and a fix.
A small-ish release. A new method and a fix.
DOMNode.query_children https://github.com/Textualize/textual/pull/4508Your coding agent can read these notes before it upgrades. Set up the MCP server →