{"record":{"id":"6ed04c5412607109","repo":"zed-industries/zed","slug":"theme-theme-name-is-using-a-deprecated-style-p","errorCode":null,"errorMessage":"Theme \"{theme_name}\" is using a deprecated style property: scrollbar_thumb.background. Use `scrollbar.thumb.background` instead.","messagePattern":"Theme \"(.+?)\" is using a deprecated style property: scrollbar_thumb\\.background\\. Use `scrollbar\\.thumb\\.background` instead\\.","errorType":"validation","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"crates/extension_cli/src/main.rs","lineNumber":551,"sourceCode":"\n    Ok(grammars)\n}\n\nfn test_languages(\n    manifest: &ExtensionManifest,\n    extension_path: &Path,\n    grammars: &HashMap<String, Language>,\n    context: &TestingContext,\n) -> Result<()> {\n    for relative_language_dir in &manifest.languages {\n        let language_dir = extension_path.join(relative_language_dir);\n        let config_path = language_dir.join(LanguageConfig::FILE_NAME);\n        let config = LanguageConfig::load(&config_path)?;\n        let grammar = if let Some(name) = &config.grammar {\n            Some(\n                grammars\n                    .get(name.as_ref())\n                    .with_context(|| format!(\"grammar not found: '{name}'\"))?,\n            )\n        } else {\n            None\n        };\n\n        let query_entries = fs::read_dir(&language_dir)?;\n        for entry in query_entries {\n            let entry = entry?;\n            let file_path = entry.path();\n\n            let Some(file_name) = file_path.file_name().and_then(|name| name.to_str()) else {\n                continue;\n            };\n\n            match file_name {\n                LanguageConfig::FILE_NAME => {\n                    // Loaded above\n                }","sourceCodeStart":533,"sourceCodeEnd":569,"githubUrl":"https://github.com/zed-industries/zed/blob/9d272b036335401f339d024ea94968fd51016c40/crates/extension_cli/src/main.rs#L533-L569","documentation":"During extension validation (`zed extension test`), the CLI loads every theme family listed in the manifest via theme_settings::deserialize_user_theme and rejects any theme that still sets the removed `deprecated_scrollbar_thumb_background` style. The scrollbar thumb color moved from the flat `scrollbar_thumb.background` key to the nested `scrollbar.thumb.background` key, and old themes fail validation with this bail naming the offending theme.","triggerScenarios":"A theme JSON file referenced by the `themes` array in extension.toml contains a top-level \"scrollbar_thumb\": {\"background\": ...} object, so deserialization populates the deprecated field and the validation loop bails.","commonSituations":"Porting an older Zed theme or copying one written before the style rename; forks that have not rebased onto the new schema; CI extension checks failing right after Zed renamed the property.","solutions":["Open the theme file named by the error's theme_name and replace the `scrollbar_thumb.background` entry with `scrollbar.thumb.background`.","Re-run `zed extension test` to confirm validation passes.","Search the whole extension for other files using the old key (grep scrollbar_thumb) since only the first hit bails."],"exampleFix":"// before (themes/my-theme.json)\n{\n  \"name\": \"My Theme\",\n  \"scrollbar_thumb\": { \"background\": \"#505050\" }\n}\n\n// after\n{\n  \"name\": \"My Theme\",\n  \"scrollbar\": { \"thumb\": { \"background\": \"#505050\" } }\n}","handlingStrategy":"validation","validationCode":"fn uses_deprecated_scrollbar(theme: &serde_json::Value) -> bool {\n    theme\n        .pointer(\"/scrollbar_thumb/background\")\n        .is_some()\n}\n\n// scan all theme files before running `zed extension test`\nfor path in theme_files {\n    let theme: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(path)?)?;\n    assert!(!uses_deprecated_scrollbar(&theme), \"{path} uses scrollbar_thumb.background\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Run `zed extension test` in CI on every theme change.","Grep for scrollbar_thumb when porting themes from older Zed versions.","Keep themes as data (JSON) so renames are mechanical search-and-replace."],"tags":["theme","extension","deprecated","validation","cli"],"backgroundTag":"deprecated-config-property","analyzedSha":"9d272b036335401f339d024ea94968fd51016c40","analyzedAt":"2026-08-20T19:29:52.058Z","contentChangedAt":"2026-08-20T19:29:52.058Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}