{-# LANGUAGE
OverloadedStrings
, FlexibleInstances
, GeneralizedNewtypeDeriving
#-}
module Clay.Gradient
(
Ramp
, linearGradient
, hGradient
, vGradient
, Radial
, circle, ellipse
, circular, elliptical
, Extend
, closestSide, closestCorner, farthestSide, farthestCorner
, radialGradient
, repeatingLinearGradient
, hRepeatingGradient
, vRepeatingGradient
, repeatingRadialGradient
)
where
import Data.Monoid
import Clay.Color
import Clay.Common
import Clay.Property
import Clay.Size
import Clay.Background
type Ramp = [(Color, Size Percentage)]
linearGradient :: Direction -> Ramp -> BackgroundImage
linearGradient d xs = other $ Value $
let Value v = "linear-gradient(" <> value d <> "," <> ramp xs <> ")"
in browsers <> v
hGradient, vGradient :: Color -> Color -> BackgroundImage
hGradient = shortcut (linearGradient (straight sideLeft))
vGradient = shortcut (linearGradient (straight sideTop ))
repeatingLinearGradient :: Direction -> Ramp -> BackgroundImage
repeatingLinearGradient d xs = other $ Value $
let Value v = "repeating-linear-gradient(" <> value d <> "," <> ramp xs <> ")"
in browsers <> v
hRepeatingGradient, vRepeatingGradient :: Color -> Color -> BackgroundImage
hRepeatingGradient = shortcut (repeatingLinearGradient (straight sideLeft))
vRepeatingGradient = shortcut (repeatingLinearGradient (straight sideTop ))
newtype Radial = Radial Value
deriving (Val, Other)
circle :: Extend -> Radial
circle ext = Radial ("circle " <> value ext)
ellipse :: Extend -> Radial
ellipse ext = Radial ("ellipse " <> value ext)
circular :: Size LengthUnit -> Radial
circular radius = Radial (value (radius, radius))
elliptical :: Size a -> Size a -> Radial
elliptical radx rady = Radial (value (radx, rady))
newtype Extend = Extend Value
deriving (Val, Other)
closestSide, closestCorner, farthestSide, farthestCorner :: Extend
closestSide = Extend "closest-side"
closestCorner = Extend "closest-corner"
farthestSide = Extend "farthest-side"
farthestCorner = Extend "farthest-corner"
radialGradient :: Loc l => l -> Radial -> Ramp -> BackgroundImage
radialGradient d r xs = other $ Value $
let Value v = "radial-gradient(" <> value [value d, value r, ramp xs] <> ")"
in browsers <> v
repeatingRadialGradient :: Loc l => l -> Radial -> Ramp -> BackgroundImage
repeatingRadialGradient d r xs = other $ Value $
let Value v = "repeating-radial-gradient(" <> value [value d, value r, ramp xs] <> ")"
in browsers <> v
ramp :: Ramp -> Value
ramp xs = value (map (\(a, b) -> value (value a, value b)) xs)
shortcut :: (Ramp -> BackgroundImage) -> Color -> Color -> BackgroundImage
shortcut g f t = g [(f, (pct 0)), (t, (pct 100))]