packages feed

css-parser-0.0.1: src/CssParser/At/Keyframe.hs

module CssParser.At.Keyframe where

import CssParser.Descriptor (Descriptor)
import CssParser.Ident ( Ident(..) )
import CssParser.Rule.Value ( PropVals )
import CssParser.Rule.TypedNum
import CssParser.Prelude
import CssParser.Show ( CssShow(..), ShowSpaceBetween(..), CslNe )

data KeyframeAdr
  = KeyframePercentAdr RawNum
  | KeyframeStart
  | KeyframeEnd
  deriving (Show, Eq, Ord, Generic)

instance CssShow KeyframeAdr where
  toCssText = \case
    KeyframePercentAdr p -> toCssText $ TypedNum p Percent
    KeyframeStart -> "from"
    KeyframeEnd -> "to"

data PropEntry = PropEntry Descriptor PropVals deriving (Show, Eq, Ord, Generic)
instance ShowSpaceBetween PropEntry PropEntry where
  cssSpace _ _ = ""
instance CssShow PropEntry where
  toCssText (PropEntry pn pv) =
    toCssText pn <> toCssText pv <> ";"

data Keyframe = Keyframe (CslNe KeyframeAdr) [PropEntry] deriving (Show, Eq, Ord, Generic)

instance CssShow Keyframe where
  toCssText (Keyframe kfa ps) =
    toCssText kfa <> " {" <> unwords (toCssText <$> ps) <> "}"
instance ShowSpaceBetween Keyframe Keyframe where
  cssSpace _ _ = " "
newtype KeyframeSetName = KeyframeSetName Ident deriving newtype (Show, Eq, Ord, CssShow, IsString) deriving (Generic)

data KeyframeSet
  = KeyframeSet KeyframeSetName [Keyframe]
  deriving (Show, Eq, Ord, Generic)

instance CssShow KeyframeSet where
  toCssText (KeyframeSet kfsn frames) =
    toCssText kfsn <> " {" <> toCssText frames <> "}"