0 | module Text.CSS.Rule
 1 |
 2 | import Data.String
 3 | import Text.CSS.Class
 4 | import Text.CSS.Declaration
 5 | import Text.CSS.Selector
 6 | import Text.HTML.Ref
 7 | import Text.HTML.Tag
 8 |
 9 | %default total
10 |
11 | public export
12 | data Rule : (n : Nat) -> Type where
13 |   Sel :
14 |        (selectors : List Selector)
15 |     -> (decls     : List Declaration)
16 |     -> Rule n
17 |
18 |   Media :
19 |        (query : String)
20 |     -> (rules : List $ Rule 0)
21 |     -> Rule 1
22 |
23 |   Container :
24 |        (query : String)
25 |     -> (rules : List $ Rule 0)
26 |     -> Rule 1
27 |
28 | export %inline
29 | sel : Selector -> List Declaration -> Rule n
30 | sel s = Sel [s]
31 |
32 | export %inline
33 | class : Class -> List Declaration -> Rule n
34 | class s = sel (class s)
35 |
36 | export
37 | classes : List Class -> List Declaration -> Rule n
38 | classes = sel . classes
39 |
40 | export %inline
41 | elem : {str : _} -> (0 tag : HTMLTag str) -> List Declaration -> Rule n
42 | elem v = sel $ elem v
43 |
44 | export %inline
45 | id : String -> List Declaration -> Rule n
46 | id = sel . id
47 |
48 | export %inline
49 | star : List Declaration -> Rule n
50 | star = sel Star
51 |
52 | ||| Uses an element ref as an ID selector
53 | export %inline
54 | ref : {0 t : HTMLTag s} -> Ref t -> List Declaration -> Rule n
55 | ref (Id i) = id i
56 |
57 | export
58 | Interpolation (Rule n) where
59 |   interpolate (Sel s ds)    =
60 |     let dss := fastConcat $ map interpolate ds
61 |         ss  := fastConcat . intersperse ", " $ map interpolate s
62 |      in "\{ss}{\{dss}}"
63 |   interpolate (Media q rs)  = "@media (\{q}){\{unlines $ map interpolate rs}}"
64 |   interpolate (Container q rs) = "@container (\{q}){\{unlines $ map interpolate rs}}"
65 |