From f29f70e460c97612b5b5ef0e09ef25317a65ce86 Mon Sep 17 00:00:00 2001 From: Alexander Solovyov Date: Wed, 21 Aug 2024 07:07:03 +0300 Subject: [PATCH] little doc changes --- dist/twinspark.min.js | 87 +++++++++++++++++++------------------- site.tmpl | 16 +++---- www/api.md | 1 + www/api/ts-swap.md | 2 +- www/examples/260-json.html | 23 +++++----- www/static/examples.js | 1 + 6 files changed, 66 insertions(+), 64 deletions(-) diff --git a/dist/twinspark.min.js b/dist/twinspark.min.js index 593eeee..98cff30 100644 --- a/dist/twinspark.min.js +++ b/dist/twinspark.min.js @@ -5,46 +5,47 @@ $jscomp.polyfillUnisolated=function(k,l,q,t){q=$jscomp.global;k=k.split(".");for $jscomp.polyfillIsolated=function(k,l,q,t){var w=k.split(".");k=1===w.length;t=w[0];t=!k&&t in $jscomp.polyfills?$jscomp.polyfills:$jscomp.global;for(var I=0;I>>0,$jscomp.propertyToPolyfillSymbol[w]=$jscomp.IS_SYMBOL_NATIVE? $jscomp.global.Symbol(w):$jscomp.POLYFILL_PREFIX+q+"$"+w),$jscomp.defineProperty(t,$jscomp.propertyToPolyfillSymbol[w],{configurable:!0,writable:!0,value:l})))};$jscomp.polyfill("Object.hasOwn",function(k){return k?k:function(l,q){return Object.prototype.hasOwnProperty.call(l,q)}},"es_next","es3"); $jscomp.polyfill("Array.prototype.flatMap",function(k){return k?k:function(l,q){var t=[];Array.prototype.forEach.call(this,function(w,I){w=l.call(q,w,I,this);Array.isArray(w)?t.push.apply(t,w):t.push(w)});return t}},"es9","es5");$jscomp.polyfill("Array.prototype.flat",function(k){return k?k:function(l){l=void 0===l?1:l;var q=[];Array.prototype.forEach.call(this,function(t){Array.isArray(t)&&0{if(c[d.length])throw C("Arity dispatch: duplicate function with the same number of arguments",{length:d.length,func:d.length,duplicate:c[d.length]});c[d.length]=d;return c},{});return function d(){var e=arguments.length,g=b[e];if(!g)throw C("No function supplied accepting "+e+" arguments",{functions:b,arguments:Array.from(arguments)});return g.apply({dispatcher:d},arguments)}}function I(a,b){return a.reduce(function(c, -d){var e=b(d);(c[e]||(c[e]=[])).push(d);return c},{})}function R(a,b){return a.map((c,d)=>[c,b[d]])}function Ga(a){for(var b=new Set,c=[],d,e=0;ea.removeEventListener(b.type, -b.func,b.opts))}function Ha(a){sa(a);T.forEach(b=>a.matches(b.selector)&&b.handler(a))}function O(a){var b=T.map(c=>c.selector).join(",");E(a,b).forEach(Ha);z(a,"ts-ready")}function Ia(a,b){var c=new XMLHttpRequest;return{promise:new Promise(function(d,e){b||(b={});c.open(b.method||"GET",a,!0);for(var g in b.headers)c.setRequestHeader(g,b.headers[g]);c.onreadystatechange=function(){if(4==c.readyState&&0!=c.status){var u={"ts-title":c.getResponseHeader("ts-title"),"ts-history":c.getResponseHeader("ts-history"), -"ts-swap":c.getResponseHeader("ts-swap"),"ts-swap-push":c.getResponseHeader("ts-swap-push")};return d({ok:200<=c.status&&299>=c.status,status:c.status,url:c.responseURL,reqUrl:a,xhr:c,opts:b,headers:u,content:c.responseText})}};c.timeout=Ja;c.ontimeout=function(){return e({ok:!1,status:0,url:a,content:"timeout"})};c.send(b.body)}),xhr:c}}function L(a,b,c){if(!b)return a;var d,e;for([d,e]of b)d&&(!c||null!==e&&""!==e?a.append(d,e):a.delete(d));return a}function Ka(a,b){return ra(a,b).reduceRight((c, -d)=>{if(""==d)var e=null;else if("{"==d[0])if(d=JSON.parse(d),"object"===typeof d&&null!==d){var g=[];for(e in d)g.push([e,d[e]]);e=g}else e=void 0;else e=L(new FormData,new URLSearchParams(d));return L(c,e,!0)},new FormData)}function da(a){return!a.name||"submit"==a.type||("radio"==a.type||"checkbox"==a.type)&&a instanceof HTMLInputElement&&!a.checked?null:a.value}function ta(a,b){var c=Ka(a,"ts-data"),d=a.tagName,e;a instanceof HTMLFormElement?(a=new FormData(a),b instanceof SubmitEvent&&(b.submitter instanceof -HTMLInputElement||b.submitter instanceof HTMLButtonElement)&&b.submitter.name&&b.submitter.value&&!a.has(b.submitter.name)&&c.append(b.submitter.name,b.submitter.value),c=L(c,a)):("INPUT"==d||"SELECT"==d||"TEXTAREA"==d)&&(e=da(a))&&c.append(a.name,e);return c}function U(a){return new Promise(function(b,c){a.onsuccess=function(){b(a.result)};a.onerror=function(){c(a.error)}})}function ua(){if(ea)return ea;var a=La.open("twinspark",1);a.onupgradeneeded=function(){a.result.createObjectStore("twinspark", -{keyPath:"url"}).createIndex("time","time")};return ea=U(a)}function V(a,b){return a.transaction(a.name,b&&b.write&&"readwrite"||"readonly").objectStore(a.name)}async function Ma(a){var b=V(a);b=await U(b.count());console.debug("PAGES IN STORAGE",b);var c=b-Na;if(!(0>=c)){b=V(a,{write:!0});var d=b.index("time").openCursor();d.onsuccess=function(e){if(e=d.result)e.delete(),0<--c&&e.continue()}}}async function va(){var a={url:J.pathname+J.search,html:l.body.innerHTML,time:+new Date},b=await ua(),c= -V(b,{write:!0});await U(c.put(a));await Ma(b)}function Oa(a,b){va();history.replaceState("history","","");history.pushState(null,b,a);z(k,"ts-pushstate",{url:a})}function Pa(a){history.replaceState("history","",a);z(k,"ts-replacestate",{url:a})}async function wa(a){if(a.state){var b=J.pathname+J.search,c=await ua();c=V(c);(b=await U(c.get(b)))&&b.html&&(console.debug("onpopstate restore",b.url,b.html.length,b.time),sa(l),l.body.innerHTML=b.html,("INITIAL"!=a.state||ca)&&O(l.body))}}function A(a,b){if(!a)return a; -null==b&&(b=a.getAttribute("ts-target"));return b?b.split("|").map(c=>c.trim()).reduce((c,d,e)=>{e=0/)[0],C(`Could not find element with selector ${d} for element ${c}`+ -(e?" among children":""),{element:c,selector:d});return g},a):a}function G(a,b,c,d){var e=b.getAttribute(c);e!=a.getAttribute(c)&&(d&&(a[c]=b[c]||""),e?a.setAttribute(c,e):a.removeAttribute(c))}function xa(a,b){for(var c of Qa)G(a,b,c)}function ya(a){a.classList.add(za);setTimeout(()=>a.classList.remove(za))}function Ra(a,b,c){if(a.id){b=b.querySelector(a.tagName+"[id='"+a.id+"']");if(!b)return ya(a);var d=a.cloneNode();xa(a,b);c.tasks.push(function(){xa(a,d)});return c}}function fa(a,b,c,d){a||(a= -"replace");"morph"!=a&&"morph-all"!=a&&"skip"!=a&&E(c,"[id]").forEach(function(g){Ra(g,b,d)});var e=c instanceof DocumentFragment&&Array.from(c.children);switch(a){case "morph-all":c=ha(b,c,{ignoreActive:!1});break;case "morph":c=ha(b,c,{ignoreActive:!0});break;case "replace":b.replaceWith(c);break;case "inner":b.replaceChildren(c);break;case "prepend":b.prepend(c);break;case "append":b.append(c);break;case "beforebegin":b.parentNode.insertBefore(c,b);break;case "afterend":b.parentNode.insertBefore(c, -b.nextSibling);break;case "skip":break;default:throw Error("Unknown swap strategy "+a);}return e||[c]}function Aa(a,b,c){var d=A(a);if(!d)throw C(`Target element not found for origin ${a.outerHTML.match(/<.+?>/)[0]}`,{origin:a,replyParent:b});var e;if(e=a.getAttribute("ts-req-selector"))if("children "==e.slice(0,9)){e=M(b,e.slice(9));var g=new DocumentFragment;e&&e.children&&g.append.apply(g,e.children);e=g}else e=M(b,e);else e="BODY"==b.tagName&&"BODY"!=d.tagName?b.children[0]:b;if(!e)throw c=a.getAttribute("ts-req-selector"), -C("Cannot find specified html in response, "+`maybe nothing to select as ${c}`,{sel:c,replyParent:b,origin:a});b=a.getAttribute("ts-swap");if(a){g={response:c.response};var u=z(a,"ts-req-after",g);W(a,u,a.getAttribute("ts-req-after"),g)}return fa(b,d,e,c)}function Sa(a,b,c){var d={response:c,tasks:[]},e=[],g,u=1==a.length?a[0]:null;"skip"!=c.headers["ts-swap"]&&(e=u?Aa(u,b,d):R(a,b.children).flatMap(([r,v])=>Aa(r,v,d)));a=E(b,"[ts-swap-push]").flatMap(r=>{try{var v=r.getAttribute("ts-swap-push"); -!v&&r.id&&(v="#"+r.id);var m=A(A(u||l.body),v);if(!m)throw C("cannot find target for server-pushed swap",{reply:r});var n=r.getAttribute("ts-swap");return fa(n,m,r,d)}catch(f){console.error(f)}});c.headers["ts-swap-push"]&&(g=c.headers["ts-swap-push"].split(",").flatMap(r=>{try{var v=r.match(/(\w+):(.+)<=(.+)/);if(!v)throw C("Cannot parse ts-swap-push header value",{header:r});var m=v[1],n=A(A(u||l.body),v[2]);if(!n)throw C("cannot find target for header swap",{sel:v[2]});var f=M(b,v[3]);if(!f)throw C("cannot find target for header swap", -{reply:f,sel:v[3]});return fa(m,n,f,d)}catch(h){console.error(h)}}));e=e.flat();a&&(e=e.concat(a.flat()));g&&(e=e.concat(g.flat()));e=Ga(e);e.forEach(function(r){for(var v=r.querySelectorAll("script"),m=0;mg.remove());c=d.headers["ts-title"]||e.title;e=e.body;if(e.children.length"string"===typeof c[1]))return a.body= -b,a;b=new URLSearchParams(b);a.body=b.toString();a.headers["Content-Type"]="application/x-www-form-urlencoded";return a}function Va(a){if(a.length){var b=a[0].url,c=a[0].method,d=a.reduce(function(m,n){return L(m,n.opts.data)},new FormData),e="GET"==c?(new URLSearchParams(d)).toString():null;d="GET"!=c?d:null;var g={method:c,headers:a.reduce(function(m,n){n=n.opts.headers;for(var f in n)m[f]?m[f]!=n[f]&&(m[f]+=", "+n[f]):m[f]=n[f];return m},{})};g=Ua(g,d);var u=b;e&&(u+=-1==b.indexOf("?")?"?":"&", -u+=e);var r=a.map(function(m){return m.el}),v=Ia(u,g);r.forEach(function(m){m.setAttribute("aria-busy","true");m.classList.add(Wa);F(m)["active-xhr"]=v.xhr});return v.promise.then(function(m){ia(()=>r.forEach(n=>{n.removeAttribute("aria-busy");n.classList.remove("ts-active");delete F(n)["active-xhr"]}));if(0==v.xhr.status&&"abort"==v.xhr.statusText)return!1;if(m.ok)return m.url&&m.url!=(new URL(u,J.href)).href?(m.headers["ts-history"]||(m.headers["ts-history"]=m.url),m.swap=Ba(m.url,[l.body],m.content, -m)):m.swap=Ba(b,r,m.content,m),m;X("Something wrong with response",m.content);r.forEach(function(n){z(n,"ts-req-error",K({error:"ts-req-error"},{response:m,url:u,opts:g}))});return m}).catch(function(m){ia(()=>r.forEach(n=>{n.removeAttribute("aria-busy");n.classList.remove("ts-active");delete F(n)["active-xhr"]}));X("Error retrieving backend response",u,m.content||m);r.forEach(function(n){z(n,"ts-req-error",K({error:"ts-req-error"},{response:m,url:u,opts:g}))});return m})}}function Y(a){a=Array.isArray(a)? -a:[a];return Promise.all(a.map(function(b){b.opts=Ta(b);var c={req:b},d=z(b.el,"ts-req-before",c);if(d.defaultPrevented)return null;var e=b;(c=W(b.el,d,b.el.getAttribute("ts-req-before"),c))&&(e=c.then(function(u){return d.defaultPrevented?null:b}));c=b.el.getAttribute("ts-req-strategy")||"queue";var g=F(b.el)["active-xhr"];if("first"===c&&g)return null;"last"===c&&g&&(g.abort(),delete F(b.el)["active-xhr"]);return e})).then(function(b){return b.filter(function(c){return!!c})}).then(Va)}function Xa(){var a= -I(P.reqs,c=>c.method+c.url);P={reqs:[],request:null};for(var b in a)Y(a[b])}function Z(a,b,c,d){var e=(null===d||void 0===d?void 0:d.url)||(c?a.getAttribute("ts-req-batch"):a.getAttribute("ts-req"))||("FORM"==a.tagName?a.getAttribute("action"):a.getAttribute("href")),g=((null===d||void 0===d?void 0:d.method)||a.getAttribute("ts-req-method")||("FORM"==a.tagName?a.getAttribute("method")||"POST":"GET")).toUpperCase();return{el:a,opts:{data:null===d||void 0===d?void 0:d.data},event:b,url:e,method:g,batch:c}} -function ja(a,b){var c=a.tagName,d="click";if("FORM"==c)d="submit";else if("INPUT"==c||"SELECT"==c||"TEXTAREA"==c)d="change";var e=null;"FORM"==c&&"submit"==d&&E(a,'button, input[type="submit"]').forEach(g=>{B(g,"click",u=>{e=u.target})});return B(a,d,function(g){g.altKey||g.ctrlKey||g.shiftKey||g.metaKey||0!=(g.button||0)||(g.preventDefault(),g.stopPropagation(),!g.submitter&&e&&"submit"==e.type&&(g.submitter=e),b(g),e=null)})}function ka(a,b,c){a=k._ts_func&&k._ts_func[a]||Q[a]||k[a];if(!a)throw Error("Unknown action command: "+ -c.src);return a.apply(c.el,b.concat([c]))}function aa(a){function b(){var p=r.trim();if(p.length){var x=u,D=x.push;var y=p[0];p='"'==y||"'"==y?p.slice(1,p.length-1):p;D.call(x,p)}r=""}function c(){u.length&&(g.push({src:a.slice(v,n).trim(),name:u[0],args:u.slice(1)}),u=[],v=n+1)}function d(){g.length&&(e.push({src:a.slice(m,n).trim(),commands:g}),g=[],m=n+1)}var e=[],g=[],u=[],r="",v=0,m=0,n=0,f=null;for(n=0;n/)[0]}}); -}}return c}function W(a,b,c,d){if(c){console.debug("ACTIONS",{spec:c,event:b,payload:d});c=aa(c);a=K({el:a,event:b},d);var e;for(b=0;bd?z(u.target,b,{entry:u}):u.intersectionRatio{Ca(d,{el:b.el,event:g})});return!1},req:w(function(a,b){this.dispatcher(null,a,b)},function(a,b,c){Y(Z(c.el,c.event,!1,{method:a,url:b,data:c.input?[["input",c.input]]:null}))}),class:function(a,b){b.el.classList.add(a)},"class+":function(a,b){b.el.classList.add(a)},"class-":function(a,b){b.el.classList.remove(a)},"class^":function(a, -b){b.el.classList.toggle(a)},classtoggle:function(a,b){b.el.classList.toggle(a)},text:w(a=>{null!==a.input&&void 0!==a.input&&(a.el.textContent=a.input);return a.input},(a,b)=>b.el.textContent=a),html:w(a=>{null!==a.input&&void 0!==a.input&&(a.el.innerHTML=a.input);return a.el.innerHTML},(a,b)=>b.el.innerHTML=a),attr:w((a,b)=>{let c=b.el[a];return"undefined"!=typeof c?c:b.el.getAttribute(a)},(a,b,c)=>{c.el[a]=b;c.el.setAttribute(a,b);return b}),log:function(...a){let b=a[a.length-1];a=a.slice(a.length- -1);b.input&&a.push(b.input);console.log(...a)}},X=console.error?console.error.bind(console,"TwinSpark error:"):console.log.bind(console,"TwinSpark error:"),K=Object.assign||function(a,b){if(!b)return a;for(var c in b)Object.hasOwn(b,c)&&(a[c]=b[c]);return a},ia=k.requestIdleCallback||function(a){setTimeout(a,100)},La=k.indexedDB,ea,ha=function(){function a(f,h){h.cb("node-remove",f);if(f instanceof Element){f.classList.add(cb);h=f.getAnimations().filter(p=>p instanceof CSSTransition);if(!h.length)return f.remove(); -Promise.all(h.map(p=>p.finished)).then(()=>{f.remove()})}else f.parentElement.removeChild(f)}function b(f,h){h.cb("node-insert",f);f instanceof HTMLElement&&(O(f),ya(f))}function c(f,h){if(f instanceof Element){for(var p of h.attributes)G(f,h,p.name);for(p of f.attributes)G(f,h,p.name);f instanceof HTMLInputElement&&"file"!=f.type?(G(f,h,"value",!0),G(f,h,"checked",!0),G(f,h,"disabled",!0)):f instanceof HTMLOptionElement?G(f,h,"selected"):f instanceof HTMLTextAreaElement&&(G(f,h,"value"),f.firstChild&& -f.firstChild.nodeValue!=h.value&&(f.firstChild.nodeValue=h.value))}else f.nodeValue=h.nodeValue}function d(f,h){const p=new Set;for(const x of h)f.has(x)&&p.add(x);return p}function e(f,h){return f&&h&&f.nodeType==h.nodeType&&f.tagName==h.tagName}function g(f,h){if(!(h instanceof Element))return null;h=E(h,"[id]").map(p=>"#"+CSS.escape(p.id)).join(",");if(!h)return null;do if(M(f,h))return f;while(f=f.nextElementSibling);return null}function u(f,h,p){var x=h.nextSibling,D=0;do{var y=E(f,"[id]").map(H=> -H.id);if(y.length&&d(p,y).size)break;if(!y.length&&!E(h,"[id]").length&&e(f,h))return f;if(e(f,x)&&(D++,x=x.nextSibling,2<=D))break}while(f=f.nextSibling);return null}function r(f,h,p){for(;f!==h;){var x=f;f=f.nextSibling;a(x,p)}return h}function v(f,h,p){let x=f.tagName;if(!p.ignoreActive||f!=l.activeElement||"INPUT"!=x&&"TEXTAREA"!=x){if(h){if(e(f,h))return c(f,h),1==f.nodeType&&1==h.nodeType&&m(f,h,p),f;if(f.parentElement)f.parentElement.insertBefore(h,f.nextSibling),a(f,p),b(h,p);else{if(!(f instanceof -Element))throw C("There is no way to morph target Node with no parent",{target:f,reply:h});f.replaceWith(h)}return h}a(f,p);return null}return f}function m(f,h,p){var x=f.firstChild,D=h.firstChild;for(h=new Set(E(h,"[id]").map(db=>db.id));D;){var y=D;D=y.nextSibling;if(x){var H=g(x,y);H?(x=r(x,H,p).nextSibling,v(H,y,p)):(H=u(x,y,h))?(x=r(x,H,p).nextSibling,v(H,y,p)):(f.insertBefore(y,x),b(y,p))}else f.appendChild(y),b(y,p)}x&&(x=r(x,f.lastChild,p),a(x,p))}function n(f,h,p={}){p.cb||(p.cb=()=>{}); -f instanceof Document&&(f=f.documentElement);h instanceof Document&&(h=h.documentElement);return v(f,h,p)}n.syncAttrs=c;return n}(),P={reqs:[],request:null};N("[ts-req]",function(a){function b(c){Y([Z(a,c,!1)])}a.hasAttribute("ts-trigger")?B(a,"ts-trigger",b):ja(a,b)});N("[ts-req-batch]",function(a){function b(c){c=Z(a,c,!0);P.reqs.push(c);P.request||(P.request=setTimeout(Xa,16))}a.hasAttribute("ts-trigger")?B(a,"ts-trigger",b):ja(a,b)});N("[ts-action]",function(a){var b=function(c){c instanceof CustomEvent&& -c.detail&&c.detail.event&&(c=c.detail.event);W(A(a),c,a.getAttribute("ts-action"),null)};a.hasAttribute("ts-trigger")?B(a,"ts-trigger",b):"A"==a.tagName||"BUTTON"==a.tagName?ja(a,b):X("No trigger for action on element",a)});var ab=S(function(){return Da({on:"visible",off:"invisible",rootMargin:"0px",threshold:.01})}),bb=S(function(){return Da({on:"closeby",off:"away",rootMargin:(k.innerHeight/2|0)+"px",threshold:.01})}),Za=S(function(){return new MutationObserver(function(a){for(var b=0;bX=a,_internal:{DIRECTIVES:T,FUNCS:Q,init:Fa}}})(window,document,"twinspark"); +(function(k,l,q){function t(a,b){return ma&&ma.dataset[a]||b}function w(...a){let b=a.reduce((c,d)=>{if(c[d.length])throw C("Arity dispatch: duplicate function with the same number of arguments",{length:d.length,func:d,duplicate:c[d.length]});c[d.length]=d;return c},{});return function d(){var e=arguments.length,g=b[e];if(!g)throw C("No function supplied accepting "+e+" arguments",{functions:b,arguments:Array.from(arguments)});return g.apply({dispatcher:d},arguments)}}function I(a,b){return a.reduce(function(c, +d){var e=b(d);(c[e]||(c[e]=[])).push(d);return c},{})}function R(a,b){return a.map((c,d)=>[c,b[d]])}function Ha(a){for(var b=new Set,c=[],d,e=0;e +a.removeEventListener(b.type,b.func,b.opts))}function Ia(a){ra(a);T.forEach(b=>a.matches(b.selector)&&b.handler(a))}function O(a){var b=T.map(c=>c.selector).join(",");E(a,b).forEach(Ia);z(a,"ts-ready")}function Ja(a,b){var c=new XMLHttpRequest;return{promise:new Promise(function(d,e){b||(b={});c.open(b.method||"GET",a,!0);for(var g in b.headers)c.setRequestHeader(g,b.headers[g]);for(g in b.xhr)c[g]=b.xhr[g];c.onreadystatechange=function(){if(4==c.readyState&&0!=c.status){var u={"ts-title":c.getResponseHeader("ts-title"), +"ts-history":c.getResponseHeader("ts-history"),"ts-swap":c.getResponseHeader("ts-swap"),"ts-swap-push":c.getResponseHeader("ts-swap-push")};return d({ok:200<=c.status&&299>=c.status,status:c.status,url:c.responseURL,reqUrl:a,xhr:c,opts:b,headers:u,content:c.responseText})}};c.timeout=Ka;c.ontimeout=function(){return e({ok:!1,status:0,url:a,content:"timeout"})};c.send(b.body)}),xhr:c}}function L(a,b,c){if(!b)return a;var d,e;for([d,e]of b)d&&(!c||null!==e&&""!==e?a.append(d,e):a.delete(d));return a} +function La(a,b){return qa(a,b).reduceRight((c,d)=>{if(""==d)var e=null;else if("{"==d[0])if(d=JSON.parse(d),"object"===typeof d&&null!==d){var g=[];for(e in d)g.push([e,d[e]]);e=g}else e=void 0;else e=L(new FormData,new URLSearchParams(d));return L(c,e,!0)},new FormData)}function da(a){return a.name&&"submit"!=a.type&&("radio"!=a.type&&"checkbox"!=a.type||a.checked)?a.value:null}function sa(a,b){var c=La(a,"ts-data"),d=a.tagName,e;"FORM"==d?(a=new FormData(a),b&&b.submitter&&b.submitter.name&&b.submitter.value&& +!a.has(b.submitter.name)&&c.append(b.submitter.name,b.submitter.value),c=L(c,a)):("INPUT"==d||"SELECT"==d||"TEXTAREA"==d)&&(e=da(a))&&c.append(a.name,e);return c}function U(a){return new Promise(function(b,c){a.onsuccess=function(){b(a.result)};a.onerror=function(){c(a.error)}})}function ta(){if(ea)return ea;var a=Ma.open("twinspark",1);a.onupgradeneeded=function(){a.result.createObjectStore("twinspark",{keyPath:"url"}).createIndex("time","time")};return ea=U(a)}function V(a,b){return a.transaction(a.name, +b&&b.write&&"readwrite"||"readonly").objectStore(a.name)}async function Na(a){var b=V(a);b=await U(b.count());console.debug("PAGES IN STORAGE",b);var c=b-fa;if(!(0>=c)){b=V(a,{write:!0});var d=b.index("time").openCursor();d.onsuccess=function(e){if(e=d.result)e.delete(),0<--c&&e.continue()}}}async function ua(){if(0!=fa){var a={url:J.pathname+J.search,html:l.body.innerHTML,time:+new Date},b=await ta(),c=V(b,{write:!0});await U(c.put(a));await Na(b)}}function Oa(a,b){ua();history.replaceState("history", +"","");history.pushState(null,b,a);z(k,"ts-pushstate",{url:a})}function Pa(a){history.replaceState("history","",a);z(k,"ts-replacestate",{url:a})}async function va(a){if(0!=fa&&a.state){var b=J.pathname+J.search,c=await ta();c=V(c);(b=await U(c.get(b)))&&b.html&&(console.debug("onpopstate restore",b.url,b.html.length,b.time),ra(l),l.body.innerHTML=b.html,("INITIAL"!=a.state||ca)&&O(l.body))}}function A(a,b){if(!a)return a;null==b&&(b=a.getAttribute("ts-target"));return b?b.split("|").map(c=>c.trim()).reduce((c, +d,e)=>{e=0/)[0],C(`Could not find element with selector ${d} for element ${c}`+(e?" among children":""),{element:c,selector:d});return g},a):a}function G(a, +b,c,d){d?(b=b[c],b!=a[c]&&((a[c]=b)?a.setAttribute(c,b):a.removeAttribute(c))):(b=b.getAttribute(c),b!=a.getAttribute(c)&&(b?a.setAttribute(c,b):a.removeAttribute(c)))}function wa(a,b){for(var c of Qa)G(a,b,c)}function xa(a){a.classList.add(ya);setTimeout(()=>a.classList.remove(ya))}function Ra(a,b,c){if(a.id){b=b.querySelector(a.tagName+"[id='"+a.id+"']");if(!b)return xa(a);var d=a.cloneNode();wa(a,b);c.tasks.push(function(){wa(a,d)});return c}}function ha(a,b,c,d){a||(a="replace");"morph"!=a&&"morph-all"!= +a&&"skip"!=a&&E(c,"[id]").forEach(function(g){Ra(g,b,d)});var e=c instanceof DocumentFragment&&Array.from(c.children);switch(a){case "morph-all":c=ia(b,c,{ignoreActive:!1});break;case "morph":c=ia(b,c,{ignoreActive:!0});break;case "replace":b.replaceWith(c);break;case "inner":b.replaceChildren(c);break;case "prepend":b.prepend(c);break;case "append":b.append(c);break;case "beforebegin":b.parentNode.insertBefore(c,b);break;case "afterend":b.parentNode.insertBefore(c,b.nextSibling);break;case "skip":break; +default:throw Error("Unknown swap strategy "+a);}return e||[c]}function za(a,b,c){var d=A(a);if(!d)throw C(`Target element not found for origin ${a.outerHTML.match(/<.+?>/)[0]}`,{origin:a,replyParent:b});var e;if(e=a.getAttribute("ts-req-selector"))if("children "==e.slice(0,9)){e=M(b,e.slice(9));var g=new DocumentFragment;e&&e.children&&g.append.apply(g,e.children);e=g}else e=M(b,e);else e="BODY"==b.tagName&&"BODY"!=d.tagName?b.children[0]:b;if(!e)throw c=a.getAttribute("ts-req-selector"),C("Cannot find specified html in response, "+ +`maybe nothing to select as ${c}`,{sel:c,replyParent:b,origin:a});b=a.getAttribute("ts-swap");if(a){g={response:c.response};var u=z(a,"ts-req-after",g);W(a,u,a.getAttribute("ts-req-after"),g)}return ha(b,d,e,c)}function Sa(a,b,c){var d={response:c,tasks:[]},e=[],g,u=1==a.length?a[0]:null;"skip"!=c.headers["ts-swap"]&&(e=u?za(u,b,d):R(a,b.children).flatMap(([r,v])=>za(r,v,d)));a=E(b,"[ts-swap-push]").flatMap(r=>{try{var v=r.getAttribute("ts-swap-push");!v&&r.id&&(v="#"+r.id);var m=A(A(u||l.body),v); +if(!m)throw C("cannot find target for server-pushed swap",{reply:r});var n=r.getAttribute("ts-swap");return ha(n,m,r,d)}catch(f){console.error(f)}});c.headers["ts-swap-push"]&&(g=c.headers["ts-swap-push"].split(",").flatMap(r=>{try{var v=r.match(/(\w+):(.+)<=(.+)/);if(!v)throw C("Cannot parse ts-swap-push header value",{header:r});var m=v[1],n=A(A(u||l.body),v[2]);if(!n)throw C("cannot find target for header swap",{sel:v[2]});var f=M(b,v[3]);if(!f)throw C("cannot find target for header swap",{reply:f, +sel:v[3]});return ha(m,n,f,d)}catch(h){console.error(h)}}));e=e.flat();a&&(e=e.concat(a.flat()));g&&(e=e.concat(g.flat()));e=Ha(e);e.forEach(function(r){for(var v=r.querySelectorAll("script"),m=0;mg.remove());c=d.headers["ts-title"]||e.title;e=e.body;if(e.children.length"string"===typeof c[1]))return a.body=b,a;b= +new URLSearchParams(b);a.body=b.toString();a.headers["Content-Type"]="application/x-www-form-urlencoded";return a}function Va(a){if(a.length){var b=a[0].url,c=a[0].method,d=a[0].el.getAttribute("ts-json");if(d){if(1r.forEach(n=>{n.removeAttribute("aria-busy");n.classList.remove("ts-active");delete F(n)["active-xhr"]})); +if(0==v.xhr.status&&"abort"==v.xhr.statusText)return!1;if(m.ok)return m.url&&m.url!=(new URL(u,J.href)).href?(m.headers["ts-history"]||(m.headers["ts-history"]=m.url),m.swap=Aa(m.url,[l.body],m.content,m)):m.swap=Aa(b,r,m.content,m),m;X("Something wrong with response",m.content);r.forEach(function(n){z(n,"ts-req-error",K({error:"ts-req-error"},{response:m,url:u,opts:g}))});return m}).catch(function(m){ja(()=>r.forEach(n=>{n.removeAttribute("aria-busy");n.classList.remove("ts-active");delete F(n)["active-xhr"]})); +X("Error retrieving backend response",u,m.error||m);r.forEach(function(n){z(n,"ts-req-error",K({error:"ts-req-error"},{response:m,url:u,opts:g}))});return m})}}function Y(a){a=Array.isArray(a)?a:[a];return Promise.all(a.map(function(b){b.opts=Ta(b);var c={req:b},d=z(b.el,"ts-req-before",c);if(d.defaultPrevented)return null;var e=b;(c=W(b.el,d,b.el.getAttribute("ts-req-before"),c))&&(e=c.then(function(u){return d.defaultPrevented?null:b}));c=b.el.getAttribute("ts-req-strategy")||"queue";var g=F(b.el)["active-xhr"]; +if("first"===c&&g)return null;"last"===c&&g&&(g.abort(),delete F(b.el)["active-xhr"]);return e})).then(function(b){return b.filter(function(c){return!!c})}).then(Va)}function Xa(){var a=I(P.reqs,c=>c.method+c.url);P={reqs:[],request:null};for(var b in a)Y(a[b])}function Z(a,b,c,d){var e=(null==d?void 0:d.url)||(c?a.getAttribute("ts-req-batch"):a.getAttribute("ts-req"))||("FORM"==a.tagName?a.getAttribute("action"):a.getAttribute("href")),g=((null==d?void 0:d.method)||a.getAttribute("ts-req-method")|| +("FORM"==a.tagName?a.getAttribute("method")||"POST":"GET")).toUpperCase();return{el:a,opts:{data:null==d?void 0:d.data},event:b,url:e,method:g,batch:c}}function ka(a,b){var c=a.tagName,d="click";if("FORM"==c)d="submit";else if("INPUT"==c||"SELECT"==c||"TEXTAREA"==c)d="change";var e=null;"FORM"==c&&"submit"==d&&E(a,'button, input[type="submit"]').forEach(g=>{B(g,"click",u=>{e=u.target})});return B(a,d,function(g){g.altKey||g.ctrlKey||g.shiftKey||g.metaKey||0!=(g.button||0)||(g.preventDefault(),g.stopPropagation(), +!g.submitter&&e&&"submit"==e.type&&(g.submitter=e),b(g),e=null)})}function la(a,b,c){a=k._ts_func&&k._ts_func[a]||Q[a]||k[a];if(!a)throw Error("Unknown action command: "+c.src);return a.apply(c.el,b.concat([c]))}function aa(a){function b(){var p=r.trim();if(p.length){var x=u,D=x.push;var y=p[0];p='"'==y||"'"==y?p.slice(1,p.length-1):p;D.call(x,p)}r=""}function c(){u.length&&(g.push({src:a.slice(v,n).trim(),name:u[0],args:u.slice(1)}),u=[],v=n+1)}function d(){g.length&&(e.push({src:a.slice(m,n).trim(), +commands:g}),g=[],m=n+1)}var e=[],g=[],u=[],r="",v=0,m=0,n=0,f=null;for(n=0;n/)[0]}});}}return c}function W(a,b,c,d){if(c){console.debug("ACTIONS",{spec:c,event:b,payload:d});c=aa(c);a=K({el:a,event:b},d);var e;for(b=0;bd?z(u.target,b,{entry:u}):u.intersectionRatio{a.el.remove()},(a,b)=>{A(b.el,a).remove()}),wait:function(a,b){return new Promise(function(c){B(b.el,a,c,{once:!0})})},on:function(a,b){var c=b.line.split(b.src)[1].replace(/^[\s,]+/,""),d=aa(c)[0];Da(b.el,a,(e,g)=>{Ba(d,{el:b.el,event:g})});return!1},req:w((a,b)=>{this.dispatcher(null,a,b)},(a,b,c)=>{Y(Z(c.el,c.event,!1, +{method:a,url:b,data:c.input?[["input",c.input]]:null}))}),class:function(a,b){b.el.classList.add(a)},"class+":function(a,b){b.el.classList.add(a)},"class-":function(a,b){b.el.classList.remove(a)},"class^":function(a,b){b.el.classList.toggle(a)},classtoggle:function(a,b){b.el.classList.toggle(a)},text:w(a=>{null!==a.input&&void 0!==a.input&&(a.el.textContent=a.input);return a.input},(a,b)=>b.el.textContent=a),html:w(a=>{null!==a.input&&void 0!==a.input&&(a.el.innerHTML=a.input);return a.el.innerHTML}, +(a,b)=>b.el.innerHTML=a),attr:w((a,b)=>{let c=b.el[a];return"undefined"!=typeof c?c:b.el.getAttribute(a)},(a,b,c)=>{c.el[a]=b;c.el.setAttribute(a,b);return b}),log:function(...a){let b=a[a.length-1];a=a.slice(a.length-1);b.input&&a.push(b.input);console.log(...a)}},X=console.error?console.error.bind(console,"TwinSpark error:"):console.log.bind(console,"TwinSpark error:"),K=Object.assign||function(a,b){if(!b)return a;for(var c in b)Object.hasOwn(b,c)&&(a[c]=b[c]);return a},ja=k.requestIdleCallback|| +function(a){setTimeout(a,100)},Ma=k.indexedDB,ea,ia=function(){function a(f,h){h.cb("node-remove",f);if(1!=f.nodeType)f.remove();else{f.classList.add(cb);h=f.getAnimations().filter(p=>p instanceof k.CSSTransition);if(!h.length)return f.remove();Promise.all(h.map(p=>p.finished)).then(()=>{f.remove()})}}function b(f,h){h.cb("node-insert",f);f instanceof HTMLElement&&(O(f),xa(f))}function c(f,h){if(1!=f.nodeType)f.nodeValue=h.nodeValue;else{for(var p of h.attributes)G(f,h,p.name);for(p=f.attributes.length- +1;0<=p;p--)G(f,h,f.attributes[p].name);"INPUT"==f.tagName&&"file"!=f.type?(G(f,h,"value",!0),G(f,h,"checked",!0),G(f,h,"disabled",!0)):"OPTION"==f.tagName?G(f,h,"selected",!0):"TEXTAREA"==f.tagName&&(G(f,h,"value"),f.firstChild&&f.firstChild.nodeValue!=h.value&&(f.firstChild.nodeValue=h.value))}}function d(f,h){const p=new Set;for(const x of h)f.has(x)&&p.add(x);return p}function e(f,h){return f&&h&&f.nodeType==h.nodeType&&f.tagName==h.tagName}function g(f,h){if(1!=h.nodeType)return null;h=E(h,"[id]").map(p=> +"#"+CSS.escape(p.id)).join(",");if(!h)return null;do if(M(f,h))return f;while(f=f.nextElementSibling);return null}function u(f,h,p){var x=h.nextSibling,D=0;do{var y=E(f,"[id]").map(H=>H.id);if(y.length&&d(p,y).size)break;if(!y.length&&!E(h,"[id]").length&&e(f,h))return f;if(e(f,x)&&(D++,x=x.nextSibling,2<=D))break}while(f=f.nextSibling);return null}function r(f,h,p){for(;f!==h;){var x=f;f=f.nextSibling;a(x,p)}return h}function v(f,h,p){if(!p.ignoreActive||f!=l.activeElement||"INPUT"!=f.tagName&&"TEXTAREA"!= +f.tagName){if(h){if(e(f,h))return c(f,h),1==f.nodeType&&1==h.nodeType&&m(f,h,p),f;f.parentElement?(f.parentElement.insertBefore(h,f.nextSibling),a(f,p),b(h,p)):f.replaceWith(h);return h}a(f,p);return null}return f}function m(f,h,p){var x=f.firstChild,D=h.firstChild;for(h=new Set(E(h,"[id]").map(db=>db.id));D;){var y=D;D=y.nextSibling;if(x){var H=g(x,y);H?(x=r(x,H,p).nextSibling,v(H,y,p)):(H=u(x,y,h))?(x=r(x,H,p).nextSibling,v(H,y,p)):(f.insertBefore(y,x),b(y,p))}else f.appendChild(y),b(y,p)}x&&(x= +r(x,f.lastChild,p),a(x,p))}function n(f,h,p={}){p.cb||(p.cb=function(){});f&&f.nodeType==Node.DOCUMENT_NODE&&(f=f.documentElement);h&&h.nodeType==Node.DOCUMENT_NODE&&(h=h.documentElement);return v(f,h,p)}n.syncAttrs=c;return n}(),P={reqs:[],request:null};N("[ts-req]",function(a){function b(c){Y([Z(a,c,!1)])}a.hasAttribute("ts-trigger")?B(a,"ts-trigger",b):ka(a,b)});N("[ts-req-batch]",function(a){function b(c){c=Z(a,c,!0);P.reqs.push(c);P.request||(P.request=setTimeout(Xa,16))}a.hasAttribute("ts-trigger")? +B(a,"ts-trigger",b):ka(a,b)});N("[ts-action]",function(a){var b=function(c){c.detail&&c.detail.event&&(c=c.detail.event);W(A(a),c,a.getAttribute("ts-action"),null)};a.hasAttribute("ts-trigger")?B(a,"ts-trigger",b):"A"==a.tagName||"BUTTON"==a.tagName?ka(a,b):X("No trigger for action on element",a)});var ab=S(function(){return Ca({on:"visible",off:"invisible",rootMargin:"0px",threshold:.01})}),bb=S(function(){return Ca({on:"closeby",off:"away",rootMargin:(k.innerHeight/2|0)+"px",threshold:.01})}),Za= +S(function(){return new MutationObserver(function(a){for(var b=0;bX=a,_internal:{DIRECTIVES:T,FUNCS:Q,init:Ea}}})(window,document, +"twinspark"); diff --git a/site.tmpl b/site.tmpl index 2aeca48..5e3ade4 100644 --- a/site.tmpl +++ b/site.tmpl @@ -89,14 +89,12 @@