// a parser for style sheets in ori
WHITESPACE = _{ " " | "\t" | "\n" | "\r" }
COMMENT = _{ "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
// atoms
Identifier = @{ (ASCII_ALPHA | "-" | "_") ~ (ASCII_ALPHANUMERIC | "-" | "_")* }
Number = @{ ASCII_DIGIT+ ~ ("." ~ ASCII_DIGIT+)? ~ (^"e" ~ ("-" | "-") ~ ASCII_DIGIT+)? }
// values
Px = { "px" }
Pt = { "pt" }
Pc = { "pc" | "%" }
Vw = { "vw" }
Vh = { "vh" }
Em = { "em" }
Unit = { Number ~ (Px | Pt | Pc | Vw | Vh | Em)? }
HexColor = @{ "#" ~ (ASCII_HEX_DIGIT{8} | ASCII_HEX_DIGIT{6} | ASCII_HEX_DIGIT{3, 4}) }
RgbColor = { "rgb(" ~ Number ~ "," ~ Number ~ "," ~ Number ~ ")" }
RgbaColor = { "rgba(" ~ Number ~ "," ~ Number ~ "," ~ Number ~ "," ~ Number ~ ")" }
Color = { HexColor | RgbColor | RgbaColor }
Enum = { Identifier }
String = { "\"" ~ (!"\"" ~ ANY)* ~ "\"" }
// transitions
Transition = _{ Number ~ "s" }
// attribute
Transitionable = _{ Unit | Color }
AttributeValue = { Transitionable ~ Transition? | Enum | String }
Attribute = { Identifier ~ ":" ~ AttributeValue ~ ";" }
// selector
State = { ":" ~ Identifier }
Element = { (Identifier | Wildcard) ~ State* }
Class = { "." ~ Identifier }
Wildcard = { "*" }
Selector = { (Element ~ Class*) | Class+ }
Selectors = { Selector+ }
// stylesheet
StyleRule = { Selectors ~ "{" ~ Attribute* ~ "}" }
Style = { SOI ~ StyleRule* ~ EOI }