Skip to content

Use of pointer style can cause a startup crash if setting a theme #6360

@davep

Description

@davep

The following code:

from textual.app import App

class BadPointerApp(App[None]):

    CSS = """
    * {
        pointer: default;
    }
    """

    def __init__(self) -> None:
        super().__init__()
        self.theme = "textual-light"

if __name__ == "__main__":
    BadPointerApp().run()

causes this crash:

╭──────────────────────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────────────────────╮
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py:3676 in refresh_css                                                │
│                                                                                                                                                    │
│   3673 │   │   stylesheet = self.app.stylesheet                                                                                                    │
│   3674 │   │   stylesheet.set_variables(self.get_css_variables())                                                                                  │
│   3675 │   │   stylesheet.reparse()                                                                                                                │
│ ❱ 3676 │   │   stylesheet.update(self.app, animate=animate)                                                                                        │
│   3677 │   │   try:                                                                                                                                │
│   3678 │   │   │   if self.screen.is_mounted:                                                                                                      │
│   3679 │   │   │   │   self.screen._refresh_layout(self.size)                                                                                      │
│                                                                                                                                                    │
│ ╭─────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────╮                   │
│ │    animate = False                                                                                                           │                   │
│ │       self = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})                │                   │
│ │ stylesheet = <Stylesheet                                                                                                     │                   │
│ │              │   [                                                                                                           │                   │
│ │              │   │   (                                                                                                       │                   │
│ │              │   │   │   '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py',                  │                   │
│ │              │   │   │   'App.DEFAULT_CSS'                                                                                   │                   │
│ │              │   │   ),                                                                                                      │                   │
│ │              │   │   ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')                                          │                   │
│ │              │   ]                                                                                                           │                   │
│ │              >                                                                                                               │                   │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                   │
│                                                                                                                                                    │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:711 in update                                           │
│                                                                                                                                                    │
│   708 │   │   │   animate: Enable CSS animation.                                                                                                   │
│   709 │   │   """                                                                                                                                  │
│   710 │   │                                                                                                                                        │
│ ❱ 711 │   │   self.update_nodes(root.walk_children(with_self=True), animate=animate)                                                               │
│   712 │                                                                                                                                            │
│   713 │   def update_nodes(self, nodes: Iterable[DOMNode], animate: bool = False) -> None:                                                         │
│   714 │   │   """Update styles for nodes.                                                                                                          │
│                                                                                                                                                    │
│ ╭───────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────╮                      │
│ │ animate = False                                                                                                           │                      │
│ │    root = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})                │                      │
│ │    self = <Stylesheet                                                                                                     │                      │
│ │           │   [                                                                                                           │                      │
│ │           │   │   (                                                                                                       │                      │
│ │           │   │   │   '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py',                  │                      │
│ │           │   │   │   'App.DEFAULT_CSS'                                                                                   │                      │
│ │           │   │   ),                                                                                                      │                      │
│ │           │   │   ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')                                          │                      │
│ │           │   ]                                                                                                           │                      │
│ │           >                                                                                                               │                      │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                      │
│                                                                                                                                                    │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:724 in update_nodes                                     │
│                                                                                                                                                    │
│   721 │   │   apply = self.apply                                                                                                                   │
│   722 │   │                                                                                                                                        │
│   723 │   │   for node in nodes:                                                                                                                   │
│ ❱ 724 │   │   │   apply(node, animate=animate, cache=cache)                                                                                        │
│   725 │   │   │   if isinstance(node, Widget) and node.is_scrollable:                                                                              │
│   726 │   │   │   │   show_vertical_scrollbar = (                                                                                                  │
│   727 │   │   │   │   │   node.show_vertical_scrollbar and node.scrollbar_size_vertical                                                            │
│                                                                                                                                                    │
│ ╭──────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────╮ │
│ │ animate = False                                                                                                                                │ │
│ │   apply = <bound method Stylesheet.apply of <Stylesheet [('/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py',   │ │
│ │           'App.DEFAULT_CSS'), ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')]>>                                                │ │
│ │   cache = {                                                                                                                                    │ │
│ │           │   (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp'): {                                                                 │ │
│ │           │   │   'pointer': 'default',                                                                                                        │ │
│ │           │   │   'auto_background': False,                                                                                                    │ │
│ │           │   │   'background': Color(224, 224, 224),                                                                                          │ │
│ │           │   │   'auto_color': False,                                                                                                         │ │
│ │           │   │   'color': Color(31, 31, 31)                                                                                                   │ │
│ │           │   }                                                                                                                                │ │
│ │           }                                                                                                                                    │ │
│ │    node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})                                     │ │
│ │   nodes = [BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})]                                   │ │
│ │    self = <Stylesheet                                                                                                                          │ │
│ │           │   [                                                                                                                                │ │
│ │           │   │   ('/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', 'App.DEFAULT_CSS'),                      │ │
│ │           │   │   ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')                                                               │ │
│ │           │   ]                                                                                                                                │ │
│ │           >                                                                                                                                    │ │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│                                                                                                                                                    │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:606 in apply                                            │
│                                                                                                                                                    │
│   603 │   │   │                                                                                                                                    │
│   604 │   │   │   if cache_key is not None:                                                                                                        │
│   605 │   │   │   │   cache[cache_key] = node_rules                                                                                                │
│ ❱ 606 │   │   │   self.replace_rules(node, node_rules, animate=animate)                                                                            │
│   607 │   │   self._process_component_classes(node)                                                                                                │
│   608 │                                                                                                                                            │
│   609 │   def _process_component_classes(self, node: DOMNode) -> None:                                                                             │
│                                                                                                                                                    │
│ ╭─────────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────────╮           │
│ │        _check_rule = <bound method Stylesheet._check_rule of <class 'textual.css.stylesheet.Stylesheet'>>                            │           │
│ │ all_pseudo_classes = {'ansi', 'disabled', 'can-focus'}                                                                               │           │
│ │            animate = False                                                                                                           │           │
│ │   base_specificity = (0, 0, 1)                                                                                                       │           │
│ │              cache = {                                                                                                               │           │
│ │                      │   (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp'): {                                            │           │
│ │                      │   │   'pointer': 'default',                                                                                   │           │
│ │                      │   │   'auto_background': False,                                                                               │           │
│ │                      │   │   'background': Color(224, 224, 224),                                                                     │           │
│ │                      │   │   'auto_color': False,                                                                                    │           │
│ │                      │   │   'color': Color(31, 31, 31)                                                                              │           │
│ │                      │   }                                                                                                           │           │
│ │                      }                                                                                                               │           │
│ │          cache_key = (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp')                                                   │           │
│ │      cached_result = None                                                                                                            │           │
│ │     css_path_nodes = [BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})]              │           │
│ │     get_first_item = operator.itemgetter(0)                                                                                          │           │
│ │            initial = set()                                                                                                           │           │
│ │   initial_defaults = set()                                                                                                           │           │
│ │   is_default_rules = True                                                                                                            │           │
│ │                key = 'color'                                                                                                         │           │
│ │        limit_rules = {                                                                                                               │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App' (0, 0, 1)>],                                                           │           │
│ │                      │   │   styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)),              │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-1,                                                                                         │           │
│ │                      │   │   selector_names={'App'},                                                                                 │           │
│ │                      │   │   pseudo_classes=set()                                                                                    │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App *' (0, 2, 0)>],                                                         │           │
│ │                      │   │   styles=Styles(opacity=0.7),                                                                             │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-1,                                                                                         │           │
│ │                      │   │   selector_names={'*'},                                                                                   │           │
│ │                      │   │   pseudo_classes={'disabled', 'can-focus'}                                                                │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>],                                                      │           │
│ │                      │   │   styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1), background=Color(0, 0, 0, ansi=-1)),     │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-2,                                                                                         │           │
│ │                      │   │   selector_names={'App'},                                                                                 │           │
│ │                      │   │   pseudo_classes={'ansi'}                                                                                 │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet '*' (0, 0, 0)>],                                                             │           │
│ │                      │   │   styles=Styles(pointer='default'),                                                                       │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=False,                                                                                 │           │
│ │                      │   │   tie_breaker=0,                                                                                          │           │
│ │                      │   │   selector_names={'*'},                                                                                   │           │
│ │                      │   │   pseudo_classes=set()                                                                                    │           │
│ │                      │   )                                                                                                           │           │
│ │                      }                                                                                                               │           │
│ │               node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})                │           │
│ │         node_rules = {                                                                                                               │           │
│ │                      │   'pointer': 'default',                                                                                       │           │
│ │                      │   'auto_background': False,                                                                                   │           │
│ │                      │   'background': Color(224, 224, 224),                                                                         │           │
│ │                      │   'auto_color': False,                                                                                        │           │
│ │                      │   'color': Color(31, 31, 31)                                                                                  │           │
│ │                      }                                                                                                               │           │
│ │               rule = RuleSet(                                                                                                        │           │
│ │                      │   selector_set=[<SelectorSet 'App' (0, 0, 1)>],                                                               │           │
│ │                      │   styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)),                  │           │
│ │                      │   errors=[],                                                                                                  │           │
│ │                      │   is_default_rules=True,                                                                                      │           │
│ │                      │   tie_breaker=-1,                                                                                             │           │
│ │                      │   selector_names={'App'},                                                                                     │           │
│ │                      │   pseudo_classes=set()                                                                                        │           │
│ │                      )                                                                                                               │           │
│ │    rule_attributes = defaultdict(<class 'list'>, {                                                                                   │           │
│ │                      │   'pointer': [((1, 0, 0, 0, 0, 0), 'default')],                                                               │           │
│ │                      │   'auto_background': [((0, 0, 0, 0, 1, -1), False)],                                                          │           │
│ │                      │   'background': [((0, 0, 0, 0, 1, -1), Color(224, 224, 224))],                                                │           │
│ │                      │   'auto_color': [((0, 0, 0, 0, 1, -1), False)],                                                               │           │
│ │                      │   'color': [((0, 0, 0, 0, 1, -1), Color(31, 31, 31))]                                                         │           │
│ │                      })                                                                                                              │           │
│ │   rule_specificity = (0, 0, 0, 0, 1, -1)                                                                                             │           │
│ │              rules = [                                                                                                               │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet '*' (0, 0, 0)>],                                                             │           │
│ │                      │   │   styles=Styles(pointer='default'),                                                                       │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=False,                                                                                 │           │
│ │                      │   │   tie_breaker=0,                                                                                          │           │
│ │                      │   │   selector_names={'*'},                                                                                   │           │
│ │                      │   │   pseudo_classes=set()                                                                                    │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App *' (0, 2, 0)>],                                                         │           │
│ │                      │   │   styles=Styles(opacity=0.7),                                                                             │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-1,                                                                                         │           │
│ │                      │   │   selector_names={'*'},                                                                                   │           │
│ │                      │   │   pseudo_classes={'disabled', 'can-focus'}                                                                │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>],                                                      │           │
│ │                      │   │   styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1), background=Color(0, 0, 0, ansi=-1)),     │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-2,                                                                                         │           │
│ │                      │   │   selector_names={'App'},                                                                                 │           │
│ │                      │   │   pseudo_classes={'ansi'}                                                                                 │           │
│ │                      │   ),                                                                                                          │           │
│ │                      │   RuleSet(                                                                                                    │           │
│ │                      │   │   selector_set=[<SelectorSet 'App' (0, 0, 1)>],                                                           │           │
│ │                      │   │   styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)),              │           │
│ │                      │   │   errors=[],                                                                                              │           │
│ │                      │   │   is_default_rules=True,                                                                                  │           │
│ │                      │   │   tie_breaker=-1,                                                                                         │           │
│ │                      │   │   selector_names={'App'},                                                                                 │           │
│ │                      │   │   pseudo_classes=set()                                                                                    │           │
│ │                      │   )                                                                                                           │           │
│ │                      ]                                                                                                               │           │
│ │          rules_map = {                                                                                                               │           │
│ │                      │   'App': [                                                                                                    │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App' (0, 0, 1)>],                                                       │           │
│ │                      │   │   │   styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)),          │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-1,                                                                                     │           │
│ │                      │   │   │   selector_names={'App'},                                                                             │           │
│ │                      │   │   │   pseudo_classes=set()                                                                                │           │
│ │                      │   │   ),                                                                                                      │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>],                                                  │           │
│ │                      │   │   │   styles=Styles(                                                                                      │           │
│ │                      │   │   │   │   auto_color=False,                                                                               │           │
│ │                      │   │   │   │   color=Color(0, 0, 0, ansi=-1),                                                                  │           │
│ │                      │   │   │   │   background=Color(0, 0, 0, ansi=-1)                                                              │           │
│ │                      │   │   │   ),                                                                                                  │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-2,                                                                                     │           │
│ │                      │   │   │   selector_names={'App'},                                                                             │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.-ansi-scrollbar': [                                                                                       │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi .-ansi-scrollbar' (0, 2, 1)>],                                 │           │
│ │                      │   │   │   styles=Styles(                                                                                      │           │
│ │                      │   │   │   │   scrollbar_color=Color(0, 0, 128, ansi=4),                                                       │           │
│ │                      │   │   │   │   scrollbar_color_hover=Color(0, 0, 255, ansi=12),                                                │           │
│ │                      │   │   │   │   scrollbar_color_active=Color(0, 0, 255, ansi=12),                                               │           │
│ │                      │   │   │   │   scrollbar_corner_color=Color(0, 0, 0, ansi=-1),                                                 │           │
│ │                      │   │   │   │   scrollbar_background=Color(0, 0, 0, ansi=-1),                                                   │           │
│ │                      │   │   │   │   scrollbar_background_hover=Color(0, 0, 0, ansi=-1),                                             │           │
│ │                      │   │   │   │   scrollbar_background_active=Color(0, 0, 0, ansi=-1)                                             │           │
│ │                      │   │   │   ),                                                                                                  │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.-ansi-scrollbar'},                                                                │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.bindings-table--key': [                                                                                   │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi .bindings-table--key' (0, 2, 1)>],                             │           │
│ │                      │   │   │   styles=Styles(auto_color=False, color=Color(128, 0, 128, ansi=5)),                                  │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.bindings-table--key'},                                                            │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.bindings-table--description': [                                                                           │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi .bindings-table--description' (0, 2, 1)>],                     │           │
│ │                      │   │   │   styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1)),                                     │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.bindings-table--description'},                                                    │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.bindings-table--header': [                                                                                │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi .bindings-table--header' (0, 2, 1)>],                          │           │
│ │                      │   │   │   styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1)),                                     │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.bindings-table--header'},                                                         │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.bindings-table--divider': [                                                                               │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:ansi .bindings-table--divider' (0, 2, 1)>],                         │           │
│ │                      │   │   │   styles=Styles(auto_color=False, color=Color(0, 0, 0, a=0), text_style='dim'),                       │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.bindings-table--divider'},                                                        │           │
│ │                      │   │   │   pseudo_classes={'ansi'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.-maximized-view': [                                                                                       │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App Screen.-maximized-view' (0, 1, 2)>],                                │           │
│ │                      │   │   │   styles=Styles(                                                                                      │           │
│ │                      │   │   │   │   layout=<vertical>,                                                                              │           │
│ │                      │   │   │   │   overflow_y='auto',                                                                              │           │
│ │                      │   │   │   │   align_horizontal='center',                                                                      │           │
│ │                      │   │   │   │   align_vertical='middle',                                                                        │           │
│ │                      │   │   │   │   hatch=('╱', Color(208, 208, 208)),                                                              │           │
│ │                      │   │   │   │   important={'overflow_y', 'layout'}                                                              │           │
│ │                      │   │   │   ),                                                                                                  │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-2,                                                                                     │           │
│ │                      │   │   │   selector_names={'.-maximized-view'},                                                                │           │
│ │                      │   │   │   pseudo_classes=set()                                                                                │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '.-maximized': [                                                                                            │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App Screen.-maximized-view .-maximized' (0, 2, 2)>],                    │           │
│ │                      │   │   │   styles=Styles(dock=None, important={'dock'}),                                                       │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-3,                                                                                     │           │
│ │                      │   │   │   selector_names={'.-maximized'},                                                                     │           │
│ │                      │   │   │   pseudo_classes=set()                                                                                │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   'HeaderTitle': [                                                                                            │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App:blur HeaderTitle' (0, 1, 2)>],                                      │           │
│ │                      │   │   │   styles=Styles(text_opacity=0.5),                                                                    │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-2,                                                                                     │           │
│ │                      │   │   │   selector_names={'HeaderTitle'},                                                                     │           │
│ │                      │   │   │   pseudo_classes={'blur'}                                                                             │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ],                                                                                                          │           │
│ │                      │   '*': [                                                                                                      │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet 'App *' (0, 2, 0)>],                                                     │           │
│ │                      │   │   │   styles=Styles(opacity=0.7),                                                                         │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=True,                                                                              │           │
│ │                      │   │   │   tie_breaker=-1,                                                                                     │           │
│ │                      │   │   │   selector_names={'*'},                                                                               │           │
│ │                      │   │   │   pseudo_classes={'disabled', 'can-focus'}                                                            │           │
│ │                      │   │   ),                                                                                                      │           │
│ │                      │   │   RuleSet(                                                                                                │           │
│ │                      │   │   │   selector_set=[<SelectorSet '*' (0, 0, 0)>],                                                         │           │
│ │                      │   │   │   styles=Styles(pointer='default'),                                                                   │           │
│ │                      │   │   │   errors=[],                                                                                          │           │
│ │                      │   │   │   is_default_rules=False,                                                                             │           │
│ │                      │   │   │   tie_breaker=0,                                                                                      │           │
│ │                      │   │   │   selector_names={'*'},                                                                               │           │
│ │                      │   │   │   pseudo_classes=set()                                                                                │           │
│ │                      │   │   )                                                                                                       │           │
│ │                      │   ]                                                                                                           │           │
│ │                      }                                                                                                               │           │
│ │               self = <Stylesheet                                                                                                     │           │
│ │                      │   [                                                                                                           │           │
│ │                      │   │   (                                                                                                       │           │
│ │                      │   │   │   '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py',                  │           │
│ │                      │   │   │   'App.DEFAULT_CSS'                                                                                   │           │
│ │                      │   │   ),                                                                                                      │           │
│ │                      │   │   ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')                                          │           │
│ │                      │   ]                                                                                                           │           │
│ │                      >                                                                                                               │           │
│ │        tie_breaker = -1                                                                                                              │           │
│ │              value = Color(31, 31, 31)                                                                                               │           │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯           │
│                                                                                                                                                    │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:700 in replace_rules                                    │
│                                                                                                                                                    │
│   697 │   │   │   get_rule = rules.get                                                                                                             │
│   698 │   │   │                                                                                                                                    │
│   699 │   │   │   for key in modified_rule_keys:                                                                                                   │
│ ❱ 700 │   │   │   │   setattr(base_styles, key, get_rule(key))                                                                                     │
│   701 │   │   node.notify_style_update()                                                                                                           │
│   702 │                                                                                                                                            │
│   703 │   def update(self, root: DOMNode, animate: bool = False) -> None:                                                                          │
│                                                                                                                                                    │
│ ╭────────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────╮                     │
│ │            animate = False                                                                                                 │                     │
│ │        base_styles = Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224), pointer='default') │                     │
│ │           get_rule = <built-in method get of dict object at 0x10b834b40>                                                   │                     │
│ │                key = 'pointer'                                                                                             │                     │
│ │ modified_rule_keys = {'color', 'background', 'auto_color', 'auto_background', 'pointer'}                                   │                     │
│ │               node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})      │                     │
│ │              rules = {                                                                                                     │                     │
│ │                      │   'pointer': 'default',                                                                             │                     │
│ │                      │   'auto_background': False,                                                                         │                     │
│ │                      │   'background': Color(224, 224, 224),                                                               │                     │
│ │                      │   'auto_color': False,                                                                              │                     │
│ │                      │   'color': Color(31, 31, 31)                                                                        │                     │
│ │                      }                                                                                                     │                     │
│ │             styles = RenderStyles(                                                                                         │                     │
│ │                      │   BadPointerApp(                                                                                    │                     │
│ │                      │   │   title='BadPointerApp',                                                                        │                     │
│ │                      │   │   classes={'-light-mode'},                                                                      │                     │
│ │                      │   │   pseudo_classes={'light', 'focus'}                                                             │                     │
│ │                      │   ),                                                                                                │                     │
│ │                      │   auto_color=False,                                                                                 │                     │
│ │                      │   color=Color(31, 31, 31),                                                                          │                     │
│ │                      │   background=Color(224, 224, 224),                                                                  │                     │
│ │                      │   pointer='default'                                                                                 │                     │
│ │                      )                                                                                                     │                     │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯                     │
│                                                                                                                                                    │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py:1544 in screen                                                     │
│                                                                                                                                                    │
│   1541 │   │   except KeyError:                                                                                                                    │
│   1542 │   │   │   raise UnknownModeError(f"No known mode {self._current_mode!r}") from None                                                       │
│   1543 │   │   except IndexError:                                                                                                                  │
│ ❱ 1544 │   │   │   raise ScreenStackError("No screens on stack") from None                                                                         │
│   1545 │                                                                                                                                           │
│   1546 │   @property                                                                                                                               │
│   1547 │   def _background_screens(self) -> list[Screen]:                                                                                          │
│                                                                                                                                                    │
│ ╭──────────────────────────────────────────────── locals ─────────────────────────────────────────────────╮                                        │
│ │ self = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │                                        │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯                                        │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ScreenStackError: No screens on stack

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions