{-# LANGUAGE OverloadedStrings, GeneralizedNewtypeDeriving #-}
module Clay.Filter
(
-- * Filter property.

  Filter
, filter
, filters

-- * Specific filter functions.

, url
, blur
, brightness
, contrast
, dropShadow
, grayscale
, hueRotate
, invert
, opacity
, saturate
, sepia
)
where

import Data.Monoid
import Data.Text hiding (filter)
import Prelude hiding (filter)

import Clay.Color
import Clay.Common
import Clay.Property
import Clay.Stylesheet
import Clay.Size

-------------------------------------------------------------------------------

newtype Filter = Filter Value
  deriving (Val, None, Inherit)

filter :: Filter -> Css
filter = prefixed (browsers <> "filter")

filters :: [Filter] -> Css
filters x = prefixed (browsers <> "filter") (noCommas x)

-------------------------------------------------------------------------------

url :: Text -> Filter
url u = Filter ("url(" <> value u <> ")")

blur :: Size LengthUnit -> Filter
blur i = Filter ("blur(" <> value i <> ")")

brightness :: Double -> Filter
brightness i = Filter ("brightness(" <> value i <> ")")

contrast :: Size Percentage -> Filter
contrast i = Filter ("contrast(" <> value i <> ")")

dropShadow :: Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Color -> Filter
dropShadow x y s c = Filter ("drop-shadow(" <> value (x ! y ! s ! c) <> ")")

grayscale :: Size Percentage -> Filter
grayscale g = Filter ("grayscale(" <> value g <> ")")

hueRotate :: Angle a -> Filter
hueRotate h = Filter ("hue-rotate(" <> value h <> ")")

invert :: Size Percentage -> Filter
invert i = Filter ("invert(" <> value i <> ")")

opacity :: Size Percentage -> Filter
opacity i = Filter ("opacity(" <> value i <> ")")

saturate :: Size Percentage -> Filter
saturate i = Filter ("saturate(" <> value i <> ")")

sepia :: Size Percentage -> Filter
sepia i = Filter ("sepia(" <> value i <> ")")