Stylelint - CSS linter
A mighty CSS linter that helps you avoid errors and enforce conventions.
Vortex comes with a pre-configured Stylelint ruleset for Drupal projects.
Stylelint in Vortex is configured to lint custom modules only (web/modules/custom). The custom theme maintains its own Stylelint configuration within the theme directory.
Usage
Check for violations
- Ahoy
- Docker Compose
# Lint all front-end code: Twig, JavaScript and CSS.
ahoy lint-fe
# Lint only CSS in custom modules.
ahoy cli "npm run lint-css"
docker compose exec cli npm run lint-css
Fix violations
Stylelint fixes many violations automatically using the --fix flag.
- Ahoy
- Docker Compose
# Fix all front-end lint issues.
ahoy lint-fe-fix
# Fix only CSS issues in custom modules.
ahoy cli "npm run lint-fix-css"
docker compose exec cli npm run lint-fix-css
ahoy lint-fe and ahoy lint-fe-fix also run the lint and lint-fix
scripts of the custom theme, which lint the theme's JavaScript and SCSS
together. To lint only the theme's stylesheets, run the theme's own lint-css
and lint-css-fix scripts:
ahoy cli "npm run --prefix=web/themes/custom/your_site_theme lint-css"
ahoy cli "npm run --prefix=web/themes/custom/your_site_theme lint-css-fix"
Configuration
All global configuration takes place in the .stylelintrc.js file.
By default, Stylelint extends the following configuration and plugin:
stylelint-config-standard- the standard shareable configurationstylelint-order- plugin that provides theorder/*rules
The following rules are set on top of the standard configuration:
order/properties-alphabetical-order- declarations within a block must be in alphabetical orderat-rule-no-unknown- unknown at-rules are reported, except the Sass at-rules@extend,@at-root,@debug,@warn,@error,@if,@else,@for,@each,@while,@include,@mixin,@function,@returnand@contentselector-class-pattern,selector-id-pattern,custom-property-patternandkeyframes-name-pattern- disabled, so class, ID, custom property and keyframes names are not forced into a naming patternno-descending-specificity- disabledfont-family-no-missing-generic-family-keyword- disabled
Targets include custom modules only. The --allow-empty-input flag makes the
run exit without an error when the glob matches no files:
{
"scripts": {
"lint-css": "stylelint --allow-empty-input \"web/modules/custom/**/*.css\"",
"lint-fix-css": "stylelint --allow-empty-input \"web/modules/custom/**/*.css\" --fix"
}
}
Adding or removing targets in package.json:
{
"scripts": {
"lint-css": "stylelint --allow-empty-input \"web/modules/custom/**/*.css\" \"web/sites/default/**/*.css\""
}
}
The stylelint, stylelint-config-standard and stylelint-order packages
are declared in the devDependencies of the root package.json and installed
by ahoy fei.
Theme configuration
The custom theme ships its own .stylelintrc.json
and its own package.json, because a theme carries its own front-end tooling
and can be moved into a separate repository.
The theme configuration extends stylelint-config-standard and
stylelint-config-standard-scss, loads the stylelint-scss plugin, uses the
string formatter and sets the following rules:
scss/at-extend-no-missing-placeholder-@extendmust target a placeholder selectorscss/comment-no-empty- disabledscss/dollar-variable-pattern-$variablenames must match^_?[a-z]+([a-z0-9-]+[a-z0-9]+)?$
The theme's lint-css script targets scss/**/*.scss, and the configuration
ignores scss/_components.scss, fonts/**/*.scss and build/.* through
the ignoreFiles key.
Ignoring
Ignoring paths globally takes place in the ignoreFiles key of the
configuration file, as the theme configuration does:
{
"ignoreFiles": [
"scss/_components.scss",
"fonts/**/*.scss",
"build/.*"
]
}
To ignore all Stylelint rules within a file, place in the file header:
/* stylelint-disable */
To ignore a specific rule within a file, place in the file header:
/* stylelint-disable selector-max-id, declaration-no-important */
To ignore rules for a code block:
/* stylelint-disable declaration-no-important */
a {
color: red !important;
}
/* stylelint-enable declaration-no-important */
To ignore only the next line:
a {
/* stylelint-disable-next-line declaration-no-important */
color: red !important;
}
To ignore rules for the current line (inline):
a {
color: red !important; /* stylelint-disable-line declaration-no-important */
}
Continuous integration
Stylelint runs in the lint job of the continuous integration pipeline
and fails the build on violations. The custom modules and the custom theme are
linted in separate steps; the theme step is skipped when
VORTEX_FRONTEND_BUILD_SKIP
is set to 1.
Ignoring failures
Set the VORTEX_CI_NODEJS_LINT_IGNORE_FAILURE environment variable to 1.
The variable is shared with ESLint, which runs in the same
step. The tool still runs and reports violations.