css-variable-lsp 0.2.6

A fast, Rust-based Language Server Protocol implementation for CSS Variables
Documentation

CSS Variable LSP (Rust Implementation)

A Language Server Protocol implementation for CSS Variables, written in Rust.

Status: Complete

This is a ground-up Rust rewrite of the TypeScript/Node-based css-variable-lsp, eliminating the Node/npm dependency for the Zed extension.

Features

  • CSS parsing for variable definitions and var() usage tracking
  • HTML parsing for <style> blocks and inline styles (custom DOM scanner)
  • Cascade sorting and specificity calculation
  • LSP features: completion, hover, definition, references, rename, diagnostics, document/workspace symbols
  • Workspace scanning and color provider (hex/rgb/hsl + named colors)

Autocomplete Contexts

TypeScript LSP (css-variable-lsp):

  • Triggers on -, (, and :.
  • Returns items only in CSS value contexts (after a : and before the next ;).
  • CSS-like files: inside rules/declarations (requires {} context).
  • HTML-like files: inside style="..." attributes or <style>...</style> blocks.
  • JS/TS/JSX/TSX: only inside string literals or template literal text (not inside ${...}).
  • Insert text: --name if already inside var(, otherwise var(--name).

Rust LSP (this repo):

  • Matches the TypeScript LSP behavior above.
  • Document kind detection uses language ID when available, otherwise extensions derived from lookupFiles.

Building

cargo build --release

Release Assets (Local)

Build and package release assets into dist/ (tar.gz on Unix, zip on Windows):

./scripts/build-release-assets.sh

To build a subset of targets:

./scripts/build-release-assets.sh x86_64-apple-darwin aarch64-apple-darwin

Running

cargo run --release

The LSP server communicates via stdin/stdout using the Language Server Protocol.

Architecture

  • main.rs - Entry point, sets up async runtime and LSP server
  • lsp_server.rs - LSP protocol handlers (implements tower_lsp_server::LanguageServer)
  • manager.rs - CSS variable manager (stores definitions/usages, DOM trees)
  • types.rs - Core data types (CssVariable, CssVariableUsage, Config, etc.)
  • parsers/ - CSS and HTML parsing (definitions + var() usages)
  • dom_tree.rs - Lightweight HTML scanner for selector matching
  • specificity.rs - Specificity calculation and cascade ordering
  • workspace.rs - Workspace scanning and file discovery
  • flags.rs - Reusable flag parsing helper functions
  • runtime_config.rs - CLI/env configuration parsing
  • path_display.rs - Path formatting for hover/completion
  • color.rs - Color parsing and color provider helpers

Configuration

The LSP server accepts configuration via CLI flags and environment variables.

Feature Flags

Flag CLI (disable) Env var Default Description
Color preview --no-color-preview CSS_LSP_COLOR_PREVIEW=0 true Enable color picker
Color only variables --color-only-variables CSS_LSP_COLOR_ONLY_VARIABLES=1 false Colors only on var()
Lookup files --lookup-files CSS_LSP_LOOKUP_FILES None File extensions to scan
Ignore globs --ignore-globs CSS_LSP_IGNORE_GLOBS None Patterns to exclude
Path display --path-display CSS_LSP_PATH_DISPLAY relative Path format mode
Path length --path-display-length CSS_LSP_PATH_DISPLAY_LENGTH 1 Abbreviation length
Undefined fallback --undefined-var-fallback CSS_LSP_UNDEFINED_VAR_FALLBACK warning Fallback diagnostic level
Suggest add fallback --no-suggest-add-fallback CSS_LSP_SUGGEST_ADD_FALLBACK=0 true Add fallback quickfix
Suggest color vars --no-suggest-exact-color-variables CSS_LSP_SUGGEST_EXACT_COLOR_VARIABLES=0 true Color replacement suggestions

Examples

# Disable color preview
./css-variable-lsp --no-color-preview

# Set lookup files via env
CSS_LSP_LOOKUP_FILES="*.css,*.scss" ./css-variable-lsp

# Combine options
./css-variable-lsp --path-display=abbreviated:2 --no-suggest-add-fallback

Dependencies

  • tower-lsp-server - LSP server framework
  • tokio - Async runtime
  • globset / walkdir - Workspace scanning
  • csscolorparser - Color value parsing
  • regex / pathdiff - Parsing helpers and path formatting

License

GPL-3.0