{"record":{"id":"d470c90d2dbabef0","repo":"BigPizzaV3/CodexPlusPlus","slug":"theme-css-d470c9","errorCode":null,"errorMessage":"theme.css 选择器或规则语法无效","messagePattern":"theme\\.css 选择器或规则语法无效","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"crates/codex-plus-core/src/dream_skin_package.rs","lineNumber":321,"sourceCode":"    let mut rest = css;\n    loop {\n        rest = rest.trim_start_matches(|character: char| {\n            character.is_ascii_whitespace() || character == '\\u{000c}'\n        });\n        if rest.is_empty() {\n            break;\n        }\n        let open = rest.find('{').context(\"theme.css 规则缺少开始括号\")?;\n        let selector = rest[..open].trim();\n        if selector.is_empty()\n            || selector.contains([',', '@', ';', '}'])\n            || rest[open + 1..].find('{').is_some_and(|nested| {\n                rest[open + 1..]\n                    .find('}')\n                    .is_none_or(|close| nested < close)\n            })\n        {\n            bail!(\"theme.css 选择器或规则语法无效\");\n        }\n        let close = open\n            + 1\n            + rest[open + 1..]\n                .find('}')\n                .context(\"theme.css 规则缺少结束括号\")?;\n        let Some(after_prefix) = selector.strip_prefix(\"[data-ds-part=\\\"\") else {\n            bail!(\"theme.css 只能选择 Skin API 注册的 data-ds-part\");\n        };\n        let (part, suffix) = after_prefix\n            .split_once(\"\\\"]\")\n            .context(\"theme.css data-ds-part 语法无效\")?;\n        if !allowed_parts.contains(&part)\n            || (!suffix.is_empty() && suffix != \":hover\" && suffix != \":focus-visible\")\n        {\n            bail!(\"theme.css 使用了未注册的 Skin API part 或状态\");\n        }\n","sourceCodeStart":303,"sourceCodeEnd":339,"githubUrl":"https://github.com/BigPizzaV3/CodexPlusPlus/blob/f2074595a281bc057525c748175c8eb9805b0673/crates/codex-plus-core/src/dream_skin_package.rs#L303-L339","documentation":"Grammar guard in parse_safe_css: a rule has no '{', an empty selector, a selector containing ',' '@' ';' or '}', or a nested '{' before the rule's closing '}'. Only simple single-selector blocks without nesting are accepted.","triggerScenarios":"Thrown at crates/codex-plus-core/src/dream_skin_package.rs:321 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Write one simple selector per rule with a single {…} block","Remove commas, at-rules, and nested braces from theme.css"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f2074595a281bc057525c748175c8eb9805b0673","analyzedAt":"2026-08-23T12:52:24.489Z","contentChangedAt":"2026-08-23T12:52:24.489Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}