0 | module Text.CSS.Rule
 1 |
 2 | import Data.String
 3 | import Text.CSS.Declaration
 4 | import Text.CSS.Selector
 5 | import Web.Dom
 6 |
 7 | %default total
 8 |
 9 | public export
10 | data Rule : (n : Nat) -> Type where
11 |   Sel :
12 |        (selectors : List Selector)
13 |     -> (decls     : List Declaration)
14 |     -> Rule n
15 |
16 |   Media :
17 |        (query : String)
18 |     -> (rules : List $ Rule 0)
19 |     -> Rule 1
20 |
21 | export %inline
22 | sel : Selector -> List Declaration -> Rule n
23 | sel s = Sel [s]
24 |
25 | export %inline
26 | class : String -> List Declaration -> Rule n
27 | class s = sel (class s)
28 |
29 | export
30 | classes : List String -> List Declaration -> Rule n
31 | classes = sel . classes
32 |
33 | export %inline
34 | elem : {str : _} -> (0 tpe : ElementType str t) -> List Declaration -> Rule n
35 | elem v = sel $ elem v
36 |
37 | export %inline
38 | id : String -> List Declaration -> Rule n
39 | id = sel . id
40 |
41 | export %inline
42 | star : List Declaration -> Rule n
43 | star = sel Star
44 |
45 | export
46 | Interpolation (Rule n) where
47 |   interpolate (Sel s ds)    =
48 |     let dss := fastConcat $ map interpolate ds
49 |         ss  := fastConcat . intersperse ", " $ map interpolate s
50 |      in "\{ss}{\{dss}}"
51 |   interpolate (Media q rs)  = "@media (\{q}){\{unlines $ map interpolate rs}}"
52 |