zed-industries/zed · error · anyhow::Error
Theme "{theme_name}" is using a deprecated style property: s
Error message
Theme "{theme_name}" is using a deprecated style property: scrollbar_thumb.background. Use `scrollbar.thumb.background` instead. What it means
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.
Source
Thrown at crates/extension_cli/src/main.rs:551
Ok(grammars)
}
fn test_languages(
manifest: &ExtensionManifest,
extension_path: &Path,
grammars: &HashMap<String, Language>,
context: &TestingContext,
) -> Result<()> {
for relative_language_dir in &manifest.languages {
let language_dir = extension_path.join(relative_language_dir);
let config_path = language_dir.join(LanguageConfig::FILE_NAME);
let config = LanguageConfig::load(&config_path)?;
let grammar = if let Some(name) = &config.grammar {
Some(
grammars
.get(name.as_ref())
.with_context(|| format!("grammar not found: '{name}'"))?,
)
} else {
None
};
let query_entries = fs::read_dir(&language_dir)?;
for entry in query_entries {
let entry = entry?;
let file_path = entry.path();
let Some(file_name) = file_path.file_name().and_then(|name| name.to_str()) else {
continue;
};
match file_name {
LanguageConfig::FILE_NAME => {
// Loaded above
}View on GitHub (pinned to 9d272b0363)
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.
Example fix
// before (themes/my-theme.json)
{
"name": "My Theme",
"scrollbar_thumb": { "background": "#505050" }
}
// after
{
"name": "My Theme",
"scrollbar": { "thumb": { "background": "#505050" } }
} Defensive patterns
Strategy: validation
Validate before calling
fn uses_deprecated_scrollbar(theme: &serde_json::Value) -> bool {
theme
.pointer("/scrollbar_thumb/background")
.is_some()
}
// scan all theme files before running `zed extension test`
for path in theme_files {
let theme: serde_json::Value = serde_json::from_str(&std::fs::read_to_string(path)?)?;
assert!(!uses_deprecated_scrollbar(&theme), "{path} uses scrollbar_thumb.background");
} Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Related errors
- extension dir {} is not an absolute path
- failed to create archive.tar.gz: {}
- failed to compile {} parser with clang: {}
- grammar directory '{}' already exists, but is not a git clon
- failed to run `git init` in directory '{}'
AI-assisted analysis of zed-industries/zed@9d272b0363 (2026-08-20).
Data as JSON: /api/errors/6ed04c5412607109.
Report an issue: GitHub.