123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255openBaseopenJs_of_ocamlmoduleWidget=structopenJs_of_ocamlincludeRaw.WidgetmoduletypeS=sigtypedom=private#Dom_html.elementmoduleInput:sigtypet[@@derivingsexp_of]endmoduleState:sigtypet[@@derivingsexp_of]endvalname:stringvalcreate:Input.t->State.t*domJs.tvalupdate:prev_input:Input.t->input:Input.t->state:State.t->element:domJs.t->State.t*domJs.tvaldestroy:prev_input:Input.t->state:State.t->element:domJs.t->unitendletof_module(typeinput)(moduleM:SwithtypeInput.t=input)=letmoduleState=structtypet={input:M.Input.t;state:M.State.t}[@@derivingsexp_of]endinletsexp_of_dom:M.domJs.t->Sexp.t=fun_->Sexp.Atom"<opaque>"inletid=Type_equal.Id.create~name:M.name[%sexp_of:State.t*dom]inBase.Staged.stage(funinput->letinfo=lazy(M.Input.sexp_of_tinput)increate~id~info~init:(fun()->letstate,element=M.createinputin{input;state},element)~update:(fun{State.input=prev_input;state}element->letstate,element=M.update~prev_input~input~state~elementin{input;state},element)~destroy:(fun{State.input=prev_input;state}element->M.destroy~prev_input~state~element)());;endtypeelement={tag:string;key:stringoption;attrs:Attr.t;raw_attrs:Raw.Attrs.tLazy.t;children:Raw.Node.tJs.js_arrayJs.t;kind:[`Vnode|`Svg]}andt=|None|Textofstring|Elementofelement|WidgetofWidget.tmoduleAliases=structtypenode_creator=?key:string->?attr:Attr.t->tlist->ttypenode_creator_childless=?key:string->?attr:Attr.t->unit->tendmoduleElement=structtypet=elementlettagt=t.tagletattrst=t.attrsletkeyt=t.keyletwith_keytkey={twithkey=Somekey}letmap_attrst~f=letattrs=ft.attrsinletraw_attrs=lazy(Attr.to_rawattrs)in{twithattrs;raw_attrs};;letadd_classtc=map_attrst~f:(funa->Attr.(a@class_c))letadd_classestc=map_attrst~f:(funa->Attr.(a@classesc))letadd_stylets=map_attrst~f:(funa->Attr.(a@styles))endlett_to_js=function|None->(* We normally filter these out, but if [to_js] is called directly on a [None] node,
we use this hack. Aside from having a [Text] node without any text present in the
Dom, there should be no unwanted side-effects. In an Incr_dom application, this
can only happen when the root view Incremental is inhabited by a [None]. *)Raw.Node.text""|Texts->Raw.Node.texts|Element{tag;key;attrs=_;raw_attrs=(lazyraw_attrs);children;kind=`Vnode}->Raw.Node.nodetagraw_attrschildrenkey|Element{tag;key;attrs=_;raw_attrs=(lazyraw_attrs);children;kind=`Svg}->Raw.Node.svgtagraw_attrschildrenkey|Widgetw->w;;letelementkind~tag~keyattrschildren=letchildren_raw=new%jsJs.array_emptyinList.iterchildren~f:(function|None->()|(Text_|Element_|Widget_)asother->let(_:int)=children_raw##push(t_to_jsother)in());letraw_attrs=lazy(Attr.to_rawattrs)in{kind;tag;key;attrs;raw_attrs;children=children_raw};;letelement_expertkind~tag?keyattrschildren=letraw_attrs=lazy(Attr.to_rawattrs)in{kind;tag;key;attrs;raw_attrs;children};;lettexts=Textsletwidget?info?destroy?update~id~init()=Widget(Widget.create?info?destroy?update~id~init());;letcreatetag?key?(attr=Attr.empty)children=Element(element`Vnode~tag~keyattrchildren);;letcreate_childlesstag?key?attr()=createtag?key?attr[]letcreate_svgtag?key?(attr=Attr.empty)children=Element(element`Svg~tag~keyattrchildren);;letcreate_svg_monoidtag?key?(attr=Attr.empty)children=Element(element`Svg~tag~keyattrchildren);;letnone=Nonelettextfformat=Printf.ksprintftextformatletwidget_of_modulem=letf=Base.Staged.unstage(Widget.of_modulem)inBase.Staged.stage(funi->Widget(fi));;letto_raw=t_to_jsletto_domt=Raw.Node.to_dom(to_rawt)letinner_htmlcreate~tag~attr~this_html_is_sanitized_and_is_totally_safe_trust_me:content=letelement=createtag~attr[]inletbuild_sexp~extra~content=Sexp.List[Sexp.Atom"inner-html";extra;Sexp.Atomcontent]inletid=Type_equal.Id.create~name:"inner-html-node"(fun((element,content),_)->build_sexp~extra:element~content)inletdebug=matchelementwith|Elementelement->Sexp.Atom(Element.tagelement)|Widget_->failwith"Vdom.Node.inner_html was given a 'widget'"|None->failwith"Vdom.Node.inner_html was given a 'none'"|Text_->failwith"Vdom.Node.inner_html was given a 'text'"inwidget~id~info:(lazy(build_sexp~extra:debug~content))~init:(fun()->letelement=to_domelementinelement##.innerHTML:=Js.stringcontent;(debug,content),element)();;letinner_html_svg=inner_html(funtag~attr->create_svg_monoidtag?key:None~attr)letinner_html=inner_html(funtag~attr->createtag?key:None~attr)leta=create"a"letbody=create"body"letbutton=create"button"letcode=create"code"letdiv=create"div"letmain=create"main"letfieldset=create"fieldset"letfooter=create"footer"leth1=create"h1"leth2=create"h2"leth3=create"h3"leth4=create"h4"leth5=create"h5"leth6=create"h6"letheader=create"header"lethtml=create"html"letinput=create"input"lettextarea=create"textarea"letselect=create"select"letoption=create"option"letlabel=create"label"letli=create"li"letp=create"p"letpre=create"pre"letsection=create"section"letspan=create"span"letstrong=create"strong"lettable=create"table"lettbody=create"tbody"lettd=create"td"letth=create"th"letthead=create"thead"lettr=create"tr"letul=create"ul"letol=create"ol"letbr=create_childless"br"lethr=create_childless"hr"letsexp_for_debugging?indentsexp=sexp|>Sexp.to_string_hum?indent|>text|>List.return|>pre~attr:Attr.empty;;modulePatch=structtypet=Raw.Patch.tletcreate~previous~current=Raw.Patch.create~previous:(t_to_jsprevious)~current:(t_to_jscurrent);;letapplytelt=Raw.Patch.applyelttletis_emptyt=Raw.Patch.is_emptytendmoduleExpert=structletcreate?keytagattrschildren=Element(element_expert`Vnode?key~tagattrschildren);;letcreate_svg?keytagattrschildren=Element(element_expert`Svg?key~tagattrschildren);;end