{"record":{"id":"7e2fe2d4644c4c8a","repo":"spectreconsole/spectre.console","slug":"a-background-color-has-already-been-set","errorCode":null,"errorMessage":"A background color has already been set.","messagePattern":"A background color has already been set\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Spectre.Console.Ansi/AnsiMarkupTagParser.cs","lineNumber":10,"sourceCode":"namespace Spectre.Console;\n\ninternal static class AnsiMarkupTagParser\n{\n    public static (Style Style, Link? Link) Parse(string text)\n    {\n        var result = Parse(text, out var error);\n        if (error != null)\n        {\n            throw new InvalidOperationException(error);\n        }\n\n        return result ?? throw new InvalidOperationException(\"Could not parse style.\");\n    }\n\n    public static bool TryParse(string text, [NotNullWhen(true)] out (Style Style, Link?)? result)\n    {\n        result = Parse(text, out _);\n        return result != null;\n    }\n\n    private static (Style Style, Link? Link)? Parse(string text, out string? error)\n    {\n        var effectiveDecoration = (Decoration?)null;\n        var effectiveForeground = (Color?)null;\n        var effectiveBackground = (Color?)null;\n        var effectiveLink = (string?)null;\n","sourceCodeStart":1,"sourceCodeEnd":28,"githubUrl":"https://github.com/spectreconsole/spectre.console/blob/0acc92fada6c42f13984e79c2b5f3d993bdfb099/src/Spectre.Console.Ansi/AnsiMarkupTagParser.cs#L1-L28","documentation":"After `on` (background mode), a background color was already set and a second background color is encountered. Only one background color is allowed per tag.","triggerScenarios":"Two colors after `on`, e.g. `[on blue red]`, `[red on blue green]`, or `[on 1 2]`.","commonSituations":"Forgetting that everything after the first `on` is background; multiple `on` keywords don't switch back to foreground (they're no-ops), so a later color is still treated as background.","solutions":["Provide exactly one background color after `on`","Move any additional foreground color into a separate nested tag","Use `default` to leave a slot unset"],"exampleFix":"// before\nAnsiMarkup.Parse(\"[red on blue green]text[/]\");\n\n// after\nAnsiMarkup.Parse(\"[red on blue]text[/]\");\n// or nest if both colors are wanted as foreground/background:\nAnsiMarkup.Parse(\"[blue][red on green]text[/][/]\");","handlingStrategy":"validation","validationCode":"// Ensure at most one color token follows `on`:\npublic static int BackgroundColorCount(string tag)\n{\n    var onIdx = tag.IndexOf(\" on \", StringComparison.OrdinalIgnoreCase);\n    if (onIdx < 0) return 0;\n    return tag[(onIdx + 4)..].Split(' ', StringSplitOptions.RemoveEmptyEntries)\n        .Count(p => ColorTable.GetColor(p) != null || Regex.IsMatch(p, \"^#[0-9A-Fa-f]{6}$\"));\n}","typeGuard":null,"tryCatchPattern":"try { AnsiMarkup.Parse(markup); }\ncatch (InvalidOperationException ex) when (ex.Message == \"A background color has already been set.\")\n{ /* keep only the first background color */ }","preventionTips":["Remember a second `on` does not switch back to foreground","Use exactly one background color per tag","Nest tags to layer additional colors"],"tags":["markup","color","parsing","spectre-console"],"backgroundTag":null,"analyzedSha":"0acc92fada6c42f13984e79c2b5f3d993bdfb099","analyzedAt":"2026-08-13T18:27:21.983Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}