{-# LANGUAGE OverloadedStrings , FlexibleInstances , GeneralizedNewtypeDeriving #-} module Clay.Mask ( -- * Generic mask property. Mask (mask) -- * The mask-composite. , MaskComposite , clear, copy , sourceOver, sourceIn, sourceOut, sourceAtop , destinationOver, destinationIn, destinationOut, destinationAtop , xor , maskComposite , maskComposites -- * The mask-position. , maskPosition , maskPositions -- * The mask-size. , maskSize , maskSizes -- * The mask-repeat. , maskRepeat , maskRepeats -- * The mask-origin. , maskOrigin , maskOrigins -- * The mask-clip. , maskClip , maskClips -- * The mask-attachment. , maskAttachment , maskAttachments -- * The mask-image. , maskImage , maskImages ) where import Data.Semigroup import Clay.Background import Clay.Common import Clay.Property import Clay.Stylesheet pkey :: Val a => Prefixed -> a -> Css pkey k = prefixed (browsers <> k) ------------------------------------------------------------------------------- -- | We implement the generic mask property as a type class that accepts -- multiple value types. This allows us to combine different mask aspects into -- a shorthand syntax. class Val a => Mask a where mask :: a -> Css mask = pkey "mask" instance Mask a => Mask [a] instance (Mask a, Mask b) => Mask (a, b) instance Mask MaskComposite instance Mask BackgroundPosition instance Mask BackgroundSize instance Mask BackgroundRepeat instance Mask BackgroundOrigin instance Mask BackgroundClip instance Mask BackgroundAttachment instance Mask BackgroundImage ------------------------------------------------------------------------------- newtype MaskComposite = MaskComposite Value deriving (Val, Other, Inherit, None) clear, copy , sourceOver, sourceIn, sourceOut, sourceAtop , destinationOver, destinationIn, destinationOut, destinationAtop , xor :: MaskComposite clear = other "clear" copy = other "copy" sourceOver = other "source-over" sourceIn = other "source-in" sourceOut = other "source-out" sourceAtop = other "source-atop" destinationOver = other "destination-over" destinationIn = other "destination-in" destinationOut = other "destination-out" destinationAtop = other "destination-atop" xor = other "xor" maskComposite :: MaskComposite -> Css maskComposite = pkey "mask-composite" maskComposites :: [MaskComposite] -> Css maskComposites = pkey "mask-composite" ------------------------------------------------------------------------------- maskPosition :: BackgroundPosition -> Css maskPosition = pkey "mask-position" maskPositions :: [BackgroundPosition] -> Css maskPositions = pkey "mask-position" ------------------------------------------------------------------------------- maskSize :: BackgroundSize -> Css maskSize = pkey "mask-size" maskSizes :: [BackgroundSize] -> Css maskSizes = pkey "mask-size" ------------------------------------------------------------------------------- maskRepeat :: BackgroundRepeat -> Css maskRepeat = pkey "mask-repeat" maskRepeats :: [BackgroundRepeat] -> Css maskRepeats = pkey "mask-repeat" ------------------------------------------------------------------------------- maskImage :: BackgroundImage -> Css maskImage = pkey "mask-image" maskImages :: [BackgroundImage] -> Css maskImages = pkey "mask-image" ------------------------------------------------------------------------------- maskOrigin :: BackgroundOrigin -> Css maskOrigin = pkey "mask-origin" maskOrigins :: [BackgroundOrigin] -> Css maskOrigins = pkey "mask-origin" ------------------------------------------------------------------------------- maskClip :: BackgroundClip -> Css maskClip = pkey "mask-clip" maskClips :: [BackgroundClip] -> Css maskClips = pkey "mask-clip" ------------------------------------------------------------------------------- maskAttachment :: BackgroundAttachment -> Css maskAttachment = pkey "mask-attachment" maskAttachments :: [BackgroundAttachment] -> Css maskAttachments = pkey "mask-attachment"