Correct pseudoclass to pseudoelement rewrites to apply to only rightmost selector. I previously got the semantics of my datastructures backwards: the head is the rightmost selector.
ISSUES: Namespaces have just been implemented.
Remove preceding whitespace from all CSS at-rules.
Lower psuedoclasses & namespaces throughout CSS selectors. Previously I just applied to them to the rightmost.
Rewrite parsed namespaces according to @namespace rules.
Evaluate attribute namespace selectors.
Parse namespace selectors.
Rewrite trivial cases of :where & :is. This is mostly for the psuedoselector rewrites performed in Data.CSS.Preprocessor.PsuedoClasses
Compute correct specificity for :is() & :not() pseudoclasses.
Implement :nth-child() & :nth-of-type(). I don't think I'll implement :nth-last-child() & :nth-last-of-type() until I'm shown their value, Haskell Stylist doesn't yet have access to the data to support them.
Implement :is, :where, & :not functional pseudoclasses. This is needed by some of the lowerings for other pseudoclasses. TODO correctly compute specificity.
Prepare to interpret functional pseudoclasses.
ISSUES: Record pseudoclass progress.
Correct legacy :before/:after syntax.
Support lowering single-arg psuedoclasses.
Implement psuedoclass rewrite rules.
ISSUES: Plan psuedoclass lowering.
ISSUES: Text properties *mostly* implemented, upstreamed from Rhapsode core.
Substitute in counters for any CSS textual property, not just `content`. Will be required by Rhapsode for navigational markers.
Implement style tree flattening utility. This will be useful in Rhapsode for making sure voice synthesizers continue to have full voice features information as the user jumps around the document. And it will be useful for visual browsers in transitioning from layout to render.