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

  1. Open the theme file named by the error's theme_name and replace the `scrollbar_thumb.background` entry with `scrollbar.thumb.background`.
  2. Re-run `zed extension test` to confirm validation passes.
  3. 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

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


AI-assisted analysis of zed-industries/zed@9d272b0363 (2026-08-20). Data as JSON: /api/errors/6ed04c5412607109. Report an issue: GitHub.