This is a merge of the CSS branch with a whole load of amazing features. Hope you enjoy.
We are now returning to regular releases and working in the open. Thanks for being patient.
What's Changed
- Outline by @willmcgugan in #195
- Hover pseudo class by @willmcgugan in #201
- Rename visible property to display, add setter by @darrenburns in #213
- Visibility by @darrenburns in #212
- Splitting out parsing of durations into new token types, avoiding Scalar by @darrenburns in #214
- Invisible widgets now dont render by @darrenburns in #219
- Use the
layout
as specified in CSS by @darrenburns in #225 - Margin spacing is now invisible by @darrenburns in #221
- Docstrings for styling properties by @darrenburns in #222
- Underline bar renderable by @darrenburns in #246
- Allow user to supply loop to App.run, ensure it closes by @darrenburns in #236
- Tokenise CSS variables by @darrenburns in #250
- Vertical layout by @darrenburns in #234
- Horizontal layout by @darrenburns in #235
- Variable support in CSS by @darrenburns in #258
- Sparklines by @darrenburns in #269
- Inline styles view by @willmcgugan in #254
- Render opacity by @darrenburns in #272
- Update pyproject.toml homepage link, add docs readme by @darrenburns in #268
- Opacity rules by @darrenburns in #279
- Tabs by @darrenburns in #293
- Bump docs dev dependencies, add Tabs page, add note to docs README by @darrenburns in #301
- Layout Resolver enhancement by @willmcgugan in #295
- Implement CSS defaults by @willmcgugan in #294
- Test animation by @willmcgugan in #303
- Query dom - get child by @darrenburns in #306
- Regions by @darrenburns in #319
- Compositor refactor by @willmcgugan in #333
- Add conversion to/from the CIE-L*ab color space. by @rodrigogiraoserrao in #360
- Stringify the cast type, for <3.10 support by @tusharsadhwani in #351
- WIP New color class by @willmcgugan in #349
- Timer fix by @willmcgugan in #372
- Custom scrollbars by @willmcgugan in #376
- require semi-colons by @willmcgugan in #377
- Logging server by @darrenburns in #366
- Ensure filename is passed to devtools from init by @darrenburns in #383
- tweak to log by @willmcgugan in #384
- Redirect standard output to devtools server and logfile by @darrenburns in #385
- Textual CLI by @darrenburns in #397
- CSS align and box model by @willmcgugan in #398
- optimize crop by @willmcgugan in #414
- fix for showing scrollbars by @willmcgugan in #416
- [css branch] Update _style_properties.py by @lllama in #415
- fix for escape key processing by @willmcgugan in #420
- [widget] Add a test for types of values we handle in style's size by @olivierphi in #428
- [css][bugfix] CSS colors can now have digits at the end of their names by @olivierphi in #441
- [layout][bugfix] Horizontal & Vertical layouts shouldn't display children that have
display: none
by @olivierphi in #436 - button widget by @willmcgugan in #432
- [colors] Add management of named Web colors to our CSS processing, prefix ANSI ones with
ansi_
by @olivierphi in #443 - Style error improvements by @darrenburns in #408
- fix broken align and error logic by @willmcgugan in #446
- Add TEXTUAL features env var by @willmcgugan in #448
- [css] Add a "did you mean" suggestion when an unknown CSS property is spotted by @olivierphi in #445
- Omit style property setter frames from tracebacks by @darrenburns in #457
- Support 3 and 4 character hex strings for colours by @darrenburns in #459
- [CI] Check that the "basic.py" sandbox script can be run for a few seconds without crashing by @olivierphi in #449
- Skip CI-based MacOS devtools tests by @darrenburns in #461
- Remove redundant import by @rjmill in #460
- Add Python 3.10 to GitHub actions, upgrade mypy by @darrenburns in #462
- Add links to CHANGELOG and fix date for v0.1.18 by @bbugyi200 in #454
- Fix README.md typo disapointment->disappointment by @toonarmycaptain in #453
- Fix broken
overflow
CSS rule by @darrenburns in #467 - Update connection instructions in devtools header by @darrenburns in #469
- Remove codecov from Textual by @darrenburns in #470
- Windows CI by @darrenburns in #464
- Tab focus by @willmcgugan in #458
- [API] Start accepting PathLike objects here and there by @olivierphi in #463
- line between logs by @willmcgugan in #478
- added auto height by @willmcgugan in #476
- CSS focus-within pseudo selector by @darrenburns in #477
- diplay event method by @willmcgugan in #480
- [tests] Add an integration test for the vertical layout, fix the bug that messes up the layout when the children have
align: center top;
by @olivierphi in #482 - Added scroll_to_widget by @willmcgugan in #483
- Scroll to top when widget is larger than container by @willmcgugan in #492
- Add style param to Widget render method by @darrenburns in #479
- [css] Add a "Did you mean" suggestion when the value of a color is wrong but we can find a close one by @olivierphi in #486
- [tests][e2e] Add a test for
Widget#scroll_to_widget()
by @olivierphi in #494 - Optimize Compositor by combining updates by @willmcgugan in #493
- Msgpack devtools by @willmcgugan in #508
- [App] Remove the focus timer: we now focus from a widget to the next/prev one instantly by @olivierphi in #505
- added save_screenshot method and action by @willmcgugan in #511
- Compositor deltas by @willmcgugan in #512
- [css][scrollbar gutter] Manage the
scrollbar-gutter: stable
CSS property by @olivierphi in #501 - Basic text input by @darrenburns in #495
- [css] add "blank" border type by @olivierphi in #522
- Auto dimensions by @willmcgugan in #527
- Box fix by @willmcgugan in #532
- Fix escape key by @willmcgugan in #534
- compensated in box mode for scrollbars by @willmcgugan in #535
- Mock time during integration tests by @olivierphi in #507
- docs plugin by @willmcgugan in #536
- Fix Option+Backspace hanging by @willmcgugan in #539
- Text input improvements by @darrenburns in #528
- [css] add
scrollbar-size
properties by @olivierphi in #529 - [terminal buffering] Add support for the "mode 2026" - aka SynchronizedOutput by @olivierphi in #533
- Refresh scrollbars on style changes. by @darrenburns in #545
- Docs Refresh by @willmcgugan in #540
- [AppTest] hotfix for the "css" branch after commit d45b044 by @olivierphi in #550
- Swap ControlShiftUp & ControlShiftDown escape codes by @darrenburns in #549
- Widget focus keybindings by @darrenburns in #546
- Box model fractional by @willmcgugan in #552
- simplify scrollbar dimensions by @willmcgugan in #553
- Cache arrangements by @willmcgugan in #555
- Fix scrollbar not updating with CSS animation by @willmcgugan in #558
- Fix combined updates by @willmcgugan in #559
- Inheritable CSS by @willmcgugan in #561
- Scrolling nested containers by @darrenburns in #538
- Support HSL colour space, allow spaces in RGB/HSL values by @darrenburns in #566
- Support for bracketed paste mode by @darrenburns in #567
- Make devtools deps extras, add note to internal ref docs, raise excep… by @darrenburns in #579
- XTerm parsing improvements by @darrenburns in #570
- Add success/warning/error button variants by @darrenburns in #575
- [perf] Widget classes in
textual.widget.__init__.py
are now lazy-loaded by @olivierphi in #584 - Tests around CSS specificity, and fix ordering in case of specificity clash by @darrenburns in #582
- Adding space key to ansi sequences allows binding by @pvmm in #410
- add space to keys by @willmcgugan in #585
- Scroll view and DataTable Widget by @willmcgugan in #560
- [tests] Restore layout integration tests by @olivierphi in #587
- [button] Add a brief "active" effect when a button a clicked by @olivierphi in #588
- Add a cursor to table by @willmcgugan in #591
- User CSS should always take precedence over Widget CSS by @darrenburns in #595
- Render cache by @willmcgugan in #602
- Render enhancements by @willmcgugan in #606
- Improvements to scroll_to_widget by @willmcgugan in #608
- Small typo fix by @jacobtomlinson in #612
- Color harmony by @willmcgugan in #619
- Adds Layers and Docks by @willmcgugan in #627
- Document CSS Styles by @willmcgugan in #629
- Register callbacks at message pump level, invoke them after refresh by @darrenburns in #607
- Focus order by @darrenburns in #638
- restore missing callback by @willmcgugan in #649
- Add remove by @willmcgugan in #653
- center layout by @willmcgugan in #656
- fix for layout bug by @willmcgugan in #662
- unified events and messages by @willmcgugan in #660
- CSS tie breaker by @willmcgugan in #665
- partial tree control fix by @willmcgugan in #667
- fix for footer by @willmcgugan in #670
- Filling the gap between horizontal and vertical scrollbars by @darrenburns in #664
- Screens API by @willmcgugan in #685
- Improve error message for CSS syntax error by @darrenburns in #680
- tests for auto refresh by @willmcgugan in #696
- Docs scrollbar gutter by @darrenburns in #695
- Animation callback by @darrenburns in #683
- Docs content align by @darrenburns in #700
- Docs intro by @willmcgugan in #703
- Optimize applying CSS styles by @willmcgugan in #705
- Docs layout by @darrenburns in #701
text-align
CSS support by @darrenburns in #704- Values sections for CSS properties, some rewordings by @darrenburns in #713
- table layout by @willmcgugan in #712
- calculator example by @willmcgugan in #714
- Delay transition by @darrenburns in #684
- hotfix for justify by @willmcgugan in #717
- Changes to opacity by @darrenburns in #720
- CSS Path Relative by @darrenburns in #724
- Log verbosity by @willmcgugan in #722
- scrollbar fix by @willmcgugan in #726
- Default css by @willmcgugan in #727
- exclude invisible widgets by @willmcgugan in #728
- private by @willmcgugan in #729
- validate identifiers by @willmcgugan in #730
- added char attribute to Text event by @willmcgugan in #732
- App docs by @willmcgugan in #733
- Fix auto height layout by @willmcgugan in #739
- Make dark mode default by @darrenburns in #743
- tree fix by @willmcgugan in #744
- Easing preview by @darrenburns in #740
- Code browser example by @willmcgugan in #746
- Scroll issue by @willmcgugan in #747
- focus level bindings by @willmcgugan in #751
- App log by @willmcgugan in #753
- Layout order by @willmcgugan in #755
- Readme by @willmcgugan in #758
- auto color by @willmcgugan in #763
- Update various broken variables by @darrenburns in #764
- Layer order by @willmcgugan in #765
- fixes for variable css errors by @willmcgugan in #768
- Add verbose tag to events docs by @darrenburns in #773
- docs/widgets/Button by @darrenburns in #769
- Grid cell margin by @darrenburns in #772
- Docs styles by @willmcgugan in #775
- Add docs for CSS variables by @darrenburns in #780
- Fix broken text in docs by @darrenburns in #781
- Initial layout guide stuff by @darrenburns in #748
- Log drop critical by @willmcgugan in #782
- Document styles by @darrenburns in #785
- Minimise rendering when text-opacity/opacity is zero by @darrenburns in #774
- Docs events by @willmcgugan in #787
- changed to CSS_PATH by @willmcgugan in #789
- Expand shrink by @willmcgugan in #794
- Remove
docks
references & other tidying by @darrenburns in #795 - Snapshot testing by @darrenburns in #793
- Docs for widgets by @willmcgugan in #800
- Docs input by @willmcgugan in #801
- new align by @willmcgugan in #802
- Docs actions by @willmcgugan in #804
- Get widget by @willmcgugan in #808
- New input by @willmcgugan in #811
- optimizations for compositor by @willmcgugan in #812
- Docs for reactivity by @willmcgugan in #815
- Fix comma separated string in "Bindings" by @darrenburns in #797
- Document widgets by @darrenburns in #819
- Docs screen by @willmcgugan in #824
- Bump 0.2.0 BETA by @willmcgugan in #822
- change typing-extensions dependancy by @willmcgugan in #825
- Too many "haves" by @driscollis in #827
- Highlight import of Container class by @driscollis in #830
- Fix some minor typos about the Stopwatch widget by @driscollis in #831
- Py typed by @willmcgugan in #836
- Note timers ID added to Container object by @kimvanwyk in #832
- Highlight changed set_interval line in stopwatch06 example by @kimvanwyk in #833
- Table polish by @willmcgugan in #837
- Initialize reactive variables earlier by @willmcgugan in #838
- fix error on exit from textual console by @willmcgugan in #841
- Docs for Animator by @darrenburns in #840
- Flag to enable header clock by @darrenburns in #843
- Fix minor readability issue in modifying CSS class by @driscollis in #844
- Regions optimize by @willmcgugan in #855
- monochrome tests by @willmcgugan in #856
- Fix issues with
Styles.css
, update "Grid" styles doc page by @darrenburns in #854 - Docs queries by @willmcgugan in #857
- DOM Queries typo squish by @davep in #858
- Documenting comma-separated bindings in docstring and guide by @darrenburns in #853
- Cli colors by @willmcgugan in #863
- Typo fix:
styles
belong to a widget by @davep in #859 - Support for key aliases, key handling tests by @darrenburns in #852
- add max_idle for screen by @willmcgugan in #869
- Update docs: fix copy/paste error for Timers by @lllama in #879
- Provide extra hinting for App.query by @davep in #883
- Document links by @darrenburns in #868
- Win slow by @willmcgugan in #881
- Harmonise the types of the App's css path declarations by @davep in #876
- update borders with css by @willmcgugan in #889
- docs: typos by @aaronst in #887
- Fix
:focus-within
pseudo-selector by @darrenburns in #885 - Move focus logic to screen, add more key replacements, collapse bindings in footer by @darrenburns in #880
- Use screen offset instead of offset by @darrenburns in #893
- Modify the screen examples to import Screen from textual.screen by @davep in #888
- Fix _reset_focus being called on app instead of Screen by @darrenburns in #895
- Fix textual run path bug on Windows by @darrenburns in #899
- Remove unused code by @darrenburns in #896
- depth first search by @willmcgugan in #902
- Add password as a Input keyword argument by @davep in #911
- CSS docs review - Layout by @davep in #913
- CSS docs review - Events and Messages by @davep in #914
- Reviewing CSS docs by @davep in #898
- CSS docs review - CSS by @davep in #906
- Get rid of string split key display, bug fix for not showing screen-level bindings by @darrenburns in #910
- CSS docs review - Actions by @davep in #916
- CSS docs review - Input by @davep in #915
- CSS docs review - Styles by @davep in #904
- CSS docs review - Reactivity by @davep in #918
- README has 'development development' by @adam-huganir in #920
- CSS docs review - Widgets by @davep in #921
- CSS docs review - Animation by @davep in #922
- CSS docs review - Screens by @davep in #923
- CSS docs review - Styles reference by @davep in #925
- CSS docs review - Events by @davep in #924
- CSS docs review - Widgets reference by @davep in #926
- Roadmap by @willmcgugan in #927
- wait for mount by @willmcgugan in #912
- fix cursor delete issue by @willmcgugan in #931
- fix error with text-log in docs by @willmcgugan in #932
- Some bug fixes in
Input
+ addtitle
toApp
constructor by @darrenburns in #934 - Mention ordering of superpower methods in docs by @darrenburns in #935
- fix focus glitch by @willmcgugan in #936
- fix alignment bug by @willmcgugan in #937
- Add directory of file to run to sys path by @darrenburns in #947
- key bindings refactor by @willmcgugan in #941
- Add support for action handlers prefixed with _ by @darrenburns in #946
- Checkbox polishing + fix auto-width in Horizontal layout by @darrenburns in #942
- Ensure scroll events are forwarded to the screen by @darrenburns in #948
- Minor doc fixes by @MatrixManAtYrService in #938
- docs: remove center layout by @aaronst in #949
- Fix variables in Screens, remove dark reactive from Screen by @darrenburns in #957
- Modify DOMNode.walk_children to return a list by @davep in #952
- Try and better settle focus after a focused widget is removed (redux) by @davep in #954
- Populate character on simulated key presses by @darrenburns in #960
- Review the use of the bell in various examples and documentation files by @davep in #958
- Post-PR #954 tidy up by @davep in #961
- Fix bindings as tuples by @darrenburns in #962
- Color animate alpha by @darrenburns in #964
- Fix color preview by @darrenburns in #967
- Update the calculator example to make all keyboard keys work again by @davep in #968
- Initial pull of 5x5 into the Textual examples directory by @davep in #963
- Switch the dark mode toggle to Ctrl+D by @davep in #970
- adds demo by @willmcgugan in #959
- docs: remove extra the by @aaronst in #976
- added version number to demo, bumped beta by @willmcgugan in #977
- Bump020 by @willmcgugan in #978
- CSS by @willmcgugan in #979
- lock update by @willmcgugan in #981
- Abs readme links by @willmcgugan in #982
New Contributors
- @darrenburns made their first contribution in #213
- @olivierphi made their first contribution in #428
- @rjmill made their first contribution in #460
- @bbugyi200 made their first contribution in #454
- @toonarmycaptain made their first contribution in #453
- @pvmm made their first contribution in #410
- @jacobtomlinson made their first contribution in #612
- @driscollis made their first contribution in #827
- @kimvanwyk made their first contribution in #832
- @davep made their first contribution in #858
- @aaronst made their first contribution in #887
- @adam-huganir made their first contribution in #920
- @MatrixManAtYrService made their first contribution in #938
Full Changelog: v0.1.18...v0.2.0