-- This file gives a bit of an indication of what might be involved in defining CSS properties in Stylish Haskell.
-- Though this is very rough, extremely incomplete, and isn't even valid Haskell.
-- It depends on an output type being defined.
longhand _ self "align-content" [Ident "stretch"] = Just self {alignContent = FlexAlign.Stretch}
longhand _ self "align-content" [Ident "center"] = Just self {alignContent = FlexAlign.Center}
longhand _ self "align-content" [Ident "flex-start"] = Just self {alignContent = FlexAlign.FlexStart}
longhand _ self "align-content" [Ident "flex-end"] = Just self {alignContent = FlexAlign.FlexEnd}
longhand _ self "align-content" [Ident "space-between"] = Just self {alignContent = FlexAlign.SpaceBetween}
longhand _ self "align-content" [Ident "space-around"] = Just self {alignContent = FlexAlign.SpaceAround}
longhand p self "align-content" v = genericProperty p v alignContent >>= \val -> self {alignContent = val}
parseAlignItem [Ident "stretch"] = Just AlignItem.Stretch
parseAlignItem [Ident "stretch"] = Just AlignItem.Center
parseAlignItem [Ident "flex-start"] = Just AlignItem.FlexStart
parseAlignItem [Ident "flex-end"] = Just AlignItem.FlexEnd
parseAlignItem [Ident "baseline"] = Just AlignItem.Baseline
parseAlignItem _ = Nothing
longhand _ self "align-items" value | Just val <- parseAlignItem value = Just self {alignItems = val}
longhand parent self "align-items" value =
genericProperty parent value alignItem >>= \val -> self {alignContent = val}
longhand _ self "align-self" value | Just val <- parseAlignItem value = Just self {alignSelf = val}
longhand parent self "align-self" value = do
genericProperty parent value alignSelf >>= \val -> self {alignSelf = val}
shorthand _ "animation" = sequenceShorthand ["animation-name", "animation-duration",
"animation-timing-function", "animation-delay", "animation-iteration-count",
"animation-duration", "animation-fill-mode", "animation-play-state"]
timeProperty _ _ [Dimension _ number "s"] = Just $ d number
timeProperty _ _ [Dimension _ number "ms"] = Just (d number * 1000)
timeProperty parent getter value = genericProperty parent value getter
longhand p self "animation-delay" v = timeProperty p v animationDelay >>= \val -> self {animationDelay = val}
longhand _ self "animation-direction" [Ident "normal"] = Just self {animationDirection = Direction.Normal}
longhand _ self "animation-direction" [Ident "reverse"] = Just self {animationDirection = Direction.Reverse}
longhand _ self "animation-direction" [Ident "alternate"] = Just self {animationDirection = Direction.Alternate}
longhand _ self "animation-direction" [Ident "alternate-reverse"] =
Just self {animationDirection = DIrection.AlternateReverse}
longhand p self "animation-direction" v =
genericProperty p v animationDirection >>= \val -> self {animationDirection = val}
longhand p self "animation-duration" v =
timeProperty p v animationDuration >>= \val -> self {animationDuration = val}
longhand _ self "animation-fill-mode" [Ident "none"] = Just self {animationFillMode = FillMode.None}
longhand _ self "animation-fill-mode" [Ident "forwards"] =
Just self {animationFillMode = FillMode.Forwards}
longhand _ self "animation-fill-mode" [Ident "backwards"] =
Just self {animationFillMode = FillMode.Backwards}
longhand _ self "animation-fill-mode" [Ident "both"] = Just self {animationFillMode = FillMode.Both}
longhand p self "animation-fill-mode" v =
genericProperty p v animationFillMode >>= \val -> self {animationFillMode = val}
longhand _ self "animation-iteration-count" [Number _ (NVInteger val)] =
Just self {animationIterationCount = Just val}
longhand _ self "animation-iteration-count" [Ident "infinite"] =
Just self {animationIterationCount = Nothing}
longhand p self "animation-iteration-count" v =
genericProperty p v animationIterationCount >>= \val -> self {animationIterationCount = val}
longhand _ self "animation-name" [Ident val] = Just self {animation = lookupKeyframe val}
longhand p self "animation-name" v = genericProperty p v animation >>= \val -> self {animation = val}
longhand _ self "animation-play-state" [Ident "puased"] = Just self {animating = False}
longhand _ self "animation-play-state" [Ident "running"] = Just self {animating = True}
longhand p self "animation-play-state" v = genericProperty p v animating >>= \val -> self {animating = val}
longhand _ self "animation-timing-function" [Ident "linear"] = Just self {animationTiming = Linear}
longhand _ self "animation-timing-function" [Ident "ease"] = Just self {animationTiming = Ease}
longhand _ self "animation-timing-function" [Ident "ease-in"] = Just self {animationTiming = EaseIn}
longhand _ self "animation-timing-function" [Ident "ease-out"] = Just self {animationTiming = EaseOut}
longhand _ self "animation-timing-function" [Ident "ease-in-out"] = Just self {animationTiming = EaseInOut}
longhand _ self "animation-timing-function" [Ident "step-start"] = Just self {animationTiming = StepStart}
longhand _ self "animation-timing-function" [Ident "step-end"] = Just self {animationTiming = StepEnd}
longhand _ self "animation-timing-function" [Function "steps"]:value
| [Number _ (NVInteger count), Ident "start"] <- function value =
Just self {animationTiming = StepsStart count}
| [Number _ (NVInteger count), Ident "end"] <- function value =
Just self {animationTiming = StepsEnd count}
longhand _ self "animation-timing-function" [Function "cubic-bezier"]:value
| [Number _ w, Number _ x, Number _ y, Number _ z] <- function value =
Just self {animationTiming = CubicBezier (d w) (d x) (d y) (d z)}
longhand p self "animationTimingFunction" v =
genericProperty p v animationTiming >>= \val -> self {animationTiming = val}
-- Utilities used:
genericProperty _ [Ident "initial"] getter = Just getter temp
genericProperty parent [Ident "inherit"] getter = Just getter parent
genericProperty _ _ _ = Nothing
sequenceShorthand properties values = sequenceShorthand' properties $ splitValues values
splitValues (Func name:values) = (Func name:arguments):splitValues values'
where (arguments, values') = scanBlock values
sequenceShorthand' (prop:props) (value:values)
| Just _ <- longhand temp temp prop value = (prop value):sequenceShorthand' props values
| otherwise = []
function (arg:Comma:rest) = let (args', rest') = function' rest in (arg:args', rest')
function args = scanBlock args
function' (arg:Comma:rest) = let (args', rest') = function' rest in (arg:args', rest')
function' _ = []
d NVInteger int = fromIntegral int
d NVScientific sci = toRealFloat sci