Fast, small, zero-config library to format CSS with basic rules. The design goal is to format CSS in a way that makes it easy to inspect. Bundle size and runtime speed are more important than versatility and extensibility.
/* TURN THIS: */
@layer base.normalize{@media (dynamic-range:high) or (color-gamut:p3){@supports (color:color(display-p3 0 0 0)){:where(html){--link:color(display-p3 .1 .4 1);--link-visited:color(display-p3 .6 .2 1)}}}}@layer base.normalize{:where(html) :where(dialog){background-color:var(--surface-1)}}
/* INTO THIS: */
@layer base.normalize {
@media (dynamic-range: high) or (color-gamut: p3) {
@supports (color: color(display-p3 0 0 0)) {
:where(html) {
--link: color(display-p3 .1 .4 1);
--link-visited: color(display-p3 .6 .2 1);
}
}
}
}
@layer base.normalize {
:where(html) :where(dialog) {
background-color: var(--surface-1);
}
}
/* AND BACK AGAIN! */npm install @projectwallace/format-css
import { format } from '@projectwallace/format-css'
let old_css = '/* Your old CSS here */'
let new_css = format(old_css)Need more examples?
The package also exports lower-level formatters for individual CSS constructs:
import {
format_value,
format_declaration,
format_selector,
format_atrule_prelude,
} from '@projectwallace/format-css'
// Format a CSS value (e.g. the right-hand side of a declaration)
format_value(node.value)
// Format a single CSS declaration (property + value)
format_declaration(node)
// Format a single CSS selector
format_selector(node)
// Format an at-rule prelude string (e.g. the query part of @media)
format_atrule_prelude(node.prelude.text)All of these accept the same options as format(). However, tab_size has no effect on them since they do not produce indented output.
format_declaration(node, { minify: true })
format_selector(node, { minify: true })- Every AtRule starts on a new line
- Every Rule starts on a new line
- Every Selector starts on a new line
- A comma is placed after every Selector that’s not the last in the SelectorList
- Every Block is indented with 1 tab more than the previous indentation level
- Every Declaration starts on a new line
- Every Declaration ends with a semicolon (;)
- An empty line is placed after a Block unless it’s the last in the surrounding Block
- Multiline tokens like Selectors, Values, etc. are rendered on a single line
- Unknown syntax is rendered as-is, with multi-line formatting kept intact
This package also exposes a minifier function since minifying CSS follows many of the same rules as formatting.
import { format, minify } from '@projectwallace/format-css'
let minified = minify('a {}')
// which is an alias for
let formatted_mini = format('a {}', { minify: true })For cases where you cannot control the tab size with CSS there is an option to override the default tabbed indentation with N spaces.
import { format } from '@projectwallace/format-css'
let formatted = format('a { color: red; }', {
tab_size: 2,
})This library also ships a CLI tools that's a small wrapper around the library.
USAGE
format-css [options] [file...]
cat styles.css | format-css [options]
OPTIONS
--minify Minify the CSS output
--tab-size=<n> Use N spaces for indentation instead of tabs
--help, -h Show this help
EXAMPLES
# Format a file
format-css styles.css
# Format with 2-space indentation
format-css styles.css --tab-size=2
# Minify
format-css styles.css --minify
# Via pipe
cat styles.css | format-css
- Format CSS online - See this formatter in action online!
- Minify CSS online - See this minifier in action online!
- CSS Analyzer - The best CSS analyzer that powers all analysis on projectwallace.com