1
2 (function RetroV(){var create_callbacks=[];function user_render(dom_container,v){var vlist=[v];var old_vlist=[];var new_vlist=make_children(vlist);if(dom_container.rv_old_vlist){old_vlist=dom_container.rv_old_vlist;}
3 else
4 {dom_container.replaceChildren();}
5 dom_container.rv_old_vlist=new_vlist;render_children(dom_container,old_vlist,new_vlist);create_callbacks.forEach(function(cc){cc.fn(cc.el);});create_callbacks=[];}
6 function render(dom_container,old_v,new_v,dom_index){var child=dom_container.childNodes[dom_index];if(typeof new_v==='undefined'){dom_container.removeChild(child);return;}
7 if(new_v.t===false){if(typeof old_v==='undefined'){dom_container.append(placeholder('false'));}
8 return;}
9 if(typeof old_v==='undefined'){dom_container.appendChild(create(new_v));return;}
10 if(old_v.t!==new_v.t){child.replaceWith(create(new_v));return;}
11 if(!new_v.t||new_v.t==='!'){return;}
12 update(child,old_v,new_v);}
13 function create(v){if(v.t==='"'){return document.createTextNode(v.text);}
14 if(v.t===null){return placeholder('null');}
15 if(v.t===false){return placeholder('false');}
16 if(v.t==='!'){return placeholder('undefined');}
17 if(v.t==='<'){return create_html(v.html);}
18 try{var el=document.createElement(v.t);}catch(e){if(e instanceof DOMException){console.error("RetroV: Bad element name: ",v.t);}
19 throw e;}
20 Object.keys(v.p).forEach(function(k){if(k==='style'){set_or_update_style(el,{},v);return;}
21 if(k==='for'){el['htmlFor']=v.p['for'];return;}
22 if(k==='rvid'){RV.id[v.p[k]]=el;}
23 if(k==='oncreate'&&typeof v.p[k]==='function'){create_callbacks.push({el:el,fn:v.p[k]});return;}
24 el[k]=v.p[k];});v.c.forEach(function(child){el.append(create(child));});return el;}
25 function create_html(html){var d=document.createElement('div');d.innerHTML=html;return d.childNodes[0];}
26 function placeholder(t){return document.createComment('RV:'+t+'-placeholder');}
27 function set_or_update_style(dom_elem,old_v,new_v){var old_style=(old_v.p&&old_v.p.style?old_v.p.style:{});Object.keys(new_v.p.style).forEach(function(sk){if(new_v.p.style[sk]!=old_style[sk]){dom_elem.style[sk]=new_v.p.style[sk];}});}
28 function update(dom_elem,old_v,new_v){if(new_v.t==='"'){dom_elem.data=new_v.text;return;}
29 if(new_v.t==='<'&&new_v.html!==old_v.html){dom_elem.replaceWith(create_html(new_v.html));return;}
30 Object.keys(new_v.p).forEach(function(k){if(k==='style'){set_or_update_style(dom_elem,old_v,new_v);return;}
31 if(k==='value'||k==='checked'){dom_elem[k]=new_v.p[k];return;}
32 if(new_v.p[k]!==old_v.p[k]){dom_elem[k]=new_v.p[k];}});render_children(dom_elem,old_v.c,new_v.c);}
33 function render_children(dom_elem,old_c,new_c){if(old_c.length>new_c.length){for(var i=old_c.length-1;i>=0;i--){render(dom_elem,old_c[i],new_c[i],i);}}
34 else{for(var i=0;i<new_c.length;i++){render(dom_elem,old_c[i],new_c[i],i);}}}
35 function make_obj(v){if(typeof v==='string'||typeof v==='number'){return{t:'"',text:v};}
36 if(Array.isArray(v)&&typeof v[0]==='string'&&v[0][0]==='<'){return{t:'<',html:v};}
37 if(v===null){return{t:null};}
38 if(v===false){return{t:false};}
39 if(v===undefined){return{t:'!'};}
40 if(Array.isArray(v)&&typeof v[0]==='string'){var child_start=1;var props={};if(v[1]&&typeof v[1]==='object'&&!Array.isArray(v[1])){props=v[1];if(typeof props['class']!=='undefined'){props['className']=props['class'];delete props['class'];}
41 if(typeof props['for']!=='undefined'){props['htmlFor']=props['for'];delete props['for'];}
42 child_start=2;}
43 var tag=v[0];var myclasses=[];var m=tag.split('.');var mytag=m.shift();if(mytag.length===0){mytag='div';}
44 m.forEach(function(v){myclasses.push(v);});if(myclasses.length>0){props.className=props.className?props.className+' '+myclasses.join(' '):myclasses.join(' ');}
45 var children=make_children(v.slice(child_start));return{t:mytag,p:props,c:children};}
46 console.error("RetroV: make_obj() cannot handle this:",v);}
47 function make_children(vlist){var objs=[];vlist.forEach(function(v){if(!Array.isArray(v)||typeof v[0]==='string'){objs.push(make_obj(v));}
48 else{make_children(v).forEach(function(flat_v){objs.push(flat_v);});}});return objs;}
49 window.RV={render:user_render,id:[]};})();