stylist: Apply CSS styles to a document tree.

[ language, library, mit ] [ Propose Tags ]

Reusable CSS engine allowing you to parse CSS stylesheets and to query the style properties for a given element. It covers CSS parsing, selection, cascade, and inheritance, whilst allowing you to declaratively define supported properties and at-rules. The hope is that this would be useful for implementing new browser engines, web development tools, and UI frameworks.

[Skip to Readme]
Versions [faq],,,,,
Change log
Dependencies async (>=2.1 && <2.3), base (>=4.9 && <=4.12), css-syntax (==0.1.*), hashable, network-uri (==2.6.*), text, unordered-containers (==0.2.*) [details]
License MIT
Copyright Adrian Cochrane copyright 2019
Author Adrian Cochrane
Category Language
Source repo head: git clone
Uploaded by alcinnz at 2020-05-08T09:03:40Z
Distributions NixOS:
Downloads 1059 total (67 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs not available [build log]
All reported builds failed as of 2020-05-08 [all 3 reports]


  • Data
    • CSS
      • Preprocessor
        • Data.CSS.Preprocessor.Assets
        • Data.CSS.Preprocessor.Conditions
          • Data.CSS.Preprocessor.Conditions.Expr
        • Data.CSS.Preprocessor.PsuedoClasses
        • Data.CSS.Preprocessor.Text
      • Data.CSS.Style
      • Data.CSS.StyleTree
      • Syntax
        • Data.CSS.Syntax.Selector
        • Data.CSS.Syntax.StyleSheet


Maintainer's Corner

For package maintainers and hackage trustees

Readme for stylist-

[back to package description]

Haskell Stylist

Generic CSS style engine for Haskell, intended to aid the development of new browser engines.

Stylish Haskell implements CSS selection and cascade (but not inheritance) independant of the CSS at-rules and properties understood by the caller. It is intended to ease the development of new browser engines, independant of their output targets.

For more interesting projects see:


The second major number indicates that more of CSS has been implemented within the existing API. Until then the error recovery rules will ensure as yet invalid CSS won't have any effect.

The first major number indicates any other change to the API, and might break your code.


To parse a CSS stylesheet call Data.CSS.Syntax.StyleSheet.parse which returns a variant of the passed in StyleSheet. StyleSheet is a typeclass specifying methods for parsing at-rules (parseAtRule), storing parsed style rules (addRule), and optionally setting the stylesheet's priority (setPriority).

If these ultimately call down into a Data.CSS.Syntax.Style.QueryableStyleSheet you can call queryRules to find all matching style rules organized by psuedoelement. Once you have these style rules (typically by specifying a psuedoelement) you can call cascade' to resolve them into any instance of PropertyParser. To query rules not targetting a psuedoelement, you can either lookup the "" psuedoelement or use the cascade shorthand.

PropertyParser allows to declaratively (via Haskell pattern matching) specify how to parse CSS properties, and how they're impacted by CSS inheritance. It has four methods: longhand and shorthand specify how to parse CSS properties, whilst temp and inherit specifies what the default values should be.


You can contributed code or register "issues" to Haskell Stylist by contacting me (Adrian Cochrane) via mastodon or email..

If you're contributing code you can link me to where you're hosting your git fork, or send a patch file. Or if you simply want to ask for more features or fixes don't hesitate to contact me!

Feel free to mirror this repo elsewhere! Just tell me about it so I can watch that mirror for contributions.


  1. Install ghc and cabal-install. (Debian package names listed here)
  2. From within the git repository, run cabal install. This'll compile Stylist and all it's other dependencies.
  3. Run cabal test after every change you make.