packages feed

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 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