Skip to content

Releases: Textualize/textual

The Quickening Release

16 Nov 18:35
Compare
Choose a tag to compare

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:

Screenshot 2024-11-16 at 18 52 01
Screen.Recording.2024-11-16.at.19.08.15.mov

Use the command palette to switch themes...

[0.86.0] - 2024-11-16

Fixed

  • Fixed duplicated key displays in the help panel #5037
  • Fixed TextArea mouse selection with tab characters #5212
  • Fixed Tabs not updating the highlighting after removing a tab #5218

Added

  • Added App.theme reactive attribute #5087
  • Added various starter themes #5087
  • Added "Change theme" command to command palette #5087
  • Added variant parameter to Label widget for quick access to common styles #5087
  • Added App.get_theme which returns a theme by name #5087
  • Added App.register_theme and App.unregister_theme #5087
  • Added App.theme_changed_signal #5087
  • Added App.available_themes property which returns a mapping of theme names to Theme instances #5087
  • Added App.current_theme property which returns the currently active theme object #5087
  • Added App.get_theme_variable_defaults which returns a mapping of theme variables to their default values #5087
  • Added App.search which allows bringing up a fuzzy search list of commands on-demand #5087
  • Added App.search_themes which allows bringing up a fuzzy search list of themes on-demand #5087
  • Added textual.theme.ThemeProvider, a command palette provider which returns all registered themes #5087
  • Added several new built-in CSS variables #5087
  • Added support for in-band terminal resize protocol #5217
  • Added TEXTUAL_THEME environment var, which should be a comma separated list of desired themes #5238
  • Added Widget.is_scrolling #5238
  • Added Tree.add_json #5238

Changed

  • Driver.process_event is now Driver.process_message #5217
  • Driver.send_event is now Driver.send_message #5217
  • Added can_focus and can_focus_children parameters to scrollable container types. #5226
  • Added textual.lazy.Reveal #5226
  • Added Screen.action_blur #5226
  • Click events can now be used with the on decorator to match the originally clicked widget #5238
  • Breaking change: Removed App.dark reactive attribute #5087
  • Breaking change: To improve consistency, several changes have been made to default widget CSS and the CSS variables which ship with Textual. On upgrading, your app will likely look different. All of these changes can be overidden with your own CSS. #5087

Removed

  • Removed App.HOVER_EFFECTS_SCROLL_PAUSE #5238

The Focus, Will, Focus! Release

02 Nov 18:19
2413818
Compare
Choose a tag to compare

An interim fix, for broken focus-within pseudo-selector

[0.85.2] - 2024-11-02

  • Fixed broken focus-within #5190

The Freddy's hotfix Release

26 Oct 18:39
Compare
Choose a tag to compare

Hotfix to fix saving screenshots on Windows

[0.85.1] - 2024-10-26

Fixed

  • Fixed encoding issue when saving files such as screenshots on Windows #5182

The Freddy's Revenge Release

25 Oct 15:06
Compare
Choose a tag to compare

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.

Screen.Recording.2024-10-25.at.16.02.46.mov

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!

[0.85.0] - 2024-10-25

Changed

  • Grid will now size children to the maximum height of a row #5113
  • Markdown links will be opened with App.open_url automatically #5113
  • The universal selector (*) will now not match widgets with the class -textual-system (scrollbars, notifications etc) #5113
  • Renamed Screen.can_view and Widget.can_view to Screen.can_view_entire and Widget.can_view_entire #5174

Added

  • Added Link widget #5113
  • Added open_links to Markdown and MarkdownViewer widgets #5113
  • Added App.DEFAULT_MODE #5113
  • Added Containers.HorizontalGroup and Containers.VerticalGroup #5113
  • Added $, £, , (, ) symbols to Digits #5113
  • Added Button.action parameter to invoke action when clicked #5113
  • Added immediate parameter to scroll methods #5164
  • Added textual._loop.loop_from_index #5164
  • Added min_color and max_color to Sparklines constructor, which take precedence over CSS #5174
  • Added new demo python -m textual, not quite finished but better than the old one #5174
  • Added Screen.can_view_partial and Widget.can_view_partial #5174
  • Added App.is_web property to indicate if the app is running via a web browser #5128
  • Enter and Leave events can now be used with the on decorator #5159

Fixed

  • Fixed glitchy ListView #5163

The Who You Gonna Call Release

22 Oct 13:20
3d65f2b
Compare
Choose a tag to compare

This was mainly a hotfix for a potential infinite loop in the TextArea, although there are a few fun additions: see below

[0.84.0] - 2024-10-22

Fixed

  • Fixed RadioSet not being scrollable #5100
  • Fixed infinite loop in TextArea #5154

Added

  • Added background-tint CSS rule #5117
  • Added :first-of-type, :last-of-type, :odd, and :even pseudo classes #5139

The Enhanced AF Release

10 Oct 13:55
afc310a
Compare
Choose a tag to compare

The Digits widget can now display A-F, so you can use hex!

Screenshot 2024-10-10 at 17 51 02

See below for the full changes.

[0.83.0] - 2024-10-10

Added

  • Added support for A-F to Digits widget #5094
  • Added Region.constrain #5097

Changed

  • Screen.ALLOW_IN_MAXIMIZED_VIEW will now default to App.ALLOW_IN_MAXIMIZED_VIEW #5088
  • Widgets matching .-textual-system will now be included in the maximize view by default #5088
  • Digits are now thin by default, style with text-style: bold to get bold digits #5094
  • Made Widget.absolute_offset public #5097
  • Tooltips are now displayed directly below the mouse cursor #5097
  • Region.inflect will now assume that margins overlap #5097
  • Pilot.click and friends will now accept a widget, in addition to a selector #5095

The Are you the Keymaster Release?

03 Oct 10:12
d76000d
Compare
Choose a tag to compare

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:

[0.82.0] - 2024-10-03

Fixed

  • Fixed issue with screen not updating when auto_refresh was enabled #5063
  • Fixed issues regarding loading indicator #5079
  • Fixed issues with inspecting the lazy loaded widgets module #5080

Added

  • Added DOMNode.is_on_screen property #5063
  • Added support for keymaps (user configurable key bindings) #5038
  • Added descriptions to bindings for all internal widgets, and updated casing to be consistent #5062

Changed

  • Breaking change: Widget.set_loading no longer return an awaitable #5079

The glitch-free-tree release

25 Sep 15:00
c75b169
Compare
Choose a tag to compare

Mostly tree related fixes and a updates. Enjoy.

[0.81.0] - 2024-09-25

Added

  • Added x_axis and y_axis parameters to Widget.scroll_to_region #5047
  • Added Tree.move_cursor_to_line #5052

Changed

  • Tree will no longer scroll the X axis when moving the cursor #5047
  • DirectoryTree will no longer select the first node #5052

Fixed

  • Fixed widgets occasionally not getting Resize events #5048
  • Fixed tree regression #5052
  • Fixed glitch with single line inline widget #5054

The Scanners release

24 Sep 11:22
c81df43
Compare
Choose a tag to compare

Couple of crash fixes, see below for details...

[0.80.1] - 2024-09-24

Fixed

  • Fixed crash when exiting the app prematurely #5039
  • Fixed exception constructing TextArea outside of App #5045

The best decade release

23 Sep 14:59
322a85c
Compare
Choose a tag to compare

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:

Screen.Recording.2024-09-23.at.15.33.49.mov

Here's the full release notes...

[0.80.0] - 2024-09-23

Added

  • Added MaskedInput widget #4783
  • Input validation for floats and integers accept embedded underscores, e.g., "1_234_567" is valid. #4784
  • Support for "none" value added to dock, hatch and split styles #4982
  • Support for "none" added to box and border style properties (e.g widget.style.border = "none") #4982
  • Docstrings added to most style properties #4982
  • Added ansi_color switch to App to permit ANSI (themed) colors #5000
  • Added :ansi pseudo class #5000
  • Added -ansi-scrollbar style to widgets #5000
  • Added App.INLINE_PADDING to define the number of spaces above inline apps #5000
  • Added nocolor psuedoclass when NO_COLOR env var is set
  • BINDING_GROUP_TITLE now defaults to None #5023
  • Added TreeNode.siblings, TreeNode.next_sibling, TreeNode.previous_sibling, TreeNode.is_collapsed #5023
  • Added additional bindings to Tree widget #5023
  • Added Tree.center_scroll #5023
  • Added Tree.unselect #5023

Changed

  • Input validation for integers no longer accepts scientific notation like '1.5e2'; must be castable to int. #4784
  • Default scrollbar-size-vertical changed to 2 in inline styles to match Widget default CSS (unlikely to affect users) #4982
  • Removed border-right from Toast #4984
  • Some fixes in RichLog result in slightly different semantics, see docstrings for details #4978
  • Changed how scrollbars are rendered (will have no visual effect, but will break snapshot tests) #5000
  • Added enabled switch to filters (mostly used internally) #5000
  • BINDING_GROUP_TITLE now defaults to None #5023
  • Breaking change: Changed how scrollbars are rendered so they work in ansi mode (will break snapshots) #5023

Fixed

  • Input validation of floats no longer accepts NaN (not a number). #4784
  • Fixed issues with screenshots by simplifying segments only for snapshot tests #4929
  • Fixed RichLog.write not respecting width parameter #4978
  • Fixed RichLog writing at wrong width when write occurs before width is known (e.g. in compose or on_mount) #4978
  • Fixed RichLog.write incorrectly shrinking width to RichLog.min_width when shrink=True (now shrinks to fit content area instead) #4978
  • Fixed flicker when setting dark reactive on startup #4989
  • Fixed command palette not sorting search results by their match score #4994
  • Fixed DataTable cached height issue on re-populating the table when using auto-height rows #4992
  • Fixed inline app output being cleared when inline_no_clear=True #5019