diff --git a/CHANGELOG.md b/CHANGELOG.md
index a49d6a75a1..76279be25a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,20 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
### Added
+- Added `App.theme` reactive attribute https://github.com/Textualize/textual/pull/5087
+- Added various starter themes https://github.com/Textualize/textual/pull/5087
+- Added "Change theme" command to command palette https://github.com/Textualize/textual/pull/5087
+- Added `variant` parameter to `Label` widget for quick access to common styles https://github.com/Textualize/textual/pull/5087
+- Added `App.get_theme` which returns a theme by name https://github.com/Textualize/textual/pull/5087
+- Added `App.register_theme` and `App.unregister_theme` https://github.com/Textualize/textual/pull/5087
+- Added `App.theme_changed_signal` https://github.com/Textualize/textual/pull/5087
+- Added `App.available_themes` property which returns a mapping of theme names to `Theme` instances https://github.com/Textualize/textual/pull/5087
+- Added `App.current_theme` property which returns the currently active theme object https://github.com/Textualize/textual/pull/5087
+- Added `App.get_theme_variable_defaults` which returns a mapping of theme variables to their default values https://github.com/Textualize/textual/pull/5087
+- Added `App.search` which allows bringing up a fuzzy search list of commands on-demand https://github.com/Textualize/textual/pull/5087
+- Added `App.search_themes` which allows bringing up a fuzzy search list of themes on-demand https://github.com/Textualize/textual/pull/5087
+- Added `textual.theme.ThemeProvider`, a command palette provider which returns all registered themes https://github.com/Textualize/textual/pull/5087
+- Added several new built-in CSS variables https://github.com/Textualize/textual/pull/5087
- Added support for in-band terminal resize protocol https://github.com/Textualize/textual/pull/5217
### Changed
@@ -23,6 +37,11 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
- Added `textual.lazy.Reveal` https://github.com/Textualize/textual/pull/5226
- Added `Screen.action_blur` https://github.com/Textualize/textual/pull/5226
+### Changed
+
+- Breaking change: Removed `App.dark` reactive attribute https://github.com/Textualize/textual/pull/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. https://github.com/Textualize/textual/pull/5087
+
## [0.85.2] - 2024-11-02
- Fixed broken focus-within https://github.com/Textualize/textual/pull/5190
diff --git a/Makefile b/Makefile
index 6ccbea68fc..c7e2e74fd6 100644
--- a/Makefile
+++ b/Makefile
@@ -4,6 +4,10 @@ run := poetry run
test:
$(run) pytest tests/ -n 16 --dist=loadgroup $(ARGS)
+.PHONY: testv
+testv:
+ $(run) pytest tests/ -vvv -n 16 --dist=loadgroup $(ARGS)
+
.PHONY: test-snapshot-update
test-snapshot-update:
$(run) pytest tests/ --snapshot-update -n 16 --dist=loadgroup $(ARGS)
diff --git a/docs/blog/posts/release0-38-0.md b/docs/blog/posts/release0-38-0.md
index f08756b13e..01dd85f3ec 100644
--- a/docs/blog/posts/release0-38-0.md
+++ b/docs/blog/posts/release0-38-0.md
@@ -58,7 +58,7 @@ If you do want to style something outside of the widget you can set `SCOPED_CSS=
## Light and Dark pseudo selectors
We've also made a slight quality of life improvement to the CSS, by adding `:light` and `:dark` pseudo selectors.
-This allows you to change styles depending on whether you have dark mode enabled or not.
+This allows you to change styles depending on whether the app is currently using a light or dark theme.
This was possible before, just a little verbose.
Here's how you would do it in 0.37.0:
diff --git a/docs/css_types/color.md b/docs/css_types/color.md
index 2394603ddb..c80720ba51 100644
--- a/docs/css_types/color.md
+++ b/docs/css_types/color.md
@@ -17,7 +17,7 @@ A bullet point summary of the formats available follows:
- a color description in the RGB system, [with](#rgba-description) or [without](#rgb-description) opacity (e.g., `rgb(23, 78, 200)`);
- a color description in the HSL system, [with](#hsla-description) or [without](#hsl-description) opacity (e.g., `hsl(290, 70%, 80%)`);
-[Textual's default themes](../guide/design.md#theme-reference) also provide many CSS variables with colors that can be used out of the box.
+[Textual's default themes](../guide/design.md) also provide many CSS variables with colors that can be used out of the box.
### Named colors
diff --git a/docs/examples/events/on_decorator01.py b/docs/examples/events/on_decorator01.py
index 6612d6ad6c..3e5cc488bf 100644
--- a/docs/examples/events/on_decorator01.py
+++ b/docs/examples/events/on_decorator01.py
@@ -16,7 +16,9 @@ def on_button_pressed(self, event: Button.Pressed) -> None: # (1)!
if event.button.id == "bell":
self.bell()
elif event.button.has_class("toggle", "dark"):
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
elif event.button.id == "quit":
self.exit()
diff --git a/docs/examples/events/on_decorator02.py b/docs/examples/events/on_decorator02.py
index 1481040952..64add46f53 100644
--- a/docs/examples/events/on_decorator02.py
+++ b/docs/examples/events/on_decorator02.py
@@ -20,7 +20,9 @@ def play_bell(self):
@on(Button.Pressed, ".toggle.dark") # (2)!
def toggle_dark(self):
"""Called when the 'toggle dark' button is pressed."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
@on(Button.Pressed, "#quit") # (3)!
def quit(self):
diff --git a/docs/examples/getting_started/console.py b/docs/examples/getting_started/console.py
index 0308ed6897..36792d2e06 100644
--- a/docs/examples/getting_started/console.py
+++ b/docs/examples/getting_started/console.py
@@ -10,7 +10,6 @@
class ConsoleApp(App):
def compose(self):
- self.dark = True
yield Static(DevConsoleHeader())
diff --git a/docs/examples/styles/background_tint.tcss b/docs/examples/styles/background_tint.tcss
index 276ef44ead..1d3c507be1 100644
--- a/docs/examples/styles/background_tint.tcss
+++ b/docs/examples/styles/background_tint.tcss
@@ -2,8 +2,8 @@ Vertical {
background: $panel;
color: auto 90%;
}
-#tint1 { background-tint: $foreground 0%; }
-#tint2 { background-tint: $foreground 25%; }
-#tint3 { background-tint: $foreground 50%; }
-#tint4 { background-tint: $foreground 75% }
-#tint5 { background-tint: $foreground 100% }
+#tint1 { background-tint: $text 0%; }
+#tint2 { background-tint: $text 25%; }
+#tint3 { background-tint: $text 50%; }
+#tint4 { background-tint: $text 75% }
+#tint5 { background-tint: $text 100% }
diff --git a/docs/examples/themes/colored_text.py b/docs/examples/themes/colored_text.py
new file mode 100644
index 0000000000..70f8fbbd6f
--- /dev/null
+++ b/docs/examples/themes/colored_text.py
@@ -0,0 +1,17 @@
+from textual.app import App, ComposeResult
+from textual.widgets import Label
+
+COLORS = ("primary", "secondary", "accent", "warning", "error", "success")
+
+
+class ColoredText(App[None]):
+ CSS = "\n".join(f".text-{color} {{color: $text-{color};}}" for color in COLORS)
+
+ def compose(self) -> ComposeResult:
+ for color in COLORS:
+ yield Label(f"$text-{color}", classes=f"text-{color}")
+
+
+app = ColoredText()
+if __name__ == "__main__":
+ app.run()
diff --git a/docs/examples/themes/muted_backgrounds.py b/docs/examples/themes/muted_backgrounds.py
new file mode 100644
index 0000000000..e44cbf88c0
--- /dev/null
+++ b/docs/examples/themes/muted_backgrounds.py
@@ -0,0 +1,20 @@
+from textual.app import App, ComposeResult
+from textual.widgets import Label
+
+COLORS = ("primary", "secondary", "accent", "warning", "error", "success")
+
+
+class MutedBackgrounds(App[None]):
+ CSS = "\n".join(
+ f".text-{color} {{padding: 0 1; color: $text-{color}; background: ${color}-muted;}}"
+ for color in COLORS
+ )
+
+ def compose(self) -> ComposeResult:
+ for color in COLORS:
+ yield Label(f"$text-{color} on ${color}-muted", classes=f"text-{color}")
+
+
+app = MutedBackgrounds()
+if __name__ == "__main__":
+ app.run()
diff --git a/docs/examples/themes/todo_app.py b/docs/examples/themes/todo_app.py
new file mode 100644
index 0000000000..ea2ccef759
--- /dev/null
+++ b/docs/examples/themes/todo_app.py
@@ -0,0 +1,96 @@
+from itertools import cycle
+
+from textual.app import App, ComposeResult
+from textual.binding import Binding
+from textual.containers import Horizontal, Vertical
+from textual.widgets import Footer, Header, Input, Label, SelectionList
+
+
+class TodoList(App[None]):
+ CSS = """
+Screen {
+ align: center middle;
+ hatch: right $foreground 10%;
+}
+#content {
+ height: auto;
+ width: 40;
+ padding: 1 2;
+}
+#header {
+ height: 1;
+ width: auto;
+ margin-bottom: 1;
+}
+.title {
+ text-style: bold;
+ padding: 0 1;
+ width: 1fr;
+}
+#overdue {
+ color: $text-error;
+ background: $error-muted;
+ padding: 0 1;
+ width: auto;
+}
+#done {
+ color: $text-success;
+ background: $success-muted;
+ padding: 0 1;
+ margin: 0 1;
+}
+#footer {
+ height: auto;
+ margin-bottom: 2;
+}
+#history-header {
+ height: 1;
+ width: auto;
+}
+#history-done {
+ width: auto;
+ padding: 0 1;
+ margin: 0 1;
+ background: $primary-muted;
+ color: $text-primary;
+}
+"""
+
+ BINDINGS = [Binding("ctrl+t", "cycle_theme", "Cycle theme")]
+ THEMES = cycle(
+ ["nord", "gruvbox", "tokyo-night", "textual-dark", "solarized-light"]
+ )
+
+ def compose(self) -> ComposeResult:
+ yield Header()
+ with Vertical(id="content"):
+ with Horizontal(id="header"):
+ yield Label("Today", classes="title")
+ yield Label("1 overdue", id="overdue")
+ yield Label("1 done", id="done")
+ yield SelectionList(
+ ("Buy milk", 0),
+ ("Buy bread", 1),
+ ("Go and vote", 2, True),
+ ("Return package", 3),
+ id="todo-list",
+ )
+ with Horizontal(id="footer"):
+ yield Input(placeholder="Add a task")
+
+ with Horizontal(id="history-header"):
+ yield Label("History", classes="title")
+ yield Label("4 items", id="history-done")
+
+ yield Footer()
+
+ def on_mount(self) -> None:
+ self.action_cycle_theme()
+
+ def action_cycle_theme(self) -> None:
+ self.theme = next(self.THEMES)
+
+
+app = TodoList()
+if __name__ == "__main__":
+ app.run()
diff --git a/docs/examples/tutorial/stopwatch.py b/docs/examples/tutorial/stopwatch.py
index e1497a67be..caae41091d 100644
--- a/docs/examples/tutorial/stopwatch.py
+++ b/docs/examples/tutorial/stopwatch.py
@@ -99,7 +99,9 @@ def action_remove_stopwatch(self) -> None:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch01.py b/docs/examples/tutorial/stopwatch01.py
index 9f9a76043f..ccf1dbe26e 100644
--- a/docs/examples/tutorial/stopwatch01.py
+++ b/docs/examples/tutorial/stopwatch01.py
@@ -1,5 +1,5 @@
from textual.app import App, ComposeResult
-from textual.widgets import Header, Footer
+from textual.widgets import Footer, Header
class StopwatchApp(App):
@@ -14,7 +14,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch02.py b/docs/examples/tutorial/stopwatch02.py
index 5937cd8058..7044d2c8d1 100644
--- a/docs/examples/tutorial/stopwatch02.py
+++ b/docs/examples/tutorial/stopwatch02.py
@@ -31,7 +31,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch03.py b/docs/examples/tutorial/stopwatch03.py
index 7ade4dd59d..8572335fbe 100644
--- a/docs/examples/tutorial/stopwatch03.py
+++ b/docs/examples/tutorial/stopwatch03.py
@@ -32,7 +32,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch04.py b/docs/examples/tutorial/stopwatch04.py
index 65f75ea68c..9dbe352339 100644
--- a/docs/examples/tutorial/stopwatch04.py
+++ b/docs/examples/tutorial/stopwatch04.py
@@ -39,7 +39,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch05.py b/docs/examples/tutorial/stopwatch05.py
index 19f6366f77..544eab647a 100644
--- a/docs/examples/tutorial/stopwatch05.py
+++ b/docs/examples/tutorial/stopwatch05.py
@@ -59,7 +59,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/tutorial/stopwatch06.py b/docs/examples/tutorial/stopwatch06.py
index ee5db13267..1b35e7f3c3 100644
--- a/docs/examples/tutorial/stopwatch06.py
+++ b/docs/examples/tutorial/stopwatch06.py
@@ -82,7 +82,9 @@ def compose(self) -> ComposeResult:
def action_toggle_dark(self) -> None:
"""An action to toggle dark mode."""
- self.dark = not self.dark
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
if __name__ == "__main__":
diff --git a/docs/examples/widgets/content_switcher.tcss b/docs/examples/widgets/content_switcher.tcss
index da47d9c57f..8e442b6cd7 100644
--- a/docs/examples/widgets/content_switcher.tcss
+++ b/docs/examples/widgets/content_switcher.tcss
@@ -9,19 +9,14 @@ Screen {
}
ContentSwitcher {
- background: $panel;
border: round $primary;
width: 90%;
height: 1fr;
}
-DataTable {
- background: $panel;
-}
-
MarkdownH2 {
- background: $primary;
+ background: $panel;
color: yellow;
border: none;
- padding: 0;
+ padding: 0 1;
}
diff --git a/docs/examples/widgets/sparkline_colors.tcss b/docs/examples/widgets/sparkline_colors.tcss
index cad5230c8d..0355593ad5 100644
--- a/docs/examples/widgets/sparkline_colors.tcss
+++ b/docs/examples/widgets/sparkline_colors.tcss
@@ -39,10 +39,10 @@ Sparkline {
}
#sxt > .sparkline--max-color {
- color: $accent 30%;
+ color: $primary 30%;
}
#sxt > .sparkline--min-color {
- color: $accent;
+ color: $primary;
}
#svt > .sparkline--max-color {
diff --git a/docs/examples/widgets/tree.py b/docs/examples/widgets/tree.py
index abbe45ef68..7e29eb81f4 100644
--- a/docs/examples/widgets/tree.py
+++ b/docs/examples/widgets/tree.py
@@ -4,7 +4,7 @@
class TreeApp(App):
def compose(self) -> ComposeResult:
- tree: Tree[dict] = Tree("Dune")
+ tree: Tree[str] = Tree("Dune")
tree.root.expand()
characters = tree.root.add("Characters", expand=True)
characters.add_leaf("Paul")
diff --git a/docs/guide/CSS.md b/docs/guide/CSS.md
index 2e27db2ca9..499f53a50b 100644
--- a/docs/guide/CSS.md
+++ b/docs/guide/CSS.md
@@ -327,7 +327,7 @@ The `background: green` is only applied to the Button underneath the mouse curso
Here are some other pseudo classes:
- `:blur` Matches widgets which *do not* have input focus.
-- `:dark` Matches widgets in dark mode (where `App.dark == True`).
+- `:dark` Matches widgets in dark themes (where `App.theme.dark == True`).
- `:disabled` Matches widgets which are in a disabled state.
- `:enabled` Matches widgets which are in an enabled state.
- `:even` Matches a widget at an evenly numbered position within its siblings.
@@ -336,7 +336,7 @@ Here are some other pseudo classes:
- `:focus` Matches widgets which have input focus.
- `:inline` Matches widgets when the app is running in inline mode.
- `:last-of-type` Matches a widget that is the last of its type amongst its siblings.
-- `:light` Matches widgets in dark mode (where `App.dark == False`).
+- `:light` Matches widgets in light themes (where `App.theme.dark == False`).
- `:odd` Matches a widget at an oddly numbered position within its siblings.
## Combinators
diff --git a/docs/guide/command_palette.md b/docs/guide/command_palette.md
index 85b30c483b..2c2db2ed35 100644
--- a/docs/guide/command_palette.md
+++ b/docs/guide/command_palette.md
@@ -11,8 +11,8 @@ Textual will suggest commands as you type in that input.
Press ++up++ or ++down++ to select a command from the list, and ++enter++ to invoke it.
Commands are looked up via a *fuzzy* search, which means Textual will show commands that match the keys you type in the same order, but not necessarily at the start of the command.
-For instance the "Toggle light/dark mode" command will be shown if you type "to" (for **to**ggle), but you could also type "dm" (to match **d**ark **m**ode).
-This scheme allows the user to quickly get to a particular command with a minimum of key-presses.
+For instance the "Change theme" command will be shown if you type "ch" (for **ch**ange), but you could also type "th" (to match **t**heme).
+This scheme allows the user to quickly get to a particular command with fewer key-presses.
=== "Command Palette"
diff --git a/docs/guide/design.md b/docs/guide/design.md
index 36723969f9..607a5ac2fb 100644
--- a/docs/guide/design.md
+++ b/docs/guide/design.md
@@ -1,52 +1,133 @@
-# Design System
+# Themes
-Textual's design system consists of a number of predefined colors and guidelines for how to use them in your app.
+Textual comes with several built-in *themes*, and it's easy to create your own.
+A theme provides variables which can be used in the CSS of your app.
+Click on the tabs below to see how themes can change the appearance of an app.
-You don't have to follow these guidelines, but if you do, you will be able to mix builtin widgets with third party widgets and your own creations, without worrying about clashing colors.
+=== "nord"
+ ```{.textual path="docs/examples/themes/todo_app.py"}
+ ```
-!!! information
+=== "gruvbox"
- Textual's color system is based on Google's Material design system, modified to suit the terminal.
+ ```{.textual path="docs/examples/themes/todo_app.py" press="ctrl+t"}
+ ```
+=== "tokyo-night"
-## Designing with Colors
+ ```{.textual path="docs/examples/themes/todo_app.py" press="ctrl+t,ctrl+t"}
+ ```
-Textual pre-defines a number of colors as [CSS variables](../guide/CSS.md#css-variables). For instance, the CSS variable `$primary` is set to `#004578` (the blue used in headers). You can use `$primary` in place of the color in the [background](../styles/background.md) and [color](../styles/color.md) rules, or other any other rule that accepts a color.
+=== "textual-dark"
-Here's an example of CSS that uses color variables:
+ ```{.textual path="docs/examples/themes/todo_app.py" press="ctrl+t,ctrl+t,ctrl+t"}
+ ```
+
+=== "solarized-light"
+
+ ```{.textual path="docs/examples/themes/todo_app.py" press="ctrl+t,ctrl+t,ctrl+t,ctrl+t"}
+ ```
+
+## Changing the theme
+
+The theme can be changed at runtime via the [Command Palette](./command_palette.md) (++ctrl+p++).
+
+You can also programmatically change the theme by setting the value of `App.theme` to the name of a theme:
+
+```python
+class MyApp(App):
+ def on_mount(self) -> None:
+ self.theme = "nord"
+```
+
+A theme must be *registered* before it can be used.
+Textual comes with a selection of built-in themes which are registered by default.
+
+## Registering a theme
+
+A theme is a simple Python object which maps variable names to colors.
+Here's an example:
+
+```python
+from textual.theme import Theme
+
+arctic_theme = Theme(
+ name="arctic",
+ primary="#88C0D0",
+ secondary="#81A1C1",
+ accent="#B48EAD",
+ foreground="#D8DEE9",
+ background="#2E3440",
+ success="#A3BE8C",
+ warning="#EBCB8B",
+ error="#BF616A",
+ surface="#3B4252",
+ panel="#434C5E",
+ dark=True,
+ variables={
+ "block-cursor-text-style": "none",
+ "footer-key-foreground": "#88C0D0",
+ "input-selection-background": "#81a1c1 35%",
+ },
+)
+```
+
+You can register this theme by calling `App.register_theme` in the `on_mount` method of your `App`.
+
+```python
+from textual.app import App
+
+class MyApp(App):
+ def on_mount(self) -> None:
+ # Register the theme
+ self.register_theme(arctic_theme) # (1)!
+
+ # Set the app's theme
+ self.theme = "arctic" # (2)!
+```
+
+1. Register the theme, making it available to the app (and command palette)
+2. Set the app's theme. When this line runs, the app immediately refreshes to use the new theme.
+
+## Theme variables
+
+Themes consist of up to 11 *base colors*, (`primary`, `secondary`, `accent`, etc.), which Textual uses to generate a broad range of CSS variables.
+For example, the `textual-dark` theme defines the *primary* base color as `#004578`.
+
+Here's an example of CSS which uses these variables:
```css
MyWidget {
background: $primary;
- color: $text;
+ color: $foreground;
}
```
-Using variables rather than explicit colors allows Textual to apply color themes. Textual supplies a default light and dark theme, but in the future many more themes will be available.
+On changing the theme, the values stored in these variables are updated to match the new theme, and the colors of `MyWidget` are updated accordingly.
+## Base colors
-### Base Colors
+When defining a theme, only the `primary` color is required.
+Textual will attempt to generate the other base colors if they're not supplied.
-There are 12 *base* colors defined in the color scheme. The following table lists each of the color names (as used in CSS) and a description of where to use them.
+The following table lists each of 11 base colors (as used in CSS) and a description of where they are used by default.
| Color | Description |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| `$primary` | The primary color, can be considered the *branding* color. Typically used for titles, and backgrounds for strong emphasis. |
| `$secondary` | An alternative branding color, used for similar purposes as `$primary`, where an app needs to differentiate something from the primary color. |
-| `$primary-background` | The primary color applied to a background. On light mode this is the same as `$primary`. In dark mode this is a dimmed version of `$primary`. |
-| `$secondary-background` | The secondary color applied to a background. On light mode this is the same as `$secondary`. In dark mode this is a dimmed version of `$secondary`. |
-| `$background` | A color used for the background, where there is no content. |
-| `$surface` | The color underneath text. |
-| `$panel` | A color used to differentiate a part of the UI form the main content. Typically used for dialogs or sidebars. |
+| `$foreground` | The default text color, which should be legible on `$background`, `$surface`, and `$panel`. |
+| `$background` | A color used for the background, where there is no content. Used as the default background color for screens. |
+| `$surface` | The default background color of widgets, typically sitting on top of `$background`. |
+| `$panel` | A color used to differentiate a part of the UI form the main content. Used sparingly in Textual itself. |
| `$boost` | A color with alpha that can be used to create *layers* on a background. |
-| `$warning` | Indicates a warning. Text or background. |
-| `$error` | Indicates an error. Text or background. |
-| `$success` | Used to indicate success. Text or background. |
-| `$accent` | Used sparingly to draw attention to a part of the UI (typically borders around focused widgets). |
-
+| `$warning` | Indicates a warning. Typically used as a background color. `$text-warning` can be used for foreground. |
+| `$error` | Indicates an error. Typically used as a background color. `$text-error` can be used for foreground. |
+| `$success` | Used to indicate success. Typically used as a background color. `$text-success` can be used for foreground. |
+| `$accent` | Used sparingly to draw attention. Typically contrasts with `$primary` and `$secondary`. |
-### Shades
+## Shades
For every color, Textual generates 3 dark shades and 3 light shades.
@@ -55,51 +136,207 @@ For every color, Textual generates 3 dark shades and 3 light shades.
For example, `$secondary-darken-1` is a slightly darkened `$secondary`, and `$error-lighten-3` is a very light version of the `$error` color.
-### Dark mode
+## Light and dark themes
+
+Themes can be either "light" or "dark".
+This setting is specified in the `Theme` constructor via the `dark` argument, and influences how Textual
+generates variables.
+Built-in widgets may also use the value of `dark` to influence their appearance.
+
+## Text color
+
+The default color of text in a theme is `$foreground`.
+This color should be legible on `$background`, `$surface`, and `$panel` backgrounds.
+
+There is also `$foreground-muted` for text which has lower importance.
+`$foreground-disabled` can be used for text which is disabled, for example a menu item which can't be selected.
-There are two color themes in Textual, a light mode and dark mode. You can switch between them by toggling the `dark` attribute on the App class.
+You can set the text color via the [color](../styles/color.md) CSS property.
-In dark mode `$background` and `$surface` are off-black. Dark mode also set `$primary-background` and `$secondary-background` to dark versions of `$primary` and `$secondary`.
+The available text colors are:
+- `$text-primary`
+- `$text-secondary`
+- `$text-accent`
+- `$text-warning`
+- `$text-error`
+- `$text-success`
-### Text color
+### Ensuring text legibility
-The design system defines three CSS variables you should use for text color.
+In some cases, the background color of a widget is unpredictable, so we cannot be certain our text will be readable against it.
-- `$text` sets the color of text in your app. Most text in your app should have this color.
+The theme system defines three CSS variables which you can use to ensure that text is legible on any background.
+
+- `$text` is set to a slightly transparent black or white, depending on which has better contrast against the background the text is on.
- `$text-muted` sets a slightly faded text color. Use this for text which has lower importance. For instance a sub-title or supplementary information.
- `$text-disabled` sets faded out text which indicates it has been disabled. For instance, menu items which are not applicable and can't be clicked.
-You can set these colors via the [color](../styles/color.md) property. The design system uses `auto` colors for text, which means that Textual will pick either white or black (whichever has better contrast).
+### Colored text
-!!! information
+Colored text is also generated from the base colors, which is guaranteed to be legible against a background of `$background`, `$surface`, and `$panel`.
+For example, `$text-primary` is a version of the `$primary` color tinted to ensure legibility.
- These text colors all have some alpha applied, so that even `$text` isn't pure white or pure black. This is done because blending in a little of the background color produces text that is not so harsh on the eyes.
+=== "Output (Theme: textual-dark)"
-### Theming
+ ```{.textual path="docs/examples/themes/colored_text.py" lines="9" columns="30"}
+ ```
-In a future version of Textual you will be able to modify theme colors directly, and allow users to configure preferred themes.
+=== "colored_text.py"
+ ```python title="colored_text.py"
+ --8<-- "docs/examples/themes/colored_text.py"
+ ```
-## Color Preview
+These colors are also be guaranteed to be legible when used as the foreground color of a widget with a *muted color* background.
-Run the following from the command line to preview the colors defined in the color system:
+## Muted colors
-```bash
-textual colors
+Muted colors are generated from the base colors by blending them with `$background` at 70% opacity.
+For example, `$primary-muted` is a muted version of the `$primary` color.
+
+Textual aims to ensure that the colored text it generates is legible against the corresponding muted color.
+In other words, `$text-primary` text should be legible against a background of `$primary-muted`:
+
+=== "Output (Theme: textual-dark)"
+
+ ```{.textual path="docs/examples/themes/muted_backgrounds.py" lines="9" columns="40"}
+ ```
+
+=== "muted_backgrounds.py"
+
+ ```python title="muted_backgrounds.py"
+ --8<-- "docs/examples/themes/muted_backgrounds.py"
+ ```
+
+The available muted colors are:
+
+- `$primary-muted`
+- `$secondary-muted`
+- `$accent-muted`
+- `$warning-muted`
+- `$error-muted`
+- `$success-muted`
+
+## Additional variables
+
+Textual uses the base colors as default values for additional variables used throughout the framework.
+These variables can be overridden by passing a `variables` argument to the `Theme` constructor.
+This also allows you to override variables such as `$primary-muted`, described above.
+
+In the Gruvbox theme, for example, we override the foreground color of the block cursor (the cursor used in widgets like `OptionList`) to be `$foreground`.
+
+```python hl_lines="14-17"
+Theme(
+ name="gruvbox",
+ primary="#85A598",
+ secondary="#A89A85",
+ warning="#fabd2f",
+ error="#fb4934",
+ success="#b8bb26",
+ accent="#fabd2f",
+ foreground="#fbf1c7",
+ background="#282828",
+ surface="#3c3836",
+ panel="#504945",
+ dark=True,
+ variables={
+ "block-cursor-foreground": "#fbf1c7",
+ "input-selection-background": "#689d6a40",
+ },
+)
```
-## Theme Reference
+Here's a comprehensive list of these variables, their purposes, and default values:
+
+### Border
+
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$border` | The border color for focused widgets with a border | `$primary` |
+| `$border-blurred` | The border color for unfocused widgets | Slightly darkened `$surface` |
+
+### Cursor
+
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$block-cursor-foreground` | Text color for block cursor (e.g., in OptionList) | `$text` |
+| `$block-cursor-background` | Background color for block cursor | `$primary` |
+| `$block-cursor-text-style` | Text style for block cursor | `"bold"` |
+| `$block-cursor-blurred-foreground` | Text color for unfocused block cursor | `$text` |
+| `$block-cursor-blurred-background` | Background color for unfocused block cursor | `$primary` with 30% opacity |
+| `$block-cursor-blurred-text-style` | Text style for unfocused block cursor | `"none"` |
+| `$block-hover-background` | Background color when hovering over a block | `$boost` with 5% opacity |
+
+### Input
+
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$input-cursor-background` | Background color of the input cursor | `$foreground` |
+| `$input-cursor-foreground` | Text color of the input cursor | `$background` |
+| `$input-cursor-text-style` | Text style of the input cursor | `"none"` |
+| `$input-selection-background` | Background color of selected text | `$primary-lighten-1` with 40% opacity |
+| `$input-selection-foreground` | Text color of selected text | `$background` |
+
+### Scrollbar
-Here's a list of the colors defined in the default light and dark themes.
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$scrollbar` | Color of the scrollbar | `$panel` |
+| `$scrollbar-hover` | Color of the scrollbar when hovered | `$panel-lighten-1` |
+| `$scrollbar-active` | Color of the scrollbar when active (being dragged) | `$panel-lighten-2` |
+| `$scrollbar-background` | Color of the scrollbar track | `$background-darken-1` |
+| `$scrollbar-corner-color` | Color of the scrollbar corner | Same as `$scrollbar-background` |
+| `$scrollbar-background-hover` | Color of the scrollbar track when hovering over the scrollbar area | Same as `$scrollbar-background` |
+| `$scrollbar-background-active` | Color of the scrollbar track when the scrollbar is active | Same as `$scrollbar-background` |
-!!! note
+### Links
- `$boost` will look different on different backgrounds because of its alpha channel.
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$link-background` | Background color of links | `"initial"` |
+| `$link-background-hover` | Background color of links when hovered | `$primary` |
+| `$link-color` | Text color of links | `$text` |
+| `$link-style` | Text style of links | `"underline"` |
+| `$link-color-hover` | Text color of links when hovered | `$text` |
+| `$link-style-hover` | Text style of links when hovered | `"bold not underline"` |
-```{.rich title="Textual Theme Colors"}
-from rich import print
-from textual.app import DEFAULT_COLORS
-from textual.design import show_design
-output = show_design(DEFAULT_COLORS["light"], DEFAULT_COLORS["dark"])
+### Footer
+
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$footer-foreground` | Text color in the footer | `$foreground` |
+| `$footer-background` | Background color of the footer | `$panel` |
+| `$footer-key-foreground` | Text color for key bindings in the footer | `$accent` |
+| `$footer-key-background` | Background color for key bindings in the footer | `"transparent"` |
+| `$footer-description-foreground` | Text color for descriptions in the footer | `$foreground` |
+| `$footer-description-background` | Background color for descriptions in the footer | `"transparent"` |
+| `$footer-item-background` | Background color for items in the footer | `"transparent"` |
+
+### Button
+
+| Variable | Purpose | Default Value |
+|----------|---------|---------------|
+| `$button-foreground` | Foreground color for standard buttons | `$foreground` |
+| `$button-color-foreground` | Foreground color for colored buttons | `$text` |
+| `$button-focus-text-style` | Text style for focused buttons | `"bold reverse"` |
+
+## App-specific variables
+
+The variables above are defined and used by Textual itself.
+However, you may also wish to expose other variables which are specific to your application.
+
+You can do this by overriding `App.get_theme_variable_defaults` in your `App` subclass.
+
+This method should return a dictionary of variable names and their default values.
+If a variable defined in this dictionary is also defined in a theme's `variables` dictionary, the theme's value will be used.
+
+## Previewing colors
+
+Run the following from the command line to preview the colors defined in the color system:
+
+```bash
+textual colors
```
+
+Inside the preview you can change the theme via the Command Palette (++ctrl+p++), and view the base variables and shades generated from the theme.
diff --git a/docs/tutorial.md b/docs/tutorial.md
index 57c369d448..3d30b29f99 100644
--- a/docs/tutorial.md
+++ b/docs/tutorial.md
@@ -117,7 +117,7 @@ If you run this code, you should see something like the following:
```{.textual path="docs/examples/tutorial/stopwatch01.py" title="stopwatch01.py"}
```
-Hit the ++d++ key to toggle between light and dark mode.
+Hit the ++d++ key to toggle between light and dark themes.
```{.textual path="docs/examples/tutorial/stopwatch01.py" press="d" title="stopwatch01.py"}
```
@@ -136,7 +136,7 @@ The first line imports the Textual `App` class, which we will use as the base cl
The following lines define the app itself:
-```python title="stopwatch01.py" hl_lines="5-17"
+```python title="stopwatch01.py" hl_lines="5-19"
--8<-- "docs/examples/tutorial/stopwatch01.py"
```
@@ -150,7 +150,7 @@ Here's what the above app defines:
- `action_toggle_dark()` defines an _action_ method. Actions are methods beginning with `action_` followed by the name of the action. The `BINDINGS` list above tells Textual to run this action when the user hits the ++d++ key. See [actions](./guide/actions.md) in the guide for details.
-```python title="stopwatch01.py" hl_lines="20-22"
+```python title="stopwatch01.py" hl_lines="22-24"
--8<-- "docs/examples/tutorial/stopwatch01.py"
```
diff --git a/examples/theme_sandbox.py b/examples/theme_sandbox.py
new file mode 100644
index 0000000000..d295150629
--- /dev/null
+++ b/examples/theme_sandbox.py
@@ -0,0 +1,502 @@
+from __future__ import annotations
+
+from functools import partial
+from typing import Any
+
+from textual._on import on
+from textual.app import App, ComposeResult
+from textual.binding import Binding
+from textual.containers import Container, Grid, Horizontal, VerticalScroll
+from textual.widgets import (
+ Button,
+ Collapsible,
+ DataTable,
+ Footer,
+ Header,
+ Input,
+ Label,
+ ListItem,
+ ListView,
+ MarkdownViewer,
+ OptionList,
+ ProgressBar,
+ RadioSet,
+ RichLog,
+ Select,
+ SelectionList,
+ Switch,
+ TabbedContent,
+ TextArea,
+ Tree,
+)
+from textual.widgets._masked_input import MaskedInput
+from textual.widgets._toggle_button import ToggleButton
+from textual.widgets.option_list import Option
+from textual.widgets.text_area import Selection
+
+HEADERS = ("lane", "swimmer", "country", "time")
+ROWS = [
+ (4, "Joseph Schooling", "Singapore", 50.39),
+ (2, "Michael Phelps", "United States", 51.14),
+ (5, "Chad le Clos", "South Africa", 51.14),
+ (6, "László Cseh", "Hungary", 51.14),
+ (3, "Li Zhuhao", "China", 51.26),
+ (8, "Mehdy Metella", "France", 51.58),
+ (7, "Tom Shields", "United States", 51.73),
+ (1, "Aleksandr Sadovnikov", "Russia", 51.84),
+ (10, "Darren Burns", "Scotland", 51.84),
+]
+
+LOREM_IPSUM = """\
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla facilisi. Sed euismod, nunc sit amet aliquam lacinia, nisl nisl aliquam nisl, nec aliquam nisl nisl sit amet lorem. Sed euismod, nunc sit amet aliquam lacinia, nisl nisl aliquam nisl, nec aliquam nisl nisl sit amet lorem. Sed euismod, nunc sit amet aliquam lacinia, nisl nisl aliquam nisl, nec aliquam nisl nisl sit amet lorem.
+"""
+
+EXAMPLE_MARKDOWN = """\
+# Markdown Viewer
+
+This is an example of Textual's `MarkdownViewer` widget.
+
+
+## Features
+
+Markdown syntax and extensions are supported.
+
+- Typography *emphasis*, **strong**, `inline code` etc.
+- Headers
+- Lists (bullet and ordered)
+- Syntax highlighted code blocks
+- Tables!
+"""
+
+
+class ThemeList(OptionList):
+ def on_mount(self) -> None:
+ self.add_options(
+ [Option(name, id=name) for name in self.app.available_themes.keys()]
+ )
+
+
+class ColorSample(Label):
+ pass
+
+
+class ChangingThemeApp(App[None]):
+ CSS = """
+ #buttons {
+ height: 3;
+ & > Button {
+ width: 10;
+ margin-right: 1;
+ }
+ }
+ ThemeList {
+ height: 1fr;
+ width: auto;
+ dock: left;
+ margin-bottom: 1;
+ }
+ TextArea {
+ height: 8;
+ scrollbar-gutter: stable;
+ }
+ DataTable {
+ height: 8;
+ }
+ ColorSample {
+ width: 1fr;
+ color: $text;
+ padding: 0 1;
+ &.hover-surface {
+ &:hover {
+ background: $surface;
+ }
+ }
+ &.primary {
+ background: $primary;
+ }
+ &.secondary {
+ background: $secondary;
+ }
+ &.accent {
+ background: $accent;
+ }
+ &.warning {
+ background: $warning;
+ }
+ &.error {
+ background: $error;
+ }
+ &.success {
+ background: $success;
+ }
+ &.foreground, &.background {
+ color: $foreground;
+ background: $background;
+ }
+ &.surface {
+ background: $surface;
+ }
+ &.panel {
+ background: $panel;
+ }
+ &.text-primary {
+ color: $text-primary;
+ }
+ &.text-secondary {
+ color: $text-secondary;
+ }
+ &.text-success {
+ color: $text-success;
+ }
+ &.text-warning {
+ color: $text-warning;
+ }
+ &.text-error {
+ color: $text-error;
+ }
+ &.text-accent {
+ color: $text-accent;
+ }
+ &.text-muted {
+ color: $text-muted;
+ }
+ &.text-disabled {
+ color: $text-disabled;
+ }
+ &.primary-muted {
+ color: $text-primary;
+ background: $primary-muted;
+ }
+ &.secondary-muted {
+ color: $text-secondary;
+ background: $secondary-muted;
+ }
+ &.accent-muted {
+ color: $text-accent;
+ background: $accent-muted;
+ }
+ &.warning-muted {
+ color: $text-warning;
+ background: $warning-muted;
+ }
+ &.error-muted {
+ color: $text-error;
+ background: $error-muted;
+ }
+ &.success-muted {
+ color: $text-success;
+ background: $success-muted;
+ }
+ }
+ ListView {
+ height: auto;
+ & > ListItem {
+ width: 1fr;
+ & > Label {
+ width: 1fr;
+ }
+ }
+ }
+ Tree {
+ height: 5;
+ }
+ MarkdownViewer {
+ height: 8;
+ }
+ LoadingIndicator {
+ height: 3;
+ }
+ RichLog {
+ height: 4;
+ }
+ TabbedContent {
+ width: 34;
+ }
+ #label-variants {
+ & > Label {
+ padding: 0 1;
+ margin-right: 1;
+ }
+ }
+
+ #palette {
+ height: auto;
+ grid-size: 3;
+ border-bottom: solid $border;
+ }
+ #widget-list {
+ & > OptionList {
+ height: 6;
+ }
+ & > RadioSet {
+ height: 6;
+ }
+ }
+ #widget-list {
+ }
+ #widget-list > * {
+ margin: 1 2;
+ }
+ .panel {
+ background: $panel;
+ }
+ .no-border {
+ border: none;
+ }
+ #menu {
+ height: auto;
+ width: auto;
+ border: round $border;
+
+ & OptionList {
+ background: transparent;
+ padding: 0;
+ border: none;
+ }
+ }
+ """
+
+ BINDINGS = [
+ Binding(
+ "ctrl+d",
+ "toggle_dark",
+ "Toggle Dark",
+ tooltip="Switch between light and dark themes",
+ ),
+ Binding(
+ "ctrl+a",
+ "toggle_panel",
+ "Toggle panel",
+ tooltip="Add or remove the panel class from the widget gallery",
+ ),
+ Binding(
+ "ctrl+b",
+ "toggle_border",
+ "Toggle border",
+ tooltip="Add or remove the borders from widgets",
+ ),
+ Binding(
+ "ctrl+i",
+ "invalid_theme",
+ "Invalid theme",
+ tooltip="Set an invalid theme (to test exceptions)",
+ ),
+ Binding(
+ "ctrl+o",
+ "widget_search",
+ "Widget search",
+ tooltip="Search for a widget",
+ ),
+ ]
+
+ def action_toggle_dark(self) -> None:
+ self.theme = "textual-light" if self.theme == "textual-dark" else "textual-dark"
+
+ def action_toggle_panel(self) -> None:
+ self.query_one("#widget-list").toggle_class("panel")
+
+ def action_toggle_border(self) -> None:
+ self.query("#widget-list > *").toggle_class("no-border")
+
+ def action_invalid_theme(self) -> None:
+ self.theme = "not-a-theme"
+
+ def action_widget_search(self) -> None:
+ self.search(
+ [
+ (
+ widget.__class__.__name__,
+ (
+ partial(self.set_focus, widget)
+ if widget.can_focus
+ else lambda: None
+ ),
+ f"Focus on {widget.__class__.__name__}",
+ )
+ for widget in self.query("#widget-list > *")
+ ],
+ placeholder="Search for a widget...",
+ )
+
+ def watch_theme(self, theme_name: str) -> None:
+ print(theme_name)
+
+ def compose(self) -> ComposeResult:
+ self.title = "Theme Sandbox"
+ with Grid(id="palette"):
+ theme = self.current_theme
+ for variable, value in vars(theme).items():
+ if variable not in {
+ "name",
+ "dark",
+ "luminosity_spread",
+ "text_alpha",
+ "variables",
+ }:
+ yield ColorSample(f"{variable}", classes=variable)
+ for color_name in [
+ "muted",
+ "primary",
+ "secondary",
+ "accent",
+ "warning",
+ "error",
+ "success",
+ ]:
+ yield ColorSample(
+ f"text-{color_name} on background",
+ classes=f"text-{color_name} background hover-surface",
+ )
+
+ for color_name in [
+ "primary",
+ "secondary",
+ "accent",
+ "warning",
+ "error",
+ "success",
+ ]:
+ yield ColorSample(
+ f"text-{color_name} on {color_name}-muted",
+ classes=f"text-{color_name} {color_name}-muted",
+ )
+
+ yield Header(show_clock=True, icon="🐟")
+ yield ThemeList(id="theme-list")
+ with VerticalScroll(id="widget-list") as container:
+ container.can_focus = False
+
+ yield Select(
+ [("foo", "foo"), ("bar", "bar"), ("baz", "baz"), ("qux", "qux")]
+ )
+ with Collapsible(title="An interesting story."):
+ yield Label("Interesting but verbose story.")
+
+ progress = ProgressBar(total=100)
+ progress.advance(70)
+ yield progress
+
+ rich_log = RichLog(highlight=True, markup=True)
+ rich_log.write("Hello, world!")
+ yield rich_log
+
+ yield MarkdownViewer(EXAMPLE_MARKDOWN)
+
+ with Horizontal(id="buttons"):
+ yield Button("Button 0")
+ yield Button("Button 1", variant="primary")
+ yield Button.success("Success 2")
+ yield Button.error("Error 3")
+ yield Button.warning("Warning 4")
+
+ with Horizontal(id="label-variants"):
+ yield Label("Primary", variant="primary")
+ yield Label("Secondary", variant="secondary")
+ yield Label("Accent", variant="accent")
+ yield Label("Warning", variant="warning")
+ yield Label("Error", variant="error")
+ yield Label("Success", variant="success")
+
+ with Container(id="menu") as container:
+ container.border_title = "Menu"
+ with TabbedContent("Foods", "Drinks", "Desserts", "Extras"):
+ yield OptionList(
+ "Pizza",
+ "Pasta",
+ "Salad",
+ "Soup",
+ )
+ yield OptionList(
+ "Coke",
+ "Sprite",
+ "Fanta",
+ "Root Beer",
+ )
+ yield OptionList(
+ "Ice Cream",
+ "Chocolate",
+ "Cake",
+ "Pie",
+ )
+ yield OptionList("Extra 1", "Extra 2", "Extra 3", "Extra 4")
+
+ yield MaskedInput(
+ template="9999-9999-9999-9999;0",
+ )
+ yield Input(placeholder="Hello, world!")
+ yield TextArea(LOREM_IPSUM)
+ tree: Tree[str] = Tree("Dune")
+ tree.root.expand()
+ characters = tree.root.add("Characters", expand=True)
+ characters.add_leaf("Paul")
+ characters.add_leaf("Jessica")
+ characters.add_leaf("Chani")
+ yield tree
+ table = DataTable[Any]()
+ table.add_columns(*HEADERS)
+ table.add_rows(ROWS)
+ table.zebra_stripes = True
+ table.fixed_columns = 1
+ table.cursor_type = "row"
+ yield table
+ yield ListView(
+ ListItem(Label("One")),
+ ListItem(Label("Two")),
+ ListItem(Label("Three")),
+ )
+ yield OptionList(
+ "Aerilon",
+ "Aquaria",
+ "Canceron",
+ "Caprica",
+ "Gemenon",
+ "Leonis",
+ "Libran",
+ "Picon",
+ "Sagittaron",
+ "Scorpia",
+ "Tauron",
+ "Virgon",
+ )
+
+ yield Switch()
+ yield ToggleButton(label="Toggle Button")
+
+ yield SelectionList[int](
+ ("Falken's Maze", 0, True),
+ ("Black Jack", 1),
+ ("Gin Rummy", 2),
+ ("Hearts", 3),
+ ("Bridge", 4),
+ ("Checkers", 5),
+ ("Chess", 6, True),
+ ("Poker", 7),
+ ("Fighter Combat", 8, True),
+ )
+ yield RadioSet(
+ "Amanda",
+ "Connor MacLeod",
+ "Duncan MacLeod",
+ "Heather MacLeod",
+ "Joe Dawson",
+ "Kurgan, [bold italic red]The[/]",
+ "Methos",
+ "Rachel Ellenstein",
+ "Ramírez",
+ )
+
+ yield Footer()
+
+ def on_mount(self) -> None:
+ self.theme = "textual-ansi"
+ text_area = self.query_one(TextArea)
+ text_area.selection = Selection((0, 0), (1, 10))
+
+ @on(ThemeList.OptionHighlighted, selector="#theme-list")
+ def _change_theme(self, event: ThemeList.OptionHighlighted) -> None:
+ self.app.theme = event.option.id or "textual-dark"
+
+
+app = ChangingThemeApp()
+if __name__ == "__main__":
+ app.run()
diff --git a/poetry.lock b/poetry.lock
index d971d5cc4b..d2dafa4ef8 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand.
+# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand.
[[package]]
name = "aiohappyeyeballs"
@@ -269,13 +269,13 @@ uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "cachecontrol"
-version = "0.14.0"
+version = "0.14.1"
description = "httplib2 caching for requests"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "cachecontrol-0.14.0-py3-none-any.whl", hash = "sha256:f5bf3f0620c38db2e5122c0726bdebb0d16869de966ea6a2befe92470b740ea0"},
- {file = "cachecontrol-0.14.0.tar.gz", hash = "sha256:7db1195b41c81f8274a7bbd97c956f44e8348265a1bc7641c37dfebc39f0c938"},
+ {file = "cachecontrol-0.14.1-py3-none-any.whl", hash = "sha256:65e3abd62b06382ce3894df60dde9e0deb92aeb734724f68fa4f3b91e97206b9"},
+ {file = "cachecontrol-0.14.1.tar.gz", hash = "sha256:06ef916a1e4eb7dba9948cdfc9c76e749db2e02104a9a1277e8b642591a0f717"},
]
[package.dependencies]
@@ -284,7 +284,7 @@ msgpack = ">=0.5.2,<2.0.0"
requests = ">=2.16.0"
[package.extras]
-dev = ["CacheControl[filecache,redis]", "black", "build", "cherrypy", "furo", "mypy", "pytest", "pytest-cov", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"]
+dev = ["CacheControl[filecache,redis]", "build", "cherrypy", "codespell[tomli]", "furo", "mypy", "pytest", "pytest-cov", "ruff", "sphinx", "sphinx-copybutton", "tox", "types-redis", "types-requests"]
filecache = ["filelock (>=3.8.0)"]
redis = ["redis (>=2.10.5)"]
@@ -593,88 +593,103 @@ typing = ["typing-extensions (>=4.12.2)"]
[[package]]
name = "frozenlist"
-version = "1.4.1"
+version = "1.5.0"
description = "A list-like structure which implements collections.abc.MutableSequence"
optional = false
python-versions = ">=3.8"
files = [
- {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"},
- {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"},
- {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"},
- {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"},
- {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"},
- {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"},
- {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"},
- {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"},
- {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"},
- {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"},
- {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"},
- {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"},
- {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"},
- {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"},
- {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"},
- {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"},
- {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"},
- {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"},
- {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"},
- {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"},
- {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"},
- {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"},
- {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"},
- {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"},
- {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"},
- {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"},
- {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"},
- {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"},
- {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"},
- {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"},
- {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"},
- {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"},
- {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"},
- {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"},
- {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"},
- {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"},
- {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"},
- {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"},
- {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"},
- {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"},
- {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"},
- {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"},
- {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"},
- {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"},
- {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"},
- {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"},
- {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"},
- {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"},
- {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"},
- {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"},
- {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"},
- {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"},
- {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"},
- {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"},
- {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"},
- {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"},
- {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"},
- {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"},
- {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"},
- {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"},
- {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"},
- {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"},
- {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"},
- {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"},
- {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"},
- {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"},
- {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"},
- {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"},
- {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"},
- {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"},
- {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"},
- {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"},
- {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"},
- {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"},
- {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"},
- {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"},
- {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5b6a66c18b5b9dd261ca98dffcb826a525334b2f29e7caa54e182255c5f6a65a"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d1b3eb7b05ea246510b43a7e53ed1653e55c2121019a97e60cad7efb881a97bb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15538c0cbf0e4fa11d1e3a71f823524b0c46299aed6e10ebb4c2089abd8c3bec"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e79225373c317ff1e35f210dd5f1344ff31066ba8067c307ab60254cd3a78ad5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9272fa73ca71266702c4c3e2d4a28553ea03418e591e377a03b8e3659d94fa76"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:498524025a5b8ba81695761d78c8dd7382ac0b052f34e66939c42df860b8ff17"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:92b5278ed9d50fe610185ecd23c55d8b307d75ca18e94c0e7de328089ac5dcba"},
+ {file = "frozenlist-1.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f3c8c1dacd037df16e85227bac13cca58c30da836c6f936ba1df0c05d046d8d"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2ac49a9bedb996086057b75bf93538240538c6d9b38e57c82d51f75a73409d2"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e66cc454f97053b79c2ab09c17fbe3c825ea6b4de20baf1be28919460dd7877f"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:5a3ba5f9a0dfed20337d3e966dc359784c9f96503674c2faf015f7fe8e96798c"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6321899477db90bdeb9299ac3627a6a53c7399c8cd58d25da094007402b039ab"},
+ {file = "frozenlist-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:76e4753701248476e6286f2ef492af900ea67d9706a0155335a40ea21bf3b2f5"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win32.whl", hash = "sha256:977701c081c0241d0955c9586ffdd9ce44f7a7795df39b9151cd9a6fd0ce4cfb"},
+ {file = "frozenlist-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:189f03b53e64144f90990d29a27ec4f7997d91ed3d01b51fa39d2dbe77540fd4"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd74520371c3c4175142d02a976aee0b4cb4a7cc912a60586ffd8d5929979b30"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2f3f7a0fbc219fb4455264cae4d9f01ad41ae6ee8524500f381de64ffaa077d5"},
+ {file = "frozenlist-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f47c9c9028f55a04ac254346e92977bf0f166c483c74b4232bee19a6697e4778"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0996c66760924da6e88922756d99b47512a71cfd45215f3570bf1e0b694c206a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2fe128eb4edeabe11896cb6af88fca5346059f6c8d807e3b910069f39157869"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a8ea951bbb6cacd492e3948b8da8c502a3f814f5d20935aae74b5df2b19cf3d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de537c11e4aa01d37db0d403b57bd6f0546e71a82347a97c6a9f0dcc532b3a45"},
+ {file = "frozenlist-1.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c2623347b933fcb9095841f1cc5d4ff0b278addd743e0e966cb3d460278840d"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cee6798eaf8b1416ef6909b06f7dc04b60755206bddc599f52232606e18179d3"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f5f9da7f5dbc00a604fe74aa02ae7c98bcede8a3b8b9666f9f86fc13993bc71a"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:90646abbc7a5d5c7c19461d2e3eeb76eb0b204919e6ece342feb6032c9325ae9"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bdac3c7d9b705d253b2ce370fde941836a5f8b3c5c2b8fd70940a3ea3af7f4f2"},
+ {file = "frozenlist-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:03d33c2ddbc1816237a67f66336616416e2bbb6beb306e5f890f2eb22b959cdf"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win32.whl", hash = "sha256:237f6b23ee0f44066219dae14c70ae38a63f0440ce6750f868ee08775073f942"},
+ {file = "frozenlist-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:0cc974cc93d32c42e7b0f6cf242a6bd941c57c61b618e78b6c0a96cb72788c1d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31115ba75889723431aa9a4e77d5f398f5cf976eea3bdf61749731f62d4a4a21"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7437601c4d89d070eac8323f121fcf25f88674627505334654fd027b091db09d"},
+ {file = "frozenlist-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7948140d9f8ece1745be806f2bfdf390127cf1a763b925c4a805c603df5e697e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feeb64bc9bcc6b45c6311c9e9b99406660a9c05ca8a5b30d14a78555088b0b3a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:683173d371daad49cffb8309779e886e59c2f369430ad28fe715f66d08d4ab1a"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7d57d8f702221405a9d9b40f9da8ac2e4a1a8b5285aac6100f3393675f0a85ee"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30c72000fbcc35b129cb09956836c7d7abf78ab5416595e4857d1cae8d6251a6"},
+ {file = "frozenlist-1.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:000a77d6034fbad9b6bb880f7ec073027908f1b40254b5d6f26210d2dab1240e"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5d7f5a50342475962eb18b740f3beecc685a15b52c91f7d975257e13e029eca9"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:87f724d055eb4785d9be84e9ebf0f24e392ddfad00b3fe036e43f489fafc9039"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:6e9080bb2fb195a046e5177f10d9d82b8a204c0736a97a153c2466127de87784"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:9b93d7aaa36c966fa42efcaf716e6b3900438632a626fb09c049f6a2f09fc631"},
+ {file = "frozenlist-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:52ef692a4bc60a6dd57f507429636c2af8b6046db8b31b18dac02cbc8f507f7f"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win32.whl", hash = "sha256:29d94c256679247b33a3dc96cce0f93cbc69c23bf75ff715919332fdbb6a32b8"},
+ {file = "frozenlist-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:8969190d709e7c48ea386db202d708eb94bdb29207a1f269bab1196ce0dcca1f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7a1a048f9215c90973402e26c01d1cff8a209e1f1b53f72b95c13db61b00f953"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dd47a5181ce5fcb463b5d9e17ecfdb02b678cca31280639255ce9d0e5aa67af0"},
+ {file = "frozenlist-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1431d60b36d15cda188ea222033eec8e0eab488f39a272461f2e6d9e1a8e63c2"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6482a5851f5d72767fbd0e507e80737f9c8646ae7fd303def99bfe813f76cf7f"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:44c49271a937625619e862baacbd037a7ef86dd1ee215afc298a417ff3270608"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12f78f98c2f1c2429d42e6a485f433722b0061d5c0b0139efa64f396efb5886b"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce3aa154c452d2467487765e3adc730a8c153af77ad84096bc19ce19a2400840"},
+ {file = "frozenlist-1.5.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b7dc0c4338e6b8b091e8faf0db3168a37101943e687f373dce00959583f7439"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:45e0896250900b5aa25180f9aec243e84e92ac84bd4a74d9ad4138ef3f5c97de"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:561eb1c9579d495fddb6da8959fd2a1fca2c6d060d4113f5844b433fc02f2641"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:df6e2f325bfee1f49f81aaac97d2aa757c7646534a06f8f577ce184afe2f0a9e"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:140228863501b44b809fb39ec56b5d4071f4d0aa6d216c19cbb08b8c5a7eadb9"},
+ {file = "frozenlist-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7707a25d6a77f5d27ea7dc7d1fc608aa0a478193823f88511ef5e6b8a48f9d03"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win32.whl", hash = "sha256:31a9ac2b38ab9b5a8933b693db4939764ad3f299fcaa931a3e605bc3460e693c"},
+ {file = "frozenlist-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:11aabdd62b8b9c4b84081a3c246506d1cddd2dd93ff0ad53ede5defec7886b28"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:dd94994fc91a6177bfaafd7d9fd951bc8689b0a98168aa26b5f543868548d3ca"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0da8bbec082bf6bf18345b180958775363588678f64998c2b7609e34719b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:73f2e31ea8dd7df61a359b731716018c2be196e5bb3b74ddba107f694fbd7604"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:828afae9f17e6de596825cf4228ff28fbdf6065974e5ac1410cecc22f699d2b3"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f1577515d35ed5649d52ab4319db757bb881ce3b2b796d7283e6634d99ace307"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2150cc6305a2c2ab33299453e2968611dacb970d2283a14955923062c8d00b10"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a72b7a6e3cd2725eff67cd64c8f13335ee18fc3c7befc05aed043d24c7b9ccb9"},
+ {file = "frozenlist-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c16d2fa63e0800723139137d667e1056bee1a1cf7965153d2d104b62855e9b99"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:17dcc32fc7bda7ce5875435003220a457bcfa34ab7924a49a1c19f55b6ee185c"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:97160e245ea33d8609cd2b8fd997c850b56db147a304a262abc2b3be021a9171"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f1e6540b7fa044eee0bb5111ada694cf3dc15f2b0347ca125ee9ca984d5e9e6e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:91d6c171862df0a6c61479d9724f22efb6109111017c87567cfeb7b5d1449fdf"},
+ {file = "frozenlist-1.5.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:c1fac3e2ace2eb1052e9f7c7db480818371134410e1f5c55d65e8f3ac6d1407e"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win32.whl", hash = "sha256:b97f7b575ab4a8af9b7bc1d2ef7f29d3afee2226bd03ca3875c16451ad5a7723"},
+ {file = "frozenlist-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:374ca2dabdccad8e2a76d40b1d037f5bd16824933bf7bcea3e59c891fd4a0923"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9bbcdfaf4af7ce002694a4e10a0159d5a8d20056a12b05b45cea944a4953f972"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1893f948bf6681733aaccf36c5232c231e3b5166d607c5fa77773611df6dc336"},
+ {file = "frozenlist-1.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b5e23253bb709ef57a8e95e6ae48daa9ac5f265637529e4ce6b003a37b2621f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f253985bb515ecd89629db13cb58d702035ecd8cfbca7d7a7e29a0e6d39af5f"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:04a5c6babd5e8fb7d3c871dc8b321166b80e41b637c31a995ed844a6139942b6"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9fe0f1c29ba24ba6ff6abf688cb0b7cf1efab6b6aa6adc55441773c252f7411"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226d72559fa19babe2ccd920273e767c96a49b9d3d38badd7c91a0fdeda8ea08"},
+ {file = "frozenlist-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b731db116ab3aedec558573c1a5eec78822b32292fe4f2f0345b7f697745c2"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:366d8f93e3edfe5a918c874702f78faac300209a4d5bf38352b2c1bdc07a766d"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1b96af8c582b94d381a1c1f51ffaedeb77c821c690ea5f01da3d70a487dd0a9b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:c03eff4a41bd4e38415cbed054bbaff4a075b093e2394b6915dca34a40d1e38b"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:50cf5e7ee9b98f22bdecbabf3800ae78ddcc26e4a435515fc72d97903e8488e0"},
+ {file = "frozenlist-1.5.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e76bfbc72353269c44e0bc2cfe171900fbf7f722ad74c9a7b638052afe6a00c"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win32.whl", hash = "sha256:666534d15ba8f0fda3f53969117383d5dc021266b3c1a42c9ec4855e4b58b9d3"},
+ {file = "frozenlist-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:5c28f4b5dbef8a0d8aad0d4de24d1e9e981728628afaf4ea0792f5d0939372f0"},
+ {file = "frozenlist-1.5.0-py3-none-any.whl", hash = "sha256:d994863bba198a4a518b467bb971c56e1db3f180a25c6cf7bb1949c267f748c3"},
+ {file = "frozenlist-1.5.0.tar.gz", hash = "sha256:81d5af29e61b9c8348e876d442253723928dce6433e0e76cd925cd83f1b4b817"},
]
[[package]]
@@ -1141,13 +1156,13 @@ pyyaml = ">=5.1"
[[package]]
name = "mkdocs-git-revision-date-localized-plugin"
-version = "1.2.9"
+version = "1.3.0"
description = "Mkdocs plugin that enables displaying the localized date of the last git modification of a markdown file."
optional = false
python-versions = ">=3.8"
files = [
- {file = "mkdocs_git_revision_date_localized_plugin-1.2.9-py3-none-any.whl", hash = "sha256:dea5c8067c23df30275702a1708885500fadf0abfb595b60e698bffc79c7a423"},
- {file = "mkdocs_git_revision_date_localized_plugin-1.2.9.tar.gz", hash = "sha256:df9a50873fba3a42ce9123885f8c53d589e90ef6c2443fe3280ef1e8d33c8f65"},
+ {file = "mkdocs_git_revision_date_localized_plugin-1.3.0-py3-none-any.whl", hash = "sha256:c99377ee119372d57a9e47cff4e68f04cce634a74831c06bc89b33e456e840a1"},
+ {file = "mkdocs_git_revision_date_localized_plugin-1.3.0.tar.gz", hash = "sha256:439e2f14582204050a664c258861c325064d97cdc848c541e48bb034a6c4d0cb"},
]
[package.dependencies]
@@ -1163,13 +1178,13 @@ dev = ["click", "codecov", "mkdocs-gen-files", "mkdocs-git-authors-plugin", "mkd
[[package]]
name = "mkdocs-material"
-version = "9.5.42"
+version = "9.5.44"
description = "Documentation that simply works"
optional = false
python-versions = ">=3.8"
files = [
- {file = "mkdocs_material-9.5.42-py3-none-any.whl", hash = "sha256:452a7c5d21284b373f36b981a2cbebfff59263feebeede1bc28652e9c5bbe316"},
- {file = "mkdocs_material-9.5.42.tar.gz", hash = "sha256:92779b5e9b5934540c574c11647131d217dc540dce72b05feeda088c8eb1b8f2"},
+ {file = "mkdocs_material-9.5.44-py3-none-any.whl", hash = "sha256:47015f9c167d58a5ff5e682da37441fc4d66a1c79334bfc08d774763cacf69ca"},
+ {file = "mkdocs_material-9.5.44.tar.gz", hash = "sha256:f3a6c968e524166b3f3ed1fb97d3ed3e0091183b0545cedf7156a2a6804c56c0"},
]
[package.dependencies]
@@ -1252,17 +1267,17 @@ python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"]
[[package]]
name = "mkdocstrings-python"
-version = "0.10.1"
+version = "1.3.0"
description = "A Python handler for mkdocstrings."
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
files = [
- {file = "mkdocstrings_python-0.10.1-py3-none-any.whl", hash = "sha256:ef239cee2c688e2b949a0a47e42a141d744dd12b7007311b3309dc70e3bafc5c"},
- {file = "mkdocstrings_python-0.10.1.tar.gz", hash = "sha256:b72301fff739070ec517b5b36bf2f7c49d1360a275896a64efb97fc17d3f3968"},
+ {file = "mkdocstrings_python-1.3.0-py3-none-any.whl", hash = "sha256:36c224c86ab77e90e0edfc9fea3307f7d0d245dd7c28f48bbb2203cf6e125530"},
+ {file = "mkdocstrings_python-1.3.0.tar.gz", hash = "sha256:f967f84bab530fcc13cc9c02eccf0c18bdb2c3bab5c55fa2045938681eec4fc4"},
]
[package.dependencies]
-griffe = ">=0.24"
+griffe = ">=0.30,<0.33"
mkdocstrings = ">=0.20"
[[package]]
@@ -1444,43 +1459,43 @@ typing-extensions = {version = ">=4.1.0", markers = "python_version < \"3.11\""}
[[package]]
name = "mypy"
-version = "1.12.1"
+version = "1.13.0"
description = "Optional static typing for Python"
optional = false
python-versions = ">=3.8"
files = [
- {file = "mypy-1.12.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3d7d4371829184e22fda4015278fbfdef0327a4b955a483012bd2d423a788801"},
- {file = "mypy-1.12.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f59f1dfbf497d473201356966e353ef09d4daec48caeacc0254db8ef633a28a5"},
- {file = "mypy-1.12.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b947097fae68004b8328c55161ac9db7d3566abfef72d9d41b47a021c2fba6b1"},
- {file = "mypy-1.12.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:96af62050971c5241afb4701c15189ea9507db89ad07794a4ee7b4e092dc0627"},
- {file = "mypy-1.12.1-cp310-cp310-win_amd64.whl", hash = "sha256:d90da248f4c2dba6c44ddcfea94bb361e491962f05f41990ff24dbd09969ce20"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1230048fec1380faf240be6385e709c8570604d2d27ec6ca7e573e3bc09c3735"},
- {file = "mypy-1.12.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02dcfe270c6ea13338210908f8cadc8d31af0f04cee8ca996438fe6a97b4ec66"},
- {file = "mypy-1.12.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a5a437c9102a6a252d9e3a63edc191a3aed5f2fcb786d614722ee3f4472e33f6"},
- {file = "mypy-1.12.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:186e0c8346efc027ee1f9acf5ca734425fc4f7dc2b60144f0fbe27cc19dc7931"},
- {file = "mypy-1.12.1-cp311-cp311-win_amd64.whl", hash = "sha256:673ba1140a478b50e6d265c03391702fa11a5c5aff3f54d69a62a48da32cb811"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9fb83a7be97c498176fb7486cafbb81decccaef1ac339d837c377b0ce3743a7f"},
- {file = "mypy-1.12.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:389e307e333879c571029d5b93932cf838b811d3f5395ed1ad05086b52148fb0"},
- {file = "mypy-1.12.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94b2048a95a21f7a9ebc9fbd075a4fcd310410d078aa0228dbbad7f71335e042"},
- {file = "mypy-1.12.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ee5932370ccf7ebf83f79d1c157a5929d7ea36313027b0d70a488493dc1b179"},
- {file = "mypy-1.12.1-cp312-cp312-win_amd64.whl", hash = "sha256:19bf51f87a295e7ab2894f1d8167622b063492d754e69c3c2fed6563268cb42a"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d34167d43613ffb1d6c6cdc0cc043bb106cac0aa5d6a4171f77ab92a3c758bcc"},
- {file = "mypy-1.12.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:427878aa54f2e2c5d8db31fa9010c599ed9f994b3b49e64ae9cd9990c40bd635"},
- {file = "mypy-1.12.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5fcde63ea2c9f69d6be859a1e6dd35955e87fa81de95bc240143cf00de1f7f81"},
- {file = "mypy-1.12.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:d54d840f6c052929f4a3d2aab2066af0f45a020b085fe0e40d4583db52aab4e4"},
- {file = "mypy-1.12.1-cp313-cp313-win_amd64.whl", hash = "sha256:20db6eb1ca3d1de8ece00033b12f793f1ea9da767334b7e8c626a4872090cf02"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b16fe09f9c741d85a2e3b14a5257a27a4f4886c171d562bc5a5e90d8591906b8"},
- {file = "mypy-1.12.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0dcc1e843d58f444fce19da4cce5bd35c282d4bde232acdeca8279523087088a"},
- {file = "mypy-1.12.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e10ba7de5c616e44ad21005fa13450cd0de7caaa303a626147d45307492e4f2d"},
- {file = "mypy-1.12.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0e6fe449223fa59fbee351db32283838a8fee8059e0028e9e6494a03802b4004"},
- {file = "mypy-1.12.1-cp38-cp38-win_amd64.whl", hash = "sha256:dc6e2a2195a290a7fd5bac3e60b586d77fc88e986eba7feced8b778c373f9afe"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:de5b2a8988b4e1269a98beaf0e7cc71b510d050dce80c343b53b4955fff45f19"},
- {file = "mypy-1.12.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:843826966f1d65925e8b50d2b483065c51fc16dc5d72647e0236aae51dc8d77e"},
- {file = "mypy-1.12.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9fe20f89da41a95e14c34b1ddb09c80262edcc295ad891f22cc4b60013e8f78d"},
- {file = "mypy-1.12.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8135ffec02121a75f75dc97c81af7c14aa4ae0dda277132cfcd6abcd21551bfd"},
- {file = "mypy-1.12.1-cp39-cp39-win_amd64.whl", hash = "sha256:a7b76fa83260824300cc4834a3ab93180db19876bce59af921467fd03e692810"},
- {file = "mypy-1.12.1-py3-none-any.whl", hash = "sha256:ce561a09e3bb9863ab77edf29ae3a50e65685ad74bba1431278185b7e5d5486e"},
- {file = "mypy-1.12.1.tar.gz", hash = "sha256:f5b3936f7a6d0e8280c9bdef94c7ce4847f5cdfc258fbb2c29a8c1711e8bb96d"},
+ {file = "mypy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6607e0f1dd1fb7f0aca14d936d13fd19eba5e17e1cd2a14f808fa5f8f6d8f60a"},
+ {file = "mypy-1.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8a21be69bd26fa81b1f80a61ee7ab05b076c674d9b18fb56239d72e21d9f4c80"},
+ {file = "mypy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b2353a44d2179846a096e25691d54d59904559f4232519d420d64da6828a3a7"},
+ {file = "mypy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0730d1c6a2739d4511dc4253f8274cdd140c55c32dfb0a4cf8b7a43f40abfa6f"},
+ {file = "mypy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:c5fc54dbb712ff5e5a0fca797e6e0aa25726c7e72c6a5850cfd2adbc1eb0a372"},
+ {file = "mypy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:581665e6f3a8a9078f28d5502f4c334c0c8d802ef55ea0e7276a6e409bc0d82d"},
+ {file = "mypy-1.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3ddb5b9bf82e05cc9a627e84707b528e5c7caaa1c55c69e175abb15a761cec2d"},
+ {file = "mypy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20c7ee0bc0d5a9595c46f38beb04201f2620065a93755704e141fcac9f59db2b"},
+ {file = "mypy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3790ded76f0b34bc9c8ba4def8f919dd6a46db0f5a6610fb994fe8efdd447f73"},
+ {file = "mypy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51f869f4b6b538229c1d1bcc1dd7d119817206e2bc54e8e374b3dfa202defcca"},
+ {file = "mypy-1.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5c7051a3461ae84dfb5dd15eff5094640c61c5f22257c8b766794e6dd85e72d5"},
+ {file = "mypy-1.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:39bb21c69a5d6342f4ce526e4584bc5c197fd20a60d14a8624d8743fffb9472e"},
+ {file = "mypy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:164f28cb9d6367439031f4c81e84d3ccaa1e19232d9d05d37cb0bd880d3f93c2"},
+ {file = "mypy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a4c1bfcdbce96ff5d96fc9b08e3831acb30dc44ab02671eca5953eadad07d6d0"},
+ {file = "mypy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0affb3a79a256b4183ba09811e3577c5163ed06685e4d4b46429a271ba174d2"},
+ {file = "mypy-1.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a7b44178c9760ce1a43f544e595d35ed61ac2c3de306599fa59b38a6048e1aa7"},
+ {file = "mypy-1.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5d5092efb8516d08440e36626f0153b5006d4088c1d663d88bf79625af3d1d62"},
+ {file = "mypy-1.13.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2904956dac40ced10931ac967ae63c5089bd498542194b436eb097a9f77bc8"},
+ {file = "mypy-1.13.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:7bfd8836970d33c2105562650656b6846149374dc8ed77d98424b40b09340ba7"},
+ {file = "mypy-1.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:9f73dba9ec77acb86457a8fc04b5239822df0c14a082564737833d2963677dbc"},
+ {file = "mypy-1.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:100fac22ce82925f676a734af0db922ecfea991e1d7ec0ceb1e115ebe501301a"},
+ {file = "mypy-1.13.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7bcb0bb7f42a978bb323a7c88f1081d1b5dee77ca86f4100735a6f541299d8fb"},
+ {file = "mypy-1.13.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bde31fc887c213e223bbfc34328070996061b0833b0a4cfec53745ed61f3519b"},
+ {file = "mypy-1.13.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07de989f89786f62b937851295ed62e51774722e5444a27cecca993fc3f9cd74"},
+ {file = "mypy-1.13.0-cp38-cp38-win_amd64.whl", hash = "sha256:4bde84334fbe19bad704b3f5b78c4abd35ff1026f8ba72b29de70dda0916beb6"},
+ {file = "mypy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0246bcb1b5de7f08f2826451abd947bf656945209b140d16ed317f65a17dc7dc"},
+ {file = "mypy-1.13.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7f5b7deae912cf8b77e990b9280f170381fdfbddf61b4ef80927edd813163732"},
+ {file = "mypy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7029881ec6ffb8bc233a4fa364736789582c738217b133f1b55967115288a2bc"},
+ {file = "mypy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3e38b980e5681f28f033f3be86b099a247b13c491f14bb8b1e1e134d23bb599d"},
+ {file = "mypy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:a6789be98a2017c912ae6ccb77ea553bbaf13d27605d2ca20a76dfbced631b24"},
+ {file = "mypy-1.13.0-py3-none-any.whl", hash = "sha256:9c250883f9fd81d212e0952c92dbfcc96fc237f4b7c92f56ac81fd48460b3e5a"},
+ {file = "mypy-1.13.0.tar.gz", hash = "sha256:0291a61b6fbf3e6673e3405cfcc0e7650bebc7939659fdca2702958038bd835e"},
]
[package.dependencies]
@@ -1490,6 +1505,7 @@ typing-extensions = ">=4.6.0"
[package.extras]
dmypy = ["psutil (>=4.0)"]
+faster-cache = ["orjson"]
install-types = ["pip"]
mypyc = ["setuptools (>=50)"]
reports = ["lxml"]
@@ -1725,13 +1741,13 @@ windows-terminal = ["colorama (>=0.4.6)"]
[[package]]
name = "pymdown-extensions"
-version = "10.11.2"
+version = "10.12"
description = "Extension pack for Python Markdown."
optional = false
python-versions = ">=3.8"
files = [
- {file = "pymdown_extensions-10.11.2-py3-none-any.whl", hash = "sha256:41cdde0a77290e480cf53892f5c5e50921a7ee3e5cd60ba91bf19837b33badcf"},
- {file = "pymdown_extensions-10.11.2.tar.gz", hash = "sha256:bc8847ecc9e784a098efd35e20cba772bc5a1b529dfcef9dc1972db9021a1049"},
+ {file = "pymdown_extensions-10.12-py3-none-any.whl", hash = "sha256:49f81412242d3527b8b4967b990df395c89563043bc51a3d2d7d500e52123b77"},
+ {file = "pymdown_extensions-10.12.tar.gz", hash = "sha256:b0ee1e0b2bef1071a47891ab17003bfe5bf824a398e13f49f8ed653b699369a7"},
]
[package.dependencies]
@@ -2081,13 +2097,13 @@ idna2008 = ["idna"]
[[package]]
name = "rich"
-version = "13.9.2"
+version = "13.9.4"
description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal"
optional = false
python-versions = ">=3.8.0"
files = [
- {file = "rich-13.9.2-py3-none-any.whl", hash = "sha256:8c82a3d3f8dcfe9e734771313e606b39d8247bb6b826e196f4914b333b743cf1"},
- {file = "rich-13.9.2.tar.gz", hash = "sha256:51a2c62057461aaf7152b4d611168f93a9fc73068f8ded2790f29fe2b5366d0c"},
+ {file = "rich-13.9.4-py3-none-any.whl", hash = "sha256:6049d5e6ec054bf2779ab3358186963bac2ea89175919d699e378b99738c2a90"},
+ {file = "rich-13.9.4.tar.gz", hash = "sha256:439594978a49a09530cff7ebc4b5c7103ef57baf48d5ea3184f21d9a2befa098"},
]
[package.dependencies]
@@ -2100,23 +2116,23 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"]
[[package]]
name = "setuptools"
-version = "75.2.0"
+version = "75.3.0"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "setuptools-75.2.0-py3-none-any.whl", hash = "sha256:a7fcb66f68b4d9e8e66b42f9876150a3371558f98fa32222ffaa5bced76406f8"},
- {file = "setuptools-75.2.0.tar.gz", hash = "sha256:753bb6ebf1f465a1912e19ed1d41f403a79173a9acf66a42e7e6aec45c3c16ec"},
+ {file = "setuptools-75.3.0-py3-none-any.whl", hash = "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd"},
+ {file = "setuptools-75.3.0.tar.gz", hash = "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686"},
]
[package.extras]
check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1)", "ruff (>=0.5.2)"]
-core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
+core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.collections", "jaraco.functools", "jaraco.text (>=3.7)", "more-itertools", "more-itertools (>=8.8)", "packaging", "packaging (>=24)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"]
cover = ["pytest-cov"]
doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
enabler = ["pytest-enabler (>=2.2)"]
-test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
-type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.11.*)", "pytest-mypy"]
+test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test (>=5.5)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
+type = ["importlib-metadata (>=7.0.2)", "jaraco.develop (>=7.21)", "mypy (==1.12.*)", "pytest-mypy"]
[[package]]
name = "six"
@@ -2463,13 +2479,13 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "virtualenv"
-version = "20.27.0"
+version = "20.27.1"
description = "Virtual Python Environment builder"
optional = false
python-versions = ">=3.8"
files = [
- {file = "virtualenv-20.27.0-py3-none-any.whl", hash = "sha256:44a72c29cceb0ee08f300b314848c86e57bf8d1f13107a5e671fb9274138d655"},
- {file = "virtualenv-20.27.0.tar.gz", hash = "sha256:2ca56a68ed615b8fe4326d11a0dca5dfbe8fd68510fb6c6349163bed3c15f2b2"},
+ {file = "virtualenv-20.27.1-py3-none-any.whl", hash = "sha256:f11f1b8a29525562925f745563bfd48b189450f61fb34c4f9cc79dd5aa32a1f4"},
+ {file = "virtualenv-20.27.1.tar.gz", hash = "sha256:142c6be10212543b32c6c45d3d3893dff89112cc588b7d0879ae5a1ec03a47ba"},
]
[package.dependencies]
@@ -2665,4 +2681,4 @@ syntax = ["tree-sitter", "tree-sitter-languages"]
[metadata]
lock-version = "2.0"
python-versions = "^3.8.1"
-content-hash = "1271ee856073da0649fdb432170dc77787d906b0cb3dc5575d802ba604bbad2e"
+content-hash = "a8060820245b4814ed458ea71aabc37a56aaf17951108195a276ae98bb0bf1b8"
diff --git a/pyproject.toml b/pyproject.toml
index 83154ce6f2..57a2f605e7 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -62,7 +62,7 @@ mkdocs-git-revision-date-localized-plugin = "^1.2.5"
mkdocs-material = "^9.0.11"
mkdocs-rss-plugin = "^1.5.0"
mkdocstrings = { extras = ["python"], version = "^0.20.0" }
-mkdocstrings-python = "0.10.1"
+mkdocstrings-python = "^1.0.0"
mypy = "^1.0.0"
pre-commit = "^2.13.0"
pytest = "^8.3.1"
@@ -79,7 +79,7 @@ pytest-textual-snapshot = "^1.0.0"
[tool.pytest.ini_options]
asyncio_mode = "auto"
testpaths = ["tests"]
-addopts = "--strict-markers -vv"
+addopts = "--strict-markers"
markers = [
"syntax: marks tests that require syntax highlighting (deselect with '-m \"not syntax\"')",
]
diff --git a/reference/_color_system.md b/reference/_color_system.md
deleted file mode 100644
index 7915c39f95..0000000000
--- a/reference/_color_system.md
+++ /dev/null
@@ -1,73 +0,0 @@
-_Note: This is kind of a living document, which might not form part of the user-facing documentation._
-
-# Textual Color System
-
-Textual's color system is a palette of colors for building TUIs, and a set of guidelines for how they should be used. Based loosely on Google's Material color system, the Textual color system ensures that elements in the TUI look aesthetically pleasing while maximizing legibility
-
-## The colors
-
-There are 10 base colors specified in the Textual Color System. Although it is unlikely that all will need to be specified, since some may be derived from others, and some defaults may not need to be changed.
-
-A dark mode is automatically derived from the base colors. See Dark Mode below.
-
-### Shades
-
-Each color has 6 additional shades (3 darker and 3 lighter), giving a total of 7 shades per color. These are calculated automatically from the base colors.
-
-### Primary and Secondary
-
-The _primary_ and _secondary_ colors are used as a background for large areas of the interface, such as headers and sidebars. The secondary color is optional, and if not supplied will be set to be the same as primary. If supplied, the secondary color should be compliment the primary, and together can be considered the _branding colors_ as they have the greatest influence over the look of the TUI.
-
-### Background and Surface
-
-The _surface_ colors is the base color which goes behind text. The _background_ color is typically the negative space where there is no content.
-
-These two colors tend to be very similar, with just enough difference in lightness to tell them apart. They should be chosen for good contrast with the text.
-
-In light mode the default background is #efefef (a bright grey) and the surface is #f5f5f5 (off white). In dark mode the default background is 100% black, and the default surface is #121212 (very dark grey).
-
-Note that, although both background and surface support the full range of shades, it may not be possible to darken or lighten them further. i.e. you can't get any lighter than 100% white or darken than 100% black.
-
-### Panel
-
-The _panel_ color is typically used as a background to emphasize text on the default surface, or as a UI element that is above the regular UI, such as a menu.
-
-The default panel color is derived from the surface color by blending it towards either white or black text (depending on mode).
-
-Unlike background and surface, the panel color is automatically selected so that it can always be lightened or darkened by the full range.
-
-### Accent
-
-The _accent_ color should be a contrasting color use in UI elements that should stand out, such as selections, status bars, and underlines.
-
-### Warning, Error, and Success
-
-The _warning_, _error_, and _success_ colors have semantic meaning. While they could be any color, by convention warning should be amber / orange, error should be red, and success should be green.
-
-### System
-
-The system color is used for system controls such as scrollbars. The default is for the system color to be the same as accent, but it is recommended that a different color is chosen to differentiate app controls from those rendered by the Textual system.
-
-## Text
-
-For every color and shade there is an automatically calculated text color, which is either white or black, chosen to produce the greatest contrast.
-
-The default text color as a slight alpha component, so that it not pure black or pure white, but a slight tint of the background showing through. Additionally, there are two text shades with increasingly greater alpha for reduced intensity text.
-
-## Dark Mode
-
-A dark mode is automatically generated from the theme. The dark variations of the primary and secondary colors are generated by blending with the background color. This ensures that the branding remains intact, while still providing dark backgrounds.
-
-The dark variations of the background and surface color defaults are selected. The other colors remain the same as light mode. The overall effect is that the majority of the interface is dark, with small portions highlighted by color.
-
-## Naming
-
-The color system produces a number of constants which are exposed in the CSS via variables.
-
-The name of the color will return one of the standard set of colors, for example `primary` or `panel`.
-
-For one of the shade variations, you can append `-darken-1`, `-darken-2`, `-darken-3` for increasingly darker colors, and `-lighten-1`, `lighten-2`, `lighten-3` for increasingly light colors.
-
-For the contrasting text color, prefix the name with `text-`, for instance `text-primary` or `text-panel`. Note that if the text is to be on top of a darkened or lightened color, it must also be included in the name. i.e. if the background is `primary-darken-2`, then the corresponding text color should be `text-primary-darken-2`.
-
-The additional two levels of faded text may be requested by appending `-fade-1` or `-fade-2` for decreasing levels of text alpha.
diff --git a/src/textual/_text_area_theme.py b/src/textual/_text_area_theme.py
index ad2e607f84..e315716f30 100644
--- a/src/textual/_text_area_theme.py
+++ b/src/textual/_text_area_theme.py
@@ -5,9 +5,7 @@
from rich.style import Style
-from textual.app import DEFAULT_COLORS
from textual.color import Color
-from textual.design import DEFAULT_DARK_SURFACE
if TYPE_CHECKING:
from textual.widgets import TextArea
@@ -92,9 +90,11 @@ def apply_css(self, text_area: TextArea) -> None:
if self.base_style.color is None:
self.base_style = Style(color="#f3f3f3", bgcolor=self.base_style.bgcolor)
+ app_theme = text_area.app.current_theme
+
if self.base_style.bgcolor is None:
self.base_style = Style(
- color=self.base_style.color, bgcolor=DEFAULT_DARK_SURFACE
+ color=self.base_style.color, bgcolor=app_theme.surface
)
configured = self._theme_configured_attributes.__contains__
@@ -148,7 +148,7 @@ def apply_css(self, text_area: TextArea) -> None:
self.selection_style = selection_style
else:
selection_background_color = background_color.blend(
- DEFAULT_COLORS["dark"].primary, factor=0.75
+ app_theme.primary, factor=0.75
)
self.selection_style = Style.from_color(
bgcolor=selection_background_color.rich_color
diff --git a/src/textual/app.py b/src/textual/app.py
index ee2aa45992..264243455f 100644
--- a/src/textual/app.py
+++ b/src/textual/app.py
@@ -92,11 +92,10 @@
from textual.await_complete import AwaitComplete
from textual.await_remove import AwaitRemove
from textual.binding import Binding, BindingsMap, BindingType, Keymap
-from textual.command import CommandPalette, Provider
+from textual.command import CommandListItem, CommandPalette, Provider, SimpleProvider
from textual.css.errors import StylesheetError
from textual.css.query import NoMatches
from textual.css.stylesheet import RulesMap, Stylesheet
-from textual.design import ColorSystem
from textual.dom import DOMNode, NoScreen
from textual.driver import Driver
from textual.errors import NoWidget
@@ -122,6 +121,7 @@
SystemModalScreen,
)
from textual.signal import Signal
+from textual.theme import BUILTIN_THEMES, Theme, ThemeProvider
from textual.timer import Timer
from textual.widget import AwaitMount, Widget
from textual.widgets._toast import ToastRack
@@ -151,42 +151,6 @@
# `asyncio.get_event_loop()` is deprecated since Python 3.10:
_ASYNCIO_GET_EVENT_LOOP_IS_DEPRECATED = sys.version_info >= (3, 10, 0)
-LayoutDefinition = "dict[str, Any]"
-
-DEFAULT_COLORS = {
- "dark": ColorSystem(
- primary="#004578",
- secondary="#ffa62b",
- warning="#ffa62b",
- error="#ba3c5b",
- success="#4EBF71",
- accent="#0178D4",
- dark=True,
- ),
- "light": ColorSystem(
- primary="#004578",
- secondary="#ffa62b",
- warning="#ffa62b",
- error="#ba3c5b",
- success="#4EBF71",
- accent="#0178D4",
- dark=False,
- ),
- "ansi": ColorSystem(
- "ansi_blue",
- secondary="ansi_cyan",
- warning="ansi_yellow",
- error="ansi_red",
- success="ansi_green",
- accent="ansi_bright_blue",
- foreground="ansi_default",
- background="ansi_default",
- surface="ansi_default",
- panel="ansi_default",
- boost="ansi_default",
- ),
-}
-
ComposeResult = Iterable[Widget]
RenderResult = RenderableType
@@ -266,6 +230,10 @@ class SuspendNotSupported(Exception):
"""
+class InvalidThemeError(Exception):
+ """Raised when an invalid theme is set."""
+
+
ReturnType = TypeVar("ReturnType")
CallThreadReturnType = TypeVar("CallThreadReturnType")
@@ -331,7 +299,7 @@ class App(Generic[ReturnType], DOMNode):
DEFAULT_CSS = """
App {
background: $background;
- color: $text;
+ color: $foreground;
&:ansi {
background: ansi_default;
@@ -496,11 +464,11 @@ class MyApp(App[None]):
HOVER_EFFECTS_SCROLL_PAUSE: ClassVar[float] = 0.2
"""Seconds to pause hover effects for when scrolling."""
- _PSEUDO_CLASSES: ClassVar[dict[str, Callable[[App], bool]]] = {
+ _PSEUDO_CLASSES: ClassVar[dict[str, Callable[[App[Any]], bool]]] = {
"focus": lambda app: app.app_focus,
"blur": lambda app: not app.app_focus,
- "dark": lambda app: app.dark,
- "light": lambda app: not app.dark,
+ "dark": lambda app: app.current_theme.dark,
+ "light": lambda app: not app.current_theme.dark,
"inline": lambda app: app.is_inline,
"ansi": lambda app: app.ansi_color,
"nocolor": lambda app: app.no_color,
@@ -511,16 +479,6 @@ class MyApp(App[None]):
sub_title: Reactive[str] = Reactive("", compute=False)
"""The app's sub-title, combined with [`title`][textual.app.App.title] in the header."""
- dark: Reactive[bool] = Reactive(True, compute=False)
- """Use a dark theme if `True`, otherwise use a light theme.
-
- Modify this attribute to switch between light and dark themes.
-
- Example:
- ```python
- self.app.dark = not self.app.dark # Toggle dark mode
- ```
- """
app_focus = Reactive(True, compute=False)
"""Indicates if the app has focus.
@@ -528,11 +486,14 @@ class MyApp(App[None]):
get focus when the terminal widget has focus.
"""
+ theme: Reactive[str] = Reactive("textual-dark")
+ """The name of the currently active theme."""
+
ansi_theme_dark = Reactive(MONOKAI, init=False)
- """Maps ANSI colors to hex colors using a Rich TerminalTheme object while in dark mode."""
+ """Maps ANSI colors to hex colors using a Rich TerminalTheme object while using a dark theme."""
ansi_theme_light = Reactive(ALABASTER, init=False)
- """Maps ANSI colors to hex colors using a Rich TerminalTheme object while in light mode."""
+ """Maps ANSI colors to hex colors using a Rich TerminalTheme object while using a light theme."""
ansi_color = Reactive(False)
"""Allow ANSI colors in UI?"""
@@ -563,7 +524,14 @@ def __init__(
super().__init__()
self.features: frozenset[FeatureFlag] = parse_features(os.getenv("TEXTUAL", ""))
- ansi_theme = self.ansi_theme_dark if self.dark else self.ansi_theme_light
+ self._registered_themes: dict[str, Theme] = {}
+ """Themes that have been registered with the App using `App.register_theme`.
+
+ This excludes the built-in themes."""
+
+ ansi_theme = (
+ self.ansi_theme_dark if self.current_theme.dark else self.ansi_theme_light
+ )
self.set_reactive(App.ansi_color, ansi_color)
self._filters: list[LineFilter] = [
ANSIToTruecolor(ansi_theme, enabled=not ansi_color)
@@ -665,9 +633,10 @@ def __init__(
self._refresh_required = False
- self.design = DEFAULT_COLORS
-
self._css_has_errors = False
+
+ # Note that the theme must be set *before* self.get_css_variables() is called
+ # to ensure that the variables are retrieved from the currently active theme.
self.stylesheet = Stylesheet(variables=self.get_css_variables())
css_path = css_path or self.CSS_PATH
@@ -744,6 +713,12 @@ def __init__(
self._original_stderr = sys.__stderr__
"""The original stderr stream (before redirection etc)."""
+ self.theme_changed_signal: Signal[Theme] = Signal(self, "theme-changed")
+ """Signal that is published when the App's theme is changed.
+
+ Subscribers will receive the new theme object as an argument to the callback.
+ """
+
self.app_suspend_signal: Signal[App] = Signal(self, "app-suspend")
"""The signal that is published when the app is suspended.
@@ -762,8 +737,8 @@ def __init__(
perform work after the app has resumed.
"""
- self.set_class(self.dark, "-dark-mode")
- self.set_class(not self.dark, "-light-mode")
+ self.set_class(self.current_theme.dark, "-dark-mode")
+ self.set_class(not self.current_theme.dark, "-light-mode")
self.animation_level: AnimationLevel = constants.TEXTUAL_ANIMATIONS
"""Determines what type of animations the app will display.
@@ -1109,19 +1084,11 @@ def get_system_commands(self, screen: Screen) -> Iterable[SystemCommand]:
[SystemCommand][textual.app.SystemCommand] instances.
"""
if not self.ansi_color:
- if self.dark:
- yield SystemCommand(
- "Light mode",
- "Switch to a light background",
- self.action_toggle_dark,
- )
- else:
- yield SystemCommand(
- "Dark mode",
- "Switch to a dark background",
- self.action_toggle_dark,
- )
-
+ yield SystemCommand(
+ "Change theme",
+ "Change the current theme",
+ self.action_change_theme,
+ )
yield SystemCommand(
"Quit the application",
"Quit the application as soon as possible",
@@ -1178,6 +1145,25 @@ def compose(self) -> ComposeResult:
"""
yield from ()
+ def get_theme_variable_defaults(self) -> dict[str, str]:
+ """Get the default values for the `variables` used in a theme.
+
+ If the currently specified theme doesn't define a value for a variable,
+ the value specified here will be used as a fallback.
+
+ If a variable is referenced in CSS but does not appear either here
+ or in the theme, the CSS will fail to parse on startup.
+
+ This method allows applications to define their own variables, beyond
+ those offered by Textual, which can then be overridden by a Theme.
+
+ Returns:
+ A mapping of variable name (e.g. "my-button-background-color") to value.
+ Values can be any valid CSS value, e.g. "red 50%", "auto 90%",
+ "#ff0000", "rgb(255, 0, 0)", etc.
+ """
+ return {}
+
def get_css_variables(self) -> dict[str, str]:
"""Get a mapping of variables used to pre-populate CSS.
@@ -1186,39 +1172,99 @@ def get_css_variables(self) -> dict[str, str]:
Returns:
A mapping of variable name to value.
"""
+ theme = self.current_theme
+ # Build the Textual color system from the theme.
+ # This will contain $secondary, $primary, $background, etc.
+ variables = theme.to_color_system().generate()
+ # Apply the additional variables from the theme
+ variables = {**variables, **(theme.variables)}
+ theme_variables = self.get_theme_variable_defaults()
+ return {**theme_variables, **variables}
+
+ def get_theme(self, theme_name: str) -> Theme | None:
+ """Get a theme by name.
- if self.dark:
- design = self.design["dark"]
- else:
- design = self.design["light"]
+ Args:
+ theme_name: The name of the theme to get.
- variables = design.generate()
- return variables
+ Returns:
+ A Theme instance and None if the theme doesn't exist.
+ """
+ return self.available_themes[theme_name]
- def _invalidate_css(self) -> None:
- """Invalidate CSS, so it will be refreshed."""
- self._css_update_count += 1
+ def register_theme(self, theme: Theme) -> None:
+ """Register a theme with the app.
+
+ If the theme already exists, it will be overridden.
+
+ After registering a theme, you can activate it by setting the
+ `App.theme` attribute. To retrieve a registered theme, use the
+ `App.get_theme` method.
- def watch_dark(self, dark: bool) -> None:
- """Watches the dark bool.
+ Args:
+ theme: The theme to register.
+ """
+ self._registered_themes[theme.name] = theme
+
+ def unregister_theme(self, theme_name: str) -> None:
+ """Unregister a theme with the app.
+
+ Args:
+ theme_name: The name of the theme to unregister.
+ """
+ if theme_name in self._registered_themes:
+ del self._registered_themes[theme_name]
+
+ @property
+ def available_themes(self) -> dict[str, Theme]:
+ """All available themes (all built-in themes plus any that have been registered).
- This method handles the transition between light and dark mode when you
- change the [dark][textual.app.App.dark] attribute.
+ A dictionary mapping theme names to Theme instances.
"""
+ return {**BUILTIN_THEMES, **self._registered_themes}
+
+ @property
+ def current_theme(self) -> Theme:
+ theme = self.get_theme(self.theme)
+ assert theme is not None # validated by _validate_theme
+ return theme
+
+ def _validate_theme(self, theme_name: str) -> str:
+ if theme_name not in self.available_themes:
+ message = (
+ f"Theme {theme_name!r} has not been registered. "
+ "Call 'App.register_theme' before setting the 'App.theme' attribute."
+ )
+ raise InvalidThemeError(message)
+ return theme_name
+
+ def _watch_theme(self, theme_name: str) -> None:
+ """Apply a theme to the application.
+
+ This method is called when the theme reactive attribute is set.
+ """
+ theme = self.current_theme
+ dark = theme.dark
+ self.ansi_color = theme_name == "textual-ansi"
self.set_class(dark, "-dark-mode", update=False)
self.set_class(not dark, "-light-mode", update=False)
self._refresh_truecolor_filter(self.ansi_theme)
self._invalidate_css()
self.call_next(self.refresh_css)
+ self.call_next(self.theme_changed_signal.publish, theme)
+
+ def _invalidate_css(self) -> None:
+ """Invalidate CSS, so it will be refreshed."""
+ self._css_update_count += 1
def watch_ansi_theme_dark(self, theme: TerminalTheme) -> None:
- if self.dark:
+ if self.current_theme.dark:
self._refresh_truecolor_filter(theme)
self._invalidate_css()
self.call_next(self.refresh_css)
def watch_ansi_theme_light(self, theme: TerminalTheme) -> None:
- if not self.dark:
+ if not self.current_theme.dark:
self._refresh_truecolor_filter(theme)
self._invalidate_css()
self.call_next(self.refresh_css)
@@ -1230,7 +1276,9 @@ def ansi_theme(self) -> TerminalTheme:
Defines how colors defined as ANSI (e.g. `magenta`) inside Rich renderables
are mapped to hex codes.
"""
- return self.ansi_theme_dark if self.dark else self.ansi_theme_light
+ return (
+ self.ansi_theme_dark if self.current_theme.dark else self.ansi_theme_light
+ )
def _refresh_truecolor_filter(self, theme: TerminalTheme) -> None:
"""Update the ANSI to Truecolor filter, if available, with a new theme mapping.
@@ -1499,9 +1547,9 @@ async def run_callback() -> CallThreadReturnType:
result = future.result()
return result
- def action_toggle_dark(self) -> None:
- """An [action](/guide/actions) to toggle dark mode."""
- self.dark = not self.dark
+ def action_change_theme(self) -> None:
+ """An [action](/guide/actions) to change the current theme."""
+ self.search_themes()
def action_screenshot(
self, filename: str | None = None, path: str | None = None
@@ -1613,6 +1661,38 @@ def deliver_screenshot(
name="screenshot",
)
+ def search(
+ self,
+ commands: Sequence[CommandListItem],
+ placeholder: str = "Search for commands…",
+ ) -> AwaitMount:
+ """Show a list of commands in the app.
+
+ Args:
+ commands: A list of SimpleCommand instances.
+
+ Returns:
+ AwaitMount: An awaitable that resolves when the commands are shown.
+ """
+ return self.push_screen(
+ CommandPalette(
+ providers=[SimpleProvider(self.screen, commands)],
+ placeholder=placeholder,
+ )
+ )
+
+ def search_themes(self) -> None:
+ """Show a fuzzy search command palette containing all registered themes.
+
+ Selecting a theme in the list will change the app's theme.
+ """
+ self.push_screen(
+ CommandPalette(
+ providers=[ThemeProvider],
+ placeholder="Search for themes…",
+ ),
+ )
+
def bind(
self,
keys: str,
@@ -4031,6 +4111,15 @@ async def action_toggle_class(self, selector: str, class_name: str) -> None:
"""
self.screen.query(selector).toggle_class(class_name)
+ def action_toggle_dark(self) -> None:
+ """An [action](/guide/actions) to toggle the theme between textual-light
+ and textual-dark. This is offered as a convenience to simplify backwards
+ compatibility with previous versions of Textual which only had light mode
+ and dark mode."""
+ self.theme = (
+ "textual-dark" if self.theme == "textual-light" else "textual-light"
+ )
+
def action_focus_next(self) -> None:
"""An [action](/guide/actions) to focus the next widget."""
self.screen.focus_next()
@@ -4168,7 +4257,7 @@ def clear_notifications(self) -> None:
def action_command_palette(self) -> None:
"""Show the Textual command palette."""
if self.use_command_palette and not CommandPalette.is_open(self):
- self.push_screen(CommandPalette())
+ self.push_screen(CommandPalette(id="--command-palette"))
def _suspend_signal(self) -> None:
"""Signal that the application is being suspended."""
diff --git a/src/textual/command.py b/src/textual/command.py
index f2b54ea826..6f02e11bc2 100644
--- a/src/textual/command.py
+++ b/src/textual/command.py
@@ -21,7 +21,16 @@
from functools import total_ordering
from inspect import isclass
from time import monotonic
-from typing import TYPE_CHECKING, Any, AsyncGenerator, AsyncIterator, ClassVar, Iterable
+from typing import (
+ TYPE_CHECKING,
+ Any,
+ AsyncGenerator,
+ AsyncIterator,
+ Callable,
+ ClassVar,
+ Iterable,
+ NamedTuple,
+)
import rich.repr
from rich.align import Align
@@ -175,6 +184,9 @@ def __post_init__(self) -> None:
Hits: TypeAlias = AsyncIterator["DiscoveryHit | Hit"]
"""Return type for the command provider's `search` method."""
+ProviderSource: TypeAlias = "Iterable[type[Provider] | Callable[[], type[Provider]]]"
+"""The type used to declare the providers for a CommandPalette."""
+
class Provider(ABC):
"""Base class for command palette command providers.
@@ -319,6 +331,78 @@ async def shutdown(self) -> None:
"""
+class SimpleCommand(NamedTuple):
+ """A simple command."""
+
+ name: str
+ """The name of the command."""
+ callback: IgnoreReturnCallbackType
+ """The callback to invoke when the command is selected."""
+ help_text: str | None = None
+ """The description of the command."""
+
+
+CommandListItem: TypeAlias = (
+ "SimpleCommand | tuple[str, IgnoreReturnCallbackType, str | None] | tuple[str, IgnoreReturnCallbackType]"
+)
+
+
+class SimpleProvider(Provider):
+ """A simple provider which the caller can pass commands to."""
+
+ def __init__(
+ self,
+ screen: Screen[Any],
+ commands: list[CommandListItem],
+ ) -> None:
+ # Convert all commands to SimpleCommand instances
+ super().__init__(screen, None)
+ self._commands: list[SimpleCommand] = []
+ for command in commands:
+ if isinstance(command, SimpleCommand):
+ self._commands.append(command)
+ elif len(command) == 2:
+ self._commands.append(SimpleCommand(*command, None))
+ elif len(command) == 3:
+ self._commands.append(SimpleCommand(*command))
+ else:
+ raise ValueError(f"Invalid command: {command}")
+
+ def __call__(
+ self, screen: Screen[Any], match_style: Style | None = None
+ ) -> SimpleProvider:
+ self.__match_style = match_style
+ return self
+
+ @property
+ def match_style(self) -> Style | None:
+ return self.__match_style
+
+ async def search(self, query: str) -> Hits:
+ matcher = self.matcher(query)
+ for name, callback, help_text in self._commands:
+ if (match := matcher.match(name)) > 0:
+ yield Hit(
+ match,
+ matcher.highlight(name),
+ callback,
+ help=help_text,
+ )
+
+ async def discover(self) -> Hits:
+ """Handle a request for the discovery commands for this provider.
+
+ Yields:
+ Commands that can be discovered.
+ """
+ for name, callback, help_text in self._commands:
+ yield DiscoveryHit(
+ name,
+ callback,
+ help=help_text,
+ )
+
+
@rich.repr.auto
@total_ordering
class Command(Option):
@@ -361,14 +445,13 @@ class CommandList(OptionList, can_focus=False):
CommandList {
visibility: hidden;
border-top: blank;
- border-bottom: hkey $primary;
+ border-bottom: hkey $border;
border-left: none;
border-right: none;
height: auto;
max-height: 70vh;
background: transparent;
padding: 0;
- text-style: bold;
}
CommandList:focus {
@@ -384,7 +467,9 @@ class CommandList(OptionList, can_focus=False):
}
CommandList > .option-list--option-highlighted {
- background: $primary;
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ text-style: $block-cursor-text-style;
}
CommandList:nocolor > .option-list--option-highlighted {
@@ -393,6 +478,7 @@ class CommandList(OptionList, can_focus=False):
CommandList > .option-list--option {
padding-left: 2;
+ color: $foreground;
}
"""
@@ -428,13 +514,14 @@ class CommandInput(Input):
CommandInput, CommandInput:focus {
border: blank;
width: 1fr;
- background: transparent;
padding-left: 0;
+ background: transparent;
+ background-tint: 0%;
}
"""
-class CommandPalette(SystemModalScreen):
+class CommandPalette(SystemModalScreen[None]):
"""The Textual command palette."""
AUTO_FOCUS = "CommandInput"
@@ -457,6 +544,7 @@ class CommandPalette(SystemModalScreen):
min-height: 20;
}
CommandPalette {
+ color: $foreground;
background: $background 60%;
align-horizontal: center;
@@ -476,7 +564,9 @@ class CommandPalette(SystemModalScreen):
}
CommandPalette > .command-palette--help-text {
- text-style: dim not bold;
+ color: $foreground-muted;
+ background: transparent;
+ text-style: not bold;
}
CommandPalette:dark > .command-palette--highlight {
@@ -497,13 +587,13 @@ class CommandPalette(SystemModalScreen):
margin-top: 3;
height: 100%;
visibility: hidden;
- background: $primary 20%;
+ background: $panel-darken-1;
}
CommandPalette #--input {
height: auto;
visibility: visible;
- border: hkey $primary;
+ border: hkey $border;
}
CommandPalette #--input.--list-visible {
@@ -528,7 +618,7 @@ class CommandPalette(SystemModalScreen):
CommandPalette LoadingIndicator {
height: auto;
visibility: hidden;
- border-bottom: hkey $primary;
+ border-bottom: hkey $border;
}
CommandPalette LoadingIndicator.--visible {
@@ -586,9 +676,6 @@ class CommandPalette(SystemModalScreen):
_calling_screen: var[Screen[Any] | None] = var(None)
"""A record of the screen that was active when we were called."""
- _PALETTE_ID: Final[str] = "--command-palette"
- """The internal ID for the command palette."""
-
@dataclass
class OptionHighlighted(Message):
"""Posted to App when an option is highlighted in the command palette."""
@@ -607,31 +694,53 @@ class Closed(Message):
option_selected: bool
"""True if an option was selected, False if the palette was closed without selecting an option."""
- def __init__(self) -> None:
- """Initialise the command palette."""
- super().__init__(id=self._PALETTE_ID)
+ def __init__(
+ self,
+ providers: ProviderSource | None = None,
+ *,
+ placeholder: str = "Search for commands…",
+ name: str | None = None,
+ id: str | None = None,
+ classes: str | None = None,
+ ) -> None:
+ """Initialise the command palette.
+
+ Args:
+ providers: An optional list of providers to use. If None, the providers supplied
+ in the App or Screen will be used.
+ placeholder: The placeholder text for the command palette.
+ """
+ super().__init__(
+ id=id,
+ classes=classes,
+ name=name,
+ )
+ self.add_class("--textual-command-palette")
+
self._selected_command: DiscoveryHit | Hit | None = None
"""The command that was selected by the user."""
self._busy_timer: Timer | None = None
"""Keeps track of if there's a busy indication timer in effect."""
self._no_matches_timer: Timer | None = None
"""Keeps track of if there are 'No matches found' message waiting to be displayed."""
+ self._supplied_providers: ProviderSource | None = providers
self._providers: list[Provider] = []
"""List of Provider instances involved in searches."""
self._hit_count: int = 0
"""Number of hits displayed."""
+ self._placeholder = placeholder
@staticmethod
- def is_open(app: App) -> bool:
- """Is the command palette current open?
+ def is_open(app: App[object]) -> bool:
+ """Is a command palette current open?
Args:
app: The app to test.
Returns:
- `True` if the command palette is currently open, `False` if not.
+ `True` if a command palette is currently open, `False` if not.
"""
- return app.screen.id == CommandPalette._PALETTE_ID
+ return app.screen.has_class("--textual-command-palette")
@property
def _provider_classes(self) -> set[type[Provider]]:
@@ -642,27 +751,36 @@ def _provider_classes(self) -> set[type[Provider]]:
the current screen][textual.screen.Screen.COMMANDS].
"""
- def get_providers(root: App | Screen) -> Iterable[type[Provider]]:
- """Get providers from app or screen.
+ def get_providers(
+ provider_source: ProviderSource,
+ ) -> Iterable[type[Provider]]:
+ """Load the providers from a source (typically from the COMMANDS class variable)
+ at the App or Screen level.
Args:
- root: The app or screen.
+ provider_source: The source of providers.
Returns:
An iterable of providers.
"""
- for provider in root.COMMANDS:
- if isclass(provider) and issubclass(provider, Provider):
+ for provider in provider_source:
+ if isinstance(provider, SimpleProvider):
+ yield provider
+ elif isclass(provider) and issubclass(provider, Provider):
yield provider
else:
# Lazy loaded providers
yield provider() # type: ignore
- return (
- set()
- if self._calling_screen is None
- else {*get_providers(self.app), *get_providers(self._calling_screen)}
- )
+ if self._calling_screen is None:
+ return set()
+ elif self._supplied_providers is None:
+ return {
+ *get_providers(self.app.COMMANDS),
+ *get_providers(self._calling_screen.COMMANDS),
+ }
+ else:
+ return {*get_providers(self._supplied_providers)}
def compose(self) -> ComposeResult:
"""Compose the command palette.
@@ -673,7 +791,7 @@ def compose(self) -> ComposeResult:
with Vertical(id="--container"):
with Horizontal(id="--input"):
yield SearchIcon()
- yield CommandInput(placeholder="Search for commands…")
+ yield CommandInput(placeholder=self._placeholder)
if not self.run_on_select:
yield Button("\u25b6")
with Vertical(id="--results"):
@@ -700,9 +818,7 @@ def _on_mount(self, _: Mount) -> None:
self.app.post_message(CommandPalette.Opened())
self._calling_screen = self.app.screen_stack[-2]
- match_style = self.get_component_rich_style(
- "command-palette--highlight", partial=True
- )
+ match_style = self.get_component_rich_style("command-palette--highlight")
assert self._calling_screen is not None
self._providers = [
@@ -955,9 +1071,7 @@ async def _gather_commands(self, search_value: str) -> None:
# We'll potentially use the help text style a lot so let's grab it
# the once for use in the loop further down.
- help_style = self.get_component_rich_style(
- "command-palette--help-text", partial=True
- )
+ help_style = self.get_component_rich_style("command-palette--help-text")
# The list to hold on to the commands we've gathered from the
# command providers.
@@ -1017,8 +1131,7 @@ async def _gather_commands(self, search_value: str) -> None:
# list of commands that have been gathered so far.
prompt = hit.prompt
if hit.help:
- help_text = Text.from_markup(hit.help)
- help_text.stylize(help_style)
+ help_text = Text(hit.help, style=help_style)
prompt = Group(prompt, help_text)
gathered_commands.append(Command(prompt, hit, id=str(command_id)))
diff --git a/src/textual/demo/home.py b/src/textual/demo/home.py
index cc60891d67..26f55ac830 100644
--- a/src/textual/demo/home.py
+++ b/src/textual/demo/home.py
@@ -231,6 +231,7 @@ class HomeScreen(PageScreen):
Markdown {
margin-right: 1;
padding-right: 1;
+ background: transparent;
}
}
}
diff --git a/src/textual/demo/projects.py b/src/textual/demo/projects.py
index 13725370ee..53b5e4de86 100644
--- a/src/textual/demo/projects.py
+++ b/src/textual/demo/projects.py
@@ -136,7 +136,6 @@ class Project(Vertical, can_focus=True, can_focus_children=False):
height: auto;
padding: 0 1;
border: tall transparent;
- opacity: 0.8;
box-sizing: border-box;
&:focus {
border: tall $accent;
@@ -146,7 +145,7 @@ class Project(Vertical, can_focus=True, can_focus_children=False):
#title { text-style: bold; width: 1fr; }
#author { text-style: italic; }
.stars {
- color: $secondary;
+ color: $text-accent;
text-align: right;
text-style: bold;
width: auto;
diff --git a/src/textual/design.py b/src/textual/design.py
index b90bfa56e2..7ebcdf6976 100644
--- a/src/textual/design.py
+++ b/src/textual/design.py
@@ -60,6 +60,7 @@ def __init__(
dark: bool = False,
luminosity_spread: float = 0.15,
text_alpha: float = 0.95,
+ variables: dict[str, str] | None = None,
):
def parse(color: str | None) -> Color | None:
if color is None:
@@ -80,6 +81,8 @@ def parse(color: str | None) -> Color | None:
self.dark = dark
self.luminosity_spread = luminosity_spread
self.text_alpha = text_alpha
+ self.variables = variables or {}
+ """Overrides for specific variables."""
@property
def shades(self) -> Iterable[str]:
@@ -93,6 +96,10 @@ def shades(self) -> Iterable[str]:
else:
yield color
+ def get_or_default(self, name: str, default: str) -> str:
+ """Get the value of a color variable, or the default value if not set."""
+ return self.variables.get(name, default)
+
def generate(self) -> dict[str, str]:
"""Generate a mapping of color name on to a CSS color.
@@ -110,6 +117,8 @@ def generate(self) -> dict[str, str]:
dark = self.dark
luminosity_spread = self.luminosity_spread
+ colors: dict[str, str] = {}
+
if dark:
background = self.background or Color.parse(DEFAULT_DARK_BACKGROUND)
surface = self.surface or Color.parse(DEFAULT_DARK_SURFACE)
@@ -118,7 +127,16 @@ def generate(self) -> dict[str, str]:
surface = self.surface or Color.parse(DEFAULT_LIGHT_SURFACE)
foreground = self.foreground or (background.inverse)
- boost = self.boost or background.get_contrast_text(1.0).with_alpha(0.04)
+ contrast_text = background.get_contrast_text(1.0)
+ boost = self.boost or contrast_text.with_alpha(0.04)
+
+ # Colored text
+ colors["text-primary"] = contrast_text.tint(primary.with_alpha(0.66)).hex
+ colors["text-secondary"] = contrast_text.tint(secondary.with_alpha(0.66)).hex
+ colors["text-warning"] = contrast_text.tint(warning.with_alpha(0.66)).hex
+ colors["text-error"] = contrast_text.tint(error.with_alpha(0.66)).hex
+ colors["text-success"] = contrast_text.tint(success.with_alpha(0.66)).hex
+ colors["text-accent"] = contrast_text.tint(accent.with_alpha(0.66)).hex
if self.panel is None:
panel = surface.blend(primary, 0.1, alpha=1)
@@ -127,9 +145,7 @@ def generate(self) -> dict[str, str]:
else:
panel = self.panel
- colors: dict[str, str] = {}
-
- def luminosity_range(spread) -> Iterable[tuple[str, float]]:
+ def luminosity_range(spread: float) -> Iterable[tuple[str, float]]:
"""Get the range of shades from darken2 to lighten2.
Returns:
@@ -165,31 +181,178 @@ def luminosity_range(spread) -> Iterable[tuple[str, float]]:
# Colors names that have a dark variant
DARK_SHADES = {"primary-background", "secondary-background"}
+ get = self.get_or_default
+
for name, color in COLORS:
is_dark_shade = dark and name in DARK_SHADES
spread = luminosity_spread
for shade_name, luminosity_delta in luminosity_range(spread):
+ key = f"{name}{shade_name}"
if color.ansi is not None:
- colors[f"{name}{shade_name}"] = color.hex
+ colors[key] = color.hex
elif is_dark_shade:
dark_background = background.blend(color, 0.15, alpha=1.0)
- shade_color = dark_background.blend(
- WHITE, spread + luminosity_delta, alpha=1.0
- ).clamped
- colors[f"{name}{shade_name}"] = shade_color.hex
+ if key not in self.variables:
+ shade_color = dark_background.blend(
+ WHITE, spread + luminosity_delta, alpha=1.0
+ ).clamped
+ colors[key] = shade_color.hex
+ else:
+ colors[key] = self.variables[key]
else:
- shade_color = color.lighten(luminosity_delta)
- colors[f"{name}{shade_name}"] = shade_color.hex
+ colors[key] = get(key, color.lighten(luminosity_delta).hex)
if foreground.ansi is None:
- colors["text"] = "auto 87%"
- colors["text-muted"] = "auto 60%"
- colors["text-disabled"] = "auto 38%"
+ colors["text"] = get("text", "auto 87%")
+ colors["text-muted"] = get("text-muted", "auto 60%")
+ colors["text-disabled"] = get("text-disabled", "auto 38%")
else:
colors["text"] = "ansi_default"
colors["text-muted"] = "ansi_default"
colors["text-disabled"] = "ansi_default"
+ # Muted variants of base colors
+ colors["primary-muted"] = get(
+ "primary-muted", primary.blend(background, 0.7).hex
+ )
+ colors["secondary-muted"] = get(
+ "secondary-muted", secondary.blend(background, 0.7).hex
+ )
+ colors["accent-muted"] = get("accent-muted", accent.blend(background, 0.7).hex)
+ colors["warning-muted"] = get(
+ "warning-muted", warning.blend(background, 0.7).hex
+ )
+ colors["error-muted"] = get("error-muted", error.blend(background, 0.7).hex)
+ colors["success-muted"] = get(
+ "success-muted", success.blend(background, 0.7).hex
+ )
+
+ # Foreground colors
+ colors["foreground-muted"] = get(
+ "foreground-muted", foreground.with_alpha(0.6).hex
+ )
+ colors["foreground-disabled"] = get(
+ "foreground-disabled", foreground.with_alpha(0.38).hex
+ )
+
+ # The cursor color for widgets such as OptionList, DataTable, etc.
+ colors["block-cursor-foreground"] = get(
+ "block-cursor-foreground", colors["text"]
+ )
+ colors["block-cursor-background"] = get("block-cursor-background", primary.hex)
+ colors["block-cursor-text-style"] = get("block-cursor-text-style", "bold")
+ colors["block-cursor-blurred-foreground"] = get(
+ "block-cursor-blurred-foreground", foreground.hex
+ )
+ colors["block-cursor-blurred-background"] = get(
+ "block-cursor-blurred-background", primary.with_alpha(0.3).hex
+ )
+ colors["block-cursor-blurred-text-style"] = get(
+ "block-cursor-blurred-text-style", "none"
+ )
+ colors["block-hover-background"] = get(
+ "block-hover-background", boost.with_alpha(0.05).hex
+ )
+
+ # The border color for focused widgets which have a border.
+ colors["border"] = get("border", primary.hex)
+ colors["border-blurred"] = get("border-blurred", surface.darken(0.025).hex)
+
+ # The surface color for builtin focused widgets
+ colors["surface-active"] = get(
+ "surface-active", surface.lighten(self.luminosity_spread / 2.5).hex
+ )
+
+ # The scrollbar colors
+ colors["scrollbar"] = get("scrollbar", panel.hex)
+ colors["scrollbar-hover"] = get("scrollbar-hover", colors["panel-lighten-1"])
+ colors["scrollbar-active"] = get("scrollbar-active", colors["panel-lighten-2"])
+ colors["scrollbar-background"] = get(
+ "scrollbar-background", colors["background-darken-1"]
+ )
+ colors["scrollbar-corner-color"] = get(
+ "scrollbar-corner-color", colors["scrollbar-background"]
+ )
+ colors["scrollbar-background-hover"] = get(
+ "scrollbar-background-hover", colors["scrollbar-background"]
+ )
+ colors["scrollbar-background-active"] = get(
+ "scrollbar-background-active", colors["scrollbar-background"]
+ )
+
+ # Links
+ colors["link-background"] = get("link-background", "initial")
+ colors["link-background-hover"] = get("link-background-hover", primary.hex)
+ colors["link-color"] = get("link-color", colors["text"])
+ colors["link-style"] = get("link-style", "underline")
+ colors["link-color-hover"] = get("link-color-hover", colors["text"])
+ colors["link-style-hover"] = get("link-style-hover", "bold not underline")
+
+ colors["footer-foreground"] = get("footer-foreground", foreground.hex)
+ colors["footer-background"] = get("footer-background", panel.hex)
+
+ colors["footer-key-foreground"] = get("footer-key-foreground", accent.hex)
+ colors["footer-key-background"] = get("footer-key-background", "transparent")
+
+ colors["footer-description-foreground"] = get(
+ "footer-description-foreground", foreground.hex
+ )
+ colors["footer-description-background"] = get(
+ "footer-description-background", "transparent"
+ )
+
+ colors["footer-item-background"] = get("footer-item-background", "transparent")
+
+ colors["input-cursor-background"] = get(
+ "input-cursor-background", foreground.hex
+ )
+ colors["input-cursor-foreground"] = get(
+ "input-cursor-foreground", background.hex
+ )
+ colors["input-cursor-text-style"] = get("input-cursor-text-style", "none")
+ colors["input-selection-background"] = get(
+ "input-selection-background",
+ Color.parse(colors["primary-lighten-1"]).with_alpha(0.4).hex,
+ )
+ colors["input-selection-foreground"] = get(
+ "input-selection-foreground", background.hex
+ )
+
+ # Markdown header styles
+ colors["markdown-h1-color"] = get("markdown-h1-color", primary.hex)
+ colors["markdown-h1-background"] = get("markdown-h1-background", "transparent")
+ colors["markdown-h1-text-style"] = get("markdown-h1-text-style", "bold")
+
+ colors["markdown-h2-color"] = get("markdown-h2-color", primary.hex)
+ colors["markdown-h2-background"] = get("markdown-h2-background", "transparent")
+ colors["markdown-h2-text-style"] = get("markdown-h2-text-style", "underline")
+
+ colors["markdown-h3-color"] = get("markdown-h3-color", primary.hex)
+ colors["markdown-h3-background"] = get("markdown-h3-background", "transparent")
+ colors["markdown-h3-text-style"] = get("markdown-h3-text-style", "bold")
+
+ colors["markdown-h4-color"] = get("markdown-h4-color", foreground.hex)
+ colors["markdown-h4-background"] = get("markdown-h4-background", "transparent")
+ colors["markdown-h4-text-style"] = get(
+ "markdown-h4-text-style", "bold underline"
+ )
+
+ colors["markdown-h5-color"] = get("markdown-h5-color", foreground.hex)
+ colors["markdown-h5-background"] = get("markdown-h5-background", "transparent")
+ colors["markdown-h5-text-style"] = get("markdown-h5-text-style", "bold")
+
+ colors["markdown-h6-color"] = get(
+ "markdown-h6-color", colors["foreground-muted"]
+ )
+ colors["markdown-h6-background"] = get("markdown-h6-background", "transparent")
+ colors["markdown-h6-text-style"] = get("markdown-h6-text-style", "bold")
+
+ colors["button-foreground"] = get("button-foreground", foreground.hex)
+ colors["button-color-foreground"] = get(
+ "button-color-foreground", colors["text"]
+ )
+ colors["button-focus-text-style"] = get("button-focus-text-style", "b reverse")
+
return colors
diff --git a/src/textual/dom.py b/src/textual/dom.py
index 78b921ef2c..80cb82d66a 100644
--- a/src/textual/dom.py
+++ b/src/textual/dom.py
@@ -238,7 +238,7 @@ def set_reactive(
Example:
```python
- self.set_reactive(App.dark_mode, True)
+ self.set_reactive(App.theme, "textual-light")
```
Args:
@@ -248,15 +248,14 @@ def set_reactive(
Raises:
AttributeError: If the first argument is not a reactive.
"""
+ name = reactive.name
if not isinstance(reactive, Reactive):
- raise TypeError(
- "A Reactive class is required; for example: MyApp.dark_mode"
- )
- if reactive.name not in self._reactives:
+ raise TypeError("A Reactive class is required; for example: MyApp.theme")
+ if name not in self._reactives:
raise AttributeError(
- "No reactive called {name!r}; Have you called super().__init__(...) in the {self.__class__.__name__} constructor?"
+ f"No reactive called {name!r}; Have you called super().__init__(...) in the {self.__class__.__name__} constructor?"
)
- setattr(self, f"_reactive_{reactive.name}", value)
+ setattr(self, f"_reactive_{name}", value)
def mutate_reactive(self, reactive: Reactive[ReactiveType]) -> None:
"""Force an update to a mutable reactive.
@@ -1224,11 +1223,11 @@ def watch(
Example:
```python
- def on_dark_change(old_value:bool, new_value:bool) -> None:
- # Called when app.dark changes.
- print("App.dark went from {old_value} to {new_value}")
+ def on_theme_change(old_value:str, new_value:str) -> None:
+ # Called when app.theme changes.
+ print(f"App.theme went from {old_value} to {new_value}")
- self.watch(self.app, "dark", self.on_dark_change, init=False)
+ self.watch(self.app, "theme", self.on_theme_change, init=False)
```
Args:
diff --git a/src/textual/screen.py b/src/textual/screen.py
index 0b025bbba1..9bea8be709 100644
--- a/src/textual/screen.py
+++ b/src/textual/screen.py
@@ -147,10 +147,9 @@ class Screen(Generic[ScreenResultType], Widget):
DEFAULT_CSS = """
Screen {
-
layout: vertical;
overflow-y: auto;
- background: $surface;
+ background: $background;
&:inline {
height: auto;
diff --git a/src/textual/theme.py b/src/textual/theme.py
new file mode 100644
index 0000000000..964ac4ee60
--- /dev/null
+++ b/src/textual/theme.py
@@ -0,0 +1,321 @@
+from __future__ import annotations
+
+from dataclasses import dataclass, field
+from functools import partial
+from typing import Callable
+
+from textual.command import DiscoveryHit, Hit, Hits, Provider
+from textual.design import ColorSystem
+
+
+@dataclass
+class Theme:
+ """Defines a theme for the application."""
+
+ name: str
+ """The name of the theme.
+
+ After registering a theme with `App.register_theme`, you can set the theme with
+ `App.theme = theme_name`. This will immediately apply the theme's colors to your
+ application.
+ """
+
+ primary: str
+ secondary: str | None = None
+ warning: str | None = None
+ error: str | None = None
+ success: str | None = None
+ accent: str | None = None
+ foreground: str | None = None
+ background: str | None = None
+ surface: str | None = None
+ panel: str | None = None
+ boost: str | None = None
+ dark: bool = True
+ luminosity_spread: float = 0.15
+ text_alpha: float = 0.95
+ variables: dict[str, str] = field(default_factory=dict)
+
+ def to_color_system(self) -> ColorSystem:
+ """
+ Create a ColorSystem instance from this Theme.
+
+ Returns:
+ A ColorSystem instance with attributes copied from this Theme.
+ """
+ return ColorSystem(
+ primary=self.primary,
+ secondary=self.secondary,
+ warning=self.warning,
+ error=self.error,
+ success=self.success,
+ accent=self.accent,
+ foreground=self.foreground,
+ background=self.background,
+ surface=self.surface,
+ panel=self.panel,
+ boost=self.boost,
+ dark=self.dark,
+ luminosity_spread=self.luminosity_spread,
+ text_alpha=self.text_alpha,
+ variables=self.variables,
+ )
+
+
+BUILTIN_THEMES: dict[str, Theme] = {
+ "textual-dark": Theme(
+ name="textual-dark",
+ primary="#0178D4",
+ secondary="#004578",
+ accent="#ffa62b",
+ warning="#ffa62b",
+ error="#ba3c5b",
+ success="#4EBF71",
+ foreground="#e0e0e0",
+ dark=True,
+ ),
+ "textual-light": Theme(
+ name="textual-light",
+ primary="#004578",
+ secondary="#0178D4",
+ accent="#ffa62b",
+ warning="#ffa62b",
+ error="#ba3c5b",
+ success="#4EBF71",
+ dark=False,
+ ),
+ "nord": Theme(
+ name="nord",
+ primary="#88C0D0",
+ secondary="#81A1C1",
+ accent="#B48EAD",
+ foreground="#D8DEE9",
+ background="#2E3440",
+ success="#A3BE8C",
+ warning="#EBCB8B",
+ error="#BF616A",
+ surface="#3B4252",
+ panel="#434C5E",
+ dark=True,
+ variables={
+ "block-cursor-background": "#88C0D0",
+ "block-cursor-foreground": "#2E3440",
+ "block-cursor-text-style": "none",
+ "footer-key-foreground": "#88C0D0",
+ "input-selection-background": "#81a1c1 35%",
+ "button-color-foreground": "#2E3440",
+ "button-focus-text-style": "reverse",
+ },
+ ),
+ "gruvbox": Theme(
+ name="gruvbox",
+ primary="#85A598",
+ secondary="#A89A85",
+ warning="#fe8019",
+ error="#fb4934",
+ success="#b8bb26",
+ accent="#fabd2f",
+ foreground="#fbf1c7",
+ background="#282828",
+ surface="#3c3836",
+ panel="#504945",
+ dark=True,
+ variables={
+ "block-cursor-foreground": "#fbf1c7",
+ "input-selection-background": "#689d6a40",
+ "button-color-foreground": "#282828",
+ },
+ ),
+ "catppuccin-mocha": Theme(
+ name="catppuccin-mocha",
+ primary="#F5C2E7",
+ secondary="#cba6f7",
+ warning="#FAE3B0",
+ error="#F28FAD",
+ success="#ABE9B3",
+ accent="#fab387",
+ foreground="#cdd6f4",
+ background="#181825",
+ surface="#313244",
+ panel="#45475a",
+ dark=True,
+ variables={
+ "input-cursor-foreground": "#11111b",
+ "input-cursor-background": "#f5e0dc",
+ "input-selection-background": "#9399b2 30%",
+ "border": "#b4befe",
+ "border-blurred": "#585b70",
+ "footer-background": "#45475a",
+ "block-cursor-foreground": "#1e1e2e",
+ "block-cursor-text-style": "none",
+ "button-color-foreground": "#181825",
+ },
+ ),
+ "textual-ansi": Theme(
+ name="textual-ansi",
+ primary="ansi_blue",
+ secondary="ansi_cyan",
+ warning="ansi_yellow",
+ error="ansi_red",
+ success="ansi_green",
+ accent="ansi_bright_blue",
+ foreground="ansi_default",
+ background="ansi_default",
+ surface="ansi_default",
+ panel="ansi_default",
+ boost="ansi_default",
+ dark=False,
+ variables={
+ "block-cursor-text-style": "b",
+ "block-cursor-blurred-text-style": "i",
+ "input-selection-background": "ansi_blue",
+ "input-selection-foreground": "ansi_white",
+ "input-cursor-text-style": "reverse",
+ "scrollbar": "ansi_blue",
+ "border-blurred": "ansi_blue",
+ "border": "ansi_bright_blue",
+ },
+ ),
+ "dracula": Theme(
+ name="dracula",
+ primary="#BD93F9",
+ secondary="#6272A4",
+ warning="#FFB86C",
+ error="#FF5555",
+ success="#50FA7B",
+ accent="#FF79C6",
+ background="#282A36",
+ surface="#2B2E3B",
+ panel="#313442",
+ foreground="#F8F8F2",
+ dark=True,
+ variables={
+ "button-color-foreground": "#282A36",
+ },
+ ),
+ "tokyo-night": Theme(
+ name="tokyo-night",
+ primary="#BB9AF7",
+ secondary="#7AA2F7",
+ warning="#E0AF68", # Yellow
+ error="#F7768E", # Red
+ success="#9ECE6A", # Green
+ accent="#FF9E64", # Orange
+ foreground="#a9b1d6",
+ background="#1A1B26", # Background
+ surface="#24283B", # Surface
+ panel="#414868", # Panel
+ dark=True,
+ variables={
+ "button-color-foreground": "#24283B",
+ },
+ ),
+ "monokai": Theme(
+ name="monokai",
+ primary="#AE81FF",
+ secondary="#F92672",
+ accent="#66D9EF",
+ warning="#FD971F",
+ error="#F92672",
+ success="#A6E22E",
+ foreground="#d6d6d6",
+ background="#272822",
+ surface="#2e2e2e",
+ panel="#3E3D32",
+ dark=True,
+ variables={
+ "foreground-muted": "#797979",
+ "input-selection-background": "#575b6190",
+ "button-color-foreground": "#272822",
+ },
+ ),
+ "flexoki": Theme(
+ name="flexoki",
+ primary="#205EA6", # blue
+ secondary="#24837B", # cyan
+ warning="#AD8301", # yellow
+ error="#AF3029", # red
+ success="#66800B", # green
+ accent="#9B76C8", # purple light
+ background="#100F0F", # base.black
+ surface="#1C1B1A", # base.950
+ panel="#282726", # base.900
+ foreground="#FFFCF0", # base.paper
+ dark=True,
+ variables={
+ "input-cursor-foreground": "#5E409D",
+ "input-cursor-background": "#FFFCF0",
+ "input-selection-background": "#6F6E69 35%", # base.600 with opacity
+ "button-color-foreground": "#FFFCF0",
+ },
+ ),
+ "catppuccin-latte": Theme(
+ name="catppuccin-latte",
+ secondary="#DC8A78",
+ primary="#8839EF",
+ warning="#DF8E1D",
+ error="#D20F39",
+ success="#40A02B",
+ accent="#FE640B",
+ foreground="#4C4F69",
+ background="#EFF1F5",
+ surface="#E6E9EF",
+ panel="#CCD0DA",
+ dark=False,
+ variables={
+ "button-color-foreground": "#EFF1F5",
+ },
+ ),
+ "solarized-light": Theme(
+ name="solarized-light",
+ primary="#268bd2",
+ secondary="#2aa198",
+ warning="#cb4b16",
+ error="#dc322f",
+ success="#859900",
+ accent="#6c71c4",
+ foreground="#586e75",
+ background="#fdf6e3",
+ surface="#eee8d5",
+ panel="#eee8d5",
+ dark=False,
+ variables={
+ "button-color-foreground": "#fdf6e3",
+ "footer-background": "#268bd2",
+ "footer-key-foreground": "#fdf6e3",
+ "footer-description-foreground": "#fdf6e3",
+ },
+ ),
+}
+
+
+class ThemeProvider(Provider):
+ """A provider for themes."""
+
+ @property
+ def commands(self) -> list[tuple[str, Callable[[], None]]]:
+ themes = self.app.available_themes
+
+ def set_app_theme(name: str) -> None:
+ self.app.theme = name
+
+ return [
+ (theme.name, partial(set_app_theme, theme.name))
+ for theme in themes.values()
+ if theme.name != "textual-ansi"
+ ]
+
+ async def discover(self) -> Hits:
+ for command in self.commands:
+ yield DiscoveryHit(*command)
+
+ async def search(self, query: str) -> Hits:
+ matcher = self.matcher(query)
+
+ for name, callback in self.commands:
+ if (match := matcher.match(name)) > 0:
+ yield Hit(
+ match,
+ matcher.highlight(name),
+ callback,
+ )
diff --git a/src/textual/widget.py b/src/textual/widget.py
index 7c71bb885c..dbcebb4a9e 100644
--- a/src/textual/widget.py
+++ b/src/textual/widget.py
@@ -277,21 +277,21 @@ class Widget(DOMNode):
DEFAULT_CSS = """
Widget{
- scrollbar-background: $panel-darken-1;
- scrollbar-background-hover: $panel-darken-2;
- scrollbar-background-active: $panel-darken-3;
- scrollbar-color: $primary-lighten-1;
- scrollbar-color-active: $warning-darken-1;
- scrollbar-color-hover: $primary-lighten-1;
- scrollbar-corner-color: $panel-darken-1;
+ scrollbar-background: $scrollbar-background;
+ scrollbar-background-hover: $scrollbar-background-hover;
+ scrollbar-background-active: $scrollbar-background-active;
+ scrollbar-color: $scrollbar;
+ scrollbar-color-active: $scrollbar-active;
+ scrollbar-color-hover: $scrollbar-hover;
+ scrollbar-corner-color: $scrollbar-corner-color;
scrollbar-size-vertical: 2;
scrollbar-size-horizontal: 1;
- link-background: initial;
- link-color: $text;
- link-style: underline;
- link-background-hover: $accent;
- link-color-hover: $text;
- link-style-hover: bold not underline;
+ link-background: $link-background;
+ link-color: $link-color;
+ link-style: $link-style;
+ link-background-hover: $link-background-hover;
+ link-color-hover: $link-color-hover;
+ link-style-hover: $link-style-hover;
background: transparent;
}
"""
@@ -374,8 +374,8 @@ class Widget(DOMNode):
"can-focus": lambda widget: widget.can_focus,
"disabled": lambda widget: widget.is_disabled,
"enabled": lambda widget: not widget.is_disabled,
- "dark": lambda widget: widget.app.dark,
- "light": lambda widget: not widget.app.dark,
+ "dark": lambda widget: widget.app.current_theme.dark,
+ "light": lambda widget: not widget.app.current_theme.dark,
"focus-within": lambda widget: widget.has_focus_within,
"inline": lambda widget: widget.app.is_inline,
"ansi": lambda widget: widget.app.ansi_color,
diff --git a/src/textual/widgets/_button.py b/src/textual/widgets/_button.py
index 67123d8d59..9821a0d21a 100644
--- a/src/textual/widgets/_button.py
+++ b/src/textual/widgets/_button.py
@@ -48,40 +48,37 @@ class Button(Widget, can_focus=True):
width: auto;
min-width: 16;
height: auto;
- background: $panel;
- color: $text;
+ color: $button-foreground;
+ background: $surface;
border: none;
- border-top: tall $panel-lighten-2;
- border-bottom: tall $panel-darken-3;
+ border-top: tall $surface-lighten-1;
+ border-bottom: tall $surface-darken-1;
text-align: center;
content-align: center middle;
- text-style: bold;
-
&:focus {
- text-style: bold reverse;
+ text-style: $button-focus-text-style;
+ background-tint: $foreground 5%;
}
&:hover {
- border-top: tall $panel;
- background: $panel-darken-2;
- color: $text;
+ border-top: tall $surface;
+ background: $surface-darken-1;
}
&.-active {
- background: $panel;
- border-bottom: tall $panel-lighten-2;
- border-top: tall $panel-darken-2;
+ background: $surface;
+ border-bottom: tall $surface-lighten-1;
+ border-top: tall $surface-darken-1;
tint: $background 30%;
}
&.-primary {
+ color: $button-color-foreground;
background: $primary;
- color: $text;
border-top: tall $primary-lighten-3;
border-bottom: tall $primary-darken-3;
&:hover {
background: $primary-darken-2;
- color: $text;
border-top: tall $primary;
}
@@ -93,14 +90,13 @@ class Button(Widget, can_focus=True):
}
&.-success {
+ color: $button-color-foreground;
background: $success;
- color: $text;
border-top: tall $success-lighten-2;
border-bottom: tall $success-darken-3;
&:hover {
background: $success-darken-2;
- color: $text;
border-top: tall $success;
}
@@ -112,14 +108,13 @@ class Button(Widget, can_focus=True):
}
&.-warning{
+ color: $button-color-foreground;
background: $warning;
- color: $text;
border-top: tall $warning-lighten-2;
border-bottom: tall $warning-darken-3;
&:hover {
background: $warning-darken-2;
- color: $text;
border-top: tall $warning;
}
@@ -131,14 +126,13 @@ class Button(Widget, can_focus=True):
}
&.-error {
+ color: $button-color-foreground;
background: $error;
- color: $text;
border-top: tall $error-lighten-2;
border-bottom: tall $error-darken-3;
&:hover {
background: $error-darken-1;
- color: $text;
border-top: tall $error;
}
diff --git a/src/textual/widgets/_collapsible.py b/src/textual/widgets/_collapsible.py
index 55b181e528..df039ea962 100644
--- a/src/textual/widgets/_collapsible.py
+++ b/src/textual/widgets/_collapsible.py
@@ -21,16 +21,19 @@ class CollapsibleTitle(Static, can_focus=True):
width: auto;
height: auto;
padding: 0 1 0 1;
- }
-
- CollapsibleTitle:hover {
- background: $foreground 10%;
- color: $text;
- }
+ text-style: $block-cursor-blurred-text-style;
+ background: $block-cursor-blurred-background;
+ color: $block-cursor-blurred-foreground;
- CollapsibleTitle:focus {
- background: $accent;
- color: $text;
+ &:hover {
+ background: $block-hover-background;
+ color: $foreground;
+ }
+ &:focus {
+ text-style: $block-cursor-text-style;
+ background: $block-cursor-background;
+ color: $block-cursor-foreground;
+ }
}
"""
@@ -100,14 +103,18 @@ class Collapsible(Widget):
Collapsible {
width: 1fr;
height: auto;
- background: $boost;
+ background: $surface;
border-top: hkey $background;
padding-bottom: 1;
padding-left: 1;
- }
- Collapsible.-collapsed > Contents {
- display: none;
+ &:focus-within {
+ background-tint: $foreground 5%;
+ }
+
+ &.-collapsed > Contents {
+ display: none;
+ }
}
"""
diff --git a/src/textual/widgets/_data_table.py b/src/textual/widgets/_data_table.py
index 5d9da649ca..a8bca4b7d3 100644
--- a/src/textual/widgets/_data_table.py
+++ b/src/textual/widgets/_data_table.py
@@ -314,58 +314,87 @@ class DataTable(ScrollView, Generic[CellType], can_focus=True):
"""
DEFAULT_CSS = """
- DataTable:dark {
- background: initial;
- }
DataTable {
- background: $surface ;
- color: $text;
+ background: $surface;
+ color: $foreground;
height: auto;
max-height: 100%;
- }
- DataTable > .datatable--header {
- text-style: bold;
- background: $primary;
- color: $text;
- }
- DataTable > .datatable--fixed {
- background: $primary 50%;
- color: $text;
- }
+
+ &.datatable--fixed-cursor {
+ background: $block-cursor-blurred-background;
+ }
- DataTable > .datatable--odd-row {
+ &:focus {
+ background-tint: $foreground 5%;
+ & > .datatable--cursor {
+ background: $block-cursor-background;
+ color: $block-cursor-foreground;
+ text-style: $block-cursor-text-style;
+ }
+
+ & > .datatable--header {
+ background-tint: $foreground 5%;
+ }
+
+ & > .datatable--fixed-cursor {
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ }
+ }
- }
+ &:dark {
+ background: $surface;
+ & > .datatable--even-row {
+ background: $surface-darken-1 40%;
+ }
+ }
- DataTable > .datatable--even-row {
- background: $primary 10%;
- }
+ & > .datatable--header {
+ text-style: bold;
+ background: $panel;
+ color: $foreground;
+ }
+ &:ansi > .datatable--header {
+ background: ansi_bright_blue;
+ color: ansi_default;
+ }
- DataTable > .datatable--cursor {
- background: $secondary;
- color: $text;
- }
+ & > .datatable--fixed {
+ background: $secondary 50%;
+ color: $foreground;
+ }
- DataTable > .datatable--fixed-cursor {
- background: $secondary 92%;
- color: $text;
- }
+ & > .datatable--odd-row {
- DataTable > .datatable--header-cursor {
- background: $secondary-darken-1;
- color: $text;
- }
+ }
- DataTable > .datatable--header-hover {
- background: $secondary 30%;
- }
+ & > .datatable--even-row {
+ background: $surface-lighten-1 50%;
+ }
- DataTable:dark > .datatable--even-row {
- background: $primary 15%;
- }
+ & > .datatable--cursor {
+ background: $block-cursor-blurred-background;
+ color: $block-cursor-blurred-foreground;
+ text-style: $block-cursor-blurred-text-style;
+ }
- DataTable > .datatable--hover {
- background: $secondary 20%;
+ & > .datatable--fixed-cursor {
+ background: $block-cursor-blurred-background;
+ color: $foreground;
+ }
+
+ & > .datatable--header-cursor {
+ background: $accent-darken-1;
+ color: $foreground;
+ }
+
+ & > .datatable--header-hover {
+ background: $accent 30%;
+ }
+
+ & > .datatable--hover {
+ background: $block-hover-background;
+ }
}
"""
diff --git a/src/textual/widgets/_footer.py b/src/textual/widgets/_footer.py
index 9e53b1a1f7..142a751280 100644
--- a/src/textual/widgets/_footer.py
+++ b/src/textual/widgets/_footer.py
@@ -27,37 +27,30 @@ class FooterKey(Widget):
FooterKey {
width: auto;
height: 1;
- background: $panel;
- color: $text-muted;
+ background: $footer-item-background;
.footer-key--key {
- color: $secondary;
- background: $panel;
+ color: $footer-key-foreground;
+ background: $footer-key-background;
text-style: bold;
padding: 0 1;
}
.footer-key--description {
padding: 0 1 0 0;
- }
-
- &:light .footer-key--key {
- color: $primary;
+ color: $footer-description-foreground;
+ background: $footer-description-background;
}
&:hover {
- background: $panel-darken-2;
- color: $text;
- .footer-key--key {
- background: $panel-darken-2;
- }
+ color: $footer-key-foreground;
+ background: $block-hover-background;
}
&.-disabled {
text-style: dim;
- background: $panel;
&:hover {
.footer-key--key {
- background: $panel;
+ background: $foreground-disabled;
}
}
}
@@ -136,8 +129,8 @@ class Footer(ScrollableContainer, can_focus=False, can_focus_children=False):
Footer {
layout: grid;
grid-columns: auto;
- background: $panel;
- color: $text;
+ color: $footer-foreground;
+ background: $footer-background;
dock: bottom;
height: 1;
scrollbar-size: 0 0;
@@ -150,7 +143,7 @@ class Footer(ScrollableContainer, can_focus=False, can_focus_children=False):
border-left: vkey $foreground 20%;
}
- &.-ansi-colors {
+ &:ansi {
background: ansi_default;
.footer-key--key {
background: ansi_default;
diff --git a/src/textual/widgets/_header.py b/src/textual/widgets/_header.py
index d9d18fed0d..2482a578e4 100644
--- a/src/textual/widgets/_header.py
+++ b/src/textual/widgets/_header.py
@@ -75,7 +75,7 @@ class HeaderClock(HeaderClockSpace):
DEFAULT_CSS = """
HeaderClock {
background: $foreground-darken-1 5%;
- color: $text;
+ color: $foreground;
text-opacity: 85%;
content-align: center middle;
}
@@ -131,8 +131,8 @@ class Header(Widget):
Header {
dock: top;
width: 100%;
- background: $foreground 5%;
- color: $text;
+ background: $panel;
+ color: $foreground;
height: 1;
}
Header.-tall {
diff --git a/src/textual/widgets/_input.py b/src/textual/widgets/_input.py
index bcf5235664..b25ac0af36 100644
--- a/src/textual/widgets/_input.py
+++ b/src/textual/widgets/_input.py
@@ -146,20 +146,21 @@ class Input(Widget, can_focus=True):
DEFAULT_CSS = """
Input {
- background: $boost;
- color: $text;
+ background: $surface;
+ color: $foreground;
padding: 0 2;
- border: tall $background;
+ border: tall $border-blurred;
width: 100%;
height: 3;
&:focus {
- border: tall $accent;
+ border: tall $border;
+ background-tint: $foreground 5%;
}
&>.input--cursor {
- background: $surface;
- color: $text;
- text-style: reverse;
+ background: $input-cursor-background;
+ color: $input-cursor-foreground;
+ text-style: $input-cursor-text-style;
}
&>.input--placeholder, &>.input--suggestion {
color: $text-disabled;
@@ -171,16 +172,10 @@ class Input(Widget, can_focus=True):
border: tall $error;
}
- &.-ansi-colors {
+ &:ansi {
background: ansi_default;
color: ansi_default;
- border: tall ansi_default;
-
- &:focus {
- border: tall ansi_blue;
- }
&>.input--cursor {
- background: ansi_default;
text-style: reverse;
}
&>.input--placeholder, &>.input--suggestion {
diff --git a/src/textual/widgets/_key_panel.py b/src/textual/widgets/_key_panel.py
index ea5a7173c5..6e0502f21b 100644
--- a/src/textual/widgets/_key_panel.py
+++ b/src/textual/widgets/_key_panel.py
@@ -128,7 +128,7 @@ class KeyPanel(VerticalScroll, can_focus=False):
align: center top;
&> BindingsTable > .bindings-table--key {
- color: $secondary;
+ color: $accent;
text-style: bold;
padding: 0 1;
}
diff --git a/src/textual/widgets/_label.py b/src/textual/widgets/_label.py
index 9dc3541f41..90fefa7294 100644
--- a/src/textual/widgets/_label.py
+++ b/src/textual/widgets/_label.py
@@ -1,7 +1,15 @@
"""Provides a simple Label widget."""
+from __future__ import annotations
+
+from typing import Literal
+
+from rich.console import RenderableType
+
from textual.widgets._static import Static
+LabelVariant = Literal["success", "error", "warning", "primary", "secondary", "accent"]
+
class Label(Static):
"""A simple label widget for displaying text-oriented renderables."""
@@ -11,5 +19,56 @@ class Label(Static):
width: auto;
height: auto;
min-height: 1;
+
+ &.success {
+ color: $text-success;
+ background: $success-muted;
+ }
+ &.error {
+ color: $text-error;
+ background: $error-muted;
+ }
+ &.warning {
+ color: $text-warning;
+ background: $warning-muted;
+ }
+ &.primary {
+ color: $text-primary;
+ background: $primary-muted;
+ }
+ &.secondary {
+ color: $text-secondary;
+ background: $secondary-muted;
+ }
+ &.accent {
+ color: $text-accent;
+ background: $accent-muted;
+ }
}
"""
+
+ def __init__(
+ self,
+ renderable: RenderableType = "",
+ *,
+ variant: LabelVariant | None = None,
+ expand: bool = False,
+ shrink: bool = False,
+ markup: bool = True,
+ name: str | None = None,
+ id: str | None = None,
+ classes: str | None = None,
+ disabled: bool = False,
+ ) -> None:
+ super().__init__(
+ renderable,
+ expand=expand,
+ shrink=shrink,
+ markup=markup,
+ name=name,
+ id=id,
+ classes=classes,
+ disabled=disabled,
+ )
+ if variant:
+ self.add_class(variant)
diff --git a/src/textual/widgets/_list_item.py b/src/textual/widgets/_list_item.py
index e450767c77..8e889d6427 100644
--- a/src/textual/widgets/_list_item.py
+++ b/src/textual/widgets/_list_item.py
@@ -16,32 +16,6 @@ class ListItem(Widget, can_focus=False):
documentation for more details on use.
"""
- SCOPED_CSS = False
-
- DEFAULT_CSS = """
- ListItem {
- color: $text;
- height: auto;
- background: $panel-lighten-1;
- overflow: hidden hidden;
- }
- ListItem > :disabled {
- background: $panel-darken-1;
- }
- ListItem > Widget :hover {
- background: $boost;
- }
- ListView > ListItem.--highlight {
- background: $accent 50%;
- }
- ListView:focus > ListItem.--highlight {
- background: $accent;
- }
- ListItem > Widget {
- height: auto;
- }
- """
-
highlighted = reactive(False)
"""Is this item highlighted?"""
@@ -52,8 +26,9 @@ def __init__(self, item: ListItem) -> None:
self.item = item
super().__init__()
- async def _on_click(self, _: events.Click) -> None:
+ def _on_click(self, _: events.Click) -> None:
self.post_message(self._ChildClicked(self))
def watch_highlighted(self, value: bool) -> None:
+ print("highlighted", value)
self.set_class(value, "--highlight")
diff --git a/src/textual/widgets/_list_view.py b/src/textual/widgets/_list_view.py
index b92f1bf773..bc81a0936f 100644
--- a/src/textual/widgets/_list_view.py
+++ b/src/textual/widgets/_list_view.py
@@ -25,6 +25,35 @@ class ListView(VerticalScroll, can_focus=True, can_focus_children=False):
index: The index in the list that's currently highlighted.
"""
+ DEFAULT_CSS = """
+ ListView {
+ background: $surface;
+ &:focus-within {
+ background-tint: $foreground 5%;
+ }
+
+ & > ListItem {
+ color: $foreground;
+ height: auto;
+ overflow: hidden hidden;
+ width: 1fr;
+
+ &.--highlight > Widget {
+ color: $block-cursor-blurred-foreground;
+ background: $block-cursor-blurred-background;
+ text-style: $block-cursor-blurred-text-style;
+ }
+ }
+
+ &:focus > ListItem.--highlight > Widget {
+ width: 1fr;
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ text-style: $block-cursor-text-style;
+ }
+ }
+ """
+
BINDINGS: ClassVar[list[BindingType]] = [
Binding("enter", "select_cursor", "Select", show=False),
Binding("up", "cursor_up", "Cursor up", show=False),
diff --git a/src/textual/widgets/_loading_indicator.py b/src/textual/widgets/_loading_indicator.py
index 0dae7324dc..7a8cb43bf8 100644
--- a/src/textual/widgets/_loading_indicator.py
+++ b/src/textual/widgets/_loading_indicator.py
@@ -22,7 +22,7 @@ class LoadingIndicator(Widget):
height: 100%;
min-height: 1;
content-align: center middle;
- color: $accent;
+ color: $primary;
text-style: not reverse;
}
LoadingIndicator.-textual-loading-indicator {
diff --git a/src/textual/widgets/_log.py b/src/textual/widgets/_log.py
index 0441a2c74e..daaf5ea6e9 100644
--- a/src/textual/widgets/_log.py
+++ b/src/textual/widgets/_log.py
@@ -31,6 +31,9 @@ class Log(ScrollView, can_focus=True):
background: $surface;
color: $text;
overflow: scroll;
+ &:focus {
+ background-tint: $foreground 5%;
+ }
}
"""
diff --git a/src/textual/widgets/_markdown.py b/src/textual/widgets/_markdown.py
index 8d0813cfd6..839046014f 100644
--- a/src/textual/widgets/_markdown.py
+++ b/src/textual/widgets/_markdown.py
@@ -244,12 +244,11 @@ class MarkdownH1(MarkdownHeader):
"""An H1 Markdown header."""
DEFAULT_CSS = """
-
MarkdownH1 {
content-align: center middle;
- text-style: bold;
- color: $success;
- &:light {color: $primary;}
+ color: $markdown-h1-color;
+ background: $markdown-h1-background;
+ text-style: $markdown-h1-text-style;
}
"""
@@ -258,11 +257,10 @@ class MarkdownH2(MarkdownHeader):
"""An H2 Markdown header."""
DEFAULT_CSS = """
-
MarkdownH2 {
- text-style: underline;
- color: $success;
- &:light {color: $primary;}
+ color: $markdown-h2-color;
+ background: $markdown-h2-background;
+ text-style: $markdown-h2-text-style;
}
"""
@@ -272,11 +270,11 @@ class MarkdownH3(MarkdownHeader):
DEFAULT_CSS = """
MarkdownH3 {
- text-style: bold;
- color: $success;
+ color: $markdown-h3-color;
+ background: $markdown-h3-background;
+ text-style: $markdown-h3-text-style;
margin: 1 0;
width: auto;
- &:light {color: $primary;}
}
"""
@@ -286,9 +284,10 @@ class MarkdownH4(MarkdownHeader):
DEFAULT_CSS = """
MarkdownH4 {
- text-style: bold underline;
+ color: $markdown-h4-color;
+ background: $markdown-h4-background;
+ text-style: $markdown-h4-text-style;
margin: 1 0;
- color: $text;
}
"""
@@ -298,10 +297,10 @@ class MarkdownH5(MarkdownHeader):
DEFAULT_CSS = """
MarkdownH5 {
- text-style: bold;
- color: $text;
+ color: $markdown-h5-color;
+ background: $markdown-h5-background;
+ text-style: $markdown-h5-text-style;
margin: 1 0;
-
}
"""
@@ -311,8 +310,9 @@ class MarkdownH6(MarkdownHeader):
DEFAULT_CSS = """
MarkdownH6 {
- text-style: bold;
- color: $text-muted;
+ color: $markdown-h6-color;
+ background: $markdown-h6-background;
+ text-style: $markdown-h6-text-style;
margin: 1 0;
}
"""
@@ -323,7 +323,7 @@ class MarkdownHorizontalRule(MarkdownBlock):
DEFAULT_CSS = """
MarkdownHorizontalRule {
- border-bottom: heavy $primary;
+ border-bottom: heavy $secondary;
height: 1;
padding-top: 1;
margin-bottom: 1;
@@ -353,7 +353,7 @@ class MarkdownBlockQuote(MarkdownBlock):
padding: 0 1;
}
MarkdownBlockQuote:light {
- border-left: outer $primary;
+ border-left: outer $secondary;
}
MarkdownBlockQuote > BlockQuote {
margin-left: 2;
@@ -500,7 +500,7 @@ class MarkdownTable(MarkdownBlock):
DEFAULT_CSS = """
MarkdownTable {
width: 100%;
- background: $panel;
+ background: $surface;
}
"""
@@ -554,7 +554,7 @@ class MarkdownBullet(Widget):
color: $success;
text-style: bold;
&:light {
- color: $primary;
+ color: $secondary;
}
}
"""
@@ -619,7 +619,7 @@ def __init__(self, markdown: Markdown, code: str, lexer: str) -> None:
self.lexer = lexer
self.theme = (
self._markdown.code_dark_theme
- if self.app.dark
+ if self.app.current_theme.dark
else self._markdown.code_light_theme
)
@@ -635,13 +635,13 @@ def _block(self) -> Syntax:
def _on_mount(self, _: Mount) -> None:
"""Watch app theme switching."""
- self.watch(self.app, "dark", self._retheme)
+ self.watch(self.app, "theme", self._retheme)
def _retheme(self) -> None:
"""Rerender when the theme changes."""
self.theme = (
self._markdown.code_dark_theme
- if self.app.dark
+ if self.app.current_theme.dark
else self._markdown.code_light_theme
)
self.get_child_by_type(Static).update(self._block())
@@ -670,10 +670,15 @@ class Markdown(Widget):
DEFAULT_CSS = """
Markdown {
height: auto;
- margin: 0 2 1 2;
+ padding: 0 2 1 2;
layout: vertical;
- color: $text;
+ color: $foreground;
+ background: $surface;
overflow-y: auto;
+
+ &:focus {
+ background-tint: $foreground 5%;
+ }
}
.em {
text-style: italic;
@@ -698,17 +703,17 @@ class Markdown(Widget):
| :- | :- |
| `code_inline` | Target text that is styled as inline code. |
| `em` | Target text that is emphasized inline. |
- | `s` | Target text that is styled inline with strykethrough. |
+ | `s` | Target text that is styled inline with strikethrough. |
| `strong` | Target text that is styled inline with strong. |
"""
BULLETS = ["\u25cf ", "▪ ", "‣ ", "• ", "⭑ "]
code_dark_theme: reactive[str] = reactive("material")
- """The theme to use for code blocks when in [dark mode][textual.app.App.dark]."""
+ """The theme to use for code blocks when the App theme is dark."""
code_light_theme: reactive[str] = reactive("material-light")
- """The theme to use for code blocks when in [light mode][textual.app.App.dark]."""
+ """The theme to use for code blocks when the App theme is light."""
def __init__(
self,
@@ -805,13 +810,13 @@ def on_markdown_link_clicked(self, event: LinkClicked) -> None:
def _watch_code_dark_theme(self) -> None:
"""React to the dark theme being changed."""
- if self.app.dark:
+ if self.app.current_theme.dark:
for block in self.query(MarkdownFence):
block._retheme()
def _watch_code_light_theme(self) -> None:
"""React to the light theme being changed."""
- if not self.app.dark:
+ if not self.app.current_theme.dark:
for block in self.query(MarkdownFence):
block._retheme()
@@ -1043,12 +1048,17 @@ class MarkdownTableOfContents(Widget, can_focus_children=True):
DEFAULT_CSS = """
MarkdownTableOfContents {
width: auto;
+ height: 1fr;
background: $panel;
- border-right: wide $background;
+ &:focus-within {
+ background-tint: $foreground 5%;
+ }
}
MarkdownTableOfContents > Tree {
padding: 1;
width: auto;
+ height: 1fr;
+ background: $panel;
}
"""
@@ -1118,7 +1128,7 @@ async def _on_tree_node_selected(self, message: Tree.NodeSelected) -> None:
message.stop()
-class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
+class MarkdownViewer(VerticalScroll, can_focus=False, can_focus_children=True):
"""A Markdown viewer widget."""
SCOPED_CSS = False
@@ -1127,14 +1137,11 @@ class MarkdownViewer(VerticalScroll, can_focus=True, can_focus_children=True):
MarkdownViewer {
height: 1fr;
scrollbar-gutter: stable;
- }
-
- MarkdownTableOfContents {
- dock:left;
- }
-
- MarkdownViewer > MarkdownTableOfContents {
- display: none;
+ background: $surface;
+ & > MarkdownTableOfContents {
+ display: none;
+ dock:left;
+ }
}
MarkdownViewer.-show-table-of-contents > MarkdownTableOfContents {
@@ -1226,8 +1233,9 @@ def compose(self) -> ComposeResult:
markdown = Markdown(
parser_factory=self._parser_factory, open_links=self._open_links
)
- yield MarkdownTableOfContents(markdown)
+ markdown.can_focus = True
yield markdown
+ yield MarkdownTableOfContents(markdown)
def _on_markdown_table_of_contents_updated(
self, message: Markdown.TableOfContentsUpdated
diff --git a/src/textual/widgets/_option_list.py b/src/textual/widgets/_option_list.py
index 5963052c80..59f12c6892 100644
--- a/src/textual/widgets/_option_list.py
+++ b/src/textual/widgets/_option_list.py
@@ -139,49 +139,41 @@ class OptionList(ScrollView, can_focus=True):
OptionList {
height: auto;
max-height: 100%;
- background: $boost;
- color: $text;
+ color: $foreground;
overflow-x: hidden;
border: tall transparent;
padding: 0 1;
- }
-
- OptionList:focus {
- border: tall $accent;
-
- }
-
- OptionList > .option-list--separator {
- color: $foreground 15%;
- }
-
- OptionList > .option-list--option-highlighted {
- color: $text;
- text-style: bold;
- }
-
- OptionList:focus > .option-list--option-highlighted {
- background: $accent;
- }
-
- OptionList > .option-list--option-disabled {
- color: $text-disabled;
- }
-
- OptionList > .option-list--option-hover {
- background: $boost;
- }
-
- OptionList > .option-list--option-hover-highlighted {
- background: $accent 60%;
- color: $text;
- text-style: bold;
- }
-
- OptionList:focus > .option-list--option-hover-highlighted {
- background: $accent;
- color: $text;
- text-style: bold;
+ background: $surface;
+ &:ansi {
+ border: tall $border-blurred;
+ }
+ & > .option-list--option-highlighted {
+ color: $block-cursor-blurred-foreground;
+ background: $block-cursor-blurred-background;
+ text-style: $block-cursor-blurred-text-style;
+ }
+ &:focus {
+ border: tall $border;
+ background-tint: $foreground 5%;
+ & > .option-list--option-highlighted {
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ text-style: $block-cursor-text-style;
+ }
+ }
+ & > .option-list--separator {
+ color: $foreground 15%;
+ }
+ & > .option-list--option-highlighted {
+ color: $foreground;
+ background: $block-cursor-blurred-background;
+ }
+ & > .option-list--option-disabled {
+ color: $text-disabled;
+ }
+ & > .option-list--option-hover {
+ background: $block-hover-background;
+ }
}
"""
@@ -190,7 +182,6 @@ class OptionList(ScrollView, can_focus=True):
"option-list--option-disabled",
"option-list--option-highlighted",
"option-list--option-hover",
- "option-list--option-hover-highlighted",
"option-list--separator",
}
"""
@@ -199,7 +190,6 @@ class OptionList(ScrollView, can_focus=True):
| `option-list--option-disabled` | Target disabled options. |
| `option-list--option-highlighted` | Target the highlighted option. |
| `option-list--option-hover` | Target an option that has the mouse over it. |
- | `option-list--option-hover-highlighted` | Target a highlighted option that has the mouse over it. |
| `option-list--separator` | Target the separators. |
"""
diff --git a/src/textual/widgets/_progress_bar.py b/src/textual/widgets/_progress_bar.py
index 6ad585a3b0..a1c0260b8e 100644
--- a/src/textual/widgets/_progress_bar.py
+++ b/src/textual/widgets/_progress_bar.py
@@ -44,16 +44,16 @@ class Bar(Widget, can_focus=False):
height: 1;
&> .bar--bar {
- color: $warning;
- background: $foreground 10%;
+ color: $primary;
+ background: $surface;
}
&> .bar--indeterminate {
color: $error;
- background: $foreground 10%;
+ background: $surface;
}
&> .bar--complete {
color: $success;
- background: $foreground 10%;
+ background: $surface;
}
}
"""
diff --git a/src/textual/widgets/_radio_set.py b/src/textual/widgets/_radio_set.py
index 68ac5dc343..61802999be 100644
--- a/src/textual/widgets/_radio_set.py
+++ b/src/textual/widgets/_radio_set.py
@@ -27,37 +27,55 @@ class RadioSet(VerticalScroll, can_focus=True, can_focus_children=False):
DEFAULT_CSS = """
RadioSet {
- border: tall transparent;
- background: $boost;
- padding: 0 1 0 0;
+ border: tall $border-blurred;
+ background: $surface;
+ padding: 0 1;
height: auto;
width: auto;
- }
-
- RadioSet:focus {
- border: tall $accent;
- }
-
- /* The following rules/styles mimic similar ToggleButton:focus rules in
- * ToggleButton. If those styles ever get updated, these should be too.
- */
-
- RadioSet > RadioButton {
- background: transparent;
- border: none;
- padding: 0 1;
- }
-
- RadioSet:focus > RadioButton.-selected > .toggle--label {
- text-style: underline;
- }
-
- RadioSet:focus ToggleButton.-selected > .toggle--button {
- background: $foreground 25%;
- }
- RadioSet:focus > RadioButton.-on.-selected > .toggle--button {
- background: $foreground 25%;
+ & > RadioButton {
+ background: transparent;
+ border: none;
+ padding: 0;
+
+ & > .toggle--button {
+ color: $surface;
+ background: $panel;
+ }
+
+ &.-selected {
+ background: $block-cursor-blurred-background;
+ }
+ }
+
+ & > RadioButton.-on .toggle--button {
+ color: $success;
+ }
+
+ &:focus {
+ /* The following rules/styles mimic similar ToggleButton:focus rules in
+ * ToggleButton. If those styles ever get updated, these should be too.
+ */
+ border: tall $border;
+ background-tint: $foreground 5%;
+
+ & > RadioButton {
+ & > .toggle--button {
+ color: $surface;
+ background: $panel-lighten-1;
+ }
+ &.-on > .toggle--button {
+ color: $success;
+ }
+ }
+
+ & > RadioButton.-selected {
+ color: $block-cursor-foreground;
+ text-style: $block-cursor-text-style;
+ background: $block-cursor-background;
+ }
+
+ }
}
"""
diff --git a/src/textual/widgets/_rich_log.py b/src/textual/widgets/_rich_log.py
index f0585c9dfe..5006dc39e8 100644
--- a/src/textual/widgets/_rich_log.py
+++ b/src/textual/widgets/_rich_log.py
@@ -50,8 +50,11 @@ class RichLog(ScrollView, can_focus=True):
DEFAULT_CSS = """
RichLog{
background: $surface;
- color: $text;
+ color: $foreground;
overflow-y: scroll;
+ &:focus {
+ background-tint: $foreground 5%;
+ }
}
"""
diff --git a/src/textual/widgets/_rule.py b/src/textual/widgets/_rule.py
index aa0a7fd67a..4ffaa8cd63 100644
--- a/src/textual/widgets/_rule.py
+++ b/src/textual/widgets/_rule.py
@@ -112,7 +112,7 @@ class Rule(Widget, can_focus=False):
DEFAULT_CSS = """
Rule {
- color: $primary;
+ color: $secondary;
}
Rule.-horizontal {
diff --git a/src/textual/widgets/_select.py b/src/textual/widgets/_select.py
index 48cc392598..a35d89ac5f 100644
--- a/src/textual/widgets/_select.py
+++ b/src/textual/widgets/_select.py
@@ -45,22 +45,6 @@ class SelectOverlay(OptionList):
BINDINGS = [("escape", "dismiss", "Dismiss menu")]
- DEFAULT_CSS = """
- SelectOverlay {
- border: tall $background;
- background: $panel;
- color: $text;
- width: 100%;
- padding: 0 1;
- }
- SelectOverlay:focus {
- border: tall $background;
- }
- SelectOverlay > .option-list--option {
- padding: 0 1;
- }
- """
-
@dataclass
class Dismiss(Message):
"""Inform ancestor the overlay should be dismissed."""
@@ -111,21 +95,27 @@ class SelectCurrent(Horizontal):
DEFAULT_CSS = """
SelectCurrent {
border: tall transparent;
- background: $boost;
- color: $text;
- width: 100%;
+ color: $foreground;
+ background: $surface;
+ width: 1fr;
height: auto;
padding: 0 2;
+ &:ansi {
+ border: tall ansi_blue;
+ color: ansi_default;
+ background: ansi_default;
+ }
+
Static#label {
width: 1fr;
height: auto;
- color: $text-disabled;
+ color: $foreground 50%;
background: transparent;
}
&.-has-value Static#label {
- color: $text;
+ color: $foreground;
}
.arrow {
@@ -133,7 +123,7 @@ class SelectCurrent(Horizontal):
width: 1;
height: 1;
padding: 0 0 0 1;
- color: $text-muted;
+ color: $foreground 50%;
background: transparent;
}
}
@@ -177,7 +167,7 @@ def _watch_has_value(self, has_value: bool) -> None:
"""Toggle the class."""
self.set_class(has_value, "-has-value")
- async def _on_click(self, event: events.Click) -> None:
+ def _on_click(self, event: events.Click) -> None:
"""Inform ancestor we want to toggle."""
event.stop()
self.post_message(self.Toggle())
@@ -211,6 +201,16 @@ class Select(Generic[SelectType], Vertical, can_focus=True):
DEFAULT_CSS = """
Select {
height: auto;
+ color: $foreground;
+
+ .up-arrow {
+ display: none;
+ }
+
+ &:focus > SelectCurrent {
+ border: tall $border;
+ background-tint: $foreground 5%;
+ }
& > SelectOverlay {
width: 1fr;
@@ -219,31 +219,31 @@ class Select(Generic[SelectType], Vertical, can_focus=True):
max-height: 12;
overlay: screen;
constrain: none inside;
+ color: $foreground;
+ border: tall $border-blurred;
+ background: $surface;
+ &:focus {
+ background-tint: $foreground 5%;
+ }
+ & > .option-list--option {
+ padding: 0 1;
+ }
}
- &:focus > SelectCurrent {
- border: tall $accent;
- }
-
- .up-arrow {
- display: none;
- }
-
- &.-expanded .down-arrow {
- display: none;
- }
+ &.-expanded {
+ .down-arrow {
+ display: none;
+ }
- &.-expanded .up-arrow {
- display: block;
- }
+ .up-arrow {
+ display: block;
+ }
- &.-expanded > SelectOverlay {
- display: block;
+ & > SelectOverlay {
+ display: block;
+ }
}
- &.-expanded > SelectCurrent {
- border: tall $accent;
- }
}
"""
diff --git a/src/textual/widgets/_selection_list.py b/src/textual/widgets/_selection_list.py
index 22ac20b0a5..9f75f8360a 100644
--- a/src/textual/widgets/_selection_list.py
+++ b/src/textual/widgets/_selection_list.py
@@ -96,62 +96,62 @@ class SelectionList(Generic[SelectionType], OptionList):
DEFAULT_CSS = """
SelectionList {
height: auto;
- }
-
- SelectionList:light:focus > .selection-list--button-selected {
- color: $primary;
- }
+
+ & > .selection-list--button {
+ color: $surface-darken-1;
+ background: $panel;
+ }
- SelectionList:light > .selection-list--button-selected-highlighted {
- color: $primary;
- }
+ & > .selection-list--button-highlighted {
+ color: $surface-darken-1;
+ background: $panel;
+ }
- SelectionList:light:focus > .selection-list--button-selected-highlighted {
- color: $primary;
- }
+ & > .selection-list--button-selected {
+ color: $success;
+ background: $panel;
+ }
- SelectionList > .selection-list--button {
- text-style: bold;
- background: $foreground 15%;
- }
+ & > .selection-list--button-selected-highlighted {
+ color: $success;
+ background: $panel;
+ }
- SelectionList:focus > .selection-list--button {
- text-style: bold;
- background: $foreground 25%;
- }
+ &:light {
+ & > .selection-list--button-selected-highlighted {
+ color: $success;
+ }
- SelectionList > .selection-list--button-highlighted {
- text-style: bold;
- background: $foreground 15%;
- }
+ &:focus {
+ & > .selection-list--button-selected {
+ color: $success-darken-1;
+ }
+ & > .selection-list--button-selected-highlighted {
+ color: $success-darken-1;
+ }
+ }
+ }
- SelectionList:focus > .selection-list--button-highlighted {
- text-style: bold;
- background: $foreground 25%;
- }
+ &:focus {
+ & > .selection-list--button {
+ background: $panel-lighten-1;
+ }
- SelectionList > .selection-list--button-selected {
- text-style: bold;
- color: $success;
- background: $foreground 15%;
- }
+ & > .selection-list--button-highlighted {
+ background: $panel-lighten-1;
+ }
- SelectionList:focus > .selection-list--button-selected {
- text-style: bold;
- color: $success;
- background: $foreground 25%;
- }
+ & > .selection-list--button-selected {
+ color: $success;
+ background: $panel-lighten-1;
+ }
- SelectionList > .selection-list--button-selected-highlighted {
- text-style: bold;
- color: $success;
- background: $foreground 15%;
- }
+ & > .selection-list--button-selected-highlighted {
+ color: $success;
+ background: $panel-lighten-1;
+ }
+ }
- SelectionList:focus > .selection-list--button-selected-highlighted {
- text-style: bold;
- color: $success;
- background: $foreground 25%;
}
"""
@@ -576,10 +576,10 @@ def render_line(self, y: int) -> Strip:
# If the button is in the unselected state, we're going to do a bit
# of a switcharound to make it look like it's a "cutout".
- if selection.value not in self._selected:
- button_style += Style.from_color(
- self.background_colors[1].rich_color, button_style.bgcolor
- )
+ # if selection.value not in self._selected:
+ # button_style += Style.from_color(
+ # self.background_colors[1].rich_color, button_style.bgcolor
+ # )
# Build the style for the side characters. Note that this is
# sensitive to the type of character used, so pay attention to
diff --git a/src/textual/widgets/_sparkline.py b/src/textual/widgets/_sparkline.py
index 5eb284b591..103cb08d94 100644
--- a/src/textual/widgets/_sparkline.py
+++ b/src/textual/widgets/_sparkline.py
@@ -41,10 +41,10 @@ class Sparkline(Widget):
height: 1;
}
Sparkline > .sparkline--max-color {
- color: $accent;
+ color: $primary;
}
Sparkline > .sparkline--min-color {
- color: $accent 30%;
+ color: $primary 30%;
}
"""
diff --git a/src/textual/widgets/_switch.py b/src/textual/widgets/_switch.py
index 09d7a83fa0..37714a62ea 100644
--- a/src/textual/widgets/_switch.py
+++ b/src/textual/widgets/_switch.py
@@ -46,33 +46,51 @@ class Switch(Widget, can_focus=True):
DEFAULT_CSS = """
Switch {
- border: tall transparent;
- background: $boost;
+ border: tall $border-blurred;
+ background: $surface;
height: auto;
width: auto;
padding: 0 2;
+ &.-on > .switch--slider {
+ color: $success;
+ }
+ & > .switch--slider {
+ background: $surface-darken-1;
+ color: $surface-lighten-2;
+ }
+ &:hover {
+ & > .switch--slider {
+ color: $surface-lighten-3;
+ }
+ &.-on {
+ & > .switch--slider {
+ color: $success-lighten-1;
+ }
+ }
+ }
+ &:focus {
+ border: tall $border;
+ background-tint: $foreground 5%;
+ }
+ &:light {
+ & > .switch--slider {
+ background: $surface-lighten-2;
+ color: $surface-darken-1;
+ }
+ &.-on {
+ & > .switch--slider {
+ color: $success-lighten-1;
+ }
+ &:hover > .switch--slider {
+ color: $success;
+ }
+ }
+ &:hover > .switch--slider {
+ color: $surface-darken-2;
+ }
+ }
}
- Switch > .switch--slider {
- background: $panel-darken-2;
- color: $panel-lighten-2;
- }
-
- Switch:hover {
- border: tall $background;
- }
-
- Switch:focus {
- border: tall $accent;
- }
-
- Switch.-on {
-
- }
-
- Switch.-on > .switch--slider {
- color: $success;
- }
"""
value: reactive[bool] = reactive(False, init=False)
diff --git a/src/textual/widgets/_tabbed_content.py b/src/textual/widgets/_tabbed_content.py
index d216688f7f..2355c82275 100644
--- a/src/textual/widgets/_tabbed_content.py
+++ b/src/textual/widgets/_tabbed_content.py
@@ -169,7 +169,6 @@ class TabPane(Widget):
DEFAULT_CSS = """
TabPane {
height: auto;
- padding: 1 2;
}
"""
diff --git a/src/textual/widgets/_tabs.py b/src/textual/widgets/_tabs.py
index db91209a88..94df1352a4 100644
--- a/src/textual/widgets/_tabs.py
+++ b/src/textual/widgets/_tabs.py
@@ -30,10 +30,13 @@ class Underline(Widget):
Underline {
width: 1fr;
height: 1;
- }
- Underline > .underline--bar {
- background: $foreground 10%;
- color: $accent;
+ & > .underline--bar {
+ color: $block-cursor-background;
+ background: $foreground 10%;
+ }
+ &:ansi {
+ text-style: dim;
+ }
}
"""
@@ -91,27 +94,25 @@ class Tab(Static):
DEFAULT_CSS = """
Tab {
width: auto;
- height: 2;
- padding: 1 1 0 2;
+ height: 1;
+ padding: 0 1;
+ margin: 0 1;
text-align: center;
- color: $text-disabled;
- }
- Tab.-active {
- text-style: bold;
- color: $text;
- }
- Tab:hover {
- text-style: bold;
- }
- Tab.-active:hover {
- color: $text;
- }
- Tab:disabled {
- color: $text-disabled;
- text-opacity: 50%;
- }
- Tab.-hidden {
- display: none;
+ color: $foreground 50%;
+
+ &:hover {
+ color: $foreground;
+ }
+ &:disabled {
+ color: $foreground 25%;
+ }
+
+ &.-active {
+ color: $foreground;
+ }
+ &.-hidden {
+ display: none;
+ }
}
"""
@@ -201,23 +202,52 @@ class Tabs(Widget, can_focus=True):
DEFAULT_CSS = """
Tabs {
width: 100%;
- height: 3;
- }
- Tabs > #tabs-scroll {
- overflow: hidden;
- }
- Tabs #tabs-list {
- width: auto;
- min-height: 2;
- }
- Tabs #tabs-list-bar, Tabs #tabs-list {
- width: auto;
- height: auto;
- min-width: 100%;
- overflow: hidden hidden;
- }
- Tabs:focus .underline--bar {
- background: $foreground 20%;
+ height: 2;
+ &:focus {
+ .underline--bar {
+ background: $foreground 30%;
+ }
+ & .-active {
+ text-style: $block-cursor-text-style;
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ }
+ }
+
+ & > #tabs-scroll {
+ overflow: hidden;
+ }
+
+ #tabs-list {
+ width: auto;
+ }
+ #tabs-list-bar, #tabs-list {
+ width: auto;
+ height: auto;
+ min-width: 100%;
+ overflow: hidden hidden;
+ }
+ &:ansi {
+ #tabs-list {
+ text-style: dim;
+ }
+ & #tabs-list > .-active {
+ text-style: not dim;
+ }
+ &:focus {
+ #tabs-list > .-active {
+ text-style: bold not dim;
+ }
+ }
+ & .underline--bar {
+ color: ansi_bright_blue;
+ background: ansi_default;
+ }
+ & .-active {
+ color: transparent;
+ background: transparent;
+ }
+ }
}
"""
diff --git a/src/textual/widgets/_text_area.py b/src/textual/widgets/_text_area.py
index 0e7da87543..6540889c6f 100644
--- a/src/textual/widgets/_text_area.py
+++ b/src/textual/widgets/_text_area.py
@@ -91,15 +91,19 @@ class TextArea(ScrollView):
TextArea {
width: 1fr;
height: 1fr;
- border: tall $background;
+ border: tall $border-blurred;
padding: 0 1;
-
+ color: $foreground;
+ background: $surface;
+ & .text-area--cursor {
+ text-style: $input-cursor-text-style;
+ }
& .text-area--gutter {
- color: $text 40%;
+ color: $foreground 40%;
}
& .text-area--cursor-gutter {
- color: $text 60%;
+ color: $foreground 60%;
background: $boost;
text-style: bold;
}
@@ -109,7 +113,7 @@ class TextArea(ScrollView):
}
& .text-area--selection {
- background: $accent-lighten-1 40%;
+ background: $input-selection-background;
}
& .text-area--matching-bracket {
@@ -117,13 +121,20 @@ class TextArea(ScrollView):
}
&:focus {
- border: tall $accent;
+ border: tall $border;
+ }
+
+ &:ansi {
+ & .text-area--selection {
+ background: transparent;
+ text-style: reverse;
+ }
}
&:dark {
.text-area--cursor {
- color: $text 90%;
- background: $foreground 90%;
+ color: $input-cursor-foreground;
+ background: $input-cursor-background;
}
&.-read-only .text-area--cursor {
background: $warning-darken-1;
@@ -744,7 +755,7 @@ def _watch_theme(self, theme: str) -> None:
if padding is applied, the colors match."""
self._set_theme(theme)
- def _app_dark_toggled(self) -> None:
+ def _app_theme_changed(self) -> None:
self._set_theme(self._theme.name)
def _set_theme(self, theme: str) -> None:
@@ -1518,8 +1529,8 @@ def gutter_width(self) -> int:
return gutter_width
def _on_mount(self, event: events.Mount) -> None:
- # When `app.dark` is toggled, reset the theme (since it caches values).
- self.watch(self.app, "dark", self._app_dark_toggled, init=False)
+ # When `app.theme` reactive is changed, reset the theme to clear cached styles.
+ self.watch(self.app, "theme", self._app_theme_changed, init=False)
self.blink_timer = self.set_interval(
0.5,
diff --git a/src/textual/widgets/_toast.py b/src/textual/widgets/_toast.py
index 0eb6aa0a2f..1fc87648ae 100644
--- a/src/textual/widgets/_toast.py
+++ b/src/textual/widgets/_toast.py
@@ -46,18 +46,18 @@ class Toast(Static, inherit_css=False):
visibility: visible;
margin-top: 1;
padding: 1 1;
- background: $panel;
- tint: white 5%;
+ background: $panel-lighten-1;
link-background: initial;
- link-color: $text;
+ link-color: $foreground;
link-style: underline;
- link-background-hover: $accent;
- link-color-hover: $text;
+ link-background-hover: $primary;
+ link-color-hover: $foreground;
link-style-hover: bold not underline;
}
.toast--title {
text-style: bold;
+ color: $foreground;
}
Toast.-information {
@@ -65,7 +65,7 @@ class Toast(Static, inherit_css=False):
}
Toast.-information .toast--title {
- color: $success-darken-1;
+ color: $text-success;
}
Toast.-warning {
@@ -73,7 +73,7 @@ class Toast(Static, inherit_css=False):
}
Toast.-warning .toast--title {
- color: $warning-darken-1;
+ color: $text-warning;
}
Toast.-error {
@@ -81,7 +81,7 @@ class Toast(Static, inherit_css=False):
}
Toast.-error .toast--title {
- color: $error-darken-1;
+ color: $text-error;
}
"""
diff --git a/src/textual/widgets/_toggle_button.py b/src/textual/widgets/_toggle_button.py
index 94e12a010a..95727e5698 100644
--- a/src/textual/widgets/_toggle_button.py
+++ b/src/textual/widgets/_toggle_button.py
@@ -55,57 +55,74 @@ class ToggleButton(Static, can_focus=True):
DEFAULT_CSS = """
ToggleButton {
width: auto;
- border: tall transparent;
+ border: tall $border-blurred;
padding: 0 1;
- background: $boost;
- }
-
- ToggleButton:focus {
- border: tall $accent;
- }
-
- ToggleButton:hover {
- text-style: bold;
- background: $boost;
- }
+ background: $surface;
+
+ & > .toggle--button {
+ color: $surface-darken-1;
+ background: $panel;
+ }
+
+ &.-on > .toggle--button {
+ color: $success;
+ background: $panel;
+ }
+
+ &:focus {
+ border: tall $border;
+ background-tint: $foreground 5%;
+ & > .toggle--label {
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ text-style: $block-cursor-text-style;
+ }
+ & > .toggle--button {
+ background: $panel-lighten-1;
+ }
+ &:hover {
+ & > .toggle--label {
+ background: $block-cursor-background;
+ }
+ }
+ }
+
+ &:hover {
+ & > .toggle--label {
+ background: $block-hover-background;
+ }
+ }
- ToggleButton:focus > .toggle--label {
- text-style: underline;
}
- /* Base button colors (including in dark mode). */
+ /* Base button colors (including in dark themes). */
ToggleButton > .toggle--button {
- color: $background;
- text-style: bold;
+ text-style: $block-cursor-text-style;
background: $foreground 15%;
}
- ToggleButton:focus > .toggle--button {
- background: $foreground 25%;
- }
-
- ToggleButton.-on > .toggle--button {
- color: $success;
- }
ToggleButton.-on:focus > .toggle--button {
background: $foreground 25%;
}
- /* Light mode overrides. */
-
- ToggleButton:light > .toggle--button {
- color: $background;
- background: $foreground 10%;
- }
-
- ToggleButton:light:focus > .toggle--button {
- background: $foreground 25%;
- }
-
- ToggleButton:light.-on > .toggle--button {
- color: $primary;
+ /* Light theme overrides. */
+ ToggleButton:light {
+ color: $text;
+ & > .toggle--button {
+ color: $background;
+ background: $foreground 10%;
+ }
+ &:focus > .toggle--button {
+ background: $foreground 25%;
+ }
+ &.-on > .toggle--button {
+ color: $success;
+ }
+ &.-on:focus > .toggle--button {
+ color: $success-darken-1;
+ }
}
""" # TODO: https://github.com/Textualize/textual/issues/1780
@@ -189,13 +206,6 @@ def _button(self) -> Text:
# Grab the button style.
button_style = self.get_component_rich_style("toggle--button")
- # If the button is off, we're going to do a bit of a switcharound to
- # make it look like it's a "cutout".
- if not self.value:
- button_style += Style.from_color(
- self.background_colors[1].rich_color, button_style.bgcolor
- )
-
# Building the style for the side characters. Note that this is
# sensitive to the type of character used, so pay attention to
# BUTTON_LEFT and BUTTON_RIGHT.
@@ -217,9 +227,7 @@ def render(self) -> RenderResult:
"""
button = self._button
label = self._label.copy()
- label.stylize_before(
- self.get_component_rich_style("toggle--label", partial=True)
- )
+ label.stylize_before(self.get_component_rich_style("toggle--label"))
spacer = " " if label else ""
return Text.assemble(
*(
diff --git a/src/textual/widgets/_tooltip.py b/src/textual/widgets/_tooltip.py
index 2b5b0440c0..b4247a326a 100644
--- a/src/textual/widgets/_tooltip.py
+++ b/src/textual/widgets/_tooltip.py
@@ -9,7 +9,7 @@ class Tooltip(Static, inherit_css=False):
layer: _tooltips;
margin: 1 0;
padding: 1 2;
- background: $background;
+ background: $panel;
width: auto;
height: auto;
constrain: inside inflect;
diff --git a/src/textual/widgets/_tree.py b/src/textual/widgets/_tree.py
index f73dd8515c..afda7a707c 100644
--- a/src/textual/widgets/_tree.py
+++ b/src/textual/widgets/_tree.py
@@ -581,70 +581,67 @@ class Tree(Generic[TreeDataType], ScrollView, can_focus=True):
DEFAULT_CSS = """
Tree {
- background: $panel;
- color: $text;
+ background: $surface;
+ color: $foreground;
- & > .tree--label {
-
- }
+ & > .tree--label {}
& > .tree--guides {
- color: $success-darken-3;
+ color: $surface-lighten-2;
}
& > .tree--guides-hover {
- color: $success;
- text-style: bold;
+ color: $surface-lighten-2;
}
& > .tree--guides-selected {
- color: $warning;
- text-style: bold;
+ color: $block-cursor-blurred-background;
}
& > .tree--cursor {
- background: $secondary-darken-2;
- color: $text;
- text-style: bold;
- }
- &:focus > .tree--cursor {
- background: $secondary;
- }
- & > .tree--highlight {
- text-style: underline;
+ text-style: $block-cursor-blurred-text-style;
+ background: $block-cursor-blurred-background;
}
+ & > .tree--highlight {}
& > .tree--highlight-line {
- background: $boost;
+ background: $block-hover-background;
}
- &.-ansi {
- background: ansi_default;
- color: ansi_default;
+ &:focus {
+ background-tint: $foreground 5%;
+ & > .tree--cursor {
+ color: $block-cursor-foreground;
+ background: $block-cursor-background;
+ text-style: $block-cursor-text-style;
+ }
& > .tree--guides {
- color: green;
+ color: $surface-lighten-3;
}
& > .tree--guides-hover {
- color: ansi_blue;
-
+ color: $surface-lighten-3;
}
& > .tree--guides-selected {
- color: ansi_bright_blue;
-
+ color: $block-cursor-background;
}
- & > .tree--cursor {
- background: ansi_bright_blue;
- color: ansi_default;
- text-style: none;
+ }
+
+ &:light {
+ /* In light mode the guides are darker*/
+ & > .tree--guides {
+ color: $surface-darken-1;
}
- &:nocolor > .tree--cursor{
- text-style: reverse;
+ & > .tree--guides-hover {
+ color: $block-cursor-background;
}
- &:focus > .tree--cursor {
- background: ansi_bright_blue;
+ & > .tree--guides-selected {
+ color: $block-cursor-background;
}
- & > .tree--highlight {
- text-style: underline;
+ }
+
+ &:ansi {
+ color: ansi_default;
+ & > .tree--guides {
+ color: ansi_green;
}
- & > .tree--highlight-line {
- background: ansi_default;
+ &:nocolor > .tree--cursor{
+ text-style: reverse;
}
-
}
}
diff --git a/src/textual/widgets/_welcome.py b/src/textual/widgets/_welcome.py
index b67c49099d..9967768afa 100644
--- a/src/textual/widgets/_welcome.py
+++ b/src/textual/widgets/_welcome.py
@@ -41,8 +41,7 @@ class Welcome(Static):
Welcome Container {
padding: 1;
- background: $panel;
- color: $text;
+ color: $foreground;
}
Welcome #text {
diff --git a/tests/footer/test_footer.py b/tests/footer/test_footer.py
index d4ed2d59f8..2016451c04 100644
--- a/tests/footer/test_footer.py
+++ b/tests/footer/test_footer.py
@@ -20,7 +20,7 @@ class TestWidget(Widget, can_focus=True):
content-align: center middle;
&:focus {
- border: tall $accent;
+ border: tall $secondary;
}
}
"""
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_alignment_containers.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_alignment_containers.svg
index d4d1abf605..adce7b3c3b 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_alignment_containers.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_alignment_containers.svg
@@ -19,139 +19,139 @@
font-weight: 700;
}
- .terminal-1827861245-matrix {
+ .terminal-1477630577-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1827861245-title {
+ .terminal-1477630577-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1827861245-r1 { fill: #cad1d6 }
-.terminal-1827861245-r2 { fill: #7ae998 }
-.terminal-1827861245-r3 { fill: #c5c8c6 }
-.terminal-1827861245-r4 { fill: #4ebf71;font-weight: bold }
-.terminal-1827861245-r5 { fill: #008139 }
-.terminal-1827861245-r6 { fill: #e3dbce }
-.terminal-1827861245-r7 { fill: #e1e1e1 }
-.terminal-1827861245-r8 { fill: #e76580 }
-.terminal-1827861245-r9 { fill: #f5e5e9;font-weight: bold }
-.terminal-1827861245-r10 { fill: #780028 }
+ .terminal-1477630577-r1 { fill: #c9d5de }
+.terminal-1477630577-r2 { fill: #7ae998 }
+.terminal-1477630577-r3 { fill: #c5c8c6 }
+.terminal-1477630577-r4 { fill: #55c076;font-weight: bold }
+.terminal-1477630577-r5 { fill: #008139 }
+.terminal-1477630577-r6 { fill: #e3dacd }
+.terminal-1477630577-r7 { fill: #e0e0e0 }
+.terminal-1477630577-r8 { fill: #e76580 }
+.terminal-1477630577-r9 { fill: #f5e5e9 }
+.terminal-1477630577-r10 { fill: #780028 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AlignContainersApp
+ AlignContainersApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- center
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- middle
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ center
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ middle
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[False].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[False].svg
deleted file mode 100644
index cee95d69f7..0000000000
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[False].svg
+++ /dev/null
@@ -1,166 +0,0 @@
-
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[True].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[True].svg
deleted file mode 100644
index 884440ba70..0000000000
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[True].svg
+++ /dev/null
@@ -1,164 +0,0 @@
-
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-dark].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-dark].svg
new file mode 100644
index 0000000000..ee81a27da1
--- /dev/null
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-dark].svg
@@ -0,0 +1,164 @@
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-light].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-light].svg
new file mode 100644
index 0000000000..a0f3fd75e7
--- /dev/null
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_color_mapping[textual-light].svg
@@ -0,0 +1,166 @@
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_command_palette.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_command_palette.svg
index d3bfa672c5..da79f4f62f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_command_palette.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_ansi_command_palette.svg
@@ -19,143 +19,144 @@
font-weight: 700;
}
- .terminal-1668212009-matrix {
+ .terminal-1079827712-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1668212009-title {
+ .terminal-1079827712-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1668212009-r1 { fill: #8a4346 }
-.terminal-1668212009-r2 { fill: #868887 }
-.terminal-1668212009-r3 { fill: #6b546f }
-.terminal-1668212009-r4 { fill: #c5c8c6 }
-.terminal-1668212009-r5 { fill: #292929 }
-.terminal-1668212009-r6 { fill: #004578 }
-.terminal-1668212009-r7 { fill: #00ff00 }
-.terminal-1668212009-r8 { fill: #000000 }
-.terminal-1668212009-r9 { fill: #1e1e1e }
-.terminal-1668212009-r10 { fill: #60686f }
-.terminal-1668212009-r11 { fill: #dddfe0 }
-.terminal-1668212009-r12 { fill: #dddfe0;font-weight: bold }
-.terminal-1668212009-r13 { fill: #848b90 }
+ .terminal-1079827712-r1 { fill: #8a4346 }
+.terminal-1079827712-r2 { fill: #868887 }
+.terminal-1079827712-r3 { fill: #6b546f }
+.terminal-1079827712-r4 { fill: #e0e0e0 }
+.terminal-1079827712-r5 { fill: #292929 }
+.terminal-1079827712-r6 { fill: #c5c8c6 }
+.terminal-1079827712-r7 { fill: #0178d4 }
+.terminal-1079827712-r8 { fill: #00ff00 }
+.terminal-1079827712-r9 { fill: #000000 }
+.terminal-1079827712-r10 { fill: #8d8d8d }
+.terminal-1079827712-r11 { fill: #7e8486 }
+.terminal-1079827712-r12 { fill: #141f27 }
+.terminal-1079827712-r13 { fill: #191919 }
+.terminal-1079827712-r14 { fill: #868686 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CommandPaletteApp
+ CommandPaletteApp
-
-
-
- RedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-
-🔎Search for commands…
-
-
- Quit the application
-Quit the application as soon as possible
- Save screenshot
-Save an SVG 'screenshot' of the current screen
- Show keys and help panel
-Show help for the focused widget and a summary of available keys
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
-MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+
+
+
+ RedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+🔎Search for commands…
+
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊ Quit the application ▎
+▊Quit the application as soon as possible▎
+▊ Save screenshot ▎
+▊Save an SVG 'screenshot' of the current screen▎
+▊ Show keys and help panel ▎
+▊Show help for the focused widget and a summary of available keys▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
+MagentaRedMagentaRedMagentaRedMagentaRedMagentaRedMagentaRed
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_blur.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_blur.svg
index 7d21a45769..f063da5765 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_blur.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_blur.svg
@@ -19,134 +19,133 @@
font-weight: 700;
}
- .terminal-625927252-matrix {
+ .terminal-3772043974-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-625927252-title {
+ .terminal-3772043974-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-625927252-r1 { fill: #e1e1e1 }
-.terminal-625927252-r2 { fill: #c5c8c6 }
-.terminal-625927252-r3 { fill: #1e1e1e }
-.terminal-625927252-r4 { fill: #121212 }
-.terminal-625927252-r5 { fill: #e2e2e2 }
+ .terminal-3772043974-r1 { fill: #e0e0e0 }
+.terminal-3772043974-r2 { fill: #c5c8c6 }
+.terminal-3772043974-r3 { fill: #121212 }
+.terminal-3772043974-r4 { fill: #191919 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AppBlurApp
+ AppBlurApp
-
-
-
-
-
-
-
-
-
-
-
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊This should be the blur style ▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊This should also be the blur style▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊This should be the blur style ▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊This should also be the blur style▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_focus_style.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_focus_style.svg
index 79cdfbd91a..81b4aef655 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_focus_style.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_focus_style.svg
@@ -19,133 +19,132 @@
font-weight: 700;
}
- .terminal-1705976361-matrix {
+ .terminal-1754273062-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1705976361-title {
+ .terminal-1754273062-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1705976361-r1 { fill: #e1e1e1 }
-.terminal-1705976361-r2 { fill: #c5c8c6 }
-.terminal-1705976361-r3 { fill: #004578 }
-.terminal-1705976361-r4 { fill: #e2e3e3 }
+ .terminal-1754273062-r1 { fill: #e0e0e0 }
+.terminal-1754273062-r2 { fill: #c5c8c6 }
+.terminal-1754273062-r3 { fill: #0178d4 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- FocusApp
+ FocusApp
-
-
-
-
-┌───────────┐
-││
-│BLURRED│
-││
-└───────────┘
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+┌───────────┐
+││
+│BLURRED│
+││
+└───────────┘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_search_opens_and_displays_search_list.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_search_opens_and_displays_search_list.svg
new file mode 100644
index 0000000000..a4853d650d
--- /dev/null
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_app_search_opens_and_displays_search_list.svg
@@ -0,0 +1,156 @@
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_fr.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_fr.svg
index caa65f18f4..68bf266f46 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_fr.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_fr.svg
@@ -19,141 +19,140 @@
font-weight: 700;
}
- .terminal-3141096165-matrix {
+ .terminal-3624987906-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3141096165-title {
+ .terminal-3624987906-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3141096165-r1 { fill: #00ffff }
-.terminal-3141096165-r2 { fill: #c5c8c6 }
-.terminal-3141096165-r3 { fill: #e1e1e1 }
-.terminal-3141096165-r4 { fill: #008000 }
-.terminal-3141096165-r5 { fill: #ff0000 }
-.terminal-3141096165-r6 { fill: #e1e1e1;font-weight: bold }
-.terminal-3141096165-r7 { fill: #dde6ed }
+ .terminal-3624987906-r1 { fill: #00ffff }
+.terminal-3624987906-r2 { fill: #c5c8c6 }
+.terminal-3624987906-r3 { fill: #e0e0e0 }
+.terminal-3624987906-r4 { fill: #008000 }
+.terminal-3624987906-r5 { fill: #ff0000 }
+.terminal-3624987906-r6 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- FRApp
+ FRApp
-
-
-
- ┌──────────────────────────────────────────────────────────────────────────────┐
-│┌────────────────────────────┐│
-││Hello one line ││
-││┌──────────────────────────┐││
-│││Widget#child│││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││└──────────────────────────┘││
-││││
-││Two││
-││Lines with 1x2 margin││
-││││
-│└────────────────────────────┘│
-└──────────────────────────────────────────────────────────────────────────────┘
+
+
+
+ ┌──────────────────────────────────────────────────────────────────────────────┐
+│┌────────────────────────────┐│
+││Hello one line ││
+││┌──────────────────────────┐││
+│││Widget#child│││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││└──────────────────────────┘││
+││││
+││Two││
+││Lines with 1x2 margin││
+││││
+│└────────────────────────────┘│
+└──────────────────────────────────────────────────────────────────────────────┘
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid.svg
index 2deb324d80..fb1cc8b74e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid.svg
@@ -19,136 +19,135 @@
font-weight: 700;
}
- .terminal-33602368-matrix {
+ .terminal-3017971061-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-33602368-title {
+ .terminal-3017971061-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-33602368-r1 { fill: #008000 }
-.terminal-33602368-r2 { fill: #c5c8c6 }
-.terminal-33602368-r3 { fill: #e1e1e1 }
-.terminal-33602368-r4 { fill: #1e1e1e }
-.terminal-33602368-r5 { fill: #121212 }
-.terminal-33602368-r6 { fill: #e2e2e2 }
+ .terminal-3017971061-r1 { fill: #008000 }
+.terminal-3017971061-r2 { fill: #c5c8c6 }
+.terminal-3017971061-r3 { fill: #e0e0e0 }
+.terminal-3017971061-r4 { fill: #121212 }
+.terminal-3017971061-r5 { fill: #191919 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- GridApp
+ GridApp
-
-
-
- ┌──────────────────────────────────────────────────────────────────────────────┐
-│foo ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│▊▎│
-│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-│Longer label▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│▊▎│
-│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-└──────────────────────────────────────────────────────────────────────────────┘
-┌──────────────────────────────────────────────────────────────────────────────┐
-│foo▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│▊▎│
-│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-│Longer label▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│▊▎│
-│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-└──────────────────────────────────────────────────────────────────────────────┘
-┌──────────────────────────────────────────────────────────────────────────────┐
-│foo bar foo bar foo bar foo ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│bar foo bar foo bar foo bar ▊▎│
-│foo bar foo bar foo bar ▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-│Longer label ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
-│▊▎│
-│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
-└──────────────────────────────────────────────────────────────────────────────┘
+
+
+
+ ┌──────────────────────────────────────────────────────────────────────────────┐
+│foo ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│▊▎│
+│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+│Longer label▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│▊▎│
+│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+└──────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────┐
+│foo▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│▊▎│
+│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+│Longer label▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│▊▎│
+│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+└──────────────────────────────────────────────────────────────────────────────┘
+┌──────────────────────────────────────────────────────────────────────────────┐
+│foo bar foo bar foo bar foo ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│bar foo bar foo bar foo bar ▊▎│
+│foo bar foo bar foo bar ▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+│Longer label ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎│
+│▊▎│
+│▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎│
+└──────────────────────────────────────────────────────────────────────────────┘
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid_default_height.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid_default_height.svg
index d7fcfbdf18..3a12f52a47 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid_default_height.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_grid_default_height.svg
@@ -19,138 +19,135 @@
font-weight: 700;
}
- .terminal-3709062841-matrix {
+ .terminal-2386001005-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3709062841-title {
+ .terminal-2386001005-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3709062841-r1 { fill: #c5c8c6 }
-.terminal-3709062841-r2 { fill: #e3e3e3 }
-.terminal-3709062841-r3 { fill: #e1e1e1 }
-.terminal-3709062841-r4 { fill: #ff0000 }
-.terminal-3709062841-r5 { fill: #fea62b;font-weight: bold }
-.terminal-3709062841-r6 { fill: #a7a9ab }
-.terminal-3709062841-r7 { fill: #e2e3e3 }
-.terminal-3709062841-r8 { fill: #4c5055 }
+ .terminal-2386001005-r1 { fill: #c5c8c6 }
+.terminal-2386001005-r2 { fill: #e0e0e0 }
+.terminal-2386001005-r3 { fill: #ff0000 }
+.terminal-2386001005-r4 { fill: #ffa62b;font-weight: bold }
+.terminal-2386001005-r5 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- GridHeightAuto
+ GridHeightAuto
-
-
-
- ⭘GridHeightAuto
-Here is some text before the grid
-┌──────────────────────────────────────────────────────────────────────────────┐
-│Cell #0 Cell #1 Cell #2 │
-│Cell #3 Cell #4 Cell #5 │
-│Cell #6 Cell #7 Cell #8 │
-└──────────────────────────────────────────────────────────────────────────────┘
-Here is some text after the grid
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- g Grid v Vertical h Horizontal c Container ▏^p palette
+
+
+
+ ⭘GridHeightAuto
+Here is some text before the grid
+┌──────────────────────────────────────────────────────────────────────────────┐
+│Cell #0 Cell #1 Cell #2 │
+│Cell #3 Cell #4 Cell #5 │
+│Cell #6 Cell #7 Cell #8 │
+└──────────────────────────────────────────────────────────────────────────────┘
+Here is some text after the grid
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ g Grid v Vertical h Horizontal c Container ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_height_scrollbar.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_height_scrollbar.svg
index 66041863f1..6aad89c92c 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_height_scrollbar.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_height_scrollbar.svg
@@ -19,137 +19,136 @@
font-weight: 700;
}
- .terminal-4291222395-matrix {
+ .terminal-3308769726-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4291222395-title {
+ .terminal-3308769726-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4291222395-r1 { fill: #e1e1e1 }
-.terminal-4291222395-r2 { fill: #c5c8c6 }
-.terminal-4291222395-r3 { fill: #ffffff }
-.terminal-4291222395-r4 { fill: #dde6ed;font-weight: bold }
-.terminal-4291222395-r5 { fill: #211505 }
-.terminal-4291222395-r6 { fill: #1e1e1e }
-.terminal-4291222395-r7 { fill: #23568b }
-.terminal-4291222395-r8 { fill: #dde6ed }
+ .terminal-3308769726-r1 { fill: #e0e0e0 }
+.terminal-3308769726-r2 { fill: #c5c8c6 }
+.terminal-3308769726-r3 { fill: #ffffff }
+.terminal-3308769726-r4 { fill: #e0e0e0;font-weight: bold }
+.terminal-3308769726-r5 { fill: #ddedf9;font-weight: bold }
+.terminal-3308769726-r6 { fill: #1e1e1e }
+.terminal-3308769726-r7 { fill: #242f38 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ExampleApp
+ ExampleApp
-
-
-
- automatic scrollbar
-┌──────────────────────────────────────────────────────────────────────────────┐
-│ Column 1 │
-│ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo│
-│▍│
-└──────────────────────────────────────────────────────────────────────────────┘
-no automatic scrollbar
-┌──────────────────────────────────────────────────────────────────────────────┐
-│ Column 1 Column 2 │
-│ Paul Jessica │
-└──────────────────────────────────────────────────────────────────────────────┘
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ automatic scrollbar
+┌──────────────────────────────────────────────────────────────────────────────┐
+│ Column 1 │
+│ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempo│
+│▍│
+└──────────────────────────────────────────────────────────────────────────────┘
+no automatic scrollbar
+┌──────────────────────────────────────────────────────────────────────────────┐
+│ Column 1 Column 2 │
+│ Paul Jessica │
+└──────────────────────────────────────────────────────────────────────────────┘
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_tab_active.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_tab_active.svg
index 0d1ef0520c..10104aa940 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_tab_active.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_tab_active.svg
@@ -19,144 +19,141 @@
font-weight: 700;
}
- .terminal-304540857-matrix {
+ .terminal-3272714694-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-304540857-title {
+ .terminal-3272714694-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-304540857-r1 { fill: #c5c8c6 }
-.terminal-304540857-r2 { fill: #e1e1e1 }
-.terminal-304540857-r3 { fill: #f4005f }
-.terminal-304540857-r4 { fill: #98e024;font-weight: bold }
-.terminal-304540857-r5 { fill: #323232 }
-.terminal-304540857-r6 { fill: #0178d4 }
-.terminal-304540857-r7 { fill: #98e024 }
-.terminal-304540857-r8 { fill: #7ae998 }
-.terminal-304540857-r9 { fill: #4ebf71;font-weight: bold }
-.terminal-304540857-r10 { fill: #008139 }
-.terminal-304540857-r11 { fill: #fea62b;font-weight: bold }
-.terminal-304540857-r12 { fill: #a7a9ab }
-.terminal-304540857-r13 { fill: #e2e3e3 }
-.terminal-304540857-r14 { fill: #4c5055 }
+ .terminal-3272714694-r1 { fill: #e0e0e0 }
+.terminal-3272714694-r2 { fill: #c5c8c6 }
+.terminal-3272714694-r3 { fill: #f4005f }
+.terminal-3272714694-r4 { fill: #98e024 }
+.terminal-3272714694-r5 { fill: #262626 }
+.terminal-3272714694-r6 { fill: #0178d4 }
+.terminal-3272714694-r7 { fill: #7ae998 }
+.terminal-3272714694-r8 { fill: #55c076;font-weight: bold }
+.terminal-3272714694-r9 { fill: #008139 }
+.terminal-3272714694-r10 { fill: #ffa62b;font-weight: bold }
+.terminal-3272714694-r11 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ExampleApp
+ ExampleApp
-
-
-
-
-Parent 1Parent 2
-━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-
-Child 2.1Child 2.2
-━━━━━━━━━━━━━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Button 2.2
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
-
-
-
-
-
-
-
- space Focus button 2.2 ▏^p palette
+
+
+
+ Parent 1Parent 2
+━━━━━━━━━━━━╸━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+Child 2.1Child 2.2
+━━━━━━━━━━━━━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Button 2.2
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ space Focus button 2.2 ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_table.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_table.svg
index eff538f1ce..9a438d682f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_table.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_table.svg
@@ -19,203 +19,203 @@
font-weight: 700;
}
- .terminal-691658502-matrix {
+ .terminal-546274821-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-691658502-title {
+ .terminal-546274821-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-691658502-r1 { fill: #c5c8c6 }
-.terminal-691658502-r2 { fill: #e3e3e3 }
-.terminal-691658502-r3 { fill: #004578 }
-.terminal-691658502-r4 { fill: #e1e1e1 }
-.terminal-691658502-r5 { fill: #632ca6 }
-.terminal-691658502-r6 { fill: #dde6ed;font-weight: bold }
-.terminal-691658502-r7 { fill: #1e1e1e }
-.terminal-691658502-r8 { fill: #14191f }
-.terminal-691658502-r9 { fill: #23568b }
+ .terminal-546274821-r1 { fill: #c5c8c6 }
+.terminal-546274821-r2 { fill: #e0e0e0 }
+.terminal-546274821-r3 { fill: #0178d4 }
+.terminal-546274821-r4 { fill: #632ca6 }
+.terminal-546274821-r5 { fill: #e0e0e0;font-weight: bold }
+.terminal-546274821-r6 { fill: #1e1e1e }
+.terminal-546274821-r7 { fill: #000000 }
+.terminal-546274821-r8 { fill: #121212 }
+.terminal-546274821-r9 { fill: #242f38 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ⭘MyApp
-╭──────────────────╮╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
-│ok ││test │
-│╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍││╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍│
-│││╭─ 0 ────────────────────────────────────────╮╭─ 1 ────────────────────────────────────────╮╭─ 2 ─│
-│││││││││
-││││ Foo Bar Baz ││ Foo Bar Baz ││ Foo │
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ▁▁││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ▁▁││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
-│││╰────────────────────────────────────────────╯╰────────────────────────────────────────────╯╰─────│
-│││▎│
-╰──────────────────╯╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
+
+
+
+ ⭘MyApp
+╭──────────────────╮╭──────────────────────────────────────────────────────────────────────────────────────────────────╮
+│ok ││test │
+│╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍││╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍│
+│││╭─ 0 ────────────────────────────────────────╮╭─ 1 ────────────────────────────────────────╮╭─ 2 ─│
+│││││││││
+││││ Foo Bar Baz ││ Foo Bar Baz ││ Foo │
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ▁▁││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ▁▁││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+││││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCDEFGH 0123456789 IJKLMNOPQRSTUVWXYZ ││ ABCD│
+│││╰────────────────────────────────────────────╯╰────────────────────────────────────────────╯╰─────│
+│││▎│
+╰──────────────────╯╰──────────────────────────────────────────────────────────────────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_width_input.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_width_input.svg
index 4830da7676..f724c40f2f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_width_input.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_auto_width_input.svg
@@ -19,140 +19,136 @@
font-weight: 700;
}
- .terminal-896659546-matrix {
+ .terminal-1403116696-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-896659546-title {
+ .terminal-1403116696-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-896659546-r1 { fill: #c5c8c6 }
-.terminal-896659546-r2 { fill: #e3e3e3 }
-.terminal-896659546-r3 { fill: #1e1e1e }
-.terminal-896659546-r4 { fill: #0178d4 }
-.terminal-896659546-r5 { fill: #e1e1e1 }
-.terminal-896659546-r6 { fill: #e2e2e2 }
-.terminal-896659546-r7 { fill: #e2e3e3 }
-.terminal-896659546-r8 { fill: #4c5055 }
-.terminal-896659546-r9 { fill: #fea62b;font-weight: bold }
-.terminal-896659546-r10 { fill: #a7a9ab }
+ .terminal-1403116696-r1 { fill: #c5c8c6 }
+.terminal-1403116696-r2 { fill: #e0e0e0 }
+.terminal-1403116696-r3 { fill: #121212 }
+.terminal-1403116696-r4 { fill: #0178d4 }
+.terminal-1403116696-r5 { fill: #495259 }
+.terminal-1403116696-r6 { fill: #ffa62b;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- InputWidthAutoApp
+ InputWidthAutoApp
-
-
-
- ⭘InputWidthAutoApp
-▊▔▔▔▔▔▔▔▔▔▔▎
-▊Hello▎
-▊▁▁▁▁▁▁▁▁▁▁▎
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-▏^p palette
+
+
+
+ ⭘InputWidthAutoApp
+▊▔▔▔▔▔▔▔▔▔▔▎
+▊Hello▎
+▊▁▁▁▁▁▁▁▁▁▁▎
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_background_tint.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_background_tint.svg
index e37daad3d7..b092dc62cd 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_background_tint.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_background_tint.svg
@@ -19,134 +19,131 @@
font-weight: 700;
}
- .terminal-3859065499-matrix {
+ .terminal-2260509821-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3859065499-title {
+ .terminal-2260509821-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3859065499-r1 { fill: #e4e4ee }
-.terminal-3859065499-r2 { fill: #c5c8c6 }
-.terminal-3859065499-r3 { fill: #e4e2ec }
-.terminal-3859065499-r4 { fill: #e4e0ea }
-.terminal-3859065499-r5 { fill: #e4dde8 }
+ .terminal-2260509821-r1 { fill: #e0e0e0 }
+.terminal-2260509821-r2 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- BackgroundTintApp
+ BackgroundTintApp
-
+
-
- 0%
-
-
-
-
-
-33%
-
-
-
-
-
-66%
-
-
-
-
-
-100%
-
-
-
-
+
+ 0%
+
+
+
+
+
+33%
+
+
+
+
+
+66%
+
+
+
+
+
+100%
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_big_buttons.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_big_buttons.svg
index 5a76dffcd2..46cb1431fa 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_big_buttons.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_big_buttons.svg
@@ -19,135 +19,134 @@
font-weight: 700;
}
- .terminal-4093147427-matrix {
+ .terminal-504785275-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4093147427-title {
+ .terminal-504785275-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4093147427-r1 { fill: #454a50 }
-.terminal-4093147427-r2 { fill: #e1e1e1 }
-.terminal-4093147427-r3 { fill: #c5c8c6 }
-.terminal-4093147427-r4 { fill: #24292f;font-weight: bold }
-.terminal-4093147427-r5 { fill: #000000 }
-.terminal-4093147427-r6 { fill: #e2e3e3;font-weight: bold }
+ .terminal-504785275-r1 { fill: #2d2d2d }
+.terminal-504785275-r2 { fill: #e0e0e0 }
+.terminal-504785275-r3 { fill: #c5c8c6 }
+.terminal-504785275-r4 { fill: #272727;font-weight: bold }
+.terminal-504785275-r5 { fill: #0d0d0d }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ButtonApp
+ ButtonApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-
-
-
- Hello
-
-
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-
-
- Hello
- World !!
-
-
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+
+
+ Hello
+
+
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+
+ Hello
+ World !!
+
+
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_bind_override.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_bind_override.svg
index a18d750bde..c19241fa39 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_bind_override.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_bind_override.svg
@@ -19,140 +19,138 @@
font-weight: 700;
}
- .terminal-1834988790-matrix {
+ .terminal-1286298759-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1834988790-title {
+ .terminal-1286298759-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1834988790-r1 { fill: #008000 }
-.terminal-1834988790-r2 { fill: #c5c8c6 }
-.terminal-1834988790-r3 { fill: #e1e1e1 }
-.terminal-1834988790-r4 { fill: #1e1e1e }
-.terminal-1834988790-r5 { fill: #262626 }
-.terminal-1834988790-r6 { fill: #e2e2e2 }
-.terminal-1834988790-r7 { fill: #fea62b;font-weight: bold }
-.terminal-1834988790-r8 { fill: #a7a9ab }
-.terminal-1834988790-r9 { fill: #e2e3e3 }
-.terminal-1834988790-r10 { fill: #4c5055 }
+ .terminal-1286298759-r1 { fill: #008000 }
+.terminal-1286298759-r2 { fill: #c5c8c6 }
+.terminal-1286298759-r3 { fill: #e0e0e0 }
+.terminal-1286298759-r4 { fill: #121212 }
+.terminal-1286298759-r5 { fill: #191919 }
+.terminal-1286298759-r6 { fill: #1e1e1e }
+.terminal-1286298759-r7 { fill: #ffa62b;font-weight: bold }
+.terminal-1286298759-r8 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- BindApp
+ BindApp
-
-
-
- ┌──────────────────────────────────────────────────────────────────────────────┐
-│MyWidget│
-││
-││
-└──────────────────────────────────────────────────────────────────────────────┘
-▊▔▔▔▔▔▔▔▔▎
-▊▎
-▊▁▁▁▁▁▁▁▁▎
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- space Bell (Widget) a widget b widget c app ▏^p palette
+
+
+
+ ┌──────────────────────────────────────────────────────────────────────────────┐
+│MyWidget│
+││
+││
+└──────────────────────────────────────────────────────────────────────────────┘
+▊▔▔▔▔▔▔▔▔▎
+▊▎
+▊▁▁▁▁▁▁▁▁▎
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ space Bell (Widget) a widget b widget c app ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_bindings_screen_overrides_show.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_bindings_screen_overrides_show.svg
index c9add5c566..2c5fcd570c 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_bindings_screen_overrides_show.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_bindings_screen_overrides_show.svg
@@ -19,136 +19,134 @@
font-weight: 700;
}
- .terminal-1311978254-matrix {
+ .terminal-2966741613-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1311978254-title {
+ .terminal-2966741613-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1311978254-r1 { fill: #e1e1e1 }
-.terminal-1311978254-r2 { fill: #c5c8c6 }
-.terminal-1311978254-r3 { fill: #fea62b;font-weight: bold }
-.terminal-1311978254-r4 { fill: #a7a9ab }
-.terminal-1311978254-r5 { fill: #e2e3e3 }
-.terminal-1311978254-r6 { fill: #4c5055 }
+ .terminal-2966741613-r1 { fill: #e0e0e0 }
+.terminal-2966741613-r2 { fill: #c5c8c6 }
+.terminal-2966741613-r3 { fill: #ffa62b;font-weight: bold }
+.terminal-2966741613-r4 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HideBindingApp
+ HideBindingApp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- p Binding shown ▏^p palette
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ p Binding shown ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_blur_on_disabled.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_blur_on_disabled.svg
index e4bf18e73c..263ddecee2 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_blur_on_disabled.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_blur_on_disabled.svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-2658976077-matrix {
+ .terminal-938783234-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2658976077-title {
+ .terminal-938783234-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2658976077-r1 { fill: #1e1e1e }
-.terminal-2658976077-r2 { fill: #171717 }
-.terminal-2658976077-r3 { fill: #c5c8c6 }
-.terminal-2658976077-r4 { fill: #a7a7a7 }
-.terminal-2658976077-r5 { fill: #e1e1e1 }
+ .terminal-938783234-r1 { fill: #121212 }
+.terminal-938783234-r2 { fill: #141414 }
+.terminal-938783234-r3 { fill: #c5c8c6 }
+.terminal-938783234-r4 { fill: #a2a2a2 }
+.terminal-938783234-r5 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- BlurApp
+ BlurApp
-
-
-
- ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊foo ▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊foo ▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_border_alpha.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_border_alpha.svg
index 1843e17b1e..3a1dc2017e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_border_alpha.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_border_alpha.svg
@@ -19,137 +19,137 @@
font-weight: 700;
}
- .terminal-29072690-matrix {
+ .terminal-3439428772-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-29072690-title {
+ .terminal-3439428772-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-29072690-r1 { fill: #1e1e1e }
-.terminal-29072690-r2 { fill: #c5c8c6 }
-.terminal-29072690-r3 { fill: #e1e1e1 }
-.terminal-29072690-r4 { fill: #183118 }
-.terminal-29072690-r5 { fill: #124512 }
-.terminal-29072690-r6 { fill: #0c580c }
-.terminal-29072690-r7 { fill: #066c06 }
-.terminal-29072690-r8 { fill: #008000 }
+ .terminal-3439428772-r1 { fill: #121212 }
+.terminal-3439428772-r2 { fill: #c5c8c6 }
+.terminal-3439428772-r3 { fill: #e0e0e0 }
+.terminal-3439428772-r4 { fill: #0e280e }
+.terminal-3439428772-r5 { fill: #0a3e0a }
+.terminal-3439428772-r6 { fill: #075407 }
+.terminal-3439428772-r7 { fill: #036a03 }
+.terminal-3439428772-r8 { fill: #008000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- BorderAlphaApp
+ BorderAlphaApp
-
-
-
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-
-
-
-
+
+
+
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_outline.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_outline.svg
index 5c810d08e7..906fd93f1b 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_outline.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_outline.svg
@@ -19,133 +19,132 @@
font-weight: 700;
}
- .terminal-1229229535-matrix {
+ .terminal-1524924108-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1229229535-title {
+ .terminal-1524924108-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1229229535-r1 { fill: #ffffff }
-.terminal-1229229535-r2 { fill: #e1e1e1 }
-.terminal-1229229535-r3 { fill: #c5c8c6 }
-.terminal-1229229535-r4 { fill: #e2e3e3;font-weight: bold }
+ .terminal-1524924108-r1 { fill: #ffffff }
+.terminal-1524924108-r2 { fill: #e0e0e0 }
+.terminal-1524924108-r3 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ButtonIssue
+ ButtonIssue
-
-
-
- ┌──────────────┐
-│ Test │
-└──────────────┘
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ┌──────────────┐
+│ Test │
+└──────────────┘
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_widths.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_widths.svg
index eabd05e04a..26c05f5ed4 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_widths.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_widths.svg
@@ -19,136 +19,135 @@
font-weight: 700;
}
- .terminal-3701416180-matrix {
+ .terminal-2982546164-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3701416180-title {
+ .terminal-2982546164-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3701416180-r1 { fill: #ff0000 }
-.terminal-3701416180-r2 { fill: #e1e1e1 }
-.terminal-3701416180-r3 { fill: #c5c8c6 }
-.terminal-3701416180-r4 { fill: #454a50 }
-.terminal-3701416180-r5 { fill: #24292f;font-weight: bold }
-.terminal-3701416180-r6 { fill: #000000 }
-.terminal-3701416180-r7 { fill: #e2e3e3;font-weight: bold }
+ .terminal-2982546164-r1 { fill: #ff0000 }
+.terminal-2982546164-r2 { fill: #e0e0e0 }
+.terminal-2982546164-r3 { fill: #c5c8c6 }
+.terminal-2982546164-r4 { fill: #2d2d2d }
+.terminal-2982546164-r5 { fill: #272727;font-weight: bold }
+.terminal-2982546164-r6 { fill: #0d0d0d }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HorizontalWidthAutoApp
+ HorizontalWidthAutoApp
-
-
-
- ┌────────────────────────────┐
-│▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔│
-│ This is a very wide button │
-│▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁│
-└────────────────────────────┘
-┌────────────────────────────────────────────────────────┐
-│▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔│
-│ This is a very wide button This is a very wide button │
-│▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁│
-└────────────────────────────────────────────────────────┘
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ┌────────────────────────────┐
+│▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔│
+│ This is a very wide button │
+│▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁│
+└────────────────────────────┘
+┌────────────────────────────────────────────────────────┐
+│▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔│
+│ This is a very wide button This is a very wide button │
+│▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁│
+└────────────────────────────────────────────────────────┘
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_console_markup.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_console_markup.svg
index c508a18efd..132c462303 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_console_markup.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_console_markup.svg
@@ -19,141 +19,140 @@
font-weight: 700;
}
- .terminal-3060571111-matrix {
+ .terminal-1272216583-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3060571111-title {
+ .terminal-1272216583-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3060571111-r1 { fill: #454a50 }
-.terminal-3060571111-r2 { fill: #e1e1e1 }
-.terminal-3060571111-r3 { fill: #c5c8c6 }
-.terminal-3060571111-r4 { fill: #24292f;font-weight: bold }
-.terminal-3060571111-r5 { fill: #24292f;font-weight: bold;font-style: italic; }
-.terminal-3060571111-r6 { fill: #000000 }
-.terminal-3060571111-r7 { fill: #e2e3e3;font-weight: bold }
-.terminal-3060571111-r8 { fill: #f4005f;font-weight: bold;font-style: italic; }
-.terminal-3060571111-r9 { fill: #303336 }
-.terminal-3060571111-r10 { fill: #a7a7a7;font-weight: bold }
-.terminal-3060571111-r11 { fill: #620909;font-weight: bold;font-style: italic; }
-.terminal-3060571111-r12 { fill: #0f0f0f }
+ .terminal-1272216583-r1 { fill: #2d2d2d }
+.terminal-1272216583-r2 { fill: #e0e0e0 }
+.terminal-1272216583-r3 { fill: #c5c8c6 }
+.terminal-1272216583-r4 { fill: #272727;font-weight: bold }
+.terminal-1272216583-r5 { fill: #272727;font-weight: bold;font-style: italic; }
+.terminal-1272216583-r6 { fill: #0d0d0d }
+.terminal-1272216583-r7 { fill: #f4005f;font-style: italic; }
+.terminal-1272216583-r8 { fill: #1e1e1e }
+.terminal-1272216583-r9 { fill: #a2a2a2 }
+.terminal-1272216583-r10 { fill: #5f0505;font-style: italic; }
+.terminal-1272216583-r11 { fill: #0f0f0f }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ButtonsWithMarkupApp
+ ButtonsWithMarkupApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-Focused Button
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-Blurred Button
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-Disabled Button
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+Focused Button
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+Blurred Button
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+Disabled Button
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_multiline_label.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_multiline_label.svg
index cc5bf41bb9..5c5479962f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_multiline_label.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_button_with_multiline_label.svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-4065186018-matrix {
+ .terminal-1423164176-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4065186018-title {
+ .terminal-1423164176-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4065186018-r1 { fill: #454a50 }
-.terminal-4065186018-r2 { fill: #e1e1e1 }
-.terminal-4065186018-r3 { fill: #c5c8c6 }
-.terminal-4065186018-r4 { fill: #24292f;font-weight: bold }
-.terminal-4065186018-r5 { fill: #000000 }
+ .terminal-1423164176-r1 { fill: #2d2d2d }
+.terminal-1423164176-r2 { fill: #e0e0e0 }
+.terminal-1423164176-r3 { fill: #c5c8c6 }
+.terminal-1423164176-r4 { fill: #272727;font-weight: bold }
+.terminal-1423164176-r5 { fill: #0d0d0d }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ButtonWithMultilineLabelApp
+ ButtonWithMultilineLabelApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Button
- with
- multi-line
- label
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Button
+ with
+ multi-line
+ label
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_buttons_render.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_buttons_render.svg
index 4e3191c0bd..0b04376d4e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_buttons_render.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_buttons_render.svg
@@ -19,162 +19,162 @@
font-weight: 700;
}
- .terminal-1520326498-matrix {
+ .terminal-157291153-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1520326498-title {
+ .terminal-157291153-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1520326498-r1 { fill: #e1e1e1 }
-.terminal-1520326498-r2 { fill: #c5c8c6 }
-.terminal-1520326498-r3 { fill: #e1e1e1;font-weight: bold }
-.terminal-1520326498-r4 { fill: #454a50 }
-.terminal-1520326498-r5 { fill: #303336 }
-.terminal-1520326498-r6 { fill: #24292f;font-weight: bold }
-.terminal-1520326498-r7 { fill: #a7a7a7;font-weight: bold }
-.terminal-1520326498-r8 { fill: #000000 }
-.terminal-1520326498-r9 { fill: #0f0f0f }
-.terminal-1520326498-r10 { fill: #507bb3 }
-.terminal-1520326498-r11 { fill: #364b66 }
-.terminal-1520326498-r12 { fill: #dde6ed;font-weight: bold }
-.terminal-1520326498-r13 { fill: #a5a9ac;font-weight: bold }
-.terminal-1520326498-r14 { fill: #001541 }
-.terminal-1520326498-r15 { fill: #0f192e }
-.terminal-1520326498-r16 { fill: #7ae998 }
-.terminal-1520326498-r17 { fill: #4a8159 }
-.terminal-1520326498-r18 { fill: #0a180e;font-weight: bold }
-.terminal-1520326498-r19 { fill: #0e1510;font-weight: bold }
-.terminal-1520326498-r20 { fill: #008139 }
-.terminal-1520326498-r21 { fill: #0f4e2a }
-.terminal-1520326498-r22 { fill: #ffcf56 }
-.terminal-1520326498-r23 { fill: #8b7439 }
-.terminal-1520326498-r24 { fill: #211505;font-weight: bold }
-.terminal-1520326498-r25 { fill: #19140c;font-weight: bold }
-.terminal-1520326498-r26 { fill: #b86b00 }
-.terminal-1520326498-r27 { fill: #68430f }
-.terminal-1520326498-r28 { fill: #e76580 }
-.terminal-1520326498-r29 { fill: #80404d }
-.terminal-1520326498-r30 { fill: #f5e5e9;font-weight: bold }
-.terminal-1520326498-r31 { fill: #b0a8aa;font-weight: bold }
-.terminal-1520326498-r32 { fill: #780028 }
-.terminal-1520326498-r33 { fill: #4a0f22 }
+ .terminal-157291153-r1 { fill: #e0e0e0 }
+.terminal-157291153-r2 { fill: #c5c8c6 }
+.terminal-157291153-r3 { fill: #e0e0e0;font-weight: bold }
+.terminal-157291153-r4 { fill: #2d2d2d }
+.terminal-157291153-r5 { fill: #1e1e1e }
+.terminal-157291153-r6 { fill: #272727;font-weight: bold }
+.terminal-157291153-r7 { fill: #a2a2a2 }
+.terminal-157291153-r8 { fill: #0d0d0d }
+.terminal-157291153-r9 { fill: #0f0f0f }
+.terminal-157291153-r10 { fill: #6db2ff }
+.terminal-157291153-r11 { fill: #3e6085 }
+.terminal-157291153-r12 { fill: #ddedf9 }
+.terminal-157291153-r13 { fill: #a0a8ae }
+.terminal-157291153-r14 { fill: #004295 }
+.terminal-157291153-r15 { fill: #082951 }
+.terminal-157291153-r16 { fill: #7ae998 }
+.terminal-157291153-r17 { fill: #447b53 }
+.terminal-157291153-r18 { fill: #0a180e }
+.terminal-157291153-r19 { fill: #0a120c }
+.terminal-157291153-r20 { fill: #008139 }
+.terminal-157291153-r21 { fill: #084724 }
+.terminal-157291153-r22 { fill: #ffcf56 }
+.terminal-157291153-r23 { fill: #856e32 }
+.terminal-157291153-r24 { fill: #211505 }
+.terminal-157291153-r25 { fill: #150f08 }
+.terminal-157291153-r26 { fill: #b86b00 }
+.terminal-157291153-r27 { fill: #633d08 }
+.terminal-157291153-r28 { fill: #e76580 }
+.terminal-157291153-r29 { fill: #7a3a47 }
+.terminal-157291153-r30 { fill: #f5e5e9 }
+.terminal-157291153-r31 { fill: #aca4a6 }
+.terminal-157291153-r32 { fill: #780028 }
+.terminal-157291153-r33 { fill: #43081c }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ButtonsApp
+ ButtonsApp
-
-
-
-
-Standard ButtonsDisabled Buttons
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Default Default
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Primary! Primary!
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Success! Success!
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Warning! Warning!
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- Error! Error!
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
+
+
+
+
+Standard ButtonsDisabled Buttons
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Default Default
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Primary! Primary!
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Success! Success!
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Warning! Warning!
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ Error! Error!
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_check_consume_keys.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_check_consume_keys.svg
index 95fffc8f35..c54c85b73f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_check_consume_keys.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_check_consume_keys.svg
@@ -19,142 +19,140 @@
font-weight: 700;
}
- .terminal-1837619731-matrix {
+ .terminal-856343534-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1837619731-title {
+ .terminal-856343534-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1837619731-r1 { fill: #1e1e1e }
-.terminal-1837619731-r2 { fill: #0178d4 }
-.terminal-1837619731-r3 { fill: #c5c8c6 }
-.terminal-1837619731-r4 { fill: #787878 }
-.terminal-1837619731-r5 { fill: #e2e2e2 }
-.terminal-1837619731-r6 { fill: #121212 }
-.terminal-1837619731-r7 { fill: #e1e1e1 }
-.terminal-1837619731-r8 { fill: #262626 }
-.terminal-1837619731-r9 { fill: #e2e3e3 }
-.terminal-1837619731-r10 { fill: #4c5055 }
-.terminal-1837619731-r11 { fill: #fea62b;font-weight: bold }
-.terminal-1837619731-r12 { fill: #a7a9ab }
+ .terminal-856343534-r1 { fill: #121212 }
+.terminal-856343534-r2 { fill: #0178d4 }
+.terminal-856343534-r3 { fill: #c5c8c6 }
+.terminal-856343534-r4 { fill: #797979 }
+.terminal-856343534-r5 { fill: #e0e0e0 }
+.terminal-856343534-r6 { fill: #191919 }
+.terminal-856343534-r7 { fill: #737373 }
+.terminal-856343534-r8 { fill: #1e1e1e }
+.terminal-856343534-r9 { fill: #495259 }
+.terminal-856343534-r10 { fill: #ffa62b;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊First Name▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊Last Name▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▎
-▊▎
-▊▁▁▁▁▁▁▁▁▎
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-▏^p palette
+
+
+
+ ▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊First Name▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊Last Name▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▎
+▊▎
+▊▁▁▁▁▁▁▁▁▎
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_checkbox_example.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_checkbox_example.svg
index 1c7c619a4c..64e0b6f8c1 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_checkbox_example.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_checkbox_example.svg
@@ -19,145 +19,145 @@
font-weight: 700;
}
- .terminal-2974566302-matrix {
+ .terminal-900808757-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2974566302-title {
+ .terminal-900808757-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2974566302-r1 { fill: #e1e1e1 }
-.terminal-2974566302-r2 { fill: #c5c8c6 }
-.terminal-2974566302-r3 { fill: #1e1e1e }
-.terminal-2974566302-r4 { fill: #262626 }
-.terminal-2974566302-r5 { fill: #e2e2e2 }
-.terminal-2974566302-r6 { fill: #4a4a4a }
-.terminal-2974566302-r7 { fill: #2e2e2e;font-weight: bold }
-.terminal-2974566302-r8 { fill: #e3e3e3 }
-.terminal-2974566302-r9 { fill: #e3e3e3;font-weight: bold }
-.terminal-2974566302-r10 { fill: #f4005f }
-.terminal-2974566302-r11 { fill: #4ebf71;font-weight: bold }
-.terminal-2974566302-r12 { fill: #0178d4 }
-.terminal-2974566302-r13 { fill: #14191f }
-.terminal-2974566302-r14 { fill: #5d5d5d }
-.terminal-2974566302-r15 { fill: #e3e3e3;text-decoration: underline; }
+ .terminal-900808757-r1 { fill: #e0e0e0 }
+.terminal-900808757-r2 { fill: #c5c8c6 }
+.terminal-900808757-r3 { fill: #121212 }
+.terminal-900808757-r4 { fill: #1b1b1b }
+.terminal-900808757-r5 { fill: #191919 }
+.terminal-900808757-r6 { fill: #3b3b3b }
+.terminal-900808757-r7 { fill: #0d0d0d;font-weight: bold }
+.terminal-900808757-r8 { fill: #e0e0e0;font-weight: bold }
+.terminal-900808757-r9 { fill: #f4005f }
+.terminal-900808757-r10 { fill: #242f38 }
+.terminal-900808757-r11 { fill: #4ebf71;font-weight: bold }
+.terminal-900808757-r12 { fill: #0178d4 }
+.terminal-900808757-r13 { fill: #000000 }
+.terminal-900808757-r14 { fill: #343f49 }
+.terminal-900808757-r15 { fill: #ddedf9;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CheckboxApp
+ CheckboxApp
-
-
-
-
-
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌ Arrakis 😓▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌ Caladan▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌ Chusuk▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌Giedi Prime▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌Ginaz▎
-▊▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎
-▊▐X▌ Grumman▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎▃▃
-▊▐X▌Kaitain▎
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+
+
+
+
+
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌ Arrakis 😓▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌ Caladan▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌ Chusuk▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌Giedi Prime▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌Ginaz▎
+▊▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎
+▊▐X▌ Grumman▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▎▃▃
+▊▐X▌Kaitain▎
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▎
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_collapsed.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_collapsed.svg
index b56de7bb0b..6512d6a7b5 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_collapsed.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_collapsed.svg
@@ -19,139 +19,136 @@
font-weight: 700;
}
- .terminal-1462435144-matrix {
+ .terminal-4000973141-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1462435144-title {
+ .terminal-4000973141-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1462435144-r1 { fill: #121212 }
-.terminal-1462435144-r2 { fill: #c5c8c6 }
-.terminal-1462435144-r3 { fill: #ddedf9 }
-.terminal-1462435144-r4 { fill: #e2e2e2 }
-.terminal-1462435144-r5 { fill: #e1e1e1 }
-.terminal-1462435144-r6 { fill: #fea62b;font-weight: bold }
-.terminal-1462435144-r7 { fill: #a7a9ab }
-.terminal-1462435144-r8 { fill: #e2e3e3 }
-.terminal-1462435144-r9 { fill: #4c5055 }
+ .terminal-4000973141-r1 { fill: #121212 }
+.terminal-4000973141-r2 { fill: #c5c8c6 }
+.terminal-4000973141-r3 { fill: #ddedf9;font-weight: bold }
+.terminal-4000973141-r4 { fill: #e0e0e0 }
+.terminal-4000973141-r5 { fill: #ffa62b;font-weight: bold }
+.terminal-4000973141-r6 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CollapsibleApp
+ CollapsibleApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▶ Leto
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▶ Jessica
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▶ Paul
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- c Collapse All e Expand All ▏^p palette
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▶ Leto
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▶ Jessica
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▶ Paul
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ c Collapse All e Expand All ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_custom_symbol.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_custom_symbol.svg
index 12ecbf8a5f..e0134ab440 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_custom_symbol.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_custom_symbol.svg
@@ -19,134 +19,133 @@
font-weight: 700;
}
- .terminal-693385943-matrix {
+ .terminal-3000680649-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-693385943-title {
+ .terminal-3000680649-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-693385943-r1 { fill: #121212 }
-.terminal-693385943-r2 { fill: #c5c8c6 }
-.terminal-693385943-r3 { fill: #ddedf9 }
-.terminal-693385943-r4 { fill: #e2e2e2 }
-.terminal-693385943-r5 { fill: #e1e1e1 }
+ .terminal-3000680649-r1 { fill: #121212 }
+.terminal-3000680649-r2 { fill: #c5c8c6 }
+.terminal-3000680649-r3 { fill: #ddedf9;font-weight: bold }
+.terminal-3000680649-r4 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CollapsibleApp
+ CollapsibleApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
->>> Togglev Toggle
-
-Hello, world.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+>>> Togglev Toggle
+
+Hello, world.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_expanded.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_expanded.svg
index 7051555a72..d51b5e5048 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_expanded.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_expanded.svg
@@ -19,141 +19,137 @@
font-weight: 700;
}
- .terminal-3191182536-matrix {
+ .terminal-2759809645-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3191182536-title {
+ .terminal-2759809645-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3191182536-r1 { fill: #c5c8c6 }
-.terminal-3191182536-r2 { fill: #e1e1e1 }
-.terminal-3191182536-r3 { fill: #121212 }
-.terminal-3191182536-r4 { fill: #e2e2e2 }
-.terminal-3191182536-r5 { fill: #23568b }
-.terminal-3191182536-r6 { fill: #1e1e1e }
-.terminal-3191182536-r7 { fill: #4ebf71;font-weight: bold }
-.terminal-3191182536-r8 { fill: #fea62b;font-weight: bold }
-.terminal-3191182536-r9 { fill: #a7a9ab }
-.terminal-3191182536-r10 { fill: #e2e3e3 }
-.terminal-3191182536-r11 { fill: #4c5055 }
+ .terminal-2759809645-r1 { fill: #c5c8c6 }
+.terminal-2759809645-r2 { fill: #e0e0e0 }
+.terminal-2759809645-r3 { fill: #121212 }
+.terminal-2759809645-r4 { fill: #242f38 }
+.terminal-2759809645-r5 { fill: #0178d4;font-weight: bold }
+.terminal-2759809645-r6 { fill: #ffa62b;font-weight: bold }
+.terminal-2759809645-r7 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CollapsibleApp
+ CollapsibleApp
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▼ Jessica
-
-▂▂
-
-Lady Jessica
-
- Bene Gesserit and concubine of Leto, and mother of Paul and Alia.
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▼ Paul
-
-
-
-Paul Atreides
-
- Son of Leto and Jessica.
-
-
-
- c Collapse All e Expand All ▏^p palette
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▼ Jessica
+
+▂▂
+
+Lady Jessica
+
+Bene Gesserit and concubine of Leto, and mother of Paul and Alia.
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▼ Paul
+
+
+
+Paul Atreides
+
+Son of Leto and Jessica.
+
+
+
+ c Collapse All e Expand All ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_nested.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_nested.svg
index 2a4926be45..f9782b7b28 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_nested.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_nested.svg
@@ -19,135 +19,133 @@
font-weight: 700;
}
- .terminal-2781425159-matrix {
+ .terminal-2534034254-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2781425159-title {
+ .terminal-2534034254-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2781425159-r1 { fill: #121212 }
-.terminal-2781425159-r2 { fill: #c5c8c6 }
-.terminal-2781425159-r3 { fill: #ddedf9 }
-.terminal-2781425159-r4 { fill: #e2e2e2 }
-.terminal-2781425159-r5 { fill: #e3e3e3 }
-.terminal-2781425159-r6 { fill: #e1e1e1 }
+ .terminal-2534034254-r1 { fill: #121212 }
+.terminal-2534034254-r2 { fill: #c5c8c6 }
+.terminal-2534034254-r3 { fill: #ddedf9;font-weight: bold }
+.terminal-2534034254-r4 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CollapsibleApp
+ CollapsibleApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▼ Toggle
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▶ Toggle
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▼ Toggle
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▶ Toggle
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_render.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_render.svg
index 4e6d5e263e..0fb19ac7e8 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_render.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_collapsible_render.svg
@@ -19,140 +19,137 @@
font-weight: 700;
}
- .terminal-4256359261-matrix {
+ .terminal-1109546557-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4256359261-title {
+ .terminal-1109546557-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4256359261-r1 { fill: #121212 }
-.terminal-4256359261-r2 { fill: #c5c8c6 }
-.terminal-4256359261-r3 { fill: #ddedf9 }
-.terminal-4256359261-r4 { fill: #e2e2e2 }
-.terminal-4256359261-r5 { fill: #4ebf71;font-weight: bold }
-.terminal-4256359261-r6 { fill: #e1e1e1 }
-.terminal-4256359261-r7 { fill: #fea62b;font-weight: bold }
-.terminal-4256359261-r8 { fill: #a7a9ab }
-.terminal-4256359261-r9 { fill: #e2e3e3 }
-.terminal-4256359261-r10 { fill: #4c5055 }
+ .terminal-1109546557-r1 { fill: #121212 }
+.terminal-1109546557-r2 { fill: #c5c8c6 }
+.terminal-1109546557-r3 { fill: #ddedf9;font-weight: bold }
+.terminal-1109546557-r4 { fill: #e0e0e0 }
+.terminal-1109546557-r5 { fill: #0178d4;font-weight: bold }
+.terminal-1109546557-r6 { fill: #ffa62b;font-weight: bold }
+.terminal-1109546557-r7 { fill: #495259 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CollapsibleApp
+ CollapsibleApp
-
-
-
- ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▼ Leto
-
-# Duke Leto I Atreides
-
-Head of House Atreides.
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▼ Jessica
-
-
-
-Lady Jessica
-
- Bene Gesserit and concubine of Leto, and mother of Paul and Alia.
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▶ Paul
-
-
-
- c Collapse All e Expand All ▏^p palette
+
+
+
+ ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▼ Leto
+
+# Duke Leto I Atreides
+
+Head of House Atreides.
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▼ Jessica
+
+
+
+Lady Jessica
+
+Bene Gesserit and concubine of Leto, and mother of Paul and Alia.
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▶ Paul
+
+
+
+ c Collapse All e Expand All ▏^p palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_columns_height.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_columns_height.svg
index c165ee6fe4..01d33e3341 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_columns_height.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_columns_height.svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-4204346594-matrix {
+ .terminal-673638422-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4204346594-title {
+ .terminal-673638422-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4204346594-r1 { fill: #ff0000 }
-.terminal-4204346594-r2 { fill: #c5c8c6 }
-.terminal-4204346594-r3 { fill: #008000 }
-.terminal-4204346594-r4 { fill: #e1e1e1 }
+ .terminal-673638422-r1 { fill: #ff0000 }
+.terminal-673638422-r2 { fill: #c5c8c6 }
+.terminal-673638422-r3 { fill: #008000 }
+.terminal-673638422-r4 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HeightApp
+ HeightApp
-
-
-
- ┌──────────────────────────────────────────────────────────────────────────────┐
-│┌────────────────────┐┌────────────────┐┌──────────────────────┐│
-││As tall as container││This has default││I have a static height││
-││││height││││
-││││but a││││
-││││few lines││││
-│││└────────────────┘│││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-││││││
-│└────────────────────┘└──────────────────────┘│
-└──────────────────────────────────────────────────────────────────────────────┘
-
-
-
-
-
+
+
+
+ ┌──────────────────────────────────────────────────────────────────────────────┐
+│┌────────────────────┐┌────────────────┐┌──────────────────────┐│
+││As tall as container││This has default││I have a static height││
+││││height││││
+││││but a││││
+││││few lines││││
+│││└────────────────┘│││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+││││││
+│└────────────────────┘└──────────────────────┘│
+└──────────────────────────────────────────────────────────────────────────────┘
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette.svg
index 95166b66ea..0815e57e3b 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette.svg
@@ -19,138 +19,137 @@
font-weight: 700;
}
- .terminal-3948438059-matrix {
+ .terminal-375849393-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3948438059-title {
+ .terminal-375849393-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3948438059-r1 { fill: #646464 }
-.terminal-3948438059-r2 { fill: #c5c8c6 }
-.terminal-3948438059-r3 { fill: #004578 }
-.terminal-3948438059-r4 { fill: #dfe1e2 }
-.terminal-3948438059-r5 { fill: #00ff00 }
-.terminal-3948438059-r6 { fill: #000000 }
-.terminal-3948438059-r7 { fill: #1e1e1e }
-.terminal-3948438059-r8 { fill: #dfe1e2;font-weight: bold }
-.terminal-3948438059-r9 { fill: #fea62b;font-weight: bold }
+ .terminal-375849393-r1 { fill: #646464 }
+.terminal-375849393-r2 { fill: #c5c8c6 }
+.terminal-375849393-r3 { fill: #0178d4 }
+.terminal-375849393-r4 { fill: #e0e0e0 }
+.terminal-375849393-r5 { fill: #00ff00 }
+.terminal-375849393-r6 { fill: #000000 }
+.terminal-375849393-r7 { fill: #121212 }
+.terminal-375849393-r8 { fill: #fea62b;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CommandPaletteApp
+ CommandPaletteApp
-
-
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-
-🔎A
-
-
- This is a test of this code 9
- This is a test of this code 8
- This is a test of this code 7
- This is a test of this code 6
- This is a test of this code 5
- This is a test of this code 4
- This is a test of this code 3
- This is a test of this code 2
- This is a test of this code 1
- This is a test of this code 0
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
+
+
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+🔎A
+
+
+ This is a test of this code 9
+ This is a test of this code 8
+ This is a test of this code 7
+ This is a test of this code 6
+ This is a test of this code 5
+ This is a test of this code 4
+ This is a test of this code 3
+ This is a test of this code 2
+ This is a test of this code 1
+ This is a test of this code 0
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_discovery.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_discovery.svg
index 3727fb2fb6..85cbac8aef 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_discovery.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_discovery.svg
@@ -19,138 +19,137 @@
font-weight: 700;
}
- .terminal-3950137090-matrix {
+ .terminal-3680050477-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3950137090-title {
+ .terminal-3680050477-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3950137090-r1 { fill: #646464 }
-.terminal-3950137090-r2 { fill: #c5c8c6 }
-.terminal-3950137090-r3 { fill: #004578 }
-.terminal-3950137090-r4 { fill: #dfe1e2 }
-.terminal-3950137090-r5 { fill: #00ff00 }
-.terminal-3950137090-r6 { fill: #000000 }
-.terminal-3950137090-r7 { fill: #1e1e1e }
-.terminal-3950137090-r8 { fill: #697278 }
-.terminal-3950137090-r9 { fill: #dfe1e2;font-weight: bold }
+ .terminal-3680050477-r1 { fill: #646464 }
+.terminal-3680050477-r2 { fill: #c5c8c6 }
+.terminal-3680050477-r3 { fill: #0178d4 }
+.terminal-3680050477-r4 { fill: #e0e0e0 }
+.terminal-3680050477-r5 { fill: #00ff00 }
+.terminal-3680050477-r6 { fill: #000000 }
+.terminal-3680050477-r7 { fill: #121212 }
+.terminal-3680050477-r8 { fill: #6d7479 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CommandPaletteApp
+ CommandPaletteApp
-
-
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-
-🔎Search for commands…
-
-
- This is a test of this code 0
- This is a test of this code 1
- This is a test of this code 2
- This is a test of this code 3
- This is a test of this code 4
- This is a test of this code 5
- This is a test of this code 6
- This is a test of this code 7
- This is a test of this code 8
- This is a test of this code 9
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-
-
-
-
+
+
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+🔎Search for commands…
+
+
+ This is a test of this code 0
+ This is a test of this code 1
+ This is a test of this code 2
+ This is a test of this code 3
+ This is a test of this code 4
+ This is a test of this code 5
+ This is a test of this code 6
+ This is a test of this code 7
+ This is a test of this code 8
+ This is a test of this code 9
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape.svg
index 7b427fa736..8965c69f00 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape.svg
@@ -19,131 +19,131 @@
font-weight: 700;
}
- .terminal-1600172249-matrix {
+ .terminal-67740577-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1600172249-title {
+ .terminal-67740577-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1600172249-r1 { fill: #e1e1e1 }
-.terminal-1600172249-r2 { fill: #c5c8c6 }
+ .terminal-67740577-r1 { fill: #e0e0e0 }
+.terminal-67740577-r2 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CPApp
+ CPApp
-
-
-
- Command palette test app
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Command palette test app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape_no_results.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape_no_results.svg
index 7b427fa736..8965c69f00 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape_no_results.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_dismiss_escape_no_results.svg
@@ -19,131 +19,131 @@
font-weight: 700;
}
- .terminal-1600172249-matrix {
+ .terminal-67740577-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1600172249-title {
+ .terminal-67740577-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1600172249-r1 { fill: #e1e1e1 }
-.terminal-1600172249-r2 { fill: #c5c8c6 }
+ .terminal-67740577-r1 { fill: #e0e0e0 }
+.terminal-67740577-r2 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- CPApp
+ CPApp
-
-
-
- Command palette test app
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Command palette test app
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_key_change.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_key_change.svg
index 9da9db84a4..d55638ed44 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_key_change.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_command_palette_key_change.svg
@@ -19,136 +19,134 @@
font-weight: 700;
}
- .terminal-229419081-matrix {
+ .terminal-4132084552-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-229419081-title {
+ .terminal-4132084552-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-229419081-r1 { fill: #e1e1e1 }
-.terminal-229419081-r2 { fill: #c5c8c6 }
-.terminal-229419081-r3 { fill: #e2e3e3 }
-.terminal-229419081-r4 { fill: #4c5055 }
-.terminal-229419081-r5 { fill: #fea62b;font-weight: bold }
-.terminal-229419081-r6 { fill: #a7a9ab }
+ .terminal-4132084552-r1 { fill: #e0e0e0 }
+.terminal-4132084552-r2 { fill: #c5c8c6 }
+.terminal-4132084552-r3 { fill: #495259 }
+.terminal-4132084552-r4 { fill: #ffa62b;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- NewPaletteBindingApp
+ NewPaletteBindingApp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-▏ctrl+\ palette
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+▏ctrl+\ palette
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_initial.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_initial.svg
index 4d9cce465e..379e15097f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_initial.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_initial.svg
@@ -19,140 +19,136 @@
font-weight: 700;
}
- .terminal-3862623007-matrix {
+ .terminal-2952163013-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3862623007-title {
+ .terminal-2952163013-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3862623007-r1 { fill: #c5c8c6 }
-.terminal-3862623007-r2 { fill: #e1e1e1 }
-.terminal-3862623007-r3 { fill: #454a50 }
-.terminal-3862623007-r4 { fill: #24292f;font-weight: bold }
-.terminal-3862623007-r5 { fill: #e2e3e3;font-weight: bold }
-.terminal-3862623007-r6 { fill: #000000 }
-.terminal-3862623007-r7 { fill: #004578 }
-.terminal-3862623007-r8 { fill: #dde6ed;font-weight: bold }
-.terminal-3862623007-r9 { fill: #dde6ed }
-.terminal-3862623007-r10 { fill: #211505 }
-.terminal-3862623007-r11 { fill: #e2e3e3 }
+ .terminal-2952163013-r1 { fill: #c5c8c6 }
+.terminal-2952163013-r2 { fill: #e0e0e0 }
+.terminal-2952163013-r3 { fill: #2d2d2d }
+.terminal-2952163013-r4 { fill: #272727;font-weight: bold }
+.terminal-2952163013-r5 { fill: #0d0d0d }
+.terminal-2952163013-r6 { fill: #0178d4 }
+.terminal-2952163013-r7 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ContentSwitcherApp
+ ContentSwitcherApp
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- DataTable Markdown
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-╭────────────────────────────────────────────────────────────────────╮
-│ Book Year │
-│ Dune 1965 │
-│ Dune Messiah 1969 │
-│ Children of Dune 1976 │
-│ God Emperor of Dune 1981 │
-│ Heretics of Dune 1984 │
-│ Chapterhouse: Dune 1985 │
-││
-││
-││
-││
-││
-││
-││
-││
-││
-││
-╰────────────────────────────────────────────────────────────────────╯
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ DataTable Markdown
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+╭────────────────────────────────────────────────────────────────────╮
+│ Book Year │
+│ Dune 1965 │
+│ Dune Messiah 1969 │
+│ Children of Dune 1976 │
+│ God Emperor of Dune 1981 │
+│ Heretics of Dune 1984 │
+│ Chapterhouse: Dune 1985 │
+││
+││
+││
+││
+││
+││
+││
+││
+││
+││
+╰────────────────────────────────────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_switch.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_switch.svg
index 72d171cfca..c973729295 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_switch.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_content_switcher_example_switch.svg
@@ -19,243 +19,242 @@
font-weight: 700;
}
- .terminal-337890275-matrix {
+ .terminal-4173401871-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-337890275-title {
+ .terminal-4173401871-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-337890275-r1 { fill: #c5c8c6 }
-.terminal-337890275-r2 { fill: #e1e1e1 }
-.terminal-337890275-r3 { fill: #454a50 }
-.terminal-337890275-r4 { fill: #e2e3e3;font-weight: bold }
-.terminal-337890275-r5 { fill: #24292f;font-weight: bold }
-.terminal-337890275-r6 { fill: #000000 }
-.terminal-337890275-r7 { fill: #004578 }
-.terminal-337890275-r8 { fill: #e2e3e3 }
-.terminal-337890275-r9 { fill: #4ebf71;font-weight: bold }
-.terminal-337890275-r10 { fill: #ffff00;text-decoration: underline; }
+ .terminal-4173401871-r1 { fill: #c5c8c6 }
+.terminal-4173401871-r2 { fill: #e0e0e0 }
+.terminal-4173401871-r3 { fill: #2d2d2d }
+.terminal-4173401871-r4 { fill: #272727;font-weight: bold }
+.terminal-4173401871-r5 { fill: #0d0d0d }
+.terminal-4173401871-r6 { fill: #0178d4 }
+.terminal-4173401871-r7 { fill: #0178d4;font-weight: bold }
+.terminal-4173401871-r8 { fill: #ffff00;text-decoration: underline; }
+.terminal-4173401871-r9 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ContentSwitcherApp
+ ContentSwitcherApp
-
-
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
- DataTable Markdown
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-╭─────────────────────────────────────────╮
-││
-││
-│Three Flavours Cornetto│
-││
-│ The Three Flavours Cornetto trilogy │
-│ is an anthology series of British │
-│ comedic genre films directed by Edgar │
-│ Wright.│
-││
-││
-│Shaun of the Dead│
-││
-││
-│UK Release │
-│Flavour Date Director │
-│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
-│ Strawberry 2004-04-09 Edgar │
-│ Wright │
-││
-││
-││
-│Hot Fuzz│
-││
-││
-│UK Release │
-│Flavour Date Director │
-│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
-│ Classico 2007-02-17 Edgar Wright │
-││
-││
-││
-│The World's End│
-││
-││
-│UK Release │
-│FlavourDate Director │
-│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
-│ Mint 2013-07-19 Edgar Wright │
-││
-││
-││
-││
-││
-╰─────────────────────────────────────────╯
+
+
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+ DataTable Markdown
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+╭─────────────────────────────────────────╮
+││
+││
+│Three Flavours Cornetto│
+││
+│The Three Flavours Cornetto trilogy │
+│is an anthology series of British │
+│comedic genre films directed by Edgar│
+│Wright.│
+││
+││
+│Shaun of the Dead│
+││
+││
+│UK Release │
+│Flavour Date Director │
+│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
+│ Strawberry 2004-04-09 Edgar │
+│ Wright │
+││
+││
+││
+│Hot Fuzz│
+││
+││
+│UK Release │
+│Flavour Date Director │
+│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
+│ Classico 2007-02-17 Edgar Wright │
+││
+││
+││
+│The World's End│
+││
+││
+│UK Release │
+│FlavourDate Director │
+│ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ │
+│ Mint 2013-07-19 Edgar Wright │
+││
+││
+││
+││
+││
+╰─────────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading.svg
index f5d367467f..361846e7a4 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading.svg
@@ -19,131 +19,131 @@
font-weight: 700;
}
- .terminal-3958682080-matrix {
+ .terminal-208512168-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3958682080-title {
+ .terminal-208512168-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3958682080-r1 { fill: #e1e1e1 }
-.terminal-3958682080-r2 { fill: #c5c8c6 }
+ .terminal-208512168-r1 { fill: #e0e0e0 }
+.terminal-208512168-r2 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HotReloadingApp
+ HotReloadingApp
-
-
-
- Hello, world!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Hello, world!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading_on_screen.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading_on_screen.svg
index f5d367467f..361846e7a4 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading_on_screen.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_hot_reloading_on_screen.svg
@@ -19,131 +19,131 @@
font-weight: 700;
}
- .terminal-3958682080-matrix {
+ .terminal-208512168-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3958682080-title {
+ .terminal-208512168-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3958682080-r1 { fill: #e1e1e1 }
-.terminal-3958682080-r2 { fill: #c5c8c6 }
+ .terminal-208512168-r1 { fill: #e0e0e0 }
+.terminal-208512168-r2 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HotReloadingApp
+ HotReloadingApp
-
-
-
- Hello, world!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Hello, world!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align.py].svg
index 1d9dbc5109..4dcc612d5c 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-4107518032-matrix {
+ .terminal-3866865046-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4107518032-title {
+ .terminal-3866865046-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4107518032-r1 { fill: #e1e1e1 }
-.terminal-4107518032-r2 { fill: #c5c8c6 }
-.terminal-4107518032-r3 { fill: #ffffff }
-.terminal-4107518032-r4 { fill: #e5f2e5 }
-.terminal-4107518032-r5 { fill: #e5f2e5;font-weight: bold }
+ .terminal-3866865046-r1 { fill: #e0e0e0 }
+.terminal-3866865046-r2 { fill: #c5c8c6 }
+.terminal-3866865046-r3 { fill: #ffffff }
+.terminal-3866865046-r4 { fill: #e5f2e5 }
+.terminal-3866865046-r5 { fill: #e5f2e5;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AlignApp
+ AlignApp
-
-
-
-
-
-
-
-
-
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┃Vertical alignment with Textual┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃
-┃Take note, browsers.┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┃Vertical alignment with Textual┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃
+┃Take note, browsers.┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align_all.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align_all.py].svg
index 42dcd43a0f..710fe5d178 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align_all.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[align_all.py].svg
@@ -19,135 +19,133 @@
font-weight: 700;
}
- .terminal-800662067-matrix {
+ .terminal-3624294643-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-800662067-title {
+ .terminal-3624294643-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-800662067-r1 { fill: #808080 }
-.terminal-800662067-r2 { fill: #e1e1e1 }
-.terminal-800662067-r3 { fill: #c5c8c6 }
-.terminal-800662067-r4 { fill: #ddedf9 }
-.terminal-800662067-r5 { fill: #e2e2e2 }
+ .terminal-3624294643-r1 { fill: #808080 }
+.terminal-3624294643-r2 { fill: #e0e0e0 }
+.terminal-3624294643-r3 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AlignAllApp
+ AlignAllApp
-
-
-
- ┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
-│left top││center top││right top│
-││││││
-││││││
-││││││
-││││││
-└────────────────────────┘└────────────────────────┘└────────────────────────┘
-
-┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
-││││││
-││││││
-│left middle││center middle││right middle│
-││││││
-││││││
-└────────────────────────┘└────────────────────────┘└────────────────────────┘
-
-┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
-││││││
-││││││
-││││││
-││││││
-││││││
-│left bottom││center bottom││right bottom│
-└────────────────────────┘└────────────────────────┘└────────────────────────┘
+
+
+
+ ┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
+│left top││center top││right top│
+││││││
+││││││
+││││││
+││││││
+└────────────────────────┘└────────────────────────┘└────────────────────────┘
+
+┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
+││││││
+││││││
+│left middle││center middle││right middle│
+││││││
+││││││
+└────────────────────────┘└────────────────────────┘└────────────────────────┘
+
+┌────────────────────────┐┌────────────────────────┐┌────────────────────────┐
+││││││
+││││││
+││││││
+││││││
+││││││
+│left bottom││center bottom││right bottom│
+└────────────────────────┘└────────────────────────┘└────────────────────────┘
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[background_tint.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[background_tint.py].svg
index 0617ea714b..de24cf7c2f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[background_tint.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[background_tint.py].svg
@@ -1,4 +1,4 @@
-
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[display.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[display.py].svg
index 5f5d0ed5d8..fc4c0aa00c 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[display.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[display.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-2110623858-matrix {
+ .terminal-2506131462-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2110623858-title {
+ .terminal-2506131462-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2110623858-r1 { fill: #0000ff }
-.terminal-2110623858-r2 { fill: #c5c8c6 }
-.terminal-2110623858-r3 { fill: #ddeedd }
+ .terminal-2506131462-r1 { fill: #0000ff }
+.terminal-2506131462-r2 { fill: #c5c8c6 }
+.terminal-2506131462-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- DisplayApp
+ DisplayApp
-
+
-
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃Widget 1┃
-┃┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃Widget 3┃
-┃┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃Widget 1┃
+┃┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃Widget 3┃
+┃┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[dock_all.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[dock_all.py].svg
index 8ecd031cb8..d70f5742a1 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[dock_all.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[dock_all.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-766040431-matrix {
+ .terminal-4231440271-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-766040431-title {
+ .terminal-4231440271-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-766040431-r1 { fill: #e1e1e1 }
-.terminal-766040431-r2 { fill: #c5c8c6 }
-.terminal-766040431-r3 { fill: #ffffff }
+ .terminal-4231440271-r1 { fill: #e0e0e0 }
+.terminal-4231440271-r2 { fill: #c5c8c6 }
+.terminal-4231440271-r3 { fill: #ffffff }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- DockAllApp
+ DockAllApp
-
-
-
-
-
-
-╭──────────────────────────────────────────────────────────╮
-│ top │
-││
-││
-││
-││
-││
-││
-│left right│
-││
-││
-││
-││
-││
-││
-││
-│ bottom │
-╰──────────────────────────────────────────────────────────╯
-
-
+
+
+
+
+
+
+╭──────────────────────────────────────────────────────────╮
+│ top │
+││
+││
+││
+││
+││
+││
+│left right│
+││
+││
+││
+││
+││
+││
+││
+│ bottom │
+╰──────────────────────────────────────────────────────────╯
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid.py].svg
index 4791efebd1..eb8e0cc51d 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3791676016-matrix {
+ .terminal-2213235336-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3791676016-title {
+ .terminal-2213235336-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3791676016-r1 { fill: #c5c8c6 }
-.terminal-3791676016-r2 { fill: #e1e1e1 }
-.terminal-3791676016-r3 { fill: #731077 }
-.terminal-3791676016-r4 { fill: #161c1d }
+ .terminal-2213235336-r1 { fill: #c5c8c6 }
+.terminal-2213235336-r2 { fill: #e0e0e0 }
+.terminal-2213235336-r3 { fill: #660066 }
+.terminal-2213235336-r4 { fill: #000000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- GridApp
+ GridApp
-
-
-
-
-Grid cell 1Grid cell 2
-
-row-span: 3;
-column-span: 2;
-
-
-Grid cell 3
-
-
-
-
-
-Grid cell 4
-
-
-
-
-
-Grid cell 5Grid cell 6Grid cell 7
-
-
-
+
+
+
+
+Grid cell 1Grid cell 2
+
+row-span: 3;
+column-span: 2;
+
+
+Grid cell 3
+
+
+
+
+
+Grid cell 4
+
+
+
+
+
+Grid cell 5Grid cell 6Grid cell 7
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_columns.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_columns.py].svg
index c8f40e989a..99b1ca284a 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_columns.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_columns.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3072634976-matrix {
+ .terminal-735522680-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3072634976-title {
+ .terminal-735522680-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3072634976-r1 { fill: #ffffff }
-.terminal-3072634976-r2 { fill: #c5c8c6 }
-.terminal-3072634976-r3 { fill: #e1e1e1 }
+ .terminal-735522680-r1 { fill: #ffffff }
+.terminal-735522680-r2 { fill: #c5c8c6 }
+.terminal-735522680-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ╭──────────╮╭──────────────╮╭──────────────────────╮╭──────────╮╭──────────────╮
-│1fr││width = 16││2fr││1fr││width = 16│
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-╰──────────╯╰──────────────╯╰──────────────────────╯╰──────────╯╰──────────────╯
-╭──────────╮╭──────────────╮╭──────────────────────╮╭──────────╮╭──────────────╮
-│1fr││width = 16││2fr││1fr││width = 16│
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-││││││││││
-╰──────────╯╰──────────────╯╰──────────────────────╯╰──────────╯╰──────────────╯
+
+
+
+ ╭──────────╮╭──────────────╮╭──────────────────────╮╭──────────╮╭──────────────╮
+│1fr││width = 16││2fr││1fr││width = 16│
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+╰──────────╯╰──────────────╯╰──────────────────────╯╰──────────╯╰──────────────╯
+╭──────────╮╭──────────────╮╭──────────────────────╮╭──────────╮╭──────────────╮
+│1fr││width = 16││2fr││1fr││width = 16│
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+││││││││││
+╰──────────╯╰──────────────╯╰──────────────────────╯╰──────────╯╰──────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_gutter.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_gutter.py].svg
index 46a3f0fa38..6ff1a8a182 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_gutter.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_gutter.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3574968865-matrix {
+ .terminal-1108503223-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3574968865-title {
+ .terminal-1108503223-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3574968865-r1 { fill: #ffffff }
-.terminal-3574968865-r2 { fill: #e1e1e1 }
-.terminal-3574968865-r3 { fill: #c5c8c6 }
+ .terminal-1108503223-r1 { fill: #ffffff }
+.terminal-1108503223-r2 { fill: #e0e0e0 }
+.terminal-1108503223-r3 { fill: #c5c8c6 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ╭─────────────────────────────────────╮╭─────────────────────────────────────╮
-││││
-│1││2│
-││││
-╰─────────────────────────────────────╯╰─────────────────────────────────────╯
-
-╭─────────────────────────────────────╮╭─────────────────────────────────────╮
-││││
-│3││4│
-││││
-╰─────────────────────────────────────╯╰─────────────────────────────────────╯
-
-╭─────────────────────────────────────╮╭─────────────────────────────────────╮
-││││
-│5││6│
-││││
-╰─────────────────────────────────────╯╰─────────────────────────────────────╯
-
-╭─────────────────────────────────────╮╭─────────────────────────────────────╮
-││││
-│7││8│
-││││
-││││
-╰─────────────────────────────────────╯╰─────────────────────────────────────╯
+
+
+
+ ╭─────────────────────────────────────╮╭─────────────────────────────────────╮
+││││
+│1││2│
+││││
+╰─────────────────────────────────────╯╰─────────────────────────────────────╯
+
+╭─────────────────────────────────────╮╭─────────────────────────────────────╮
+││││
+│3││4│
+││││
+╰─────────────────────────────────────╯╰─────────────────────────────────────╯
+
+╭─────────────────────────────────────╮╭─────────────────────────────────────╮
+││││
+│5││6│
+││││
+╰─────────────────────────────────────╯╰─────────────────────────────────────╯
+
+╭─────────────────────────────────────╮╭─────────────────────────────────────╮
+││││
+│7││8│
+││││
+││││
+╰─────────────────────────────────────╯╰─────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_rows.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_rows.py].svg
index 6d523cf260..41cfd4e712 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_rows.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_rows.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3421668871-matrix {
+ .terminal-2189775119-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3421668871-title {
+ .terminal-2189775119-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3421668871-r1 { fill: #ffffff }
-.terminal-3421668871-r2 { fill: #c5c8c6 }
-.terminal-3421668871-r3 { fill: #e1e1e1 }
+ .terminal-2189775119-r1 { fill: #ffffff }
+.terminal-2189775119-r2 { fill: #c5c8c6 }
+.terminal-2189775119-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-│1fr││1fr│
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-│height = 6││height = 6│
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-│25%││25%│
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-│1fr││1fr│
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-│height = 6││height = 6│
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+
+
+
+ ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+│1fr││1fr│
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+│height = 6││height = 6│
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+│25%││25%│
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+│1fr││1fr│
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+│height = 6││height = 6│
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_both.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_both.py].svg
index 449f34e217..72684b71f4 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_both.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_both.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-4060527209-matrix {
+ .terminal-611225555-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4060527209-title {
+ .terminal-611225555-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4060527209-r1 { fill: #ffffff }
-.terminal-4060527209-r2 { fill: #c5c8c6 }
-.terminal-4060527209-r3 { fill: #e1e1e1 }
+ .terminal-611225555-r1 { fill: #ffffff }
+.terminal-611225555-r2 { fill: #c5c8c6 }
+.terminal-611225555-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-│1││2│
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-│3││4│
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮
-││
-│5│
-││
-││
-╰──────────────────────────────────────╯
-
-
-
-
-
+
+
+
+ ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+│1││2│
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+│3││4│
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮
+││
+│5│
+││
+││
+╰──────────────────────────────────────╯
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_columns.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_columns.py].svg
index 4c1ba0406c..1b50293bbf 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_columns.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[grid_size_columns.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-1640924670-matrix {
+ .terminal-351227878-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1640924670-title {
+ .terminal-351227878-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1640924670-r1 { fill: #ffffff }
-.terminal-1640924670-r2 { fill: #c5c8c6 }
-.terminal-1640924670-r3 { fill: #e1e1e1 }
+ .terminal-351227878-r1 { fill: #ffffff }
+.terminal-351227878-r2 { fill: #c5c8c6 }
+.terminal-351227878-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
- ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-││││
-│1││2│
-││││
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮╭──────────────────────────────────────╮
-││││
-││││
-│3││4│
-││││
-││││
-││││
-╰──────────────────────────────────────╯╰──────────────────────────────────────╯
-╭──────────────────────────────────────╮
-││
-││
-│5│
-││
-││
-││
-╰──────────────────────────────────────╯
+
+
+
+ ╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+││││
+│1││2│
+││││
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮╭──────────────────────────────────────╮
+││││
+││││
+│3││4│
+││││
+││││
+││││
+╰──────────────────────────────────────╯╰──────────────────────────────────────╯
+╭──────────────────────────────────────╮
+││
+││
+│5│
+││
+││
+││
+╰──────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[hatch.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[hatch.py].svg
index 743bbc4346..ea1737f242 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[hatch.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[hatch.py].svg
@@ -19,138 +19,138 @@
font-weight: 700;
}
- .terminal-791754898-matrix {
+ .terminal-742394316-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-791754898-title {
+ .terminal-742394316-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-791754898-r1 { fill: #fea62b }
-.terminal-791754898-r2 { fill: #c5c8c6 }
-.terminal-791754898-r3 { fill: #e1e1e1 }
-.terminal-791754898-r4 { fill: #4ebf71 }
-.terminal-791754898-r5 { fill: #449e60 }
-.terminal-791754898-r6 { fill: #3a7e4f }
-.terminal-791754898-r7 { fill: #315e3f }
-.terminal-791754898-r8 { fill: #273e2e }
+ .terminal-742394316-r1 { fill: #004578 }
+.terminal-742394316-r2 { fill: #c5c8c6 }
+.terminal-742394316-r3 { fill: #e0e0e0 }
+.terminal-742394316-r4 { fill: #4ebf71 }
+.terminal-742394316-r5 { fill: #429c5e }
+.terminal-742394316-r6 { fill: #36794b }
+.terminal-742394316-r7 { fill: #2a5738 }
+.terminal-742394316-r8 { fill: #1e3425 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HatchApp
+ HatchApp
-
-
-
- ┌─ cross ──────┐┌─ horizontal ─┐┌─ custom ─────┐┌─ left ───────┐┌─ right ──────┐
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
-└──────────────┘└──────────────┘└──────────────┘└──────────────┘└──────────────┘
+
+
+
+ ┌─ cross ──────┐┌─ horizontal ─┐┌─ custom ─────┐┌─ left ───────┐┌─ right ──────┐
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+│╳╳╳╳╳╳╳╳╳╳╳╳╳╳││──────────────││TTTTTTTTTTTTTT││╲╲╲╲╲╲╲╲╲╲╲╲╲╲││╱╱╱╱╱╱╱╱╱╱╱╱╱╱│
+└──────────────┘└──────────────┘└──────────────┘└──────────────┘└──────────────┘
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height.py].svg
index 81991b5099..c90dc3a701 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-3614144091-matrix {
+ .terminal-697855935-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3614144091-title {
+ .terminal-697855935-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3614144091-r1 { fill: #ffffff }
-.terminal-3614144091-r2 { fill: #c5c8c6 }
-.terminal-3614144091-r3 { fill: #e1e1e1 }
+ .terminal-697855935-r1 { fill: #ffffff }
+.terminal-697855935-r2 { fill: #c5c8c6 }
+.terminal-697855935-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HeightApp
+ HeightApp
-
-
-
- Widget
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Widget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height_comparison.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height_comparison.py].svg
index 2249581009..e18f5a815e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height_comparison.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[height_comparison.py].svg
@@ -19,141 +19,141 @@
font-weight: 700;
}
- .terminal-3573285936-matrix {
+ .terminal-1085278600-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3573285936-title {
+ .terminal-1085278600-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3573285936-r1 { fill: #c5c8c6 }
-.terminal-3573285936-r2 { fill: #e8e0e7 }
-.terminal-3573285936-r3 { fill: #ddedf9 }
-.terminal-3573285936-r4 { fill: #eae3e5 }
-.terminal-3573285936-r5 { fill: #ede6e6 }
-.terminal-3573285936-r6 { fill: #efe9e4 }
-.terminal-3573285936-r7 { fill: #efeedf }
-.terminal-3573285936-r8 { fill: #e9eee5 }
-.terminal-3573285936-r9 { fill: #e4eee8 }
-.terminal-3573285936-r10 { fill: #e2edeb }
-.terminal-3573285936-r11 { fill: #dfebed }
+ .terminal-1085278600-r1 { fill: #c5c8c6 }
+.terminal-1085278600-r2 { fill: #e7e0e6 }
+.terminal-1085278600-r3 { fill: #e0e0e0 }
+.terminal-1085278600-r4 { fill: #eae2e4 }
+.terminal-1085278600-r5 { fill: #ece5e5 }
+.terminal-1085278600-r6 { fill: #eee8e3 }
+.terminal-1085278600-r7 { fill: #eeeddf }
+.terminal-1085278600-r8 { fill: #e8ede4 }
+.terminal-1085278600-r9 { fill: #e3ede7 }
+.terminal-1085278600-r10 { fill: #e1eceb }
+.terminal-1085278600-r11 { fill: #dfebec }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- HeightComparisonApp
+ HeightComparisonApp
-
-
-
- #cells·
-·
-·
-#percent·
-•
-·
-#w·
-·
-·
-•
-#h·
-·
-·
-·
-#vw•
-·
-·
-·
-#vh·
-•
-#auto·
-#fr1·
-#fr2·
-·
+
+
+
+ #cells·
+·
+·
+#percent·
+•
+·
+#w·
+·
+·
+•
+#h·
+·
+·
+·
+#vw•
+·
+·
+·
+#vh·
+•
+#auto·
+#fr1·
+#fr2·
+·
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline.py].svg
index 984905f97c..4cfc1c8d38 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline.py].svg
@@ -19,136 +19,136 @@
font-weight: 700;
}
- .terminal-1885421407-matrix {
+ .terminal-2446657206-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1885421407-title {
+ .terminal-2446657206-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1885421407-r1 { fill: #c5c8c6 }
-.terminal-1885421407-r2 { fill: #008000 }
-.terminal-1885421407-r3 { fill: #e8e0e7 }
-.terminal-1885421407-r4 { fill: #eae3e5 }
-.terminal-1885421407-r5 { fill: #1e1e1e }
-.terminal-1885421407-r6 { fill: #ede6e6 }
-.terminal-1885421407-r7 { fill: #efeedf }
+ .terminal-2446657206-r1 { fill: #c5c8c6 }
+.terminal-2446657206-r2 { fill: #008000 }
+.terminal-2446657206-r3 { fill: #e7e0e6 }
+.terminal-2446657206-r4 { fill: #eae2e4 }
+.terminal-2446657206-r5 { fill: #121212 }
+.terminal-2446657206-r6 { fill: #ece5e5 }
+.terminal-2446657206-r7 { fill: #eeeddf }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- KeylineApp
+ KeylineApp
-
-
-
-
-
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃┃┃
-┃┃┃
-┃#foo┃┃
-┃┃┃
-┃┃┃
-┣━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┫#bar┃
-┃┃┃┃
-┃┃┃┃
-┃Placeholder┃┃┃
-┃┃┃┃
-┃┃┃┃
-┣━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━┫
-┃┃
-┃┃
-┃#baz┃
-┃┃
-┃┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
+
+
+
+
+
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃┃┃
+┃┃┃
+┃#foo┃┃
+┃┃┃
+┃┃┃
+┣━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━┫#bar┃
+┃┃┃┃
+┃┃┃┃
+┃Placeholder┃┃┃
+┃┃┃┃
+┃┃┃┃
+┣━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━┫
+┃┃
+┃┃
+┃#baz┃
+┃┃
+┃┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline_horizontal.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline_horizontal.py].svg
index 9be8fec043..8dae544cc7 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline_horizontal.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[keyline_horizontal.py].svg
@@ -19,135 +19,135 @@
font-weight: 700;
}
- .terminal-1481807543-matrix {
+ .terminal-3023374911-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1481807543-title {
+ .terminal-3023374911-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1481807543-r1 { fill: #fea62b }
-.terminal-1481807543-r2 { fill: #c5c8c6 }
-.terminal-1481807543-r3 { fill: #e8e0e7 }
-.terminal-1481807543-r4 { fill: #eae3e5 }
-.terminal-1481807543-r5 { fill: #ede6e6 }
+ .terminal-3023374911-r1 { fill: #004578 }
+.terminal-3023374911-r2 { fill: #c5c8c6 }
+.terminal-3023374911-r3 { fill: #e7e0e6 }
+.terminal-3023374911-r4 { fill: #eae2e4 }
+.terminal-3023374911-r5 { fill: #ece5e5 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- KeylineApp
+ KeylineApp
-
-
-
- ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-│Placeholder│Placeholder│Placeholder│
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-││││
-└─────────────────────────┴─────────────────────────┴──────────────────────────┘
+
+
+
+ ┌─────────────────────────┬─────────────────────────┬──────────────────────────┐
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+│Placeholder│Placeholder│Placeholder│
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+││││
+└─────────────────────────┴─────────────────────────┴──────────────────────────┘
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[layout.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[layout.py].svg
index c994a65259..6d92a409d2 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[layout.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[layout.py].svg
@@ -19,134 +19,132 @@
font-weight: 700;
}
- .terminal-17876085-matrix {
+ .terminal-2854924863-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-17876085-title {
+ .terminal-2854924863-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-17876085-r1 { fill: #efddef }
-.terminal-17876085-r2 { fill: #c5c8c6 }
-.terminal-17876085-r3 { fill: #000000 }
-.terminal-17876085-r4 { fill: #ddefef }
-.terminal-17876085-r5 { fill: #e1e1e1 }
+ .terminal-2854924863-r1 { fill: #e0e0e0 }
+.terminal-2854924863-r2 { fill: #c5c8c6 }
+.terminal-2854924863-r3 { fill: #000000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LayoutApp
+ LayoutApp
-
-
-
-
-Layout
-
-Is
-
-Vertical
-
-
-LayoutIsHorizontal
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+Layout
+
+Is
+
+Vertical
+
+
+LayoutIsHorizontal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background.py].svg
index 63a0871d73..d83a56ccde 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-3791839841-matrix {
+ .terminal-2634535760-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3791839841-title {
+ .terminal-2634535760-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3791839841-r1 { fill: #e1e1e1 }
-.terminal-3791839841-r2 { fill: #c5c8c6 }
-.terminal-3791839841-r3 { fill: #ffdddd;text-decoration: underline; }
-.terminal-3791839841-r4 { fill: #121201;text-decoration: underline; }
-.terminal-3791839841-r5 { fill: #ddedf9;text-decoration: underline; }
+ .terminal-2634535760-r1 { fill: #e0e0e0 }
+.terminal-2634535760-r2 { fill: #c5c8c6 }
+.terminal-2634535760-r3 { fill: #ffdddd;text-decoration: underline; }
+.terminal-2634535760-r4 { fill: #efefdf;text-decoration: underline; }
+.terminal-2634535760-r5 { fill: #211505;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkBackgroundApp
+ LinkBackgroundApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background_hover.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background_hover.py].svg
index 42d1c19bfc..d9f6a5f0a8 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background_hover.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_background_hover.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-213509332-matrix {
+ .terminal-1281938369-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-213509332-title {
+ .terminal-1281938369-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-213509332-r1 { fill: #e1e1e1 }
-.terminal-213509332-r2 { fill: #c5c8c6 }
-.terminal-213509332-r3 { fill: #e1e1e1;text-decoration: underline; }
+ .terminal-1281938369-r1 { fill: #e0e0e0 }
+.terminal-1281938369-r2 { fill: #c5c8c6 }
+.terminal-1281938369-r3 { fill: #e0e0e0;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkHoverBackgroundApp
+ LinkHoverBackgroundApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color.py].svg
index edf6054984..51de9ac98b 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-1781128917-matrix {
+ .terminal-1542508026-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1781128917-title {
+ .terminal-1542508026-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1781128917-r1 { fill: #e1e1e1 }
-.terminal-1781128917-r2 { fill: #c5c8c6 }
-.terminal-1781128917-r3 { fill: #ff0000;text-decoration: underline; }
-.terminal-1781128917-r4 { fill: #8e8e0f;text-decoration: underline; }
-.terminal-1781128917-r5 { fill: #0178d4;text-decoration: underline; }
+ .terminal-1542508026-r1 { fill: #e0e0e0 }
+.terminal-1542508026-r2 { fill: #c5c8c6 }
+.terminal-1542508026-r3 { fill: #ff0000;text-decoration: underline; }
+.terminal-1542508026-r4 { fill: #888809;text-decoration: underline; }
+.terminal-1542508026-r5 { fill: #fea62b;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkColorApp
+ LinkColorApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color_hover.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color_hover.py].svg
index a76245768b..bd53874279 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color_hover.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_color_hover.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-2559238867-matrix {
+ .terminal-765972928-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2559238867-title {
+ .terminal-765972928-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2559238867-r1 { fill: #e1e1e1 }
-.terminal-2559238867-r2 { fill: #c5c8c6 }
-.terminal-2559238867-r3 { fill: #e1e1e1;text-decoration: underline; }
+ .terminal-765972928-r1 { fill: #e0e0e0 }
+.terminal-765972928-r2 { fill: #c5c8c6 }
+.terminal-765972928-r3 { fill: #e0e0e0;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkHoverColorApp
+ LinkHoverColorApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style.py].svg
index 15100fb267..807af9eb95 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-4258391335-matrix {
+ .terminal-3176649748-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-4258391335-title {
+ .terminal-3176649748-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-4258391335-r1 { fill: #e1e1e1 }
-.terminal-4258391335-r2 { fill: #c5c8c6 }
-.terminal-4258391335-r3 { fill: #e1e1e1;font-weight: bold;font-style: italic; }
-.terminal-4258391335-r4 { fill: #1e1e1e;text-decoration: line-through; }
-.terminal-4258391335-r5 { fill: #e1e1e1;font-weight: bold }
+ .terminal-3176649748-r1 { fill: #e0e0e0 }
+.terminal-3176649748-r2 { fill: #c5c8c6 }
+.terminal-3176649748-r3 { fill: #e0e0e0;font-weight: bold;font-style: italic; }
+.terminal-3176649748-r4 { fill: #121212;text-decoration: line-through; }
+.terminal-3176649748-r5 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkStyleApp
+ LinkStyleApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style_hover.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style_hover.py].svg
index 5ab9dc8e50..8d4db695a3 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style_hover.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[link_style_hover.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-2570642149-matrix {
+ .terminal-777376210-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2570642149-title {
+ .terminal-777376210-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2570642149-r1 { fill: #e1e1e1 }
-.terminal-2570642149-r2 { fill: #c5c8c6 }
-.terminal-2570642149-r3 { fill: #e1e1e1;text-decoration: underline; }
+ .terminal-777376210-r1 { fill: #e0e0e0 }
+.terminal-777376210-r2 { fill: #c5c8c6 }
+.terminal-777376210-r3 { fill: #e0e0e0;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinkHoverStyleApp
+ LinkHoverStyleApp
-
-
-
- Visit the Textualize website.
-Click here for the bell sound.
-You can also click here for the bell sound.
-Exit this application.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Visit the Textualize website.
+Click here for the bell sound.
+You can also click here for the bell sound.
+Exit this application.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[links.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[links.py].svg
index 6036dd28ca..855bb89d73 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[links.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[links.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3461676208-matrix {
+ .terminal-3072978127-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3461676208-title {
+ .terminal-3072978127-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3461676208-r1 { fill: #e1e1e1 }
-.terminal-3461676208-r2 { fill: #e1e1e1;text-decoration: underline; }
-.terminal-3461676208-r3 { fill: #c5c8c6 }
-.terminal-3461676208-r4 { fill: #030e19;font-weight: bold;font-style: italic;;text-decoration: underline; }
+ .terminal-3072978127-r1 { fill: #e0e0e0 }
+.terminal-3072978127-r2 { fill: #e0e0e0;text-decoration: underline; }
+.terminal-3072978127-r3 { fill: #c5c8c6 }
+.terminal-3072978127-r4 { fill: #030e19;font-weight: bold;font-style: italic;;text-decoration: underline; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- LinksApp
+ LinksApp
-
-
-
- Here is a link which you can click!
-
-Here is a link which you can click!
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Here is a link which you can click!
+
+Here is a link which you can click!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_height.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_height.py].svg
index 137f4d0809..188e91b7e6 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_height.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_height.py].svg
@@ -19,135 +19,135 @@
font-weight: 700;
}
- .terminal-871212948-matrix {
+ .terminal-3709115834-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-871212948-title {
+ .terminal-3709115834-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-871212948-r1 { fill: #c5c8c6 }
-.terminal-871212948-r2 { fill: #e8e0e7 }
-.terminal-871212948-r3 { fill: #efe9e4 }
-.terminal-871212948-r4 { fill: #ede6e6 }
-.terminal-871212948-r5 { fill: #e1e1e1 }
-.terminal-871212948-r6 { fill: #eae3e5 }
+ .terminal-3709115834-r1 { fill: #c5c8c6 }
+.terminal-3709115834-r2 { fill: #e7e0e6 }
+.terminal-3709115834-r3 { fill: #eee8e3 }
+.terminal-3709115834-r4 { fill: #ece5e5 }
+.terminal-3709115834-r5 { fill: #e0e0e0 }
+.terminal-3709115834-r6 { fill: #eae2e4 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MaxHeightApp
+ MaxHeightApp
-
-
-
-
-
-
-max-height: 10w
-max-height: 10
-max-height: 50%
-
-
-
-
-
-max-height: 999
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+max-height: 10w
+max-height: 10
+max-height: 50%
+
+
+
+
+
+max-height: 999
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_width.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_width.py].svg
index 7b14e2ee82..ed0a6ea01e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_width.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[max_width.py].svg
@@ -19,135 +19,135 @@
font-weight: 700;
}
- .terminal-2391822459-matrix {
+ .terminal-2158578299-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2391822459-title {
+ .terminal-2158578299-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2391822459-r1 { fill: #c5c8c6 }
-.terminal-2391822459-r2 { fill: #e1e1e1 }
-.terminal-2391822459-r3 { fill: #e8e0e7 }
-.terminal-2391822459-r4 { fill: #eae3e5 }
-.terminal-2391822459-r5 { fill: #ede6e6 }
-.terminal-2391822459-r6 { fill: #efe9e4 }
+ .terminal-2158578299-r1 { fill: #c5c8c6 }
+.terminal-2158578299-r2 { fill: #e0e0e0 }
+.terminal-2158578299-r3 { fill: #e7e0e6 }
+.terminal-2158578299-r4 { fill: #eae2e4 }
+.terminal-2158578299-r5 { fill: #ece5e5 }
+.terminal-2158578299-r6 { fill: #eee8e3 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MaxWidthApp
+ MaxWidthApp
-
-
-
-
-
-max-width:
-50h
-
-
-
-
-max-width: 999
-
-
-
-
-
-max-width: 50%
-
-
-
-
-
-max-width: 30
-
-
+
+
+
+
+
+max-width:
+50h
+
+
+
+
+max-width: 999
+
+
+
+
+
+max-width: 50%
+
+
+
+
+
+max-width: 30
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_height.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_height.py].svg
index 4994a56bc9..cb93bfbc65 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_height.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_height.py].svg
@@ -19,137 +19,137 @@
font-weight: 700;
}
- .terminal-2728591289-matrix {
+ .terminal-3829199572-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2728591289-title {
+ .terminal-3829199572-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2728591289-r1 { fill: #c5c8c6 }
-.terminal-2728591289-r2 { fill: #1e1e1e }
-.terminal-2728591289-r3 { fill: #e8e0e7 }
-.terminal-2728591289-r4 { fill: #eae3e5 }
-.terminal-2728591289-r5 { fill: #e1e1e1 }
-.terminal-2728591289-r6 { fill: #ede6e6 }
-.terminal-2728591289-r7 { fill: #efe9e4 }
-.terminal-2728591289-r8 { fill: #14191f }
+ .terminal-3829199572-r1 { fill: #c5c8c6 }
+.terminal-3829199572-r2 { fill: #121212 }
+.terminal-3829199572-r3 { fill: #e7e0e6 }
+.terminal-3829199572-r4 { fill: #eae2e4 }
+.terminal-3829199572-r5 { fill: #e0e0e0 }
+.terminal-3829199572-r6 { fill: #ece5e5 }
+.terminal-3829199572-r7 { fill: #eee8e3 }
+.terminal-3829199572-r8 { fill: #000000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MinHeightApp
+ MinHeightApp
-
-
-
-
-
-
-
-
-min-height: 25%
-
-
-min-height: 75%
-
-
-
-
-
-min-height: 30
-min-height: 40w
-
-
-▃▃
-
-
-
-
+
+
+
+
+
+
+
+
+min-height: 25%
+
+
+min-height: 75%
+
+
+
+
+
+min-height: 30
+min-height: 40w
+
+
+▃▃
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_width.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_width.py].svg
index 0aa9bf35d9..06a2a6ddce 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_width.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[min_width.py].svg
@@ -19,136 +19,136 @@
font-weight: 700;
}
- .terminal-1758188849-matrix {
+ .terminal-4045001061-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1758188849-title {
+ .terminal-4045001061-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1758188849-r1 { fill: #c5c8c6 }
-.terminal-1758188849-r2 { fill: #e1e1e1 }
-.terminal-1758188849-r3 { fill: #e8e0e7 }
-.terminal-1758188849-r4 { fill: #eae3e5 }
-.terminal-1758188849-r5 { fill: #ede6e6 }
-.terminal-1758188849-r6 { fill: #efe9e4 }
-.terminal-1758188849-r7 { fill: #1e1e1e }
+ .terminal-4045001061-r1 { fill: #c5c8c6 }
+.terminal-4045001061-r2 { fill: #e0e0e0 }
+.terminal-4045001061-r3 { fill: #e7e0e6 }
+.terminal-4045001061-r4 { fill: #eae2e4 }
+.terminal-4045001061-r5 { fill: #ece5e5 }
+.terminal-4045001061-r6 { fill: #eee8e3 }
+.terminal-4045001061-r7 { fill: #121212 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MinWidthApp
+ MinWidthApp
-
-
-
-
-
-min-width: 25%
-
-
-
-
-min-width: 75%
-
-
-
-
-
-min-width: 100
-
-
-
-
-
-min-width: 400h
-
-
-
+
+
+
+
+
+min-width: 25%
+
+
+
+
+min-width: 75%
+
+
+
+
+
+min-width: 100
+
+
+
+
+
+min-width: 400h
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[opacity.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[opacity.py].svg
index dabedbfa8b..344862df39 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[opacity.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[opacity.py].svg
@@ -19,141 +19,141 @@
font-weight: 700;
}
- .terminal-618549268-matrix {
+ .terminal-1157124040-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-618549268-title {
+ .terminal-1157124040-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-618549268-r1 { fill: #000000 }
-.terminal-618549268-r2 { fill: #c5c8c6 }
-.terminal-618549268-r3 { fill: #000000;font-weight: bold }
-.terminal-618549268-r4 { fill: #01090f }
-.terminal-618549268-r5 { fill: #373838;font-weight: bold }
-.terminal-618549268-r6 { fill: #07243f }
-.terminal-618549268-r7 { fill: #6f7474;font-weight: bold }
-.terminal-618549268-r8 { fill: #10518f }
-.terminal-618549268-r9 { fill: #a8b3b2;font-weight: bold }
-.terminal-618549268-r10 { fill: #1e90ff }
-.terminal-618549268-r11 { fill: #e2f4f3;font-weight: bold }
+ .terminal-1157124040-r1 { fill: #000000 }
+.terminal-1157124040-r2 { fill: #c5c8c6 }
+.terminal-1157124040-r3 { fill: #000000;font-weight: bold }
+.terminal-1157124040-r4 { fill: #01090f }
+.terminal-1157124040-r5 { fill: #383838;font-weight: bold }
+.terminal-1157124040-r6 { fill: #07243f }
+.terminal-1157124040-r7 { fill: #707070;font-weight: bold }
+.terminal-1157124040-r8 { fill: #10518f }
+.terminal-1157124040-r9 { fill: #a8a8a8;font-weight: bold }
+.terminal-1157124040-r10 { fill: #1e90ff }
+.terminal-1157124040-r11 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- OpacityApp
+ OpacityApp
-
+
-
- ▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
-▌opacity: 0%▐
-▌▐
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
-▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
-▌▐
-▌opacity: 25%▐
-▌▐
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
-▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
-▌▐
-▌opacity: 50%▐
-▌▐
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
-▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
-▌▐
-▌opacity: 75%▐
-▌▐
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
-▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
-▌▐
-▌opacity: 100%▐
-▌▐
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
+
+ ▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
+▌opacity: 0%▐
+▌▐
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
+▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
+▌▐
+▌opacity: 25%▐
+▌▐
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
+▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
+▌▐
+▌opacity: 50%▐
+▌▐
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
+▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
+▌▐
+▌opacity: 75%▐
+▌▐
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
+▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜
+▌▐
+▌opacity: 100%▐
+▌▐
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_all.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_all.py].svg
index 0cd831a4b4..3a72a3dc4e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_all.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_all.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-3311194111-matrix {
+ .terminal-2423824395-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3311194111-title {
+ .terminal-2423824395-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3311194111-r1 { fill: #e1e1e1 }
-.terminal-3311194111-r2 { fill: #0178d4 }
-.terminal-3311194111-r3 { fill: #c5c8c6 }
-.terminal-3311194111-r4 { fill: #1e1e1e }
+ .terminal-2423824395-r1 { fill: #e0e0e0 }
+.terminal-2423824395-r2 { fill: #fea62b }
+.terminal-2423824395-r3 { fill: #c5c8c6 }
+.terminal-2423824395-r4 { fill: #121212 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AllOutlinesApp
+ AllOutlinesApp
-
-
-
- +------------------+┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
-|ascii|blank╏dashed╏
-+------------------+┗╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┛
-
-
-╔══════════════════╗┏━━━━━━━━━━━━━━━━━━┓
-║double║┃heavy┃hidden/none
-╚══════════════════╝┗━━━━━━━━━━━━━━━━━━┛
-
-
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖
-hkey▐inner▌none
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▝▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▘
-
-
-▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜╭──────────────────╮┌──────────────────┐
-▌outer▐│round││solid│
-▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟╰──────────────────╯└──────────────────┘
-
-
-▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎▏ ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▊tall▎▏vkey▕▎wide▊
-▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎▏ ▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+
+
+ +------------------+┏╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┓
+|ascii|blank╏dashed╏
++------------------+┗╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍┛
+
+
+╔══════════════════╗┏━━━━━━━━━━━━━━━━━━┓
+║double║┃heavy┃hidden/none
+╚══════════════════╝┗━━━━━━━━━━━━━━━━━━┛
+
+
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▗▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▖
+hkey▐inner▌none
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▝▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▘
+
+
+▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜╭──────────────────╮┌──────────────────┐
+▌outer▐│round││solid│
+▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟╰──────────────────╯└──────────────────┘
+
+
+▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▎▏ ▕▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▊tall▎▏vkey▕▎wide▊
+▊▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎▏ ▕▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_vs_border.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_vs_border.py].svg
index ed503e7926..34be27b79f 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_vs_border.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[outline_vs_border.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-55418416-matrix {
+ .terminal-2691590399-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-55418416-title {
+ .terminal-2691590399-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-55418416-r1 { fill: #b93c5b }
-.terminal-55418416-r2 { fill: #e1e1e1 }
-.terminal-55418416-r3 { fill: #c5c8c6 }
-.terminal-55418416-r4 { fill: #4ebf71 }
+ .terminal-2691590399-r1 { fill: #b93c5b }
+.terminal-2691590399-r2 { fill: #e0e0e0 }
+.terminal-2691590399-r3 { fill: #c5c8c6 }
+.terminal-2691590399-r4 { fill: #4ebf71 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- OutlineBorderApp
+ OutlineBorderApp
-
-
-
- ╭───────────────────────────────────────────────────────────────────╮
-│ear is the mind-killer.│
-│ear is the little-death that brings total obliteration.│
-│ will face my fear.│
-│ will permit it to pass over me and through me.│
-│nd when it has gone past, I will turn the inner eye to see its path│
-│here the fear has gone there will be nothing. Only I will remain.│
-╰───────────────────────────────────────────────────────────────────╯
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃I must not fear.┃
-┃Fear is the mind-killer.┃
-┃Fear is the little-death that brings total obliteration.┃
-┃I will face my fear.┃
-┃I will permit it to pass over me and through me.┃
-┃And when it has gone past, I will turn the inner eye to see its path.┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-╭─────────────────────────────────────────────────────────────────────╮
-│I must not fear.│
-│Fear is the mind-killer.│
-│Fear is the little-death that brings total obliteration.│
-│I will face my fear.│
-│I will permit it to pass over me and through me.│
-│And when it has gone past, I will turn the inner eye to see its path.│
-╰─────────────────────────────────────────────────────────────────────╯
+
+
+
+ ╭───────────────────────────────────────────────────────────────────╮
+│ear is the mind-killer.│
+│ear is the little-death that brings total obliteration.│
+│ will face my fear.│
+│ will permit it to pass over me and through me.│
+│nd when it has gone past, I will turn the inner eye to see its path│
+│here the fear has gone there will be nothing. Only I will remain.│
+╰───────────────────────────────────────────────────────────────────╯
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃I must not fear.┃
+┃Fear is the mind-killer.┃
+┃Fear is the little-death that brings total obliteration.┃
+┃I will face my fear.┃
+┃I will permit it to pass over me and through me.┃
+┃And when it has gone past, I will turn the inner eye to see its path.┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+╭─────────────────────────────────────────────────────────────────────╮
+│I must not fear.│
+│Fear is the mind-killer.│
+│Fear is the little-death that brings total obliteration.│
+│I will face my fear.│
+│I will permit it to pass over me and through me.│
+│And when it has gone past, I will turn the inner eye to see its path.│
+╰─────────────────────────────────────────────────────────────────────╯
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[overflow.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[overflow.py].svg
index 40eefa2ee0..cfa199949e 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[overflow.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[overflow.py].svg
@@ -19,137 +19,136 @@
font-weight: 700;
}
- .terminal-2280965404-matrix {
+ .terminal-3419977497-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2280965404-title {
+ .terminal-3419977497-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2280965404-r1 { fill: #000000 }
-.terminal-2280965404-r2 { fill: #121212 }
-.terminal-2280965404-r3 { fill: #c5c8c6 }
-.terminal-2280965404-r4 { fill: #008000 }
-.terminal-2280965404-r5 { fill: #e5f0e5 }
-.terminal-2280965404-r6 { fill: #036a03 }
-.terminal-2280965404-r7 { fill: #14191f }
+ .terminal-3419977497-r1 { fill: #000000 }
+.terminal-3419977497-r2 { fill: #121212 }
+.terminal-3419977497-r3 { fill: #c5c8c6 }
+.terminal-3419977497-r4 { fill: #008000 }
+.terminal-3419977497-r5 { fill: #e5f0e5 }
+.terminal-3419977497-r6 { fill: #036a03 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- OverflowApp
+ OverflowApp
-
-
-
-
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▎I must not fear.▊▎I must not fear.▊
-▎Fear is the mind-killer.▊▎Fear is the mind-killer.▊
-▎Fear is the little-death that ▊▎Fear is the little-death that ▊
-▎brings total obliteration.▊▎brings total obliteration.▊
-▎I will face my fear.▊▎I will face my fear.▊
-▎I will permit it to pass over me▊▎I will permit it to pass over me ▊
-▎and through me.▊▎and through me.▊
-▎And when it has gone past, I ▊▎And when it has gone past, I will ▊
-▎will turn the inner eye to see ▊▎turn the inner eye to see its ▊
-▎its path.▊▁▁▎path.▊
-▎Where the fear has gone there ▊▎Where the fear has gone there will▊
-▎will be nothing. Only I will ▊▎be nothing. Only I will remain.▊
-▎remain.▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
-▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎I must not fear.▊
-▎I must not fear.▊▎Fear is the mind-killer.▊
-▎Fear is the mind-killer.▊▎Fear is the little-death that ▊
-▎Fear is the little-death that ▊▎brings total obliteration.▊
-▎brings total obliteration.▊▎I will face my fear.▊
-▎I will face my fear.▊▎I will permit it to pass over me ▊
-▎I will permit it to pass over me▊▎and through me.▊
+
+
+
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▎I must not fear.▊▎I must not fear.▊
+▎Fear is the mind-killer.▊▎Fear is the mind-killer.▊
+▎Fear is the little-death that ▊▎Fear is the little-death that ▊
+▎brings total obliteration.▊▎brings total obliteration.▊
+▎I will face my fear.▊▎I will face my fear.▊
+▎I will permit it to pass over me▊▎I will permit it to pass over me ▊
+▎and through me.▊▎and through me.▊
+▎And when it has gone past, I ▊▎And when it has gone past, I will ▊
+▎will turn the inner eye to see ▊▎turn the inner eye to see its ▊
+▎its path.▊▁▁▎path.▊
+▎Where the fear has gone there ▊▎Where the fear has gone there will▊
+▎will be nothing. Only I will ▊▎be nothing. Only I will remain.▊
+▎remain.▊▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▎I must not fear.▊
+▎I must not fear.▊▎Fear is the mind-killer.▊
+▎Fear is the mind-killer.▊▎Fear is the little-death that ▊
+▎Fear is the little-death that ▊▎brings total obliteration.▊
+▎brings total obliteration.▊▎I will face my fear.▊
+▎I will face my fear.▊▎I will permit it to pass over me ▊
+▎I will permit it to pass over me▊▎and through me.▊
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[row_span.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[row_span.py].svg
index 56ad130772..9d2edd4c53 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[row_span.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[row_span.py].svg
@@ -19,138 +19,138 @@
font-weight: 700;
}
- .terminal-3617589510-matrix {
+ .terminal-2350635735-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3617589510-title {
+ .terminal-2350635735-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3617589510-r1 { fill: #c5c8c6 }
-.terminal-3617589510-r2 { fill: #e1e1e1 }
-.terminal-3617589510-r3 { fill: #efe9e4 }
-.terminal-3617589510-r4 { fill: #ede6e6 }
-.terminal-3617589510-r5 { fill: #eae3e5 }
-.terminal-3617589510-r6 { fill: #e8e0e7 }
-.terminal-3617589510-r7 { fill: #efeedf }
-.terminal-3617589510-r8 { fill: #e9eee5 }
-.terminal-3617589510-r9 { fill: #e4eee8 }
+ .terminal-2350635735-r1 { fill: #c5c8c6 }
+.terminal-2350635735-r2 { fill: #e0e0e0 }
+.terminal-2350635735-r3 { fill: #eee8e3 }
+.terminal-2350635735-r4 { fill: #ece5e5 }
+.terminal-2350635735-r5 { fill: #eae2e4 }
+.terminal-2350635735-r6 { fill: #e7e0e6 }
+.terminal-2350635735-r7 { fill: #eeeddf }
+.terminal-2350635735-r8 { fill: #e8ede4 }
+.terminal-2350635735-r9 { fill: #e3ede7 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- MyApp
+ MyApp
-
-
-
-
-
-#p4
-
-
-#p3
-
-
-#p2
-
-
-#p1
-
-
-#p5
-
-
-#p6
-
-
-#p7
-
-
+
+
+
+
+
+#p4
+
+
+#p3
+
+
+#p2
+
+
+#p1
+
+
+#p5
+
+
+#p6
+
+
+#p7
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_corner_color.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_corner_color.py].svg
index 52b074745e..0e81f1f619 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_corner_color.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_corner_color.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-2078122073-matrix {
+ .terminal-2649911942-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2078122073-title {
+ .terminal-2649911942-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2078122073-r1 { fill: #e1e1e1 }
-.terminal-2078122073-r2 { fill: #1e1e1e }
-.terminal-2078122073-r3 { fill: #c5c8c6 }
-.terminal-2078122073-r4 { fill: #14191f }
+ .terminal-2649911942-r1 { fill: #e0e0e0 }
+.terminal-2649911942-r2 { fill: #121212 }
+.terminal-2649911942-r3 { fill: #c5c8c6 }
+.terminal-2649911942-r4 { fill: #000000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ScrollbarCornerColorApp
+ ScrollbarCornerColorApp
-
-
-
- I must not fear. Fear is the mind-killer. Fear is the little-death that brings
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.▅▅
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
+
+
+
+ I must not fear. Fear is the mind-killer. Fear is the little-death that brings
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.▅▅
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_gutter.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_gutter.py].svg
index 287c9aa165..3c8b043f19 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_gutter.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_gutter.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-2133906435-matrix {
+ .terminal-2967127755-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2133906435-title {
+ .terminal-2967127755-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2133906435-r1 { fill: #fffaf0 }
-.terminal-2133906435-r2 { fill: #c5c8c6 }
-.terminal-2133906435-r3 { fill: #e1e1e1 }
+ .terminal-2967127755-r1 { fill: #fffaf0 }
+.terminal-2967127755-r2 { fill: #c5c8c6 }
+.terminal-2967127755-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ScrollbarGutterApp
+ ScrollbarGutterApp
-
-
-
- I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size.py].svg
index 2b7e85df27..f84fa74742 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size.py].svg
@@ -19,133 +19,133 @@
font-weight: 700;
}
- .terminal-715252448-matrix {
+ .terminal-1245890115-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-715252448-title {
+ .terminal-1245890115-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-715252448-r1 { fill: #c5c8c6 }
-.terminal-715252448-r2 { fill: #ffffff }
-.terminal-715252448-r3 { fill: #3333ff }
-.terminal-715252448-r4 { fill: #14191f }
+ .terminal-1245890115-r1 { fill: #c5c8c6 }
+.terminal-1245890115-r2 { fill: #ffffff }
+.terminal-1245890115-r3 { fill: #3333ff }
+.terminal-1245890115-r4 { fill: #000000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ScrollbarApp
+ ScrollbarApp
-
-
-
-
-
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.▁▁▁▁
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.▁▁▁▁
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size2.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size2.py].svg
index f6cc94fe1b..f9108cd8e0 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size2.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbar_size2.py].svg
@@ -19,139 +19,137 @@
font-weight: 700;
}
- .terminal-3769580805-matrix {
+ .terminal-2210600219-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3769580805-title {
+ .terminal-2210600219-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3769580805-r1 { fill: #e7e0e0 }
-.terminal-3769580805-r2 { fill: #c5c8c6 }
-.terminal-3769580805-r3 { fill: #4b1818 }
-.terminal-3769580805-r4 { fill: #e0e4e0 }
-.terminal-3769580805-r5 { fill: #183118 }
-.terminal-3769580805-r6 { fill: #e0e0e7 }
-.terminal-3769580805-r7 { fill: #18184b }
-.terminal-3769580805-r8 { fill: #14191f }
-.terminal-3769580805-r9 { fill: #23568b }
+ .terminal-2210600219-r1 { fill: #e0e0e0 }
+.terminal-2210600219-r2 { fill: #c5c8c6 }
+.terminal-2210600219-r3 { fill: #410e0e }
+.terminal-2210600219-r4 { fill: #0e280e }
+.terminal-2210600219-r5 { fill: #0e0e41 }
+.terminal-2210600219-r6 { fill: #000000 }
+.terminal-2210600219-r7 { fill: #242f38 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ScrollbarApp
+ ScrollbarApp
-
-
-
- I must not fear.I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death Fear is the little-death tFear is the little-death
-I will face my fear.I will face my fear.I will face my fear.
-I will permit it to pass I will permit it to pass oI will permit it to pass
-And when it has gone pastAnd when it has gone past,And when it has gone past
-Where the fear has gone tWhere the fear has gone thWhere the fear has gone t
-I must not fear.I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death Fear is the little-death tFear is the little-death
-I will face my fear.▇I will face my fear.I will face my fear.▇▇
-I will permit it to pass I will permit it to pass oI will permit it to pass
-And when it has gone pastAnd when it has gone past,And when it has gone past
-Where the fear has gone tWhere the fear has gone thWhere the fear has gone t
-I must not fear.I must not fear.▂I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death Fear is the little-death tFear is the little-death
-I will face my fear.I will face my fear.I will face my fear.
-I will permit it to pass I will permit it to pass oI will permit it to pass
-▏And when it has gone past,▏
-▏Where the fear has gone th▏
-▏I must not fear.▏
-▏Fear is the mind-killer.▏
-▏▉▏
+
+
+
+ I must not fear.I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death Fear is the little-death tFear is the little-death
+I will face my fear.I will face my fear.I will face my fear.
+I will permit it to pass I will permit it to pass oI will permit it to pass
+And when it has gone pastAnd when it has gone past,And when it has gone past
+Where the fear has gone tWhere the fear has gone thWhere the fear has gone t
+I must not fear.I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death Fear is the little-death tFear is the little-death
+I will face my fear.▇I will face my fear.I will face my fear.▇▇
+I will permit it to pass I will permit it to pass oI will permit it to pass
+And when it has gone pastAnd when it has gone past,And when it has gone past
+Where the fear has gone tWhere the fear has gone thWhere the fear has gone t
+I must not fear.I must not fear.▂I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death Fear is the little-death tFear is the little-death
+I will face my fear.I will face my fear.I will face my fear.
+I will permit it to pass I will permit it to pass oI will permit it to pass
+▏And when it has gone past,▏
+▏Where the fear has gone th▏
+▏I must not fear.▏
+▏Fear is the mind-killer.▏
+▏▉▏
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars.py].svg
index 9a621fd8a0..6397626205 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars.py].svg
@@ -19,137 +19,137 @@
font-weight: 700;
}
- .terminal-3671412872-matrix {
+ .terminal-1158220469-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3671412872-title {
+ .terminal-1158220469-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3671412872-r1 { fill: #e1e1e1 }
-.terminal-3671412872-r2 { fill: #c5c8c6 }
-.terminal-3671412872-r3 { fill: #1e1e1e }
-.terminal-3671412872-r4 { fill: #14191f }
-.terminal-3671412872-r5 { fill: #ff0000 }
-.terminal-3671412872-r6 { fill: #23568b }
-.terminal-3671412872-r7 { fill: #008000 }
+ .terminal-1158220469-r1 { fill: #e0e0e0 }
+.terminal-1158220469-r2 { fill: #c5c8c6 }
+.terminal-1158220469-r3 { fill: #121212 }
+.terminal-1158220469-r4 { fill: #000000 }
+.terminal-1158220469-r5 { fill: #ff0000 }
+.terminal-1158220469-r6 { fill: #242f38 }
+.terminal-1158220469-r7 { fill: #008000 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- ScrollbarApp
+ ScrollbarApp
-
-
-
- I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death that brings tFear is the little-death that brings t
-I will face my fear.I will face my fear.
-I will permit it to pass over me and tI will permit it to pass over me and t
-And when it has gone past, I will turnAnd when it has gone past, I will turn
-see its path.see its path.
-Where the fear has gone there will be Where the fear has gone there will be
-will remain.will remain.
-I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death that brings tFear is the little-death that brings t
-I will face my fear.I will face my fear.
-I will permit it to pass over me and tI will permit it to pass over me and t
-And when it has gone past, I will turnAnd when it has gone past, I will turn
-see its path.▃▃see its path.▃▃
-Where the fear has gone there will be Where the fear has gone there will be
-will remain.will remain.
-I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death that brings tFear is the little-death that brings t
-I will face my fear.I will face my fear.
-I will permit it to pass over me and tI will permit it to pass over me and t
-▍▍
+
+
+
+ I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death that brings tFear is the little-death that brings t
+I will face my fear.I will face my fear.
+I will permit it to pass over me and tI will permit it to pass over me and t
+And when it has gone past, I will turnAnd when it has gone past, I will turn
+see its path.see its path.
+Where the fear has gone there will be Where the fear has gone there will be
+will remain.will remain.
+I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death that brings tFear is the little-death that brings t
+I will face my fear.I will face my fear.
+I will permit it to pass over me and tI will permit it to pass over me and t
+And when it has gone past, I will turnAnd when it has gone past, I will turn
+see its path.▃▃see its path.▃▃
+Where the fear has gone there will be Where the fear has gone there will be
+will remain.will remain.
+I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death that brings tFear is the little-death that brings t
+I will face my fear.I will face my fear.
+I will permit it to pass over me and tI will permit it to pass over me and t
+▍▍
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars2.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars2.py].svg
index b249691404..37da6b7de9 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars2.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[scrollbars2.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-1771288740-matrix {
+ .terminal-3879964726-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1771288740-title {
+ .terminal-3879964726-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1771288740-r1 { fill: #e1e1e1 }
-.terminal-1771288740-r2 { fill: #c5c8c6 }
-.terminal-1771288740-r3 { fill: #1e1e1e }
-.terminal-1771288740-r4 { fill: #0000ff }
+ .terminal-3879964726-r1 { fill: #e0e0e0 }
+.terminal-3879964726-r2 { fill: #c5c8c6 }
+.terminal-3879964726-r3 { fill: #121212 }
+.terminal-3879964726-r4 { fill: #0000ff }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- Scrollbar2App
+ Scrollbar2App
-
-
-
- I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
-Fear is the mind-killer.▇▇
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
-I will face my fear.
-I will permit it to pass over me and through me.
-And when it has gone past, I will turn the inner eye to see its path.
-Where the fear has gone there will be nothing. Only I will remain.
-I must not fear.
-Fear is the mind-killer.
-Fear is the little-death that brings total obliteration.
+
+
+
+ I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
+Fear is the mind-killer.▇▇
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
+I will face my fear.
+I will permit it to pass over me and through me.
+And when it has gone past, I will turn the inner eye to see its path.
+Where the fear has gone there will be nothing. Only I will remain.
+I must not fear.
+Fear is the mind-killer.
+Fear is the little-death that brings total obliteration.
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_align.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_align.py].svg
index 1418702b56..7bc6d26b62 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_align.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_align.py].svg
@@ -19,138 +19,134 @@
font-weight: 700;
}
- .terminal-2525861690-matrix {
+ .terminal-3439298128-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2525861690-title {
+ .terminal-3439298128-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2525861690-r1 { fill: #c5c8c6 }
-.terminal-2525861690-r2 { fill: #161c1d;font-weight: bold }
-.terminal-2525861690-r3 { fill: #161c1d }
-.terminal-2525861690-r4 { fill: #f8e9e9 }
-.terminal-2525861690-r5 { fill: #f8e9e9;font-weight: bold }
-.terminal-2525861690-r6 { fill: #132013 }
-.terminal-2525861690-r7 { fill: #132013;font-weight: bold }
-.terminal-2525861690-r8 { fill: #1c0e13;font-weight: bold }
-.terminal-2525861690-r9 { fill: #1c0e13 }
+ .terminal-3439298128-r1 { fill: #c5c8c6 }
+.terminal-3439298128-r2 { fill: #000000;font-weight: bold }
+.terminal-3439298128-r3 { fill: #000000 }
+.terminal-3439298128-r4 { fill: #ffffff }
+.terminal-3439298128-r5 { fill: #ffffff;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- TextAlign
+ TextAlign
-
+
-
-
-Left alignedCenter aligned
-I must not fear. Fear is the I must not fear. Fear is the
-mind-killer. Fear is the mind-killer. Fear is the
-little-death that brings total little-death that brings total
-obliteration. I will face my fear. Iobliteration. I will face my fear. I
-will permit it to pass over me and will permit it to pass over me and
-through me. through me.
-
-
-
-
-
-Right alignedJustified
- I must not fear. Fear is theI must not fear. Fear is the
- mind-killer. Fear is themind-killer. Fear is the
- little-death that brings totallittle-death that brings total
-obliteration. I will face my fear. Iobliteration. I will face my fear. I
- will permit it to pass over me andwill permit it to pass over me and
- through me.through me.
-
-
-
+
+
+Left alignedCenter aligned
+I must not fear. Fear is the I must not fear. Fear is the
+mind-killer. Fear is the mind-killer. Fear is the
+little-death that brings total little-death that brings total
+obliteration. I will face my fear. Iobliteration. I will face my fear. I
+will permit it to pass over me and will permit it to pass over me and
+through me. through me.
+
+
+
+
+
+Right alignedJustified
+ I must not fear. Fear is theI must not fear. Fear is the
+ mind-killer. Fear is themind-killer. Fear is the
+ little-death that brings totallittle-death that brings total
+obliteration. I will face my fear. Iobliteration. I will face my fear. I
+ will permit it to pass over me andwill permit it to pass over me and
+ through me.through me.
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_opacity.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_opacity.py].svg
index 9afc44eeec..ae40d230d0 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_opacity.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_opacity.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-248406950-matrix {
+ .terminal-455824985-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-248406950-title {
+ .terminal-455824985-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-248406950-r1 { fill: #c5c8c6 }
-.terminal-248406950-r2 { fill: #4e4e4e;font-weight: bold }
-.terminal-248406950-r3 { fill: #7f7f7f;font-weight: bold }
-.terminal-248406950-r4 { fill: #b0b0b0;font-weight: bold }
-.terminal-248406950-r5 { fill: #e1e1e1;font-weight: bold }
+ .terminal-455824985-r1 { fill: #c5c8c6 }
+.terminal-455824985-r2 { fill: #454545;font-weight: bold }
+.terminal-455824985-r3 { fill: #797979;font-weight: bold }
+.terminal-455824985-r4 { fill: #acacac;font-weight: bold }
+.terminal-455824985-r5 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- TextOpacityApp
+ TextOpacityApp
-
-
-
-
-
-
-
- text-opacity: 25%
-
-
-
-
- text-opacity: 50%
-
-
-
-
- text-opacity: 75%
-
-
-
-
- text-opacity: 100%
-
-
-
+
+
+
+
+
+
+
+ text-opacity: 25%
+
+
+
+
+ text-opacity: 50%
+
+
+
+
+ text-opacity: 75%
+
+
+
+
+ text-opacity: 100%
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style.py].svg
index 73c57898ed..f62c5f0fe2 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style.py].svg
@@ -19,134 +19,134 @@
font-weight: 700;
}
- .terminal-3276779286-matrix {
+ .terminal-2118630150-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3276779286-title {
+ .terminal-2118630150-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3276779286-r1 { fill: #eae0e0;font-weight: bold }
-.terminal-3276779286-r2 { fill: #c5c8c6 }
-.terminal-3276779286-r3 { fill: #e0e5e0;font-style: italic; }
-.terminal-3276779286-r4 { fill: #151561 }
-.terminal-3276779286-r5 { fill: #e1e1e1 }
+ .terminal-2118630150-r1 { fill: #e0e0e0;font-weight: bold }
+.terminal-2118630150-r2 { fill: #c5c8c6 }
+.terminal-2118630150-r3 { fill: #e0e0e0;font-style: italic; }
+.terminal-2118630150-r4 { fill: #0c0c59 }
+.terminal-2118630150-r5 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- TextStyleApp
+ TextStyleApp
-
-
-
- I must not fear.I must not fear.I must not fear.
-Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
-Fear is the little-death Fear is the little-death Fear is the little-death
-that brings total that brings total that brings total
-obliteration.obliteration.obliteration.
-I will face my fear.I will face my fear.I will face my fear.
-I will permit it to pass I will permit it to pass I will permit it to pass
-over me and through me.over me and through me.over me and through me.
-And when it has gone past,And when it has gone past, And when it has gone past,
-I will turn the inner eye I will turn the inner eye I will turn the inner eye
-to see its path.to see its path.to see its path.
-Where the fear has gone Where the fear has gone Where the fear has gone
-there will be nothing. there will be nothing. Onlythere will be nothing. Only
-Only I will remain.I will remain.I will remain.
-
-
-
-
-
-
-
-
-
+
+
+
+ I must not fear.I must not fear.I must not fear.
+Fear is the mind-killer.Fear is the mind-killer.Fear is the mind-killer.
+Fear is the little-death Fear is the little-death Fear is the little-death
+that brings total that brings total that brings total
+obliteration.obliteration.obliteration.
+I will face my fear.I will face my fear.I will face my fear.
+I will permit it to pass I will permit it to pass I will permit it to pass
+over me and through me.over me and through me.over me and through me.
+And when it has gone past,And when it has gone past, And when it has gone past,
+I will turn the inner eye I will turn the inner eye I will turn the inner eye
+to see its path.to see its path.to see its path.
+Where the fear has gone Where the fear has gone Where the fear has gone
+there will be nothing. there will be nothing. Onlythere will be nothing. Only
+Only I will remain.I will remain.I will remain.
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style_all.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style_all.py].svg
index 91ffb0bf99..8528c68865 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style_all.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[text_style_all.py].svg
@@ -19,138 +19,138 @@
font-weight: 700;
}
- .terminal-3629813941-matrix {
+ .terminal-2644379134-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3629813941-title {
+ .terminal-2644379134-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3629813941-r1 { fill: #e1e1e1 }
-.terminal-3629813941-r2 { fill: #c5c8c6 }
-.terminal-3629813941-r3 { fill: #e1e1e1;font-weight: bold }
-.terminal-3629813941-r4 { fill: #e1e1e1;font-style: italic; }
-.terminal-3629813941-r5 { fill: #1e1e1e }
-.terminal-3629813941-r6 { fill: #e1e1e1;text-decoration: line-through; }
-.terminal-3629813941-r7 { fill: #e1e1e1;text-decoration: underline; }
-.terminal-3629813941-r8 { fill: #e1e1e1;font-weight: bold;font-style: italic; }
-.terminal-3629813941-r9 { fill: #1e1e1e;text-decoration: line-through; }
+ .terminal-2644379134-r1 { fill: #e0e0e0 }
+.terminal-2644379134-r2 { fill: #c5c8c6 }
+.terminal-2644379134-r3 { fill: #e0e0e0;font-weight: bold }
+.terminal-2644379134-r4 { fill: #e0e0e0;font-style: italic; }
+.terminal-2644379134-r5 { fill: #121212 }
+.terminal-2644379134-r6 { fill: #e0e0e0;text-decoration: line-through; }
+.terminal-2644379134-r7 { fill: #e0e0e0;text-decoration: underline; }
+.terminal-2644379134-r8 { fill: #e0e0e0;font-weight: bold;font-style: italic; }
+.terminal-2644379134-r9 { fill: #121212;text-decoration: line-through; }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AllTextStyleApp
+ AllTextStyleApp
-
-
-
-
- nonebolditalicreverse
- I must not fear.I must not fear.I must not fear.I must not fear.
- Fear is the Fear is the Fear is the Fear is the
- mind-killer.mind-killer.mind-killer.mind-killer.
- Fear is the Fear is the Fear is the Fear is the
- little-death that little-death that little-death thatlittle-death that
- brings total brings total brings total brings total
- obliteration.obliteration.obliteration.obliteration.
- I will face my I will face my I will face my I will face my
- fear.fear.fear.fear.
-
-strikeunderlinebold italicreverse strike
-I must not fear.I must not fear.I must not fear.I must not fear.
-Fear is the Fear is the Fear is the Fear is the
-mind-killer.mind-killer.mind-killer.mind-killer.
-Fear is the Fear is the Fear is the Fear is the
-little-death thatlittle-death that little-death thatlittle-death that
-brings total brings total brings total brings total
-obliteration.obliteration.obliteration.obliteration.
-I will face my I will face my I will face my I will face my
-fear.fear.fear.fear.
-I will permit it I will permit it I will permit it I will permit it
+
+
+
+
+ nonebolditalicreverse
+ I must not fear.I must not fear.I must not fear.I must not fear.
+ Fear is the Fear is the Fear is the Fear is the
+ mind-killer.mind-killer.mind-killer.mind-killer.
+ Fear is the Fear is the Fear is the Fear is the
+ little-death that little-death that little-death thatlittle-death that
+ brings total brings total brings total brings total
+ obliteration.obliteration.obliteration.obliteration.
+ I will face my I will face my I will face my I will face my
+ fear.fear.fear.fear.
+
+strikeunderlinebold italicreverse strike
+I must not fear.I must not fear.I must not fear.I must not fear.
+Fear is the Fear is the Fear is the Fear is the
+mind-killer.mind-killer.mind-killer.mind-killer.
+Fear is the Fear is the Fear is the Fear is the
+little-death thatlittle-death that little-death thatlittle-death that
+brings total brings total brings total brings total
+obliteration.obliteration.obliteration.obliteration.
+I will face my I will face my I will face my I will face my
+fear.fear.fear.fear.
+I will permit it I will permit it I will permit it I will permit it
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[tint.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[tint.py].svg
index 1aa0ef5f57..c070deac88 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[tint.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[tint.py].svg
@@ -19,141 +19,141 @@
font-weight: 700;
}
- .terminal-2792552836-matrix {
+ .terminal-2845632122-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2792552836-title {
+ .terminal-2845632122-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2792552836-r1 { fill: #c5c8c6 }
-.terminal-2792552836-r2 { fill: #1e1e1e }
-.terminal-2792552836-r3 { fill: #000000;font-weight: bold }
-.terminal-2792552836-r4 { fill: #000c00;font-weight: bold }
-.terminal-2792552836-r5 { fill: #001900;font-weight: bold }
-.terminal-2792552836-r6 { fill: #002600;font-weight: bold }
-.terminal-2792552836-r7 { fill: #003300;font-weight: bold }
-.terminal-2792552836-r8 { fill: #004000;font-weight: bold }
-.terminal-2792552836-r9 { fill: #14191f }
-.terminal-2792552836-r10 { fill: #e1e1e1 }
-.terminal-2792552836-r11 { fill: #004c00;font-weight: bold }
-.terminal-2792552836-r12 { fill: #005900;font-weight: bold }
+ .terminal-2845632122-r1 { fill: #c5c8c6 }
+.terminal-2845632122-r2 { fill: #121212 }
+.terminal-2845632122-r3 { fill: #000000;font-weight: bold }
+.terminal-2845632122-r4 { fill: #000c00;font-weight: bold }
+.terminal-2845632122-r5 { fill: #001900;font-weight: bold }
+.terminal-2845632122-r6 { fill: #002600;font-weight: bold }
+.terminal-2845632122-r7 { fill: #003300;font-weight: bold }
+.terminal-2845632122-r8 { fill: #004000;font-weight: bold }
+.terminal-2845632122-r9 { fill: #000000 }
+.terminal-2845632122-r10 { fill: #e0e0e0 }
+.terminal-2845632122-r11 { fill: #004c00;font-weight: bold }
+.terminal-2845632122-r12 { fill: #005900;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- TintApp
+ TintApp
-
-
-
-
-tint: green 0%;
-
-
-tint: green 10%;
-
-
-tint: green 20%;
-
-
-tint: green 30%;
-
-
-tint: green 40%;
-
-
-tint: green 50%;
-▄▄
-
-tint: green 60%;
-
-
-tint: green 70%;
+
+
+
+
+tint: green 0%;
+
+
+tint: green 10%;
+
+
+tint: green 20%;
+
+
+tint: green 30%;
+
+
+tint: green 40%;
+
+
+tint: green 50%;
+▄▄
+
+tint: green 60%;
+
+
+tint: green 70%;
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility.py].svg
index c95545f629..dd217ea24d 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-3114242500-matrix {
+ .terminal-2078771544-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3114242500-title {
+ .terminal-2078771544-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3114242500-r1 { fill: #0000ff }
-.terminal-3114242500-r2 { fill: #c5c8c6 }
-.terminal-3114242500-r3 { fill: #ddeedd }
+ .terminal-2078771544-r1 { fill: #0000ff }
+.terminal-2078771544-r2 { fill: #c5c8c6 }
+.terminal-2078771544-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- VisibilityApp
+ VisibilityApp
-
+
-
- ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃Widget 1┃
-┃┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-
-
-
-
-┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
-┃Widget 3┃
-┃┃
-┃┃
-┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
-
-
-
-
-
-
-
-
+
+ ┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃Widget 1┃
+┃┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+
+
+
+
+┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
+┃Widget 3┃
+┃┃
+┃┃
+┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility_containers.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility_containers.py].svg
index 099e47db0c..22d648ba32 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility_containers.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[visibility_containers.py].svg
@@ -19,137 +19,137 @@
font-weight: 700;
}
- .terminal-1982402907-matrix {
+ .terminal-2016544061-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-1982402907-title {
+ .terminal-2016544061-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-1982402907-r1 { fill: #c5c8c6 }
-.terminal-1982402907-r2 { fill: #191118 }
-.terminal-1982402907-r3 { fill: #1b1316 }
-.terminal-1982402907-r4 { fill: #1d1717 }
-.terminal-1982402907-r5 { fill: #e1e1e1 }
-.terminal-1982402907-r6 { fill: #141e19 }
-.terminal-1982402907-r7 { fill: #121d1c }
-.terminal-1982402907-r8 { fill: #101c1d }
+ .terminal-2016544061-r1 { fill: #c5c8c6 }
+.terminal-2016544061-r2 { fill: #191118 }
+.terminal-2016544061-r3 { fill: #1b1316 }
+.terminal-2016544061-r4 { fill: #1d1717 }
+.terminal-2016544061-r5 { fill: #e0e0e0 }
+.terminal-2016544061-r6 { fill: #141e19 }
+.terminal-2016544061-r7 { fill: #121d1c }
+.terminal-2016544061-r8 { fill: #101c1d }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- VisibilityContainersApp
+ VisibilityContainersApp
-
-
-
-
-
-
-PlaceholderPlaceholderPlaceholder
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-PlaceholderPlaceholderPlaceholder
-
-
-
+
+
+
+
+
+
+PlaceholderPlaceholderPlaceholder
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+PlaceholderPlaceholderPlaceholder
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width.py].svg
index 74e4369b97..734091be53 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width.py].svg
@@ -19,132 +19,132 @@
font-weight: 700;
}
- .terminal-2620740165-matrix {
+ .terminal-4218832141-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2620740165-title {
+ .terminal-4218832141-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2620740165-r1 { fill: #ffffff }
-.terminal-2620740165-r2 { fill: #c5c8c6 }
-.terminal-2620740165-r3 { fill: #e1e1e1 }
+ .terminal-4218832141-r1 { fill: #ffffff }
+.terminal-4218832141-r2 { fill: #c5c8c6 }
+.terminal-4218832141-r3 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- WidthApp
+ WidthApp
-
-
-
- Widget
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Widget
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width_comparison.py].svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width_comparison.py].svg
index 3e5645ea23..0844d160fd 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width_comparison.py].svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_css_property[width_comparison.py].svg
@@ -19,141 +19,141 @@
font-weight: 700;
}
- .terminal-2486976152-matrix {
+ .terminal-1158165406-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2486976152-title {
+ .terminal-1158165406-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2486976152-r1 { fill: #c5c8c6 }
-.terminal-2486976152-r2 { fill: #e8e0e7 }
-.terminal-2486976152-r3 { fill: #eae3e5 }
-.terminal-2486976152-r4 { fill: #ede6e6 }
-.terminal-2486976152-r5 { fill: #efe9e4 }
-.terminal-2486976152-r6 { fill: #efeedf }
-.terminal-2486976152-r7 { fill: #e9eee5 }
-.terminal-2486976152-r8 { fill: #e4eee8 }
-.terminal-2486976152-r9 { fill: #e2edeb }
-.terminal-2486976152-r10 { fill: #dfebed }
-.terminal-2486976152-r11 { fill: #ddedf9 }
+ .terminal-1158165406-r1 { fill: #c5c8c6 }
+.terminal-1158165406-r2 { fill: #e7e0e6 }
+.terminal-1158165406-r3 { fill: #eae2e4 }
+.terminal-1158165406-r4 { fill: #ece5e5 }
+.terminal-1158165406-r5 { fill: #eee8e3 }
+.terminal-1158165406-r6 { fill: #eeeddf }
+.terminal-1158165406-r7 { fill: #e8ede4 }
+.terminal-1158165406-r8 { fill: #e3ede7 }
+.terminal-1158165406-r9 { fill: #e1eceb }
+.terminal-1158165406-r10 { fill: #dfebec }
+.terminal-1158165406-r11 { fill: #e0e0e0 }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- WidthComparisonApp
+ WidthComparisonApp
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-#cells#percent#w#h#vw#vh#auto#fr1#fr3
-
-
-
-
-
-
-
-
-
-
-
-····•····•····•····•····•····•····•····•····•····•····•····•····•····•····•····•
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#cells#percent#w#h#vw#vh#auto#fr1#fr3
+
+
+
+
+
+
+
+
+
+
+
+····•····•····•····•····•····•····•····•····•····•····•····•····•····•····•····•
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_custom_theme_with_variables.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_custom_theme_with_variables.svg
new file mode 100644
index 0000000000..b65158f504
--- /dev/null
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_custom_theme_with_variables.svg
@@ -0,0 +1,153 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ThemeApp
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
+▎▊
+▎Custom Theme▊
+▎▊
+▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_data_table_in_tabs.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_data_table_in_tabs.svg
index 4564153f55..dbce01f6df 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_data_table_in_tabs.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_data_table_in_tabs.svg
@@ -19,137 +19,135 @@
font-weight: 700;
}
- .terminal-971656130-matrix {
+ .terminal-3806950721-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-971656130-title {
+ .terminal-3806950721-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-971656130-r1 { fill: #c5c8c6 }
-.terminal-971656130-r2 { fill: #e1e1e1 }
-.terminal-971656130-r3 { fill: #e1e1e1;font-weight: bold }
-.terminal-971656130-r4 { fill: #474747 }
-.terminal-971656130-r5 { fill: #0178d4 }
-.terminal-971656130-r6 { fill: #dde6ed;font-weight: bold }
-.terminal-971656130-r7 { fill: #dde6ed }
-.terminal-971656130-r8 { fill: #211505 }
+ .terminal-3806950721-r1 { fill: #e0e0e0 }
+.terminal-3806950721-r2 { fill: #c5c8c6 }
+.terminal-3806950721-r3 { fill: #ddedf9;font-weight: bold }
+.terminal-3806950721-r4 { fill: #4f4f4f }
+.terminal-3806950721-r5 { fill: #0178d4 }
+.terminal-3806950721-r6 { fill: #e0e0e0;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- Dashboard
+ Dashboard
-
-
-
-
-Workflows
-━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
-
- Id Description Status Result Id
- 1 2 3 4
- a b c d
- fee fy fo fum
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Workflows
+━╸━━━━━━━━━╺━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
+ Id Description Status Result Id
+ 1 2 3 4
+ a b c d
+ fee fy fo fum
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_column.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_column.svg
index b2a677069f..331e80d225 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_column.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_column.svg
@@ -19,134 +19,133 @@
font-weight: 700;
}
- .terminal-2146794738-matrix {
+ .terminal-3277744308-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-2146794738-title {
+ .terminal-3277744308-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-2146794738-r1 { fill: #dde6ed;font-weight: bold }
-.terminal-2146794738-r2 { fill: #dde6ed }
-.terminal-2146794738-r3 { fill: #c5c8c6 }
-.terminal-2146794738-r4 { fill: #211505 }
-.terminal-2146794738-r5 { fill: #e1e1e1 }
+ .terminal-3277744308-r1 { fill: #e0e0e0;font-weight: bold }
+.terminal-3277744308-r2 { fill: #e0e0e0 }
+.terminal-3277744308-r3 { fill: #c5c8c6 }
+.terminal-3277744308-r4 { fill: #ddedf9;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
- AddColumn
+ AddColumn
-
-
-
- Movies No Default With Default Long Default
- Severance ABC 01234567890123456789
- Foundation ABC 01234567890123456789
- Dark Hello! ABC 01234567890123456789
- The Boys ABC 01234567890123456789
- The Last of Us ABC 01234567890123456789
- Lost in Space ABC 01234567890123456789
- Altered Carbon ABC 01234567890123456789
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+ Movies No Default With Default Long Default
+ Severance ABC 01234567890123456789
+ Foundation ABC 01234567890123456789
+ Dark Hello! ABC 01234567890123456789
+ The Boys ABC 01234567890123456789
+ The Last of Us ABC 01234567890123456789
+ Lost in Space ABC 01234567890123456789
+ Altered Carbon ABC 01234567890123456789
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_row_auto_height.svg b/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_row_auto_height.svg
index 5f362bb6f1..c2127f29ae 100644
--- a/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_row_auto_height.svg
+++ b/tests/snapshot_tests/__snapshots__/test_snapshots/test_datatable_add_row_auto_height.svg
@@ -19,134 +19,133 @@
font-weight: 700;
}
- .terminal-3912008695-matrix {
+ .terminal-22507541-matrix {
font-family: Fira Code, monospace;
font-size: 20px;
line-height: 24.4px;
font-variant-east-asian: full-width;
}
- .terminal-3912008695-title {
+ .terminal-22507541-title {
font-size: 18px;
font-weight: bold;
font-family: arial;
}
- .terminal-3912008695-r1 { fill: #dde6ed;font-weight: bold }
-.terminal-3912008695-r2 { fill: #dde6ed }
-.terminal-3912008695-r3 { fill: #c5c8c6 }
-.terminal-3912008695-r4 { fill: #211505 }
-.terminal-3912008695-r5 { fill: #e1e1e1 }
+ .terminal-22507541-r1 { fill: #e0e0e0;font-weight: bold }
+.terminal-22507541-r2 { fill: #e0e0e0 }
+.terminal-22507541-r3 { fill: #c5c8c6 }
+.terminal-22507541-r4 { fill: #ddedf9;font-weight: bold }
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+