{-# 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 (Filter -> Value
(Filter -> Value) -> Val Filter
forall a. (a -> Value) -> Val a
value :: Filter -> Value
$cvalue :: Filter -> Value
Val, Filter
Filter -> None Filter
forall a. a -> None a
none :: Filter
$cnone :: Filter
None, Filter
Filter -> Inherit Filter
forall a. a -> Inherit a
inherit :: Filter
$cinherit :: Filter
Inherit)

filter :: Filter -> Css
filter :: Filter -> Css
filter = Prefixed -> Filter -> Css
forall a. Val a => Prefixed -> a -> Css
prefixed (Prefixed
browsers Prefixed -> Prefixed -> Prefixed
forall a. Semigroup a => a -> a -> a
<> Prefixed
"filter")

filters :: [Filter] -> Css
filters :: [Filter] -> Css
filters [Filter]
x = Prefixed -> Value -> Css
forall a. Val a => Prefixed -> a -> Css
prefixed (Prefixed
browsers Prefixed -> Prefixed -> Prefixed
forall a. Semigroup a => a -> a -> a
<> Prefixed
"filter") ([Filter] -> Value
forall a. Val a => [a] -> Value
noCommas [Filter]
x)

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

url :: Text -> Filter
url :: Text -> Filter
url Text
u = Value -> Filter
Filter (Value
"url(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Text -> Value
forall a. Val a => a -> Value
value Text
u Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

blur :: Size LengthUnit -> Filter
blur :: Size LengthUnit -> Filter
blur Size LengthUnit
i = Value -> Filter
Filter (Value
"blur(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size LengthUnit -> Value
forall a. Val a => a -> Value
value Size LengthUnit
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

brightness :: Double -> Filter
brightness :: Double -> Filter
brightness Double
i = Value -> Filter
Filter (Value
"brightness(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Double -> Value
forall a. Val a => a -> Value
value Double
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

contrast :: Size Percentage -> Filter
contrast :: Size Percentage -> Filter
contrast Size Percentage
i = Value -> Filter
Filter (Value
"contrast(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

dropShadow :: Size LengthUnit -> Size LengthUnit -> Size LengthUnit -> Color -> Filter
dropShadow :: Size LengthUnit
-> Size LengthUnit -> Size LengthUnit -> Color -> Filter
dropShadow Size LengthUnit
x Size LengthUnit
y Size LengthUnit
s Color
c = Value -> Filter
Filter (Value
"drop-shadow(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> (Size LengthUnit, (Size LengthUnit, (Size LengthUnit, Color)))
-> Value
forall a. Val a => a -> Value
value (Size LengthUnit
x Size LengthUnit
-> (Size LengthUnit, (Size LengthUnit, Color))
-> (Size LengthUnit, (Size LengthUnit, (Size LengthUnit, Color)))
forall a b. a -> b -> (a, b)
! Size LengthUnit
y Size LengthUnit
-> (Size LengthUnit, Color)
-> (Size LengthUnit, (Size LengthUnit, Color))
forall a b. a -> b -> (a, b)
! Size LengthUnit
s Size LengthUnit -> Color -> (Size LengthUnit, Color)
forall a b. a -> b -> (a, b)
! Color
c) Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

grayscale :: Size Percentage -> Filter
grayscale :: Size Percentage -> Filter
grayscale Size Percentage
g = Value -> Filter
Filter (Value
"grayscale(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
g Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

hueRotate :: Angle a -> Filter
hueRotate :: Angle a -> Filter
hueRotate Angle a
h = Value -> Filter
Filter (Value
"hue-rotate(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Angle a -> Value
forall a. Val a => a -> Value
value Angle a
h Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

invert :: Size Percentage -> Filter
invert :: Size Percentage -> Filter
invert Size Percentage
i = Value -> Filter
Filter (Value
"invert(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

opacity :: Size Percentage -> Filter
opacity :: Size Percentage -> Filter
opacity Size Percentage
i = Value -> Filter
Filter (Value
"opacity(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

saturate :: Size Percentage -> Filter
saturate :: Size Percentage -> Filter
saturate Size Percentage
i = Value -> Filter
Filter (Value
"saturate(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")

sepia :: Size Percentage -> Filter
sepia :: Size Percentage -> Filter
sepia Size Percentage
i = Value -> Filter
Filter (Value
"sepia(" Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Size Percentage -> Value
forall a. Val a => a -> Value
value Size Percentage
i Value -> Value -> Value
forall a. Semigroup a => a -> a -> a
<> Value
")")