0 | module Text.CSS.Selector
4 | import Text.CSS.Class
5 | import Text.CSS.Property
11 | data Combinator : Type where
12 | Descendant : Combinator
14 | GeneralSibling : Combinator
15 | AdjacentSibling : Combinator
18 | Interpolation Combinator where
19 | interpolate Descendant = ""
20 | interpolate Child = ">"
21 | interpolate GeneralSibling = "~"
22 | interpolate AdjacentSibling = "+"
25 | data AttributeValue : Type where
26 | Set : AttributeValue
27 | Has : String -> AttributeValue
28 | Equals : String -> AttributeValue
29 | Contains : String -> AttributeValue
30 | Prefix : String -> AttributeValue
31 | Suffix : String -> AttributeValue
34 | Interpolation AttributeValue where
35 | interpolate Set = ""
36 | interpolate (Has s) = "~=\{quote s}"
37 | interpolate (Equals s) = "=\{quote s}"
38 | interpolate (Contains s) = "*=\{quote s}"
39 | interpolate (Prefix s) = "^=\{quote s}"
40 | interpolate (Suffix s) = "$=\{quote s}"
43 | data Selector : Type where
45 | Id : String -> Selector
46 | Class : Class -> Selector
47 | Elem : {str : _} -> (0 tag : HTMLTag str) -> Selector
48 | Attr : String -> AttributeValue -> Selector
49 | Complex : Selector -> Combinator -> Selector -> Selector
51 | (::) : Selector -> Selector -> Selector
66 | Dir : Direction -> Selector
76 | FirstChild : Selector
78 | FirstOfType : Selector
82 | FocusVisible : Selector
84 | FocusWithin : Selector
90 | Indeterminate : Selector
96 | Lang : String -> Selector
98 | LastChild : Selector
100 | LastOfType : Selector
106 | LocalLink : Selector
110 | NthChild : String -> Selector
112 | NthOfType : String -> Selector
114 | NthLastChild : String -> Selector
116 | NthLastOfType : String -> Selector
118 | OnlyChild : Selector
120 | OnlyOfType : Selector
122 | Optional : Selector
124 | OutOfRange : Selector
128 | PlaceholderShown : Selector
134 | ReadOnly : Selector
136 | ReadWrite : Selector
138 | Required : Selector
153 | Backdrop : Selector
156 | CueRegion : Selector
157 | FirstLetter : Selector
158 | FirstLine : Selector
159 | FileSelectorButton : Selector
161 | Placeholder : Selector
162 | Selection : Selector
165 | (>) : Selector -> Selector -> Selector
166 | p > c = Complex p Child c
169 | (+) : Selector -> Selector -> Selector
170 | c1 + c2 = Complex c1 AdjacentSibling c2
173 | Interpolation Selector where
174 | interpolate Star = "*"
175 | interpolate (Id s) = "#\{s}"
176 | interpolate (Class s) = ".\{s}"
177 | interpolate (Elem {str} _) = str
178 | interpolate (Attr s v) = "[\{s}\{v}]"
179 | interpolate [] = ""
180 | interpolate (h::t) = interpolate h ++ interpolate t
181 | interpolate (Complex s1 Descendant s2) = "\{s1} \{s2}"
182 | interpolate (Complex s1 c s2) = "\{s1} \{c} \{s2}"
183 | interpolate Active = ":active"
184 | interpolate AnyLink = ":any-link"
185 | interpolate Blank = ":blank"
186 | interpolate Checked = ":checked"
187 | interpolate Current = ":current"
188 | interpolate Default = ":default"
189 | interpolate (Dir x) = ":dir(\{x})"
190 | interpolate Disabled = ":disabled"
191 | interpolate Empty = ":empty"
192 | interpolate Enabled = ":enabled"
193 | interpolate First = ":first"
194 | interpolate FirstChild = ":first-child"
195 | interpolate FirstOfType = ":first-of-type"
196 | interpolate Focus = ":focus"
197 | interpolate FocusVisible = ":focus-visible"
198 | interpolate FocusWithin = ":focus-within"
199 | interpolate Future = ":future"
200 | interpolate Hover = ":hover"
201 | interpolate Indeterminate = ":indeterminate"
202 | interpolate InRange = ":in-range"
203 | interpolate Invalid = ":invalid"
204 | interpolate (Lang x) = ":lang(\{x})"
205 | interpolate LastChild = ":last-child"
206 | interpolate LastOfType = ":last-of-type"
207 | interpolate Left = ":left"
208 | interpolate Link = ":link"
209 | interpolate LocalLink = ":local-link"
210 | interpolate Modal = ":modal"
211 | interpolate (NthChild x) = ":nth-child(\{x})"
212 | interpolate (NthOfType x) = ":nth-of-type(\#{x})"
213 | interpolate (NthLastChild x) = ":nth-last-child(\#{x})"
214 | interpolate (NthLastOfType x) = ":nth-last-of-type(\#{x})"
215 | interpolate OnlyChild = ":only-child"
216 | interpolate OnlyOfType = ":only-of-type"
217 | interpolate Optional = ":optional"
218 | interpolate OutOfRange = ":out-of-range"
219 | interpolate Past = ":past"
220 | interpolate PlaceholderShown = ":placeholder-shown"
221 | interpolate Playing = ":playing"
222 | interpolate Paused = ":paused"
223 | interpolate ReadOnly = ":read-only"
224 | interpolate ReadWrite = ":read-write"
225 | interpolate Required = ":required"
226 | interpolate Right = ":right"
227 | interpolate Root = ":root"
228 | interpolate Scope = ":scope"
229 | interpolate Valid = ":valid"
230 | interpolate Target = ":target"
231 | interpolate Visited = ":visited"
232 | interpolate After = "::after"
233 | interpolate Backdrop = "::backdrop"
234 | interpolate Before = "::before"
235 | interpolate Cue = "::cue"
236 | interpolate CueRegion = "::cue-region"
237 | interpolate FirstLetter = "::first-letter"
238 | interpolate FirstLine = "::first-line"
239 | interpolate FileSelectorButton = "::file-selector-button"
240 | interpolate Marker = "::marker"
241 | interpolate Placeholder = "::placeholder"
242 | interpolate Selection = "::selection"
245 | class : Class -> Selector
249 | classes : List Class -> Selector
251 | classes (x :: xs) = class x :: classes xs
254 | elem : {str : _} -> (0 tpe : HTMLTag str) -> Selector
258 | attribute : String -> Selector
259 | attribute s = Attr s Set
262 | id : String -> Selector