{"record":{"id":"626825db3f1b2a5c","repo":"Textualize/textual","slug":"token-r-is-not-a-valid-scalar","errorCode":null,"errorMessage":"{token!r} is not a valid scalar","messagePattern":"(.+?) is not a valid scalar","errorType":"validation","errorClass":"ScalarParseError","httpStatus":null,"severity":"error","filePath":"src/textual/css/scalar.py","lineNumber":261,"sourceCode":"    @lru_cache(maxsize=1024)\n    def parse(cls, token: str, percent_unit: Unit = Unit.WIDTH) -> Scalar:\n        \"\"\"Parse a string into a Scalar\n\n        Args:\n            token: A string containing a scalar, e.g. \"3.14fr\"\n\n        Raises:\n            ScalarParseError: If the value is not a valid scalar\n\n        Returns:\n            New scalar\n        \"\"\"\n        if token.lower() == \"auto\":\n            scalar = cls(1.0, Unit.AUTO, Unit.AUTO)\n        else:\n            match = _MATCH_SCALAR(token)\n            if match is None:\n                raise ScalarParseError(f\"{token!r} is not a valid scalar\")\n            value, unit_name = match.groups()\n            scalar = cls(float(value), SYMBOL_UNIT[unit_name or \"\"], percent_unit)\n        return scalar\n\n    @lru_cache(maxsize=4096)\n    def resolve(\n        self, size: Size, viewport: Size, fraction_unit: Fraction | None = None\n    ) -> Fraction:\n        \"\"\"Resolve scalar with units into a dimensions.\n\n        Args:\n            size: Size of the container.\n            viewport: Size of the viewport (typically terminal size)\n\n        Raises:\n            ScalarResolveError: If the unit is unknown.\n\n        Returns:","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/Textualize/textual/blob/06dbeef4bb70fb718236aa418ed658ef4667a126/src/textual/css/scalar.py#L243-L279","documentation":"Raised by Scalar.parse when the token doesn't match the scalar pattern (e.g. '10', '50%', 'auto'). Textual CSS requires dimensions and offsets to be a number with an optional unit; anything else fails regex matching and raises ScalarParseError.","triggerScenarios":"Calling Scalar.parse(token) with strings like 'ten', '10 px' (space), '1.2.3', or '#fff'. Also triggered by CSS/TCSS values in stylesheets where a scalar is expected but the value is malformed.","commonSituations":"Typos in TCSS files (missing unit symbol, stray characters), dynamically building style strings from user input, or passing a raw number instead of a string.","solutions":["Correct the token to a valid scalar: number + unit (e.g. '10', '50%', '3fr', '4w') or 'auto'","Validate user-provided dimension strings with a regex before passing them to Scalar.parse or styling APIs","If building values programmatically, format them explicitly, e.g. f'{value}%', instead of concatenating raw input"],"exampleFix":"// before\nscalar = Scalar.parse(user_input)  # user_input = 'half'\n// after\nscalar = Scalar.parse('50%')","handlingStrategy":"validation","validationCode":"import re\n_SCALAR_RE = re.compile(r'^auto$|^[+-]?(\\d+(\\.\\d+)?|\\.\\d+)(%|fr|w|h|vw|vh| cells)?$|^[+-]?\\d+(w|h)$', re.I)\ndef is_valid_scalar(token: str) -> bool:\n    return _SCALAR_RE.match(token.strip()) is not None","typeGuard":"def is_scalar_token(t: object) -> bool:\n    return isinstance(t, str) and is_valid_scalar(t)","tryCatchPattern":"from textual.css.scalar import ScalarParseError\ntry:\n    s = Scalar.parse(token)\nexcept ScalarParseError as e:\n    log.warning(f\"ignoring invalid scalar {token!r}: {e}\")\n    s = Scalar.from_number(1)","preventionTips":["Validate dimension strings with a regex before parsing","Build scalars via Scalar.parse/from_number rather than raw strings","Unit-test CSS value builders with invalid inputs"],"tags":["textual","css","scalar","parse","validation"],"backgroundTag":"css-value-parse-error","analyzedSha":"06dbeef4bb70fb718236aa418ed658ef4667a126","analyzedAt":"2026-08-27T02:36:57.214Z","schemaVersion":2},"datasetVersion":"2026-08-27T03:17:27.898Z"}