diff --git a/CHANGELOG.md b/CHANGELOG.md index e9c9c20041..90ba3e1436 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Breaking change: The `@on` decorator will now match a message class and any child classes https://github.com/Textualize/textual/pull/2746 +- Breaking change: Styles update to checkbox, radiobutton, OptionList, Select, SelectionList, Switch https://github.com/Textualize/textual/pull/2777 ## [0.27.0] - 2023-06-01 diff --git a/docs/examples/widgets/checkbox.css b/docs/examples/widgets/checkbox.css index b6e17c093e..d1b09295ba 100644 --- a/docs/examples/widgets/checkbox.css +++ b/docs/examples/widgets/checkbox.css @@ -5,7 +5,6 @@ Screen { VerticalScroll { width: auto; height: auto; - border: solid $primary; - background: $panel; + background: $boost; padding: 2; } diff --git a/docs/examples/widgets/option_list.css b/docs/examples/widgets/option_list.css index cc1b7365f5..20c4d44022 100644 --- a/docs/examples/widgets/option_list.css +++ b/docs/examples/widgets/option_list.css @@ -3,8 +3,6 @@ Screen { } OptionList { - background: $panel; - border: round $primary; width: 70%; - height: 70%; + height: 80%; } diff --git a/src/textual/pilot.py b/src/textual/pilot.py index 64cd602bf2..a94b41a908 100644 --- a/src/textual/pilot.py +++ b/src/textual/pilot.py @@ -26,7 +26,7 @@ def _get_mouse_message_arguments( control: bool = False, ) -> dict[str, Any]: """Get the arguments to pass into mouse messages for the click and hover methods.""" - click_x, click_y, _, _ = target.region.translate(offset) + click_x, click_y = target.region.offset + offset message_arguments = { "x": click_x, "y": click_y, @@ -134,6 +134,7 @@ async def hover( message_arguments = _get_mouse_message_arguments( target_widget, offset, button=0 ) + await self.pause() app.post_message(MouseMove(**message_arguments)) await self.pause() diff --git a/src/textual/widgets/_option_list.py b/src/textual/widgets/_option_list.py index 65fd77470d..d010ac645d 100644 --- a/src/textual/widgets/_option_list.py +++ b/src/textual/widgets/_option_list.py @@ -172,9 +172,17 @@ class OptionList(ScrollView, can_focus=True): DEFAULT_CSS = """ OptionList { - background: $panel-lighten-1; + height: auto; + background: $boost; color: $text; overflow-x: hidden; + border: tall transparent; + padding: 0 1; + } + + OptionList:focus { + border: tall $accent; + } OptionList > .option-list--separator { @@ -182,7 +190,6 @@ class OptionList(ScrollView, can_focus=True): } OptionList > .option-list--option-highlighted { - background: $accent 50%; color: $text; text-style: bold; } @@ -197,11 +204,11 @@ class OptionList(ScrollView, can_focus=True): OptionList > .option-list--option-highlighted-disabled { color: $text-disabled; - background: $accent 30%; + background: $accent 20%; } OptionList:focus > .option-list--option-highlighted-disabled { - background: $accent 40%; + background: $accent 30%; } OptionList > .option-list--option-hover { @@ -401,6 +408,7 @@ def _on_mouse_move(self, event: MouseMove) -> None: Args: event: The mouse movement event. """ + print(event, event.style.meta) self._mouse_hovering_over = event.style.meta.get("option") def _on_leave(self, _: Leave) -> None: diff --git a/src/textual/widgets/_radio_set.py b/src/textual/widgets/_radio_set.py index b3c98aec06..3a0ee116bf 100644 --- a/src/textual/widgets/_radio_set.py +++ b/src/textual/widgets/_radio_set.py @@ -25,23 +25,27 @@ class RadioSet(Container, can_focus=True, can_focus_children=False): DEFAULT_CSS = """ RadioSet { - border: round #666; + border: tall transparent; + background: $boost; + padding: 0 1 0 0; height: auto; width: auto; } RadioSet:focus { - border: round $accent; - } - - App.-light-mode RadioSet { - border: round #CCC; + 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 > * { + background: transparent; + border: none; + padding: 0 1; + } + RadioSet:focus > RadioButton.-selected > .toggle--label { text-style: underline; } diff --git a/src/textual/widgets/_select.py b/src/textual/widgets/_select.py index ce667f526c..90e6f18411 100644 --- a/src/textual/widgets/_select.py +++ b/src/textual/widgets/_select.py @@ -32,6 +32,9 @@ class SelectOverlay(OptionList): width: 100%; padding: 0 1; } + SelectOverlay:focus { + border: tall $background; + } SelectOverlay > .option-list--option { padding: 0 1; } @@ -79,7 +82,7 @@ class SelectCurrent(Horizontal): DEFAULT_CSS = """ SelectCurrent { - border: tall $background; + border: tall transparent; background: $boost; color: $text; width: 100%; diff --git a/src/textual/widgets/_selection_list.py b/src/textual/widgets/_selection_list.py index 556e4732d9..4c02a13073 100644 --- a/src/textual/widgets/_selection_list.py +++ b/src/textual/widgets/_selection_list.py @@ -93,6 +93,22 @@ class SelectionList(Generic[SelectionType], OptionList): """ DEFAULT_CSS = """ + SelectionList { + height: auto; + } + + .-light-mode SelectionList:focus > .selection-list--button-selected { + color: $primary; + } + + .-light-mode SelectionList > .selection-list--button-selected-highlighted { + color: $primary; + } + + .-light-mode SelectionList:focus > .selection-list--button-selected-highlighted { + color: $primary; + } + SelectionList > .selection-list--button { text-style: bold; background: $foreground 15%; @@ -115,7 +131,6 @@ class SelectionList(Generic[SelectionType], OptionList): SelectionList > .selection-list--button-selected { text-style: bold; - background: $foreground 15%; } SelectionList:focus > .selection-list--button-selected { diff --git a/src/textual/widgets/_switch.py b/src/textual/widgets/_switch.py index e66acd1d8d..d19ee168e0 100644 --- a/src/textual/widgets/_switch.py +++ b/src/textual/widgets/_switch.py @@ -46,7 +46,7 @@ class Switch(Widget, can_focus=True): DEFAULT_CSS = """ Switch { border: tall transparent; - background: $panel; + background: $boost; height: auto; width: auto; padding: 0 2; diff --git a/src/textual/widgets/_toggle_button.py b/src/textual/widgets/_toggle_button.py index 30f23e1781..cb9b959012 100644 --- a/src/textual/widgets/_toggle_button.py +++ b/src/textual/widgets/_toggle_button.py @@ -54,6 +54,13 @@ class ToggleButton(Static, can_focus=True): DEFAULT_CSS = """ ToggleButton { width: auto; + border: tall transparent; + padding: 0 1; + background: $boost; + } + + ToggleButton:focus { + border: tall $accent; } ToggleButton:hover { diff --git a/tests/option_list/test_option_list_mouse_hover.py b/tests/option_list/test_option_list_mouse_hover.py index 33aec34ab4..73c6ef84b5 100644 --- a/tests/option_list/test_option_list_mouse_hover.py +++ b/tests/option_list/test_option_list_mouse_hover.py @@ -28,7 +28,7 @@ async def test_no_hover() -> None: async def test_hover_highlight() -> None: """The mouse hover value should react to the mouse hover over a highlighted option.""" async with OptionListApp().run_test() as pilot: - await pilot.hover(OptionList) + await pilot.hover(OptionList, Offset(2, 1)) option_list = pilot.app.query_one(OptionList) assert option_list._mouse_hovering_over == 0 assert option_list._mouse_hovering_over == option_list.highlighted @@ -37,7 +37,7 @@ async def test_hover_highlight() -> None: async def test_hover_no_highlight() -> None: """The mouse hover value should react to the mouse hover over a non-highlighted option.""" async with OptionListApp().run_test() as pilot: - await pilot.hover(OptionList, Offset(1, 1)) + await pilot.hover(OptionList, Offset(1, 1) + Offset(2, 1)) option_list = pilot.app.query_one(OptionList) assert option_list._mouse_hovering_over == 1 assert option_list._mouse_hovering_over != option_list.highlighted @@ -46,7 +46,7 @@ async def test_hover_no_highlight() -> None: async def test_hover_disabled() -> None: """The mouse hover value should react to the mouse hover over a disabled option.""" async with OptionListApp().run_test() as pilot: - await pilot.hover(OptionList, Offset(1, 3)) + await pilot.hover(OptionList, Offset(1, 3) + Offset(2, 1)) option_list = pilot.app.query_one(OptionList) assert option_list._mouse_hovering_over == 3 assert option_list.get_option_at_index( @@ -58,7 +58,7 @@ async def test_hover_disabled() -> None: async def test_hover_then_leave() -> None: """After a mouse has been over an OptionList and left _mouse_hovering_over should be None again.""" async with OptionListApp().run_test() as pilot: - await pilot.hover(OptionList) + await pilot.hover(OptionList, Offset(2, 1)) option_list = pilot.app.query_one(OptionList) assert option_list._mouse_hovering_over == 0 await pilot.hover(Label) diff --git a/tests/option_list/test_option_messages.py b/tests/option_list/test_option_messages.py index d76d2f8976..e66debc458 100644 --- a/tests/option_list/test_option_messages.py +++ b/tests/option_list/test_option_messages.py @@ -105,7 +105,7 @@ async def test_click_option_with_mouse() -> None: """Clicking on an option via the mouse should result in highlight and select messages.""" async with OptionListApp().run_test() as pilot: assert isinstance(pilot.app, OptionListApp) - await pilot.click(OptionList, Offset(1, 1)) + await pilot.click(OptionList, Offset(2, 2)) assert pilot.app.messages[1:] == [ ("OptionHighlighted", "1", 1), ("OptionSelected", "1", 1), diff --git a/tests/snapshot_tests/__snapshots__/test_snapshots.ambr b/tests/snapshot_tests/__snapshots__/test_snapshots.ambr index b2f1bfe8c5..ec59fef9c5 100644 --- a/tests/snapshot_tests/__snapshots__/test_snapshots.ambr +++ b/tests/snapshot_tests/__snapshots__/test_snapshots.ambr @@ -1401,141 +1401,143 @@ font-weight: 700; } - .terminal-2118990000-matrix { + .terminal-1541091233-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2118990000-title { + .terminal-1541091233-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2118990000-r1 { fill: #e1e1e1 } - .terminal-2118990000-r2 { fill: #c5c8c6 } - .terminal-2118990000-r3 { fill: #004578 } - .terminal-2118990000-r4 { fill: #42464b } - .terminal-2118990000-r5 { fill: #24292f;font-weight: bold } - .terminal-2118990000-r6 { fill: #e2e3e3 } - .terminal-2118990000-r7 { fill: #e2e3e3;font-weight: bold } - .terminal-2118990000-r8 { fill: #98729f } - .terminal-2118990000-r9 { fill: #4ebf71;font-weight: bold } - .terminal-2118990000-r10 { fill: #565a5e } - .terminal-2118990000-r11 { fill: #e2e3e3;text-decoration: underline; } + .terminal-1541091233-r1 { fill: #e1e1e1 } + .terminal-1541091233-r2 { fill: #c5c8c6 } + .terminal-1541091233-r3 { fill: #262626 } + .terminal-1541091233-r4 { fill: #4a4a4a } + .terminal-1541091233-r5 { fill: #2e2e2e;font-weight: bold } + .terminal-1541091233-r6 { fill: #e3e3e3 } + .terminal-1541091233-r7 { fill: #e3e3e3;font-weight: bold } + .terminal-1541091233-r8 { fill: #98729f } + .terminal-1541091233-r9 { fill: #4ebf71;font-weight: bold } + .terminal-1541091233-r10 { fill: #0178d4 } + .terminal-1541091233-r11 { fill: #14191f } + .terminal-1541091233-r12 { fill: #5d5d5d } + .terminal-1541091233-r13 { fill: #e3e3e3;text-decoration: underline; } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - CheckboxApp + CheckboxApp - - - - - - - - - ─────────────────── - - - XArrakis 😓 - XCaladan - XChusuk - XGiedi Prime - XGinaz - XGrumman - XKaitain - XNovebruns - - - ─────────────────── - - - - - + + + + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + XArrakis 😓 + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔▔ + XCaladan + ▁▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔ + XChusuk + ▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + XGiedi Prime + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔ + XGinaz + ▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔▔ + XGrumman + ▁▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔▔▃▃ + XKaitain + ▁▁▁▁▁▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ @@ -14590,139 +14592,141 @@ font-weight: 700; } - .terminal-3253336215-matrix { + .terminal-3279266708-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3253336215-title { + .terminal-3279266708-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3253336215-r1 { fill: #3d3d3d } - .terminal-3253336215-r2 { fill: #1e1e1e;font-weight: bold } - .terminal-3253336215-r3 { fill: #e1e1e1 } - .terminal-3253336215-r4 { fill: #c5c8c6 } - .terminal-3253336215-r5 { fill: #23568b } - .terminal-3253336215-r6 { fill: #ddedf9 } + .terminal-3279266708-r1 { fill: #1e1e1e } + .terminal-3279266708-r2 { fill: #e1e1e1 } + .terminal-3279266708-r3 { fill: #c5c8c6 } + .terminal-3279266708-r4 { fill: #434343 } + .terminal-3279266708-r5 { fill: #262626;font-weight: bold } + .terminal-3279266708-r6 { fill: #e2e2e2 } + .terminal-3279266708-r7 { fill: #23568b } + .terminal-3279266708-r8 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - ScrollOffByOne + ScrollOffByOne - - - - X76 - X77 - X78 - X79 - X80 - X81 - X82 - X83 - X84 - X85 - X86 - X87 - X88 - X89 - X90 - X91 - X92 - X93 - X94▂▂ - X95 - X96 - X97 - X98 - X99 + + + + ▔▔▔▔▔▔▔▔ + X92 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X93 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X94 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X95 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X96 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X97 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X98 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X99▁▁ + ▁▁▁▁▁▁▁▁ @@ -19543,135 +19547,137 @@ font-weight: 700; } - .terminal-1891986877-matrix { + .terminal-72094857-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1891986877-title { + .terminal-72094857-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1891986877-r1 { fill: #ddedf9;font-weight: bold } - .terminal-1891986877-r2 { fill: #e1e9ef;font-weight: bold } - .terminal-1891986877-r3 { fill: #c5c8c6 } - .terminal-1891986877-r4 { fill: #e4e5e6 } - .terminal-1891986877-r5 { fill: #4f5459 } - .terminal-1891986877-r6 { fill: #cc555a } + .terminal-72094857-r1 { fill: #1e1e1e } + .terminal-72094857-r2 { fill: #0178d4 } + .terminal-72094857-r3 { fill: #c5c8c6 } + .terminal-72094857-r4 { fill: #ddedf9;font-weight: bold } + .terminal-72094857-r5 { fill: #e2e2e2;font-weight: bold } + .terminal-72094857-r6 { fill: #e2e2e2 } + .terminal-72094857-r7 { fill: #434343 } + .terminal-72094857-r8 { fill: #cc555a } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - OptionListApp + OptionListApp - - - - OneOneOne - TwoTwoTwo - ──────────────────────────────────────────────────────────────────────────────── - ThreeThreeThree - - - - - - - - - - - - - - - - - - - + + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + OneOneOne + TwoTwoTwo + ──────────────────────────────────────────────────────────────────── + ThreeThreeThree + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + + + + + + + + + + + + + + + + @@ -19702,139 +19708,140 @@ font-weight: 700; } - .terminal-2312905855-matrix { + .terminal-371403050-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-2312905855-title { + .terminal-371403050-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-2312905855-r1 { fill: #c5c8c6 } - .terminal-2312905855-r2 { fill: #e3e3e3 } - .terminal-2312905855-r3 { fill: #e1e1e1 } - .terminal-2312905855-r4 { fill: #004578 } - .terminal-2312905855-r5 { fill: #ddedf9;font-weight: bold } - .terminal-2312905855-r6 { fill: #e2e3e3 } - .terminal-2312905855-r7 { fill: #42464b } - .terminal-2312905855-r8 { fill: #777a7e } - .terminal-2312905855-r9 { fill: #14191f } - .terminal-2312905855-r10 { fill: #ddedf9 } + .terminal-371403050-r1 { fill: #c5c8c6 } + .terminal-371403050-r2 { fill: #e3e3e3 } + .terminal-371403050-r3 { fill: #e1e1e1 } + .terminal-371403050-r4 { fill: #1e1e1e } + .terminal-371403050-r5 { fill: #0178d4 } + .terminal-371403050-r6 { fill: #ddedf9;font-weight: bold } + .terminal-371403050-r7 { fill: #e2e2e2 } + .terminal-371403050-r8 { fill: #434343 } + .terminal-371403050-r9 { fill: #787878 } + .terminal-371403050-r10 { fill: #14191f } + .terminal-371403050-r11 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - OptionListApp + OptionListApp - - - - OptionListApp - - - - ────────────────────────────────────────────────────── - Aerilon - Aquaria - ──────────────────────────────────────────────────── - Canceron - Caprica - ──────────────────────────────────────────────────── - Gemenon - ──────────────────────────────────────────────────── - Leonis - Libran - ────────────────────────────────────────────────────▅▅ - Picon - ──────────────────────────────────────────────────── - Sagittaron - ────────────────────────────────────────────────────── - - - + + + + OptionListApp + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + Aerilon + Aquaria + ─────────────────────────────────────────────────── + Canceron + Caprica + ─────────────────────────────────────────────────── + Gemenon + ─────────────────────────────────────────────────── + Leonis + Libran + ─────────────────────────────────────────────────── + Picon + ─────────────────────────────────────────────────── + Sagittaron▄▄ + Scorpia + ─────────────────────────────────────────────────── + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + @@ -19865,136 +19872,137 @@ font-weight: 700; } - .terminal-4119903855-matrix { + .terminal-2341816165-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4119903855-title { + .terminal-2341816165-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4119903855-r1 { fill: #c5c8c6 } - .terminal-4119903855-r2 { fill: #e3e3e3 } - .terminal-4119903855-r3 { fill: #e1e1e1 } - .terminal-4119903855-r4 { fill: #004578 } - .terminal-4119903855-r5 { fill: #ddedf9;font-weight: bold } - .terminal-4119903855-r6 { fill: #e2e3e3 } - .terminal-4119903855-r7 { fill: #ddedf9 } + .terminal-2341816165-r1 { fill: #c5c8c6 } + .terminal-2341816165-r2 { fill: #e3e3e3 } + .terminal-2341816165-r3 { fill: #e1e1e1 } + .terminal-2341816165-r4 { fill: #1e1e1e } + .terminal-2341816165-r5 { fill: #0178d4 } + .terminal-2341816165-r6 { fill: #ddedf9;font-weight: bold } + .terminal-2341816165-r7 { fill: #e2e2e2 } + .terminal-2341816165-r8 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - OptionListApp + OptionListApp - - - - OptionListApp - - - - ────────────────────────────────────────────────────── - Aerilon - Aquaria - Canceron - Caprica - Gemenon - Leonis - Libran - Picon - Sagittaron - Scorpia - Tauron - Virgon - - - ────────────────────────────────────────────────────── - - - + + + + OptionListApp + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + Aerilon + Aquaria + Canceron + Caprica + Gemenon + Leonis + Libran + Picon + Sagittaron + Scorpia + Tauron + Virgon + + + + + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + @@ -20025,140 +20033,141 @@ font-weight: 700; } - .terminal-3932700002-matrix { + .terminal-228828675-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3932700002-title { + .terminal-228828675-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3932700002-r1 { fill: #c5c8c6 } - .terminal-3932700002-r2 { fill: #e3e3e3 } - .terminal-3932700002-r3 { fill: #e1e1e1 } - .terminal-3932700002-r4 { fill: #004578 } - .terminal-3932700002-r5 { fill: #ddedf9;font-weight: bold;font-style: italic; } - .terminal-3932700002-r6 { fill: #e2e3e3 } - .terminal-3932700002-r7 { fill: #ddedf9;font-weight: bold } - .terminal-3932700002-r8 { fill: #14191f } - .terminal-3932700002-r9 { fill: #e2e3e3;font-style: italic; } - .terminal-3932700002-r10 { fill: #e2e3e3;font-weight: bold } - .terminal-3932700002-r11 { fill: #ddedf9 } + .terminal-228828675-r1 { fill: #c5c8c6 } + .terminal-228828675-r2 { fill: #e3e3e3 } + .terminal-228828675-r3 { fill: #e1e1e1 } + .terminal-228828675-r4 { fill: #1e1e1e } + .terminal-228828675-r5 { fill: #0178d4 } + .terminal-228828675-r6 { fill: #ddedf9;font-weight: bold;font-style: italic; } + .terminal-228828675-r7 { fill: #e2e2e2 } + .terminal-228828675-r8 { fill: #ddedf9;font-weight: bold } + .terminal-228828675-r9 { fill: #14191f } + .terminal-228828675-r10 { fill: #e2e2e2;font-style: italic; } + .terminal-228828675-r11 { fill: #e2e2e2;font-weight: bold } + .terminal-228828675-r12 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - OptionListApp + OptionListApp - - - - OptionListApp - - - - ────────────────────────────────────────────────────── -                   Data for Aerilon                   - ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ - Patron God   Population    Capital City   ▂▂ - ┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ - Demeter      1.2 Billion   Gaoth           - └───────────────┴────────────────┴─────────────────┘ -                   Data for Aquaria                   - ┏━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ - Patron God    Population   Capital City    - ┡━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ - Hermes        75,000       None            - └────────────────┴───────────────┴─────────────────┘ -                  Data for Canceron                   - ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ - ────────────────────────────────────────────────────── - - - + + + + OptionListApp + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +                  Data for Aerilon                   + ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ + Patron God   Population    Capital City   + ┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩▃▃ + Demeter      1.2 Billion   Gaoth          + └───────────────┴────────────────┴────────────────┘ +                  Data for Aquaria                   + ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┓ + Patron God   Population   Capital City    + ┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━┩ + Hermes       75,000       None            + └───────────────┴───────────────┴─────────────────┘ +                  Data for Canceron                  + ┏━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┓ + Patron God   Population    Capital City   + ┡━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━┩ + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + @@ -21945,137 +21954,139 @@ font-weight: 700; } - .terminal-1099969603-matrix { + .terminal-3235965674-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1099969603-title { + .terminal-3235965674-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1099969603-r1 { fill: #e1e1e1 } - .terminal-1099969603-r2 { fill: #c5c8c6 } - .terminal-1099969603-r3 { fill: #0178d4 } - .terminal-1099969603-r4 { fill: #515151 } - .terminal-1099969603-r5 { fill: #1e1e1e;font-weight: bold } - .terminal-1099969603-r6 { fill: #e1e1e1;text-decoration: underline; } - .terminal-1099969603-r7 { fill: #3d3d3d } - .terminal-1099969603-r8 { fill: #4ebf71;font-weight: bold } + .terminal-3235965674-r1 { fill: #e1e1e1 } + .terminal-3235965674-r2 { fill: #c5c8c6 } + .terminal-3235965674-r3 { fill: #1e1e1e } + .terminal-3235965674-r4 { fill: #0178d4 } + .terminal-3235965674-r5 { fill: #575757 } + .terminal-3235965674-r6 { fill: #262626;font-weight: bold } + .terminal-3235965674-r7 { fill: #e2e2e2 } + .terminal-3235965674-r8 { fill: #e2e2e2;text-decoration: underline; } + .terminal-3235965674-r9 { fill: #434343 } + .terminal-3235965674-r10 { fill: #4ebf71;font-weight: bold } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - RadioChoicesApp + RadioChoicesApp - - - - - - - - - - ─────────────────────────────────────── - Battlestar Galactica - Dune 1984 - Dune 2021 - Serenity - Star Trek: The Motion Picture - Star Wars: A New Hope - The Last Starfighter - Total Recall 👉 🔴 - Wing Commander - ─────────────────────────────────────── - - - - - - + + + + + + + + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + Battlestar Galactica + Dune 1984 + Dune 2021 + Serenity + Star Trek: The Motion Picture + Star Wars: A New Hope + The Last Starfighter + Total Recall 👉 🔴 + Wing Commander + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + + + + + @@ -22106,139 +22117,140 @@ font-weight: 700; } - .terminal-4163780602-matrix { + .terminal-2849727264-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-4163780602-title { + .terminal-2849727264-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-4163780602-r1 { fill: #e1e1e1 } - .terminal-4163780602-r2 { fill: #c5c8c6 } - .terminal-4163780602-r3 { fill: #0178d4 } - .terminal-4163780602-r4 { fill: #666666 } - .terminal-4163780602-r5 { fill: #515151 } - .terminal-4163780602-r6 { fill: #1e1e1e;font-weight: bold } - .terminal-4163780602-r7 { fill: #e1e1e1;text-decoration: underline; } - .terminal-4163780602-r8 { fill: #3d3d3d } - .terminal-4163780602-r9 { fill: #4ebf71;font-weight: bold } - .terminal-4163780602-r10 { fill: #cc555a;font-weight: bold;font-style: italic; } + .terminal-2849727264-r1 { fill: #e1e1e1 } + .terminal-2849727264-r2 { fill: #c5c8c6 } + .terminal-2849727264-r3 { fill: #1e1e1e } + .terminal-2849727264-r4 { fill: #0178d4 } + .terminal-2849727264-r5 { fill: #575757 } + .terminal-2849727264-r6 { fill: #262626;font-weight: bold } + .terminal-2849727264-r7 { fill: #e2e2e2 } + .terminal-2849727264-r8 { fill: #e2e2e2;text-decoration: underline; } + .terminal-2849727264-r9 { fill: #434343 } + .terminal-2849727264-r10 { fill: #4ebf71;font-weight: bold } + .terminal-2849727264-r11 { fill: #cc555a;font-weight: bold;font-style: italic; } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - RadioChoicesApp + RadioChoicesApp - - - - - - - - - - ────────────────────────────────────────────────────────────────────── - Battlestar GalacticaAmanda - Dune 1984Connor MacLeod - Dune 2021Duncan MacLeod - SerenityHeather MacLeod - Star Trek: The Motion PictureJoe Dawson - Star Wars: A New HopeKurgan, The - The Last StarfighterMethos - Total Recall 👉 🔴Rachel Ellenstein - Wing CommanderRamírez - ────────────────────────────────────────────────────────────────────── - - - - - - + + + + + + + + + + ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ + Battlestar GalacticaAmanda + Dune 1984Connor MacLeod + Dune 2021Duncan MacLeod + SerenityHeather MacLeod + Star Trek: The Motion PictureJoe Dawson + Star Wars: A New HopeKurgan, The + The Last StarfighterMethos + Total Recall 👉 🔴Rachel Ellenstein + Wing CommanderRamírez + ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁ + + + + + + @@ -22587,140 +22599,142 @@ font-weight: 700; } - .terminal-1594050745-matrix { + .terminal-2367026169-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-1594050745-title { + .terminal-2367026169-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-1594050745-r1 { fill: #3d3d3d } - .terminal-1594050745-r2 { fill: #1e1e1e;font-weight: bold } - .terminal-1594050745-r3 { fill: #e1e1e1 } - .terminal-1594050745-r4 { fill: #c5c8c6 } - .terminal-1594050745-r5 { fill: #23568b } - .terminal-1594050745-r6 { fill: #14191f } - .terminal-1594050745-r7 { fill: #ddedf9 } + .terminal-2367026169-r1 { fill: #1e1e1e } + .terminal-2367026169-r2 { fill: #c5c8c6 } + .terminal-2367026169-r3 { fill: #434343 } + .terminal-2367026169-r4 { fill: #262626;font-weight: bold } + .terminal-2367026169-r5 { fill: #e2e2e2 } + .terminal-2367026169-r6 { fill: #e1e1e1 } + .terminal-2367026169-r7 { fill: #23568b } + .terminal-2367026169-r8 { fill: #14191f } + .terminal-2367026169-r9 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - ScrollOffByOne + ScrollOffByOne - - - - X27 - X28 - X29 - X30 - X31 - X32 - X33▄▄ - X34 - X35 - X36 - X37 - X38 - X39▂▂ - X40 - X41 - X42 - X43 - X44 - X45 - X46 - X47 - X48 - X49 - X50 + + + + X43 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X44 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X45 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X46 + ▁▁▁▁▁▁▁▁▃▃ + ▔▔▔▔▔▔▔▔ + X47▂▂ + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X48 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X49 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + X50 + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ @@ -23872,141 +23886,141 @@ font-weight: 700; } - .terminal-3781955182-matrix { + .terminal-627774835-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3781955182-title { + .terminal-627774835-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3781955182-r1 { fill: #c5c8c6 } - .terminal-3781955182-r2 { fill: #e3e3e3 } - .terminal-3781955182-r3 { fill: #e1e1e1 } - .terminal-3781955182-r4 { fill: #0178d4 } - .terminal-3781955182-r5 { fill: #e1e1e1;font-weight: bold } - .terminal-3781955182-r6 { fill: #62666a } - .terminal-3781955182-r7 { fill: #4ebf71;font-weight: bold } - .terminal-3781955182-r8 { fill: #ddedf9;font-weight: bold } - .terminal-3781955182-r9 { fill: #98a84b } - .terminal-3781955182-r10 { fill: #34393f;font-weight: bold } - .terminal-3781955182-r11 { fill: #e4e5e6 } - .terminal-3781955182-r12 { fill: #ddedf9 } + .terminal-627774835-r1 { fill: #c5c8c6 } + .terminal-627774835-r2 { fill: #e3e3e3 } + .terminal-627774835-r3 { fill: #e1e1e1 } + .terminal-627774835-r4 { fill: #0178d4 } + .terminal-627774835-r5 { fill: #e1e1e1;font-weight: bold } + .terminal-627774835-r6 { fill: #575757 } + .terminal-627774835-r7 { fill: #4ebf71;font-weight: bold } + .terminal-627774835-r8 { fill: #ddedf9;font-weight: bold } + .terminal-627774835-r9 { fill: #98a84b } + .terminal-627774835-r10 { fill: #262626;font-weight: bold } + .terminal-627774835-r11 { fill: #e2e2e2 } + .terminal-627774835-r12 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - SelectionListApp + SelectionListApp - - - - SelectionListApp - - -  Shall we play some games? ── Selected games ───────────── - [ - XFalken's Maze'secret_back_door', - XBlack Jack'a_nice_game_of_chess', - XGin Rummy'fighter_combat' - XHearts] - XBridge────────────────────────────── - XCheckers - XChess - XPoker - XFighter Combat - - - - - - ────────────────────────────── - - - + + + + SelectionListApp + + +  Shall we play some games? ── Selected games ───────────── + [ + XFalken's Maze'secret_back_door', + XBlack Jack'a_nice_game_of_chess', + XGin Rummy'fighter_combat' + XHearts] + XBridge────────────────────────────── + XCheckers + XChess + XPoker + XFighter Combat + + ────────────────────────────── + + + + + + + @@ -24037,139 +24051,139 @@ font-weight: 700; } - .terminal-3782657965-matrix { + .terminal-575251527-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3782657965-title { + .terminal-575251527-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3782657965-r1 { fill: #c5c8c6 } - .terminal-3782657965-r2 { fill: #e3e3e3 } - .terminal-3782657965-r3 { fill: #e1e1e1 } - .terminal-3782657965-r4 { fill: #0178d4 } - .terminal-3782657965-r5 { fill: #62666a } - .terminal-3782657965-r6 { fill: #4ebf71;font-weight: bold } - .terminal-3782657965-r7 { fill: #ddedf9;font-weight: bold } - .terminal-3782657965-r8 { fill: #34393f;font-weight: bold } - .terminal-3782657965-r9 { fill: #e4e5e6 } - .terminal-3782657965-r10 { fill: #ddedf9 } + .terminal-575251527-r1 { fill: #c5c8c6 } + .terminal-575251527-r2 { fill: #e3e3e3 } + .terminal-575251527-r3 { fill: #e1e1e1 } + .terminal-575251527-r4 { fill: #0178d4 } + .terminal-575251527-r5 { fill: #575757 } + .terminal-575251527-r6 { fill: #4ebf71;font-weight: bold } + .terminal-575251527-r7 { fill: #ddedf9;font-weight: bold } + .terminal-575251527-r8 { fill: #262626;font-weight: bold } + .terminal-575251527-r9 { fill: #e2e2e2 } + .terminal-575251527-r10 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - SelectionListApp + SelectionListApp - - - - SelectionListApp - - -  Shall we play some games? ────────────────────────────────── - - XFalken's Maze - XBlack Jack - XGin Rummy - XHearts - XBridge - XCheckers - XChess - XPoker - XFighter Combat - - - - - - - ────────────────────────────────────────────────────────────── - - + + + + SelectionListApp + + +  Shall we play some games? ────────────────────────────────── + + XFalken's Maze + XBlack Jack + XGin Rummy + XHearts + XBridge + XCheckers + XChess + XPoker + XFighter Combat + + + + + + + ────────────────────────────────────────────────────────────── + + @@ -24200,139 +24214,139 @@ font-weight: 700; } - .terminal-3782657965-matrix { + .terminal-575251527-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3782657965-title { + .terminal-575251527-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3782657965-r1 { fill: #c5c8c6 } - .terminal-3782657965-r2 { fill: #e3e3e3 } - .terminal-3782657965-r3 { fill: #e1e1e1 } - .terminal-3782657965-r4 { fill: #0178d4 } - .terminal-3782657965-r5 { fill: #62666a } - .terminal-3782657965-r6 { fill: #4ebf71;font-weight: bold } - .terminal-3782657965-r7 { fill: #ddedf9;font-weight: bold } - .terminal-3782657965-r8 { fill: #34393f;font-weight: bold } - .terminal-3782657965-r9 { fill: #e4e5e6 } - .terminal-3782657965-r10 { fill: #ddedf9 } + .terminal-575251527-r1 { fill: #c5c8c6 } + .terminal-575251527-r2 { fill: #e3e3e3 } + .terminal-575251527-r3 { fill: #e1e1e1 } + .terminal-575251527-r4 { fill: #0178d4 } + .terminal-575251527-r5 { fill: #575757 } + .terminal-575251527-r6 { fill: #4ebf71;font-weight: bold } + .terminal-575251527-r7 { fill: #ddedf9;font-weight: bold } + .terminal-575251527-r8 { fill: #262626;font-weight: bold } + .terminal-575251527-r9 { fill: #e2e2e2 } + .terminal-575251527-r10 { fill: #ddedf9 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - SelectionListApp + SelectionListApp - - - - SelectionListApp - - -  Shall we play some games? ────────────────────────────────── - - XFalken's Maze - XBlack Jack - XGin Rummy - XHearts - XBridge - XCheckers - XChess - XPoker - XFighter Combat - - - - - - - ────────────────────────────────────────────────────────────── - - + + + + SelectionListApp + + +  Shall we play some games? ────────────────────────────────── + + XFalken's Maze + XBlack Jack + XGin Rummy + XHearts + XBridge + XCheckers + XChess + XPoker + XFighter Combat + + + + + + + ────────────────────────────────────────────────────────────── + + @@ -25310,136 +25324,136 @@ font-weight: 700; } - .terminal-3771425298-matrix { + .terminal-333537270-matrix { font-family: Fira Code, monospace; font-size: 20px; line-height: 24.4px; font-variant-east-asian: full-width; } - .terminal-3771425298-title { + .terminal-333537270-title { font-size: 18px; font-weight: bold; font-family: arial; } - .terminal-3771425298-r1 { fill: #e1e1e1 } - .terminal-3771425298-r2 { fill: #c5c8c6 } - .terminal-3771425298-r3 { fill: #e1e1e1;font-weight: bold } - .terminal-3771425298-r4 { fill: #1e1e1e } - .terminal-3771425298-r5 { fill: #0178d4 } - .terminal-3771425298-r6 { fill: #e2e3e3 } - .terminal-3771425298-r7 { fill: #e3e8e8 } + .terminal-333537270-r1 { fill: #e1e1e1 } + .terminal-333537270-r2 { fill: #c5c8c6 } + .terminal-333537270-r3 { fill: #e1e1e1;font-weight: bold } + .terminal-333537270-r4 { fill: #1e1e1e } + .terminal-333537270-r5 { fill: #0178d4 } + .terminal-333537270-r6 { fill: #e2e2e2 } + .terminal-333537270-r7 { fill: #e3e8e8 } - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - SwitchApp + SwitchApp - - - - - - - - Example switches - - - ▔▔▔▔▔▔▔▔ - off:      - ▁▁▁▁▁▁▁▁ - ▔▔▔▔▔▔▔▔ - on:       - ▁▁▁▁▁▁▁▁ - ▔▔▔▔▔▔▔▔ - focused:  - ▁▁▁▁▁▁▁▁ - ▔▔▔▔▔▔▔▔ - custom:   - ▁▁▁▁▁▁▁▁ - - - - + + + + + + + + Example switches + + + ▔▔▔▔▔▔▔▔ + off:      + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + on:       + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + focused:  + ▁▁▁▁▁▁▁▁ + ▔▔▔▔▔▔▔▔ + custom:   + ▁▁▁▁▁▁▁▁ + + + +