clay 0.2 → 0.3
raw patch · 7 files changed
+288/−26 lines, 7 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Clay.Box: boxShadows :: [(Size a, Size a, Size a, Color)] -> Css
+ Clay.Filter: blur :: Size Abs -> Filter
+ Clay.Filter: brightness :: Double -> Filter
+ Clay.Filter: contrast :: Size Rel -> Filter
+ Clay.Filter: data Filter
+ Clay.Filter: dropShadow :: Size Abs -> Size Abs -> Size Abs -> Color -> Filter
+ Clay.Filter: filter :: Filter -> Css
+ Clay.Filter: filters :: [Filter] -> Css
+ Clay.Filter: grayscale :: Size Rel -> Filter
+ Clay.Filter: hueRotate :: Angle a -> Filter
+ Clay.Filter: instance Inherit Filter
+ Clay.Filter: instance None Filter
+ Clay.Filter: instance Val Filter
+ Clay.Filter: invert :: Size Rel -> Filter
+ Clay.Filter: opacity :: Size Rel -> Filter
+ Clay.Filter: saturate :: Size Rel -> Filter
+ Clay.Filter: sepia :: Size Rel -> Filter
+ Clay.Filter: url :: Text -> Filter
+ Clay.Gradient: Extend :: Value -> Extend
+ Clay.Gradient: closestCorner :: Extend
+ Clay.Gradient: closestSide :: Extend
+ Clay.Gradient: farthestCorner :: Extend
+ Clay.Gradient: farthestSide :: Extend
+ Clay.Gradient: instance Other Extend
+ Clay.Gradient: instance Val Extend
+ Clay.Gradient: newtype Extend
+ Clay.Mask: class Val a => Mask a where mask = pkey "mask"
+ Clay.Mask: clear :: MaskComposite
+ Clay.Mask: copy :: MaskComposite
+ Clay.Mask: data MaskComposite
+ Clay.Mask: destinationAtop :: MaskComposite
+ Clay.Mask: destinationIn :: MaskComposite
+ Clay.Mask: destinationOut :: MaskComposite
+ Clay.Mask: destinationOver :: MaskComposite
+ Clay.Mask: instance (Mask a, Mask b) => Mask (a, b)
+ Clay.Mask: instance Inherit MaskComposite
+ Clay.Mask: instance Mask BackgroundAttachment
+ Clay.Mask: instance Mask BackgroundClip
+ Clay.Mask: instance Mask BackgroundImage
+ Clay.Mask: instance Mask BackgroundOrigin
+ Clay.Mask: instance Mask BackgroundPosition
+ Clay.Mask: instance Mask BackgroundRepeat
+ Clay.Mask: instance Mask BackgroundSize
+ Clay.Mask: instance Mask MaskComposite
+ Clay.Mask: instance Mask a => Mask [a]
+ Clay.Mask: instance None MaskComposite
+ Clay.Mask: instance Other MaskComposite
+ Clay.Mask: instance Val MaskComposite
+ Clay.Mask: mask :: Mask a => a -> Css
+ Clay.Mask: maskAttachment :: BackgroundAttachment -> Css
+ Clay.Mask: maskAttachments :: [BackgroundAttachment] -> Css
+ Clay.Mask: maskClip :: BackgroundClip -> Css
+ Clay.Mask: maskClips :: [BackgroundClip] -> Css
+ Clay.Mask: maskComposite :: MaskComposite -> Css
+ Clay.Mask: maskComposites :: [MaskComposite] -> Css
+ Clay.Mask: maskImage :: BackgroundImage -> Css
+ Clay.Mask: maskImages :: [BackgroundImage] -> Css
+ Clay.Mask: maskOrigin :: BackgroundOrigin -> Css
+ Clay.Mask: maskOrigins :: [BackgroundOrigin] -> Css
+ Clay.Mask: maskPosition :: BackgroundPosition -> Css
+ Clay.Mask: maskPositions :: [BackgroundPosition] -> Css
+ Clay.Mask: maskRepeat :: BackgroundRepeat -> Css
+ Clay.Mask: maskRepeats :: [BackgroundRepeat] -> Css
+ Clay.Mask: maskSize :: BackgroundSize -> Css
+ Clay.Mask: maskSizes :: [BackgroundSize] -> Css
+ Clay.Mask: sourceAtop :: MaskComposite
+ Clay.Mask: sourceIn :: MaskComposite
+ Clay.Mask: sourceOut :: MaskComposite
+ Clay.Mask: sourceOver :: MaskComposite
+ Clay.Mask: xor :: MaskComposite
- Clay.Gradient: circle :: Radial
+ Clay.Gradient: circle :: Extend -> Radial
- Clay.Gradient: ellipse :: Radial
+ Clay.Gradient: ellipse :: Extend -> Radial
Files
- clay.cabal +9/−8
- src/Clay.hs +7/−3
- src/Clay/Box.hs +4/−0
- src/Clay/Filter.hs +81/−0
- src/Clay/Gradient.hs +11/−14
- src/Clay/Mask.hs +175/−0
- src/Clay/Render.hs +1/−1
clay.cabal view
@@ -1,5 +1,5 @@ Name: clay-Version: 0.2+Version: 0.3 Synopsis: CSS preprocessor as embedded Haskell. Description: Clay is a CSS preprocessor like LESS and Sass, but implemented as an embedded@@ -11,13 +11,12 @@ . The API documentation can be found in the top level module "Clay". .- > 0.1.1 -> 0.2- > - Rotate takes only one argument.- > - Added opacity property.- > - Print Clay banner in CSS comments by default.- > - Fixed bug in font-family rendering (Firefox only).- > - Added outline related properties.- > - Fixed bug in monospace font family.+ > 0.2 -> 0.3+ > - Fixed value grammar of radial gradients.+ > - Added mask related properties.+ > - Allow multiple box-shadows.+ > - Added filter property.+ > - Also render value prefix when both key and value are prefixed. Author: Sebastiaan Visser Maintainer: Sebastiaan Visser <code@fvisser.nl>@@ -47,10 +46,12 @@ Clay.Common Clay.Display Clay.Elements+ Clay.Filter Clay.Font Clay.Geometry Clay.Gradient Clay.Media+ Clay.Mask Clay.Property Clay.Pseudo Clay.Render
src/Clay.hs view
@@ -87,6 +87,8 @@ , module Clay.Text , module Clay.Transform , module Clay.Transition+, module Clay.Mask+, module Clay.Filter ) where @@ -110,14 +112,16 @@ import Clay.Color import Clay.Time import Clay.Common-import Clay.Display hiding (table)-import Clay.Font hiding (menu, caption, small, icon)+import Clay.Display hiding (table)+import Clay.Font hiding (menu, caption, small, icon) import Clay.Geometry import Clay.Gradient import Clay.Size-import Clay.Text hiding (pre)+import Clay.Text hiding (pre) import Clay.Transform import Clay.Transition+import Clay.Mask hiding (clear)+import Clay.Filter hiding (url, opacity) -- $media --
src/Clay/Box.hs view
@@ -4,6 +4,7 @@ , paddingBox, borderBox, contentBox , boxSizing , boxShadow+, boxShadows ) where @@ -35,4 +36,7 @@ boxShadow :: Size a -> Size a -> Size a -> Color -> Css boxShadow x y w c = prefixed (browsers <> "box-shadow") (x ! y ! w ! c)++boxShadows :: [(Size a, Size a, Size a, Color)] -> Css+boxShadows = prefixed (browsers <> "box-shadow") . map (\(a, b, c, d) -> a ! b ! c ! d)
+ src/Clay/Filter.hs view
@@ -0,0 +1,81 @@+{-# 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 Abs -> Filter+blur i = Filter ("blur(" <> value i <> ")")++brightness :: Double -> Filter+brightness i = Filter ("brightness(" <> value i <> ")")++contrast :: Size Rel -> Filter+contrast i = Filter ("contrast(" <> value i <> ")")++dropShadow :: Size Abs -> Size Abs -> Size Abs -> Color -> Filter+dropShadow x y s c = Filter ("drop-shadow(" <> value (x ! y ! s ! c) <> ")")++grayscale :: Size Rel -> Filter+grayscale g = Filter ("grayscale(" <> value g <> ")")++hueRotate :: Angle a -> Filter+hueRotate h = Filter ("hue-rotate(" <> value h <> ")")++invert :: Size Rel -> Filter+invert i = Filter ("invert(" <> value i <> ")")++opacity :: Size Rel -> Filter+opacity i = Filter ("opacity(" <> value i <> ")")++saturate :: Size Rel -> Filter+saturate i = Filter ("saturate(" <> value i <> ")")++sepia :: Size Rel -> Filter+sepia i = Filter ("sepia(" <> value i <> ")")+
src/Clay/Gradient.hs view
@@ -21,6 +21,9 @@ , circle, ellipse , circular, elliptical +, Extend (..)+, closestSide, closestCorner, farthestSide, farthestCorner+ -- , Extend -- , closestSide, closestCorner, farthestSide, farthestCorner @@ -75,19 +78,17 @@ newtype Radial = Radial Value deriving (Val, Other) -circle :: Radial-circle = Radial "circle"+circle :: Extend -> Radial+circle ext = Radial ("circle " <> value ext) -ellipse :: Radial-ellipse = Radial "ellipse"+ellipse :: Extend -> Radial+ellipse ext = Radial ("ellipse " <> value ext) circular :: Size Abs -> Radial-circular radius = Radial ("circle " <> value radius)+circular radius = Radial (value (radius, radius)) elliptical :: Size a -> Size a -> Radial-elliptical radx rady = Radial (value ("ellipse " <> value (radx, rady)))--{-+elliptical radx rady = Radial (value (radx, rady)) newtype Extend = Extend Value deriving (Val, Other)@@ -99,20 +100,16 @@ 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] <> ")"+ 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] <> ")"+ let Value v = "repeating-radial-gradient(" <> value [value d, value r, ramp xs] <> ")" in browsers <> v -------------------------------------------------------------------------------
+ src/Clay/Mask.hs view
@@ -0,0 +1,175 @@+{-# 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.Monoid++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"+
src/Clay/Render.hs view
@@ -160,7 +160,7 @@ ( Plain k , Plain v ) -> [prop k v] ( Prefixed ks , Plain v ) -> flip map ks $ \(p, k) -> prop (p <> k) v ( Plain k , Prefixed vs ) -> flip map vs $ \(p, v) -> prop k (p <> v)- ( Prefixed ks , Prefixed vs ) -> flip map ks $ \(p, k) -> (Left (p <> k) `maybe` prop (p <> k)) (lookup p vs)+ ( Prefixed ks , Prefixed vs ) -> flip map ks $ \(p, k) -> (Left (p <> k) `maybe` (prop (p <> k) . mappend p)) (lookup p vs) where prop k v = Right (k, v) properties :: Config -> [Either Text (Text, Text)] -> Builder