3 | import public Web.Internal.Types
4 | import public Web.Raw.Dom as Dom
12 | %foreign "browser:lambda:()=>window"
13 | prim__window : PrimIO Window
15 | %foreign "browser:lambda:()=>document"
16 | prim__document : PrimIO Document
19 | window : JSIO Window
20 | window = primJS prim__window
23 | document : JSIO Document
24 | document = primJS prim__document
27 | body : JSIO HTMLElement
28 | body = unMaybe "Web.Dom.body" $
document >>= to body
37 | Anchor = HTMLAnchorElement
41 | Area = HTMLAreaElement
45 | Audio = HTMLAudioElement
53 | Base = HTMLBaseElement
57 | Body = HTMLBodyElement
61 | Button = HTMLButtonElement
65 | Canvas = HTMLCanvasElement
69 | DList = HTMLDListElement
73 | Data = HTMLDataElement
77 | DataList = HTMLDataListElement
81 | Details = HTMLDetailsElement
85 | Dialog = HTMLDialogElement
89 | Div = HTMLDivElement
93 | Embed = HTMLEmbedElement
97 | FieldSet = HTMLFieldSetElement
101 | Form = HTMLFormElement
109 | Heading = HTMLHeadingElement
113 | Html = HTMLHtmlElement
117 | IFrame = HTMLIFrameElement
121 | Image = HTMLImageElement
125 | Input = HTMLInputElement
133 | Label = HTMLLabelElement
137 | Legend = HTMLLegendElement
141 | Link = HTMLLinkElement
145 | Map = HTMLMapElement
149 | Menu = HTMLMenuElement
153 | Meta = HTMLMetaElement
157 | Meter = HTMLMeterElement
161 | Mod = HTMLModElement
165 | OList = HTMLOListElement
169 | Object = HTMLObjectElement
173 | OptGroup = HTMLOptGroupElement
177 | Option = HTMLOptionElement
181 | Output = HTMLOutputElement
185 | Paragraph = HTMLParagraphElement
189 | Param = HTMLParamElement
193 | Picture = HTMLPictureElement
197 | Pre = HTMLPreElement
201 | Progress = HTMLProgressElement
205 | Quote = HTMLQuoteElement
209 | Script = HTMLScriptElement
213 | Select = HTMLSelectElement
217 | Slot = HTMLSlotElement
221 | Source = HTMLSourceElement
225 | Span = HTMLSpanElement
229 | Style = HTMLStyleElement
232 | 0 TableCaption : Type
233 | TableCaption = HTMLTableCaptionElement
237 | TableCell = HTMLTableCellElement
241 | TableCol = HTMLTableColElement
245 | Table = HTMLTableElement
249 | TableRow = HTMLTableRowElement
252 | 0 TableSection : Type
253 | TableSection = HTMLTableSectionElement
257 | Template = HTMLTemplateElement
261 | TextArea = HTMLTextAreaElement
265 | Time = HTMLTimeElement
269 | Title = HTMLTitleElement
273 | Track = HTMLTrackElement
277 | UList = HTMLUListElement
281 | Video = HTMLVideoElement
293 | data ElementType : (tag : String) -> (htmlElement : Type) -> Type where
294 | A : ElementType "a" HTMLAnchorElement
295 | Address : ElementType "address" HTMLElement
296 | Area : ElementType "area" HTMLAreaElement
297 | Article : ElementType "article" HTMLElement
298 | Audio : ElementType "audio" HTMLAudioElement
299 | Base : ElementType "base" HTMLBaseElement
300 | Blockquote : ElementType "blockquote" HTMLQuoteElement
301 | Body : ElementType "body" HTMLBodyElement
302 | Br : ElementType "br" HTMLBRElement
303 | Button : ElementType "button" HTMLButtonElement
304 | Canvas : ElementType "canvas" HTMLCanvasElement
305 | Caption : ElementType "caption" HTMLTableCaptionElement
306 | Col : ElementType "col" HTMLTableColElement
307 | Colgroup : ElementType "colgroup" HTMLTableColElement
308 | Data : ElementType "data" HTMLDataElement
309 | Datalist : ElementType "datalist" HTMLDataListElement
310 | Del : ElementType "del" HTMLModElement
311 | Details : ElementType "details" HTMLDetailsElement
312 | Dialog : ElementType "dialog" HTMLDialogElement
313 | Div : ElementType "div" HTMLDivElement
314 | Dl : ElementType "dl" HTMLDListElement
315 | Embed : ElementType "embed" HTMLEmbedElement
316 | FieldSet : ElementType "fieldset" HTMLFieldSetElement
317 | Footer : ElementType "footer" HTMLElement
318 | Form : ElementType "form" HTMLFormElement
319 | H1 : ElementType "h1" HTMLHeadingElement
320 | H2 : ElementType "h2" HTMLHeadingElement
321 | H3 : ElementType "h3" HTMLHeadingElement
322 | H4 : ElementType "h4" HTMLHeadingElement
323 | H5 : ElementType "h5" HTMLHeadingElement
324 | H6 : ElementType "h6" HTMLHeadingElement
325 | HR : ElementType "hr" HTMLHRElement
326 | Header : ElementType "header" HTMLElement
327 | Html : ElementType "html" HTMLHtmlElement
328 | IFrame : ElementType "iframe" HTMLIFrameElement
329 | Img : ElementType "img" HTMLImageElement
330 | Input : ElementType "input" HTMLInputElement
331 | Ins : ElementType "ins" HTMLModElement
332 | Label : ElementType "label" HTMLLabelElement
333 | Legend : ElementType "legend" HTMLLegendElement
334 | Li : ElementType "li" HTMLLIElement
335 | Link : ElementType "link" HTMLLinkElement
336 | Map : ElementType "map" HTMLMapElement
337 | Menu : ElementType "menu" HTMLMenuElement
338 | Meta : ElementType "meta" HTMLMetaElement
339 | Meter : ElementType "meter" HTMLMeterElement
340 | Object : ElementType "object" HTMLObjectElement
341 | Ol : ElementType "ol" HTMLOListElement
342 | OptGroup : ElementType "optgroup" HTMLOptGroupElement
343 | Option : ElementType "option" HTMLOptionElement
344 | Output : ElementType "output" HTMLOutputElement
345 | P : ElementType "p" HTMLParagraphElement
346 | Param : ElementType "param" HTMLParamElement
347 | Picture : ElementType "picture" HTMLPictureElement
348 | Pre : ElementType "pre" HTMLPreElement
349 | Progress : ElementType "progress" HTMLProgressElement
350 | Q : ElementType "q" HTMLQuoteElement
351 | Script : ElementType "script" HTMLScriptElement
352 | Section : ElementType "section" HTMLElement
353 | Select : ElementType "select" HTMLSelectElement
354 | Slot : ElementType "slot" HTMLSlotElement
355 | Source : ElementType "source" HTMLSourceElement
356 | Span : ElementType "span" HTMLSpanElement
357 | Style : ElementType "style" HTMLStyleElement
358 | Table : ElementType "table" HTMLTableElement
359 | Tbody : ElementType "tbody" HTMLTableSectionElement
360 | Td : ElementType "td" HTMLTableCellElement
361 | Template : ElementType "template" HTMLTemplateElement
362 | TextArea : ElementType "textarea" HTMLTextAreaElement
363 | Tfoot : ElementType "tfoot" HTMLTableSectionElement
364 | Th : ElementType "th" HTMLTableCellElement
365 | Thead : ElementType "thead" HTMLTableSectionElement
366 | Time : ElementType "time" HTMLTimeElement
367 | Title : ElementType "title" HTMLTitleElement
368 | Tr : ElementType "tr" HTMLTableRowElement
369 | Track : ElementType "track" HTMLTrackElement
370 | Ul : ElementType "ul" HTMLUListElement
371 | Video : ElementType "video" HTMLVideoElement
374 | public export %inline
375 | elementTag : {tag : _} -> (0 _ : ElementType tag t) -> String
382 | createElement : SafeCast t => {tag : _} -> (0 e : ElementType tag t) -> JSIO t
384 | castingTo "Web.Dom.createElement \{tag}" $
document >>= (`createElement` tag)
391 | {auto sc : SafeCast t}
393 | -> (0 e : ElementType tag t)
394 | -> (mods : List (t -> JSIO ()))
396 | newElement e mods = do
397 | res <- createElement e
398 | for_ mods $
\m => m res
406 | ArrayLike HTMLCollection Element where
409 | getElementById : String -> JSIO (Maybe Element)
410 | getElementById s = document >>= (`getElementById` s)
413 | castElementById_ : SafeCast a => String -> JSIO (Maybe a)
414 | castElementById_ = map (>>= safeCast) . getElementById
417 | castElementById : (0 a : Type) -> SafeCast a => String -> JSIO (Maybe a)
418 | castElementById _ = castElementById_
422 | {auto sc : SafeCast t}
423 | -> (0 e : ElementType tag t)
426 | htmlElementById e s = castElementById_ s
429 | getElementsByClass : String -> JSIO HTMLCollection
430 | getElementsByClass s = document >>= (`getElementsByClassName` s)
433 | firstElementByClass : String -> JSIO (Maybe Element)
434 | firstElementByClass s = do
435 | col <- getElementsByClass s
439 | castFirstElementByClass_ : SafeCast a => String -> JSIO (Maybe a)
440 | castFirstElementByClass_ = map (>>= safeCast) . firstElementByClass
443 | castFirstElementByClass :
445 | -> {auto sc : SafeCast a}
448 | castFirstElementByClass _ = castFirstElementByClass_
451 | firstHtmlElementByClass :
452 | (0 e : ElementType tag a)
453 | -> {auto sc : SafeCast a}
456 | firstHtmlElementByClass e s = castFirstElementByClass_ s
463 | getElementByClass : SafeCast t => (class : String) -> JSIO t
464 | getElementByClass class = liftJSIO $
do
465 | Nothing <- castFirstElementByClass t class | Just t => pure t
466 | throwError $
Caught "Web.Dom.getElementByClass: Could not find an element with class \{class}"
473 | ArrayLike NodeList Node where
476 | ArrayLike DOMTokenList String where
479 | Callback EventListener (Event -> JSIO ()) where
480 | callback f = toEventListener (runJS . f)
483 | Callback MutationCallback
484 | (Array MutationRecord -> MutationObserver -> JSIO ()) where
485 | callback f = toMutationCallback $
\a,m => runJS (f a m)
490 | Callback NodeFilter (Node -> JSIO Bits16) where
491 | callback f = toNodeFilter (runJSWithDefault FILTER_REJECT . f)
494 | Callback XPathNSResolver (Maybe String -> JSIO (Maybe String) ) where
496 | toXPathNSResolver $
497 | map maybeToNullable
498 | . runJSWithDefault Nothing