{"record":{"id":"9eea07ddd026f4da","repo":"Textualize/textual","slug":"unknown-pseudo-class-pseudo-class-r-must-be-one","errorCode":null,"errorMessage":"unknown pseudo-class {pseudo_class!r}; must be one of {friendly_list(VALID_PSEUDO_CLASSES)}","messagePattern":"unknown pseudo-class (.+?); must be one of (.+?)","errorType":"exception","errorClass":"TokenError","httpStatus":null,"severity":"error","filePath":"src/textual/css/tokenizer.py","lineNumber":333,"sourceCode":"            referenced_by=None,\n        )\n\n        if (\n            token.name == \"pseudo_class\"\n            and token.value.strip(\":\") not in VALID_PSEUDO_CLASSES\n        ):\n            pseudo_class = token.value.strip(\":\")\n            suggestion = get_suggestion(pseudo_class, list(VALID_PSEUDO_CLASSES))\n            all_valid = f\"must be one of {friendly_list(VALID_PSEUDO_CLASSES)}\"\n            if suggestion:\n                raise TokenError(\n                    self.read_from,\n                    self.code,\n                    (line_no + 1, col_no + 1),\n                    f\"unknown pseudo-class {pseudo_class!r}; did you mean {suggestion!r}?; {all_valid}\",\n                )\n            else:\n                raise TokenError(\n                    self.read_from,\n                    self.code,\n                    (line_no + 1, col_no + 1),\n                    f\"unknown pseudo-class {pseudo_class!r}; {all_valid}\",\n                )\n\n        col_no += len(value)\n        if col_no >= len(line):\n            line_no += 1\n            col_no = 0\n        self.line_no = line_no\n        self.col_no = col_no\n        return token\n\n    def skip_to(self, expect: Expect) -> Token:\n        \"\"\"Skip tokens.\n\n        Args:","sourceCodeStart":315,"sourceCodeEnd":351,"githubUrl":"https://github.com/Textualize/textual/blob/06dbeef4bb70fb718236aa418ed658ef4667a126/src/textual/css/tokenizer.py#L315-L351","documentation":"TokenError raised for an unknown pseudo-class with no close match — the message lists every valid pseudo-class via friendly_list(VALID_PSEUDO_CLASSES). Counterpart to the did-you-mean variant.","triggerScenarios":"Using a pseudo-class that neither exists nor resembles a valid one, e.g. ':nth-child(2)', ':checked', or a typo like ':hvoer'.","commonSituations":"Porting web CSS selectors with structural pseudo-classes Textual doesn't support; custom pseudo-classes from other frameworks.","solutions":["Pick a valid pseudo-class from the list in the error message","Use a different mechanism (variant, class, or component state) for unsupported structural pseudo-classes"],"exampleFix":"/* before */\nTab:nth-child(2) { color: red; }\n/* after */\nTab.-active { color: red; }","handlingStrategy":"validation","validationCode":"from textual.css.tokenizer import VALID_PSEUDO_CLASSES\ndef valid_pseudo(name: str) -> bool:\n    return name.lstrip(':') in VALID_PSEUDO_CLASSES","typeGuard":null,"tryCatchPattern":"from textual.css.tokenizer import TokenError\ntry:\n    stylesheet.parse()\nexcept TokenError as e:\n    report(f\"unsupported pseudo-class: {e}\"); raise","preventionTips":["Pick pseudo-classes from the list in the error message","Use variants/classes instead of unsupported structural pseudo-classes","Keep a project lint for selector names"],"tags":["textual","css","pseudo-class","selector"],"backgroundTag":"unknown-css-pseudo-class","analyzedSha":"06dbeef4bb70fb718236aa418ed658ef4667a126","analyzedAt":"2026-08-27T02:36:57.214Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}