Skip to content

Commit fd7f96f

Browse files
committed
Add some support for media queries
1 parent 22c69df commit fd7f96f

File tree

5 files changed

+45
-4
lines changed

5 files changed

+45
-4
lines changed

site/Main.purs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import Css.Font
1111
import Css.FontFace
1212
import Css.Geometry
1313
import Css.Gradient
14+
import qualified Css.Media as M
1415
import Css.Pseudo
1516
import Css.Render
1617
import Css.Selector
@@ -80,6 +81,10 @@ style = do
8081

8182
keyframes "buzz-button" $ tuple2 50 (shake id) NEL.:| [tuple2 100 (shake negate)]
8283

84+
query M.screen (NEL.singleton <<< M.maxWidth $ px 768) $
85+
h1 ? do
86+
fontSize (em 2)
87+
8388
html ? height (pct 100)
8489
body ? do
8590
fontFamily ["Lato"] (NEL.singleton sansSerif)

src/Css/Media.purs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module Css.Media where
2+
3+
import Css.Property
4+
import Css.Size
5+
import Css.String
6+
import Css.Stylesheet
7+
import Data.Maybe
8+
9+
screen :: MediaType
10+
screen = MediaType $ fromString "screen"
11+
12+
maxWidth :: Size Abs -> Feature
13+
maxWidth = Feature "max-width" <<< Just <<< value

src/Css/Property.purs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
module Css.Property where
22

33
import Css.String
4+
import Data.Foldable
5+
import Data.Maybe
46
import Data.Monoid
57
import Data.Profunctor.Strong
68
import Data.Tuple
7-
import Data.Foldable
89
import qualified Data.Array.NonEmpty as NEL
910

1011
data Prefixed = Prefixed [Tuple String String]
@@ -22,6 +23,10 @@ instance semigroupPrefixed :: Semigroup Prefixed where
2223
instance monoidPrefixed :: Monoid Prefixed where
2324
mempty = Plain mempty
2425

26+
plain :: Prefixed -> String
27+
plain (Prefixed xs) = fromMaybe "" $ lookup "" xs
28+
plain (Plain p ) = p
29+
2530
-- TODO: Escape
2631
quote :: String -> String
2732
quote s = "\"" <> s <> "\""

src/Css/Render.purs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,24 +63,39 @@ frame :: Number -> [Rule] -> String
6363
frame p rs = show p <> "% " <> "{ " <> x <> " }"
6464
where x = fromMaybe "" <<< renderedInline $ rules [] rs
6565

66+
query' :: MediaQuery -> [App] -> [Rule] -> Rendered
67+
query' q sel rs = Just <<< That <<< Sheet $ mediaQuery q <> " { " <> fromMaybe "" (renderedSheet $ rules sel rs) <> " }\n"
68+
69+
mediaQuery :: MediaQuery -> String
70+
mediaQuery (MediaQuery no ty fs) = "@media " <> mediaType ty <> NEL.sconcat ((" and " <>) <<< feature <$> fs)
71+
72+
mediaType :: MediaType -> String
73+
mediaType (MediaType (Value s)) = plain s
74+
75+
feature :: Feature -> String
76+
feature (Feature k mv) = maybe k (\(Value v) -> "(" <> k <> ": " <> plain v <> ")") mv
77+
6678
face :: [Rule] -> Rendered
6779
face rs = Just <<< That <<< Sheet $ "@font-face { " <> fromMaybe "" (renderedInline $ rules [] rs) <> " }\n"
6880

6981
rules :: [App] -> [Rule] -> Rendered
70-
rules sel rs = topRules <> importRules <> keyframeRules <> faceRules <> nestedSheets
82+
rules sel rs = topRules <> importRules <> keyframeRules <> faceRules <> nestedSheets <> queryRules
7183
where property (Property k v) = Just (Tuple k v)
7284
property _ = Nothing
7385
nested (Nested a ns ) = Just (Tuple a ns)
7486
nested _ = Nothing
87+
queries (Query q ns ) = Just (Tuple q ns)
88+
queries _ = Nothing
7589
kframes (Keyframe fs ) = Just fs
7690
kframes _ = Nothing
7791
faces (Face ns ) = Just ns
7892
faces _ = Nothing
7993
imports (Import i ) = Just i
8094
imports _ = Nothing
8195
topRules = rule' sel (mapMaybe property rs)
82-
nestedSheets = intercalate (Just (That (Sheet " "))) $ uncurry nestedRules <$> mapMaybe nested rs
96+
nestedSheets = foldMap (<> (Just <<< That $ Sheet "\n")) $ uncurry nestedRules <$> mapMaybe nested rs
8397
nestedRules a = rules (a : sel)
98+
queryRules = foldMap (uncurry $ flip query' sel) $ mapMaybe queries rs
8499
keyframeRules = foldMap kframe $ mapMaybe kframes rs
85100
faceRules = foldMap face $ mapMaybe faces rs
86101
importRules = foldMap imp $ mapMaybe imports rs

src/Css/Stylesheet.purs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ newtype MediaType = MediaType Value
1313

1414
data NotOrOnly = Not | Only
1515

16-
data MediaQuery = MediaQuery (Maybe NotOrOnly) MediaType [Feature]
16+
data MediaQuery = MediaQuery (Maybe NotOrOnly) MediaType (NEL.NonEmpty Feature)
1717

1818
data Feature = Feature String (Maybe Value)
1919

@@ -63,6 +63,9 @@ infixr 5 ?
6363
(?) :: Selector -> Css -> Css
6464
(?) sel rs = rule $ Nested (Sub sel) (runS rs)
6565

66+
query :: MediaType -> NEL.NonEmpty Feature -> Css -> Css
67+
query ty fs = rule <<< Query (MediaQuery Nothing ty fs) <<< runS
68+
6669
keyframes :: String -> NEL.NonEmpty (Tuple Number Css) -> Css
6770
keyframes n xs = rule $ Keyframe (Keyframes n (second runS <$> xs))
6871

0 commit comments

Comments
 (0)