UNPKG

pill

Version:

Dynamic content loading for static sites.

1 lines 3.17 kB
var pill=function(){'use strict';function a(a,b){var c=new CustomEvent(a,{detail:b});document.dispatchEvent(c)}function b(a){return a.origin===location.origin}function c(a,b,c,d){return{title:a||"",content:b||"",status:c||0,timestamp:d||new Date}}function d(a,b){document.title=b.title,a.innerHTML=b.content}function e(a,b,c){var d=document.createDocumentFragment(),e=document.createElement("html");d.appendChild(e),e.innerHTML=c;var f=e.querySelector("title").textContent,g=e.querySelector(a),h=g?g.innerHTML:"";return{title:f,content:h}}function f(a,b,c,d){d?history.pushState(a||{},c,b):history.replaceState(a||{},c,b)}function g(){return{title:"Error",content:"<h1>Error</h1><p>Ooops. Something went wrong</p>",code:500,timestamp:new Date}}function h(a){requestAnimationFrame(function(){var b;b=a in document.anchors?document.anchors[a]:document.getElementById(b),b&&b.scrollIntoView(!0)})}function i(){}function j(a){return"/"+a.replace(/\/+/g,"/").replace(/^\/|\/$/g,"")}function k(a){return j(a.pathname)+a.search}var l={onReady:"pill:ready",onLoading:"pill:loading",onUnmounting:"pill:unmounting",onMounting:"pill:mounting",onError:"pill:error"},m=/(Mac OS|MacPPC|MacIntel|Mac_PowerPC|Macintosh)/.test(navigator.platform)?function(a){return a.metaKey}:function(a){return a.ctrlKey};return function(j,n){function o(b,c,e){a(l.onUnmounting,{page:c,url:b,element:E}),v(c,b,E),f(null,b,c.title,e),a(l.onMounting,{page:c,url:b,element:E}),w(c,b,E),d(E,c),a(l.onReady,{page:c,url:b,element:E}),t(c,E),e&&1<b.hash.length?h(b.hash.slice(1)):window.scrollTo(0,0)}function p(b,c){var d=y(b);if(d in H){var g=H[d];if(!0!==B(g))return void o(b,g,c)}f(null,b,b,c);var h=++C;fetch(b).then(function(a){return a.text().then(function(b){return{res:a,text:b}})}).finally(function(){D=!1}).then(function(a){var c=a.res,f=a.text,g=e(j,c,f);H[d]=g,g.status=c.status,g.timestamp=new Date;h!==C||o(b,g,!1)}).catch(function(a){if(h===C){var c=z(a);o(b,c,!1)}throw a}).catch(function(c){a(l.onError,{url:b,element:E,error:c}),x(c)}),D=!0,a(l.onLoading,{url:b,element:E}),u(b)}function q(a){if(!m(a)){for(var b=a.target,c=!1;b!==document.body;){if("A"===b.nodeName){c=!0;break}b=b.parentNode}if(c){var d=new URL(b.href,document.location);A(d,b)&&(a.preventDefault(),p(d,!D))}}}function r(a){p(new URL(document.location),!1),requestAnimationFrame(function(){var b=0,c=0;a.state&&(c=a.state.scrollX,b=a.state.scrollY),window.scrollTo(c,b)})}function s(){I||(I=setTimeout(function(){f({scrollX:window.scrollX,scrollY:window.scrollY},document.location,document.title,!1),I=null},100))}if("function"==typeof window.history.pushState){n=n||{};var t=n.onReady||i,u=n.onLoading||i,v=n.onUnmounting||i,w=n.onMounting||i,x=n.onError||console.error.bind(console),y=n.keyFromUrl||k,z=n.fromError||g,A=n.shouldServe||b,B=n.shouldReload||i,C=0,D=!1,E=document.querySelector(j);if(!E)throw new Error("Element \""+j+"\" not found");var F=new URL(document.location),G=c(document.title,E.innerHTML,200),H={};H[y(F)]=G,f({scrollX:window.scrollX,scrollY:window.scrollY},F,G.title,!1);var I;document.body.addEventListener("click",q),window.addEventListener("popstate",r),window.addEventListener("scroll",s)}}}();