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 SelectionList issues after removing an option https://github.com/Textualize/textual/pull/4464
SelectionList issues after removing an option https://github.com/Textualize/textual/pull/4464ListView bugs with the initial index https://github.com/Textualize/textual/pull/4452Select not closing https://github.com/Textualize/textual/pull/4499loading=False removing all child loading indicators https://github.com/Textualize/textual/pull/4499App.exit(), the console no longer highlights things such as numbers.message_signal to MessagePump, to listen to events sent to another widget. https://github.com/Textualize/textual/pull/4487Widget.suppress_click https://github.com/Textualize/textual/pull/4499> Believe it or not...this is the transcript of an actual radio conversation between a US naval ship and Canadian authorities off the coast of Newfoun
Believe it or not...this is the transcript of an actual radio conversation between a US naval ship and Canadian authorities off the coast of Newfoundland in October 1995. The Radio conversation was released by the Chief of Naval Operations on Oct. 10, 1995.
US Ship: Please divert your course 0.5 degrees to the south to avoid a collision.
CND reply: Recommend you divert your course 15 degrees to the South to avoid a collision.
US Ship: This is the Captain of a US Navy Ship. I say again, divert your course.
CND reply: No. I say again, you divert YOUR course!
US Ship: THIS IS THE AIRCRAFT CARRIER USS CORAL SEA*, WE ARE A LARGE WARSHIP OF THE US NAVY. DIVERT YOUR COURSE NOW!!
CND reply: This is a lighthouse. Your call.
Fixed TextArea to end mouse selection only if currently selecting https://github.com/Textualize/textual/pull/4436
TextArea to end mouse selection only if currently selecting https://github.com/Textualize/textual/pull/4436Fixed an off-by-one error in the line number of the Document.end property https://github.com/Textualize/textual/issues/4426
Document.end property https://github.com/Textualize/textual/issues/4426Offset.clamp and Size.clamp_offset https://github.com/Textualize/textual/pull/4435Adds support for copying to the clipboard
Adds support for copying to the clipboard
https://textual.textualize.io/api/app/#textual.app.App.copy_to_clipboard
Integer validator missing failure description when not a number https://github.com/Textualize/textual/issues/4413DataTable if you clicked a link in the border https://github.com/Textualize/textual/issues/4410App.copy_to_clipboard https://github.com/Textualize/textual/pull/4416Disabled terminal synchronization in inline mode as it breaks on some terminals
100th release, and it has to be a hot fix. 🤷♂️
100th release, and it has to be a hot fix. 🤷♂️
Fixed inline mode not clearing with multiple screen
Fixed flicker when non-current screen updates https://github.com/Textualize/textual/pull/4401
A relatively small update here. See below for details...
A relatively small update here. See below for details...
Size.with_width and Size.with_height https://github.com/Textualize/textual/pull/4393Fixed mouse escape sequences being generated with mouse=False
mouse=FalseThe highlight of this release is the new inline feature, which allows you to run Textual apps below the prompt, rather than in application mode.
The highlight of this release is the new inline feature, which allows you to run Textual apps below the prompt, rather than in application mode.
We also have a bunch of additional languages for the TextArea widget, and some fixes.
https://github.com/Textualize/textual/assets/554369/9d961904-cf91-41a4-9c6a-b86e5889d3f6
https://github.com/Textualize/textual/assets/554369/4c4d6a68-5ffc-47ac-a4af-cf11a5e97da6
Widget.compose or workers weren't bubbling up in tests https://github.com/Textualize/textual/issues/4282DataTable scrolling issues by changing max-height back to 100% https://github.com/Textualize/textual/issues/4286Button not rendering correctly with console markup https://github.com/Textualize/textual/issues/4328Document.start and end location properties for convenience https://github.com/Textualize/textual/pull/4267TextArea https://github.com/Textualize/textual/pull/4350inline parameter to run and run_async to run app inline (under the prompt). https://github.com/Textualize/textual/pull/4343mouse parameter to disable mouse support https://github.com/Textualize/textual/pull/4343The ProgressBar widget now has a much improved ETA calculation
The ProgressBar widget now has a much improved ETA calculation
TextArea when undoing an edit to a selection the selection was made backwards https://github.com/Textualize/textual/issues/4301total reactive https://github.com/Textualize/textual/pull/4316Input waits until an edit has been made, after entry to the widget, before offering a suggestion https://github.com/Textualize/textual/pull/4335Fixed issue with data binding https://github.com/Textualize/textual/pull/4308
Lots of refinements and enhancements here!
Lots of refinements and enhancements here!
App.ansi_theme_dark and App.ansi_theme_light https://github.com/Textualize/textual/pull/4192Pilot.resize_terminal to resize the terminal in testing https://github.com/Textualize/textual/issues/4212sort_children method https://github.com/Textualize/textual/pull/4244TextArea.code_editor missing recently added attributes https://github.com/Textualize/textual/pull/4172Sparkline not working with data in a deque https://github.com/Textualize/textual/issues/3899DirectoryTree.path no longer reacting to new values https://github.com/Textualize/textual/issues/4208grid-gutter interaction with Pretty widget https://github.com/Textualize/textual/pull/4219TextArea styling issue on alternate screens https://github.com/Textualize/textual/pull/4220RichLog https://github.com/Textualize/textual/pull/4223RichLog.min_width not being used https://github.com/Textualize/textual/pull/4223CollapsibleTitle.action_toggle to action_toggle_collapsible to fix clash with DOMNode.action_toggle https://github.com/Textualize/textual/pull/4221Switch.action_toggle to action_toggle_switch to fix clash with DOMNode.action_toggle https://github.com/Textualize/textual/issues/4262OptionList.OptionHighlighted leaking out of Select https://github.com/Textualize/textual/issues/4224Tab enable/disable messages leaking into TabbedContent https://github.com/Textualize/textual/issues/4233TabbedContent https://github.com/Textualize/textual/issues/4232TextArea while mouse selection is happening https://github.com/Textualize/textual/issues/4292_ https://github.com/Textualize/textual/pull/4252CollapsibleMarkdownSelectSelectionListTabbedContentTabsTextAreaTreeAppFocus and AppBlur are now posted when the terminal window gains or loses focus, if the terminal supports this https://github.com/Textualize/textual/pull/4265
Tabs) / tab pane (in TabbedContent) can now be unset https://github.com/Textualize/textual/issues/4241Fixed the check for animation level in LoadingIndicator https://github.com/Textualize/textual/issues/4188
Fixes a SyntaxWarning
LoadingIndicator https://github.com/Textualize/textual/issues/4188A few modest changes, with a focus on env vars for some reason.
A few modest changes, with a focus on env vars for some reason.
asyncio lock attribute Widget.lock to be used to synchronize widget state https://github.com/Textualize/textual/issues/4134TEXTUAL_ANIMATIONS to control what animations Textual displays https://github.com/Textualize/textual/pull/4062App.animation_level to control whether animations on that app run or not https://github.com/Textualize/textual/pull/4062TEXTUAL_SCREENSHOT_LOCATION environment variable to specify the location of an automated screenshot https://github.com/Textualize/textual/pull/4181/TEXTUAL_SCREENSHOT_FILENAME environment variable to specify the filename of an automated screenshot https://github.com/Textualize/textual/pull/4181/asyncio lock attribute Widget.lock to be used to synchronize widget state https://github.com/Textualize/textual/issues/4134Widget.remove_children now accepts a CSS selector to specify which children to remove https://github.com/Textualize/textual/pull/4183Widget.batch combines widget locking and app update batching https://github.com/Textualize/textual/pull/4183Note the breaking change below...
Mostly fixes in this updated.
Note the breaking change below...
read_only mode https://github.com/Textualize/textual/pull/4151Tab not being scrolled into view when Tabs.active is assigned https://github.com/Textualize/textual/issues/4150TabbedContent.TabActivate not being posted when TabbedContent.active is assigned https://github.com/Textualize/textual/issues/4150TextArea.tab_behaviour to TextArea.tab_behavior https://github.com/Textualize/textual/pull/4124TextArea.theme now defaults to "css" instead of None, and is no longer optional https://github.com/Textualize/textual/pull/4157read_only mode https://github.com/Textualize/textual/pull/4151Tab not being scrolled into view when Tabs.active is assigned https://github.com/Textualize/textual/issues/4150TabbedContent.TabActivate not being posted when TabbedContent.active is assigned https://github.com/Textualize/textual/issues/4150TextArea.tab_behaviour to TextArea.tab_behavior https://github.com/Textualize/textual/pull/4124TextArea.theme now defaults to "css" instead of None, and is no longer optional https://github.com/Textualize/textual/pull/4157Fixed tint applied to ANSI colors https://github.com/Textualize/textual/pull/4142
A relatively small release for the benefit of an app we are going to release soon.
A relatively small release for the benefit of an app we are going to release soon.
watch to create additional watchers would trigger other watch methods https://github.com/Textualize/textual/issues/3878Markdown https://github.com/Textualize/textual/issues/3997Breaking change: TextArea will not use Escape to shift focus if the tab_behaviour is the default https://github.com/Textualize/textual/issues/4110
This release adds data binding, which can help you write lean code. There are also a few new methods, fixes, and enhancements. See below for the full details...
OptionList by adding max height of 100% https://github.com/Textualize/textual/issues/4021DirectoryTree.clear_node not clearing the node specified https://github.com/Textualize/textual/issues/4122DirectoryTree.reload and DirectoryTree.reload_node now preserve state when reloading https://github.com/Textualize/textual/issues/4056TextArea will not use Escape to shift focus if the tab_behaviour is the default https://github.com/Textualize/textual/issues/4110TextArea cursor will now be invisible before first focus https://github.com/Textualize/textual/pull/4128TextArea.cursor_blink reactive when widget does not have focus https://github.com/Textualize/textual/pull/4128Tree (and DirectoryTree) grew an attribute lock that can be used for synchronization across coroutines https://github.com/Textualize/textual/issues/4056Breaking change: keyboard navigation in RadioSet, ListView, OptionList, and SelectionList, no longer allows highlighting disabled items https://github…
Hotfix for two issues.
OptionList Option.id mappings https://github.com/Textualize/textual/issues/4101RadioSet, ListView, OptionList, and SelectionList, no longer allows highlighting disabled items https://github.com/Textualize/textual/issues/3881A small oversight with the TextArea theme
A small oversight with the TextArea theme
TextArea uses CSS theme by default instead of monokai https://github.com/Textualize/textual/pull/4091Note there is a breaking change here. The TextArea now defaults to a multi-line soft-wrapped editor rather than a more code oriented editor. If you wa…
The highlight of this release is the addition of soft wrapping to the TextArea, which you can see below:
https://github.com/Textualize/textual/assets/554369/73926642-40fa-43c1-94e2-753729465ab9
This makes TextArea one of our most powerful widgets. Looking forward to seeing what you build with it!
Note there is a breaking change here. The TextArea now defaults to a multi-line soft-wrapped editor rather than a more code oriented editor. If you want the original behaviour, use the code_editor classmethod. i.e. replace TextArea with TextArea.code_editor.
Also in this release is a new suspend decorator which will temporarily suspend the currently running app and allow you to launch another terminal app (which doesn't even need to be a Textual app).
There are plenty of other fixes and enhancements. See below for the full details...
TextArea.__init__ default values/behaviour https://github.com/Textualize/textual/pull/3933
soft_wrap=True - soft wrapping is now enabled by default.show_line_numbers=False - line numbers are now disabled by default.tab_behaviour="focus" - pressing the tab key now switches focus instead of indenting by default.TextArea default theme changed to CSS, and default styling changed https://github.com/Textualize/textual/pull/4074DOMNode.has_pseudo_class now accepts a single name only https://github.com/Textualize/textual/pull/3970textual.cache (formerly textual._cache) public https://github.com/Textualize/textual/pull/3976Tab.label can now be used to change the label of a tab https://github.com/Textualize/textual/pull/3979DOMNode.has_pseudo_classes https://github.com/Textualize/textual/pull/3970Widget.allow_focus and Widget.allow_focus_children https://github.com/Textualize/textual/pull/3989TextArea.soft_wrap reactive attribute added https://github.com/Textualize/textual/pull/3933TextArea.tab_behaviour reactive attribute added https://github.com/Textualize/textual/pull/3933TextArea.code_editor classmethod/alternative constructor https://github.com/Textualize/textual/pull/3933TextArea.wrapped_document attribute which can convert between wrapped visual coordinates and locations https://github.com/Textualize/textual/pull/3933show_line_numbers to TextArea.__init__ https://github.com/Textualize/textual/pull/3933TextArea to be styled using CSS https://github.com/Textualize/textual/pull/4074Query.blur and Query.focus https://github.com/Textualize/textual/pull/4012MessagePump.message_queue_size https://github.com/Textualize/textual/pull/4012TabbedContent.active_pane https://github.com/Textualize/textual/pull/4012App.suspend https://github.com/Textualize/textual/pull/4064App.action_suspend_process https://github.com/Textualize/textual/pull/4064animate from DataTable.move_cursor was being ignored https://github.com/Textualize/textual/issues/3840DirectoryTree.show_root was set before the DOM was fully available https://github.com/Textualize/textual/issues/2363SelectionList option IDs are usable as soon as the widget is instantiated https://github.com/Textualize/textual/issues/3903Strip.crop when crop window start aligned with strip end https://github.com/Textualize/textual/pull/3998TextArea language was set but tree-sitter language binaries were not installed https://github.com/Textualize/textual/issues/4045TextArea.SelectionChanged message only sends when the updated selection is different https://github.com/Textualize/textual/pull/3933A hotfix for a bug in nested CSS.
A hotfix for a bug in nested CSS.
Breaking change: Widget.move_child parameters before and after are now keyword-only https://github.com/Textualize/textual/pull/3896
Two highlights of this release, Textual CSS now supports nesting, and there is a new method for waiting on the result of screens.
<img width="865" alt="Screenshot 2024-01-04 at 11 54 40" src="https://github.com/Textualize/textual/assets/554369/7cdb346c-71e3-45db-af96-4b9a15241c2a">
<img width="1452" alt="Screenshot 2024-01-03 at 14 10 56" src="https://github.com/Textualize/textual/assets/554369/2916cdcb-fee0-4ee3-8f05-8efd24970969">
There are also a few fixes. See below for the details...
Widget.move_child would break if before/after is set to the index of the widget in child https://github.com/Textualize/textual/issues/1743Tree.clear not retaining the root's expanded state https://github.com/Textualize/textual/issues/3557Widget.move_child parameters before and after are now keyword-only https://github.com/Textualize/textual/pull/3896Breaking change: tab is no longer a @on decorator selector for TabbedContent.TabActivated -- use pane instead https://github.com/Textualize/textual/pu…
It's been a busy year at Textualize towers. This is probably the last release of the year (barring hotfixes). See you in `24.
A few fixes and smaller changes. Also a nice little speed increase for CSS processing.
TabbedContent now prefix their IDs to stop any clash with their associated TabPane https://github.com/Textualize/textual/pull/3815tab is no longer a @on decorator selector for TabbedContent.TabActivated -- use pane instead https://github.com/Textualize/textual/pull/3815Collapsible.title reactive attribute https://github.com/Textualize/textual/pull/3830pane attribute to TabbedContent.TabActivated https://github.com/Textualize/textual/pull/3815cache parameter to Stylesheet.apply https://github.com/Textualize/textual/pull/3880A hotfix for https://github.com/Textualize/textual/issues/3858
A hotfix for https://github.com/Textualize/textual/issues/3858
Breaking change: Removed limit_rules from Stylesheet.apply https://github.com/Textualize/textual/pull/3844
A relative minor release, feature wise, but this version much faster CSS processing. You may notice this if you have UIs with 100s of widgets.
Also see a new HowTo: https://textual.textualize.io/how-to/render-and-compose/
DataTable.update_cell not raising an error with an invalid column key https://github.com/Textualize/textual/issues/3335Input showing suggestions when not focused https://github.com/Textualize/textual/pull/3808limit_rules from Stylesheet.apply https://github.com/Textualize/textual/pull/3844get_loading_widget to Widget and App customize the loading widget. https://github.com/Textualize/textual/pull/3816Collapsible.Expanded and Collapsible.Collapsed that inherit from Collapsible.Toggled. https://github.com/Textualize/textual/issues/3824A patch to improve scrolling speed when there are many widgets in the screen.
A patch to improve scrolling speed when there are many widgets in the screen.
Scrolling show now be buttery smooth for the screen and other scrolling containers (like the ListView).
Breaking change: Dropped 3.7 support https://github.com/Textualize/textual/pull/3766
This release drops support for Python3.7
Additionally, there are a few fixes and some changes. See below for details
link-hover-background renamed to link-background-hoverlink-hover-color renamed to link-color-hoverlink-hover-style renamed to link-style-hoverlink-hover-background renamed to link-background-hoverlink-hover-color renamed to link-color-hoverlink-hover-style renamed to link-style-hoverTree now forces a scroll when scroll_to_node is called https://github.com/Textualize/textual/pull/3786Select.from_values class method that can be used to initialize a Select control with an iterator of values https://github.com/Textualize/textual/pull/3743Fixed NoWidget error https://github.com/Textualize/textual/pull/3779
Fixed clicking on scrollbar moves TextArea cursor https://github.com/Textualize/textual/issues/3763
A hotfix.
The highlight of this release, is the new keyline rule which draws lines around widgets in the margins.
The highlight of this release, is the new keyline rule which draws lines around widgets in the margins.
This is similar to border, but keyline can overlap with neighbouring widgets. Here's a screenshot. Note how the green borders around the widgets intersect with each other.
<img width="1372" alt="Screenshot 2023-11-23 at 21 11 53" src="https://github.com/Textualize/textual/assets/554369/ae05ca0c-d96a-4640-ae2c-8bbfc7fcd03c">
See below for the full changelog.
TextArea when tabs were not fully expanded https://github.com/Textualize/textual/pull/3725Select not updating after changing the prompt reactive https://github.com/Textualize/textual/issues/2983keyline rule https://github.com/Textualize/textual/pull/3669/label property of a Checkbox https://github.com/Textualize/textual/pull/3765label property of a RadioButton https://github.com/Textualize/textual/pull/3765MarkdownTableOfContents.set_table_of_contents renamed to MarkdownTableOfContents.rebuild_table_of_contents https://github.com/Textualize/textual/pull/3730Tree.UnknownNodeID moved out of Tree, import from textual.widgets.tree https://github.com/Textualize/textual/pull/3730TreeNode.RemoveRootError moved out of TreeNode, import from textual.widgets.tree https://github.com/Textualize/textual/pull/3730A few minor breaking changes, see below for details...
Some fixes, improvements, and updates to Pilot (used in testing).
Also some significant improvements in rendering speed.
A few minor breaking changes, see below for details...
blur pseudo class https://github.com/Textualize/textual/issues/3439ScrollableContainer to receive focus https://github.com/Textualize/textual/pull/3632Select.value could be in an invalid state https://github.com/Textualize/textual/issues/3612textual.widgets.select https://github.com/Textualize/textual/pull/3614
InvalidSelectValueError for when setting a Select to an invalid valueEmptySelectError when creating/setting a Select to have no options when allow_blank is FalseSelect methods https://github.com/Textualize/textual/pull/3614
clearis_blankSelect.BLANK to flag an empty selection https://github.com/Textualize/textual/pull/3614restrict, type, max_length, and valid_empty to Input https://github.com/Textualize/textual/pull/3657Pilot.mouse_down to simulate MouseDown events https://github.com/Textualize/textual/pull/3495Pilot.mouse_up to simulate MouseUp events https://github.com/Textualize/textual/pull/3495Widget.is_mounted property https://github.com/Textualize/textual/pull/3709Select.value to None no longer clears the selection (See Select.BLANK and Select.clear) https://github.com/Textualize/textual/pull/3614Button no longer inherits from Static, now it inherits directly from Widget https://github.com/Textualize/textual/issues/3603Just in time for Halloween, we have a new release. There are a lot of fixes, and improvement to startup time. A few breaking changes that are unlikely…
Just in time for Halloween, we have a new release. There are a lot of fixes, and improvement to startup time. A few breaking changes that are unlikely to impact many people.
We also reached the scary milestone of 666 forks!
<img width="741" alt="Screenshot 2023-10-31 at 13 14 29" src="https://github.com/Textualize/textual/assets/554369/03b49953-aff5-40de-a8ad-4a2eed24d8be">
Input.cursor_blink reactive not changing blink state after Input was mounted https://github.com/Textualize/textual/pull/3498Tabs.active attribute value not being re-assigned after removing a tab or clearing https://github.com/Textualize/textual/pull/3498DirectoryTree race-condition crash when changing path https://github.com/Textualize/textual/pull/3498LRUCache.discard https://github.com/Textualize/textual/issues/3537DataTable not scrolling to rows that were just added https://github.com/Textualize/textual/pull/3552DataTable.update_cell https://github.com/Textualize/textual/pull/3551OptionList event leakage from CommandPalette to App.LoadingIndicator https://github.com/Textualize/textual/pull/3498Tabs appeared as a descendant of TabbedContent in the DOM https://github.com/Textualize/textual/pull/3602get_index_from_location / get_location_from_index https://github.com/Textualize/textual/pull/3410TextArea.text https://github.com/Textualize/textual/discussions/3525key argument to the DataTable.sort() method, allowing the table to be sorted using a custom function (or other callable) https://github.com/Textualize/textual/pull/3090initial to all css rules, which restores default (i.e. value from DEFAULT_CSS) https://github.com/Textualize/textual/pull/3566AwaitComplete class, to be used for optionally awaitable return values https://github.com/Textualize/textual/pull/3498Button.ACTIVE_EFFECT_DURATION classvar converted to Button.active_effect_duration attribute https://github.com/Textualize/textual/pull/3498Input.blink_timer made private (renamed to Input._blink_timer) https://github.com/Textualize/textual/pull/3498Input.cursor_blink reactive updated to not run on mount (now init=False) https://github.com/Textualize/textual/pull/3498AwaitTabbedContent class removed https://github.com/Textualize/textual/pull/3498Tabs.remove_tab now returns an AwaitComplete instead of an AwaitRemove https://github.com/Textualize/textual/pull/3498Tabs.clear now returns an AwaitComplete instead of an AwaitRemove https://github.com/Textualize/textual/pull/3498TabbedContent.add_pane now returns an AwaitComplete instead of an AwaitTabbedContent https://github.com/Textualize/textual/pull/3498TabbedContent.remove_pane now returns an AwaitComplete instead of an AwaitTabbedContent https://github.com/Textualize/textual/pull/3498TabbedContent.clear_pane now returns an AwaitComplete instead of an AwaitTabbedContent https://github.com/Textualize/textual/pull/3498Tabs.add_tab now returns an AwaitComplete instead of an AwaitMount https://github.com/Textualize/textual/pull/3498DirectoryTree.reload now returns an AwaitComplete, which may be awaited to ensure the node has finished being processed by the internal queue https://github.com/Textualize/textual/pull/3498Tabs.remove_tab now returns an AwaitComplete, which may be awaited to ensure the tab is unmounted and internal state is updated https://github.com/Textualize/textual/pull/3498App.switch_mode now returns an AwaitMount, which may be awaited to ensure the screen is mounted https://github.com/Textualize/textual/pull/3498You can now set widget.loading=True to replace the widget with a loading indicator.
You can now set widget.loading=True to replace the widget with a loading indicator.
https://twitter.com/willmcgugan/status/1712104087213297791
loading reactive property to widgets https://github.com/Textualize/textual/pull/3509loading reactive property to widgets https://github.com/Textualize/textual/pull/3509Notable breaking change is that the tree-sitter code has been split out. If you need syntax highlighting in the TextArea, you can install it with this…
A mixed bag of fixes and API improvements.
Notable breaking change is that the tree-sitter code has been split out. If you need syntax highlighting in the TextArea, you can install it with this:
pip install "textual[syntax]"
Pilot.click/Pilot.hover can't use Screen as a selector https://github.com/Textualize/textual/issues/3395Tree is initialized/mounted with disabled=True https://github.com/Textualize/textual/issues/3407print locations not being correctly reported in textual console https://github.com/Textualize/textual/issues/3237OptionList https://github.com/Textualize/textual/issues/3455OutOfBounds exception to be raised by Pilot https://github.com/Textualize/textual/pull/3360TextArea.cursor_screen_offset property for getting the screen-relative position of the cursor https://github.com/Textualize/textual/pull/3408Input.cursor_screen_offset property for getting the screen-relative position of the cursor https://github.com/Textualize/textual/pull/3408cell_padding (and respective parameter) to define horizontal cell padding in data table columns https://github.com/Textualize/textual/issues/3435Input.clear method https://github.com/Textualize/textual/pull/3430TextArea.SelectionChanged and TextArea.Changed messages https://github.com/Textualize/textual/pull/3442wait_for_dismiss parameter to App.push_screen https://github.com/Textualize/textual/pull/3477syntax extra https://github.com/Textualize/textual/pull/3398Pilot.click/Pilot.hover now raises OutOfBounds when clicking outside visible screen https://github.com/Textualize/textual/pull/3360Pilot.click/Pilot.hover now return a Boolean indicating whether the click/hover landed on the widget that matches the selector https://github.com/Textualize/textual/pull/3360No Matches message appears in the command palette, thus removing a flicker https://github.com/Textualize/textual/pull/3399Hotfix - added missing highlight files in build distribution https://github.com/Textualize/textual/pull/3370
Nothing published for this version
Breaking change: CSS in DEFAULT_CSS is now automatically scoped to the widget (set SCOPED_CSS=False) to disable
https://textual.textualize.io/blog/2023/09/21/textual-0380-adds-a-syntax-aware-textarea/
DataTable not updating component styles on hot-reloading https://github.com/Textualize/textual/issues/3312DataTable not updating component styles on hot-reloading https://github.com/Textualize/textual/issues/3312Markdown.goto_anchor to return a boolean (if the anchor was found) instead of None https://github.com/Textualize/textual/pull/3334Fixed the command palette crashing with a TimeoutError in any Python before 3.11 https://github.com/Textualize/textual/issues/3320
Hotfix for a TimeoutError
TimeoutError in any Python before 3.11 https://github.com/Textualize/textual/issues/3320Input event leakage from CommandPalette to App.Breaking change: Widget.notify and App.notify now return None https://github.com/Textualize/textual/pull/3275
https://textual.textualize.io/blog/2023/09/15/textual-0370-adds-a-command-palette/
Input is now validated when focus moves out of it https://github.com/Textualize/textual/pull/3193Input.validate_on (and __init__ parameter of the same name) to customise when validation occurs https://github.com/Textualize/textual/pull/3193Screen.TITLEScreen.SUB_TITLEScreen.titleScreen.sub_titleHeader.screen_title and Header.screen_sub_title https://github.com/Textualize/textual/pull/3199DirectoryTree.DirectorySelected message https://github.com/Textualize/textual/issues/3200widgets.Collapsible contributed by Sunyoung Yoo https://github.com/Textualize/textual/pull/2989OptionList while the mouse is hovering over the last option https://github.com/Textualize/textual/issues/3270MarkdownViewer when clicking on a link that contains an anchor https://github.com/Textualize/textual/issues/3094Markdown.load will now attempt to scroll to a related heading if an anchor is provided https://github.com/Textualize/textual/pull/3244TCSS styles layer and layers can be strings https://github.com/Textualize/textual/pull/3169
layer and layers can be strings https://github.com/Textualize/textual/pull/3169App.return_code for the app return code https://github.com/Textualize/textual/pull/3202animate switch to Tree.scroll_to_line and Tree.scroll_to_node https://github.com/Textualize/textual/pull/3210Rule widget https://github.com/Textualize/textual/pull/3209call_next will now have the same prevented messages as when the callback was scheduled https://github.com/Textualize/textual/pull/3065cursor_type to the DataTable constructor.push_screen not updating Screen.CSS styles https://github.com/Textualize/textual/issues/3217layer and layers can be strings https://github.com/Textualize/textual/pull/3169App.return_code for the app return code https://github.com/Textualize/textual/pull/3202animate switch to Tree.scroll_to_line and Tree.scroll_to_node https://github.com/Textualize/textual/pull/3210Rule widget https://github.com/Textualize/textual/pull/3209call_next will now have the same prevented messages as when the callback was scheduled https://github.com/Textualize/textual/pull/3065cursor_type to the DataTable constructor.push_screen not updating Screen.CSS styles https://github.com/Textualize/textual/issues/3217DataTable.add_row accepts height=None to automatically compute optimal height for a row https://github.com/Textualize/textual/pull/3213Fixed flash of 80x24 interface in textual-web
A small release, feature wise. Mainly to add support for Textual web on Windows.
A small release, feature wise. Mainly to add support for Textual web on Windows.
disabled in tab panes https://github.com/Textualize/textual/pull/3152TabbedContent https://github.com/Textualize/textual/pull/3150Nothing published for this version
Methods TabbedContent.disable_tab and TabbedContent.enable_tab https://github.com/Textualize/textual/pull/3112
TabbedContent.disable_tab and TabbedContent.enable_tab https://github.com/Textualize/textual/pull/3112Tabs.disable and Tabs.enable https://github.com/Textualize/textual/pull/3112Tab.Disabled, Tab.Enabled, Tabs.TabDisabled and Tabs.Enabled https://github.com/Textualize/textual/pull/3112TabbedContent.hide_tab and TabbedContent.show_tab https://github.com/Textualize/textual/pull/3112Tabs.hide and Tabs.show https://github.com/Textualize/textual/pull/3112Tabs.TabHidden and Tabs.TabShown https://github.com/Textualize/textual/pull/3112ListView.extend method to append multiple items https://github.com/Textualize/textual/pull/3012auto token to detect the optimal size https://github.com/Textualize/textual/pull/3107page_up and page_down bug in DataTable when show_header = False https://github.com/Textualize/textual/pull/3093Some fixes, and a new Digits widget
Some fixes, and a new Digits widget
https://github.com/Textualize/textual/assets/554369/00df82cc-0180-41b0-9788-8faafe84c451
SelectionList.clear_options https://github.com/Textualize/textual/pull/3075MouseMove events bubble up from widgets. App and Screen receive MouseMove events even if there's no Widget under the cursor. https://github.com/Textualize/textual/issues/2905OptionList https://github.com/Textualize/textual/issues/2603DirectoryTree.reload_node method https://github.com/Textualize/textual/issues/2757BORDER_TITLE and BORDER_SUBTITLE classvars to Widget https://github.com/Textualize/textual/pull/3097SelectionList.clear_options https://github.com/Textualize/textual/pull/3075MouseMove events bubble up from widgets. App and Screen receive MouseMove events even if there's no Widget under the cursor. https://github.com/Textualize/textual/issues/2905DOMNode.visible now takes into account full DOM to report whether a node is visible or not.Widget.focusable_children https://github.com/Textualize/textual/pull/3070OptionList https://github.com/Textualize/textual/issues/2603DirectoryTree.reload_node method https://github.com/Textualize/textual/issues/2757BORDER_TITLE and BORDER_SUBTITLE classvars to Widget https://github.com/Textualize/textual/pull/3097New Log widget, and TextLog has been renamed to RichLog (breaking change)
New Log widget, and TextLog has been renamed to RichLog (breaking change)
https://github.com/Textualize/textual/assets/554369/1f9d9fcc-3965-4b51-8eb1-e6ca134587e8
Fixes and updates. Also a few breaking changes, see below for details...
Fixes and updates. Also a few breaking changes, see below for details...
App.stop_animation https://github.com/Textualize/textual/issues/2786Widget.stop_animation https://github.com/Textualize/textual/issues/2786thread=True keyword argument is passed https://github.com/Textualize/textual/pull/2938Markdown.load no longer captures all errors and returns a bool, errors now propagate https://github.com/Textualize/textual/issues/2956DataTable now has max-height: 100% https://github.com/Textualize/textual/issues/2959SelectionList had a prompt wider than itself https://github.com/Textualize/textual/issues/2900Click events were bubbling up from Switch widgets https://github.com/Textualize/textual/issues/2366DataTable hover highlighting https://github.com/Textualize/textual/issues/2909https://textual.textualize.io/blog/2023/07/17/textual-0300-adds-desktop-style-notifications/
https://textual.textualize.io/blog/2023/07/17/textual-0300-adds-desktop-style-notifications/
DataTable.remove_column method https://github.com/Textualize/textual/pull/2899on_complete callback to scroll methods https://github.com/Textualize/textual/pull/2903https://textual.textualize.io/blog/2023/07/03/textual-0290-refactors-dev-tools/
https://textual.textualize.io/blog/2023/07/03/textual-0290-refactors-dev-tools/
textual command) in to external lib (textual-dev).Markdown.update optionally awaitable https://github.com/Textualize/textual/pull/2838default parameter to DataTable.add_column for populating existing rows https://github.com/Textualize/textual/pull/2836DataTable https://github.com/Textualize/textual/pull/2836textual command) in to external lib (textual-dev).DataTable.get_cell type hints to accept string keys https://github.com/Textualize/textual/issues/2586DataTable.get_cell_coordinate methodDataTable.get_row_index method https://github.com/Textualize/textual/issues/2587DataTable.get_column_index methodMarkdown.update optionally awaitable https://github.com/Textualize/textual/pull/2838default parameter to DataTable.add_column for populating existing rows https://github.com/Textualize/textual/pull/2836DataTable https://github.com/Textualize/textual/pull/2836Nothing published for this version
Nothing published for this version
Mostly fixes for Markdown issues.
Mostly fixes for Markdown issues.
Markdown https://github.com/Textualize/textual/issues/2781Markdown https://github.com/Textualize/textual/issues/2676Markdown being added to the focus chain https://github.com/Textualize/textual/issues/2380Tabs posting unnecessary messages when removing non-active tabs https://github.com/Textualize/textual/issues/2807Markdown https://github.com/Textualize/textual/pull/2803MarkdownBlock as an exported symbol in textual.widgets.markdown https://github.com/Textualize/textual/pull/2803Breaking change: The @on decorator will now match a message class and any child classes https://github.com/Textualize/textual/pull/2746
CSS to screens https://github.com/Textualize/textual/issues/2137CSS_PATH to screens https://github.com/Textualize/textual/issues/2137cursor_foreground_priority and cursor_background_priority to DataTable https://github.com/Textualize/textual/pull/2736center parameter to Widget.scroll_to_regionorigin_visible parameter to Widget.scroll_to_regionorigin_visible parameter to Widget.scroll_to_centerTabbedContent.tab_count https://github.com/Textualize/textual/pull/2751TabbedContent.add_pane https://github.com/Textualize/textual/pull/2751TabbedContent.remove_pane https://github.com/Textualize/textual/pull/2751TabbedContent.clear_panes https://github.com/Textualize/textual/pull/2751TabbedContent.Cleared https://github.com/Textualize/textual/pull/2751TreeNode.label on an existing Tree node not immediately refreshing https://github.com/Textualize/textual/pull/2713__eq__ protocol in DataTable https://github.com/Textualize/textual/pull/2705OptionList could be invalid for short window after clear_options https://github.com/Textualize/textual/pull/2754Tooltip causing a query_one on a lone Static to fail https://github.com/Textualize/textual/issues/2723Tabs Underline highlight getting "lost" in some extreme situations https://github.com/Textualize/textual/pull/2751@on decorator will now match a message class and any child classes https://github.com/Textualize/textual/pull/2746Tabs.add_tab is now optionally awaitable https://github.com/Textualize/textual/pull/2778Tabs.add_tab now takes before and after arguments to position a new tab https://github.com/Textualize/textual/pull/2778Tabs.remove_tab is now optionally awaitable https://github.com/Textualize/textual/pull/2778Tabs.clear has been changed from returning self to being optionally awaitable https://github.com/Textualize/textual/pull/2778https://textual.textualize.io/blog/2023/06/01/textual-adds-sparklines-selection-list-input-validation-and-tool-tips/
https://textual.textualize.io/blog/2023/06/01/textual-adds-sparklines-selection-list-input-validation-and-tool-tips/
scroll_to_center when there were nested layers out of view (Compositor full_map not populated fully) https://github.com/Textualize/textual/pull/2684Select widget value attribute was set in compose https://github.com/Textualize/textual/pull/2690switch_screen not updating the results callback appropriately https://github.com/Textualize/textual/issues/2650work decorator accepts description parameter to add debug string https://github.com/Textualize/textual/issues/2597SelectionList widget https://github.com/Textualize/textual/pull/2652App.AUTO_FOCUS to set auto focus on all screens https://github.com/Textualize/textual/issues/2594scroll_to_center to ensure we don't scroll such that the top left corner of the widget is not visible https://github.com/Textualize/textual/pull/2682Widget.tooltip property https://github.com/Textualize/textual/pull/2670Region.inflect https://github.com/Textualize/textual/pull/2670Suggester API to compose with widgets for automatic suggestions https://github.com/Textualize/textual/issues/2330SuggestFromList class to let widgets get completions from a fixed set of options https://github.com/Textualize/textual/pull/2604Input has a new component class input--suggestion https://github.com/Textualize/textual/pull/2604Widget.remove_children https://github.com/Textualize/textual/pull/2657Validator framework and validation for Input https://github.com/Textualize/textual/pull/2600message_hook to App.run_test https://github.com/Textualize/textual/pull/2702Placeholder now sets its color cycle per app https://github.com/Textualize/textual/issues/2590__rich_repr__ method if needed. https://github.com/Textualize/textual/pull/2623Screen.AUTO_FOCUS to None will inherit AUTO_FOCUS from the app instead of disabling it https://github.com/Textualize/textual/issues/2594Screen.AUTO_FOCUS to "" will disable it on the screen https://github.com/Textualize/textual/issues/2594handler_name class var which contains the name of the default handler method.Message.control is now a property instead of a class variable. https://github.com/Textualize/textual/issues/2528Tree and DirectoryTree Messages no longer accept a tree parameter, using self.node.tree instead. https://github.com/Textualize/textual/issues/2529Input is also used to accept a suggestion if the cursor is at the end of the input https://github.com/Textualize/textual/pull/2604Input.__init__ now accepts a suggester attribute for completion suggestions https://github.com/Textualize/textual/pull/2604switch_screen to switch to the currently active screen is now a no-op https://github.com/Textualize/textual/pull/2692Placeholder.reset_color_cycleWidget.reset_focus (now called Widget.blur) https://github.com/Textualize/textual/issues/2642New behaviour related to focus. If a newly focused widget is not in view, then it will scroll to center. This more closely matches how browsers behave
New behaviour related to focus. If a newly focused widget is not in view, then it will scroll to center. This more closely matches how browsers behave.
App title and sub_title attributes can be set to any type https://github.com/Textualize/textual/issues/2521
title and sub_title attributes can be set to any type https://github.com/Textualize/textual/issues/2521DirectoryTree now loads directory contents in a worker https://github.com/Textualize/textual/issues/2456Widget.move_child where the target and the child being moved are the same is now a no-op https://github.com/Textualize/textual/issues/1743dismiss on a screen that is not at the top of the stack now raises an exception https://github.com/Textualize/textual/issues/2575MessagePump.call_after_refresh and MessagePump.call_later will now return False if the callback could not be scheduled. https://github.com/Textualize/textual/pull/2584ZeroDivisionError in resolve_fraction_unit https://github.com/Textualize/textual/issues/2502TreeNode.expand and TreeNode.expand_all not posting a Tree.NodeExpanded message https://github.com/Textualize/textual/issues/2535TreeNode.collapse and TreeNode.collapse_all not posting a Tree.NodeCollapsed message https://github.com/Textualize/textual/issues/2535TreeNode.toggle and TreeNode.toggle_all not posting a Tree.NodeExpanded or Tree.NodeCollapsed message https://github.com/Textualize/textual/issues/2535footer--description component class was being ignored https://github.com/Textualize/textual/issues/2544Input would raise an exception https://github.com/Textualize/textual/issues/2563Screen.AUTO_FOCUS now focuses the first focusable widget that matches the selector https://github.com/Textualize/textual/issues/2578Screen.AUTO_FOCUS now works on the default screen on startup https://github.com/Textualize/textual/pull/2581__init__ https://github.com/Textualize/textual/issues/2583Tab https://github.com/Textualize/textual/pull/2589AUTO_FOCUS to screens https://github.com/Textualize/textual/issues/2457NULL_SPACING and NULL_REGION to geometry.pyYour coding agent can read these notes before it upgrades. Set up the MCP server →