simplyview 3.3.0 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -556,12 +556,52 @@
556
556
  }
557
557
  }
558
558
 
559
+ // src/highlight.mjs
560
+ function html(strings, ...values) {
561
+ const outputArray = values.map(
562
+ (value, index) => `${strings[index]}${value}`
563
+ );
564
+ return outputArray.join("") + strings[strings.length - 1];
565
+ }
566
+ function css(strings, ...values) {
567
+ return html(strings, ...values);
568
+ }
569
+
559
570
  // src/app.mjs
560
571
  var SimplyApp = class {
561
572
  constructor(options = {}) {
562
573
  this.container = options.container || document.body;
574
+ if (options.components) {
575
+ mergeComponents(options, options.components);
576
+ }
563
577
  for (let key in options) {
564
578
  switch (key) {
579
+ case "html":
580
+ for (const name in options.html) {
581
+ const element = document.createElement("div");
582
+ element.innerHTML = options.html[name];
583
+ let template = this.container.querySelector("template#" + name);
584
+ if (!template) {
585
+ template = document.createElement("template");
586
+ template.id = name;
587
+ template.content.append(...element.children);
588
+ this.container.appendChild(template);
589
+ } else {
590
+ template.content.replaceChildren(...element.children);
591
+ }
592
+ }
593
+ break;
594
+ case "css":
595
+ for (const name in options.css) {
596
+ let style = this.container.querySelector("style#" + name);
597
+ if (!style) {
598
+ style = document.createElement("style");
599
+ style.id = name;
600
+ this.container.appendChild(style);
601
+ }
602
+ style.innerHTML = options.css[name];
603
+ }
604
+ break;
565
605
  case "commands":
566
606
  this.commands = commands({ app: this, container: this.container, commands: options.commands });
567
607
  break;
@@ -611,6 +651,12 @@
611
651
  };
612
652
  this[key] = new Proxy(options[key], moduleHandler);
613
653
  break;
654
+ components:
655
+ this.components = components;
656
+ break;
657
+ prototype:
658
+ __proto__:
659
+ break;
614
660
  default:
615
661
  console.log('simply.app: unknown initialization option "' + key + '", added as-is');
616
662
  this[key] = options[key];
@@ -622,6 +668,13 @@
622
668
  return this;
623
669
  }
624
670
  async start() {
671
+ if (this.components) {
672
+ for (const name in this.components) {
673
+ if (this.components[name].hooks?.start) {
674
+ await this.components[name].hooks.start();
675
+ }
676
+ }
677
+ }
625
678
  if (this.hooks?.start) {
626
679
  await this.hooks.start();
627
680
  }
@@ -643,4 +696,51 @@
643
696
  function app(options = {}) {
644
697
  return new SimplyApp(options);
645
698
  }
699
+ if (!globalThis.html) {
700
+ globalThis.html = html;
701
+ }
702
+ if (!globalThis.css) {
703
+ globalThis.css = css;
704
+ }
705
+ function mergeOptions(options, otherOptions) {
706
+ for (const key in otherOptions) {
707
+ switch (typeof otherOptions[key]) {
708
+ case "object":
709
+ if (!otherOptions[key]) {
710
+ continue;
711
+ }
712
+ if (!options[key]) {
713
+ options[key] = otherOptions[key];
714
+ } else {
715
+ mergeOptions(options[key], otherOptions[key]);
716
+ }
717
+ break;
718
+ default:
719
+ options[key] = otherOptions[key];
720
+ }
721
+ }
722
+ }
723
+ function mergeComponents(options, components2) {
724
+ for (const name in components2) {
725
+ const component = components2[name];
726
+ if (component.components) {
727
+ mergeComponents(options, component.components);
728
+ }
729
+ options.components[name] = component;
730
+ for (const key in component) {
731
+ switch (key) {
732
+ case "hooks":
733
+ // don't merge these, app.hooks.start will trigger each components start hook
734
+ case "components":
735
+ break;
736
+ default:
737
+ if (!options[key]) {
738
+ options[key] = /* @__PURE__ */ Object.create(null);
739
+ }
740
+ mergeOptions(options[key], component[key]);
741
+ break;
742
+ }
743
+ }
744
+ }
745
+ }
646
746
  })();
@@ -1,2 +1,2 @@
1
- (()=>{function g(t,e){if(e){let a=t;t=e,t.app=t}return new m(t)}var m=class{constructor(e={}){this.baseURL=e.baseURL||"/",this.app=e.app||{},this.addMissingSlash=!!e.addMissingSlash,this.matchExact=!!e.matchExact,this.clear(),e.routes&&this.load(e.routes)}load(e){C(e,this.routeInfo,this.matchExact)}clear(){this.routeInfo=[],this.listeners={match:{},call:{},goto:{},finish:{}}}match(e,a){let r={path:e,options:a};r=this.runListeners("match",r),e=r.path?r.path:e;let i;if(!e)return this.match(document.location.pathname+document.location.hash)?!0:this.match(document.location.pathname);e=f(e);for(let s of this.routeInfo)if(i=s.match.exec(e),this.addMissingSlash&&!i?.length&&e&&e[e.length-1]!="/"&&(i=s.match.exec(e+"/"),i&&(e+="/",history.replaceState({},"",b(e,this.baseURL)))),i&&i.length){let n={};s.params.forEach((l,h)=>{l=="*"&&(l="remainder"),n[l]=i[h+1]}),Object.assign(n,a),r.route=s,r.params=n,r=this.runListeners("call",r),n=r.params?r.params:n;let c=new URLSearchParams(document.location.search);return r.result=s.action.call(this.app,n,c),this.runListeners("finish",r),r.result}return!1}runListeners(e,a){if(!(!this.listeners[e]||!Object.keys(this.listeners[e])))return Object.keys(this.listeners[e]).forEach(r=>{var i=w(r);if(i.exec(a.path)){var s;for(let n of this.listeners[e][r])s=n.call(this.app,a),s&&(a=s)}}),a}handleEvents(){globalThis.addEventListener("popstate",()=>{this.match(f(document.location.pathname+document.location.hash,this.baseURL))===!1&&this.match(f(document.location.pathname,this.baseURL))}),this.app.container.addEventListener("click",e=>{if(!e.ctrlKey&&e.which==1){for(var a=e.target;a&&a.tagName!="A";)a=a.parentElement;if(a&&a.pathname&&a.hostname==globalThis.location.hostname&&!a.link&&!a.dataset.simplyCommand){let r=[a.hash,a.pathname+a.hash,a.pathname],i;do i=f(r.shift(),this.baseURL);while(r.length&&!this.has(i));if(this.has(i)){let s=this.runListeners("goto",{path:i});if(s.path&&this.goto(s.path))return e.preventDefault(),!1}}}})}goto(e){return history.pushState({},"",b(e,this.baseURL)),this.match(e)}has(e){e=f(e,this.baseURL);for(let r of this.routeInfo){var a=r.match.exec(e);if(a&&a.length)return!0}return!1}addListener(e,a,r){if(["goto","match","call","finish"].indexOf(e)==-1)throw new Error("Unknown action "+e);this.listeners[e][a]||(this.listeners[e][a]=[]),this.listeners[e][a].push(r)}removeListener(e,a,r){if(["match","call","finish"].indexOf(e)==-1)throw new Error("Unknown action "+e);this.listeners[e][a]&&(this.listeners[e][a]=this.listeners[e][a].filter(i=>i!=r))}init(e){e.baseURL&&(this.baseURL=e.baseURL)}};function f(t,e="/"){return(t.substring(0,e.length)==e||e[e.length-1]=="/"&&t.length==e.length-1&&t==e.substring(0,t.length))&&(t=t.substring(e.length)),t[0]!="/"&&t[0]!="#"&&(t="/"+t),t}function b(t,e){return t=f(t,e),e[e.length-1]==="/"&&t[0]==="/"&&(t=t.substring(1)),t[0]=="#"?t:e+t}function w(t,e=!1){return e?new RegExp("^"+t.replace(/:\w+/g,"([^/]+)").replace(/:\*/,"(.*)")+"(\\?|$)"):new RegExp("^"+t.replace(/:\w+/g,"([^/]+)").replace(/:\*/,"(.*)"))}function C(t,e,a=!1){let r=Object.keys(t),i=/:(\w+|\*)/g;for(let s of r){let n=[],c=[];do n=i.exec(s),n&&c.push(n[1]);while(n);e.push({match:w(s,a),params:c,action:t[s]})}return e}var p=class{constructor(e={}){e.app||(e.app={}),e.app.container||(e.app.container=document.body),this.app=e.app,this.$handlers=e.handlers||j,e.commands&&Object.assign(this,e.commands);let a=r=>{let i=U(r,this.$handlers);if(!i)return;if(!this[i.name]){console.error("simply.command: undefined command "+i.name,i.source);return}if(this[i.name].call(e.app,i.source,i.value)!==!0)return r.preventDefault(),r.stopPropagation(),!1};e.app.container.addEventListener("click",a),e.app.container.addEventListener("submit",a),e.app.container.addEventListener("change",a),e.app.container.addEventListener("input",a)}call(e,a,r){if(!this[e]){console.error("simply.command: undefined command "+e);return}return this[e].call(this.app,a,r)}action(e){console.warn("deprecated call to `this.commands.action`");let a=Array.from(arguments).slice();return a.shift(),this.app.actions[e](...a)}appendHandler(e){this.$handlers.push(e)}prependHandler(e){this.$handlers.unshift(e)}};function v(t={},e){if(e){let a=t;t=e,t.app=t}return new p(t)}function U(t,e){var a=t.target.closest("[data-simply-command]");if(a){for(let r of e)if(a.matches(r.match))return r.check(a,t)?{name:a.dataset.simplyCommand,source:a,value:r.get(a)}:null}return null}var j=[{match:"input,select,textarea",get:function(t){if(t.tagName==="SELECT"&&t.multiple){let e=[];for(let a of t.options)a.selected&&e.push(a.value);return e}return t.dataset.simplyValue||t.value},check:function(t,e){return e.type=="change"||t.dataset.simplyImmediate&&e.type=="input"}},{match:"a,button",get:function(t){return t.dataset.simplyValue||t.href||t.value},check:function(t,e){return e.type=="click"&&e.ctrlKey==!1&&e.button==0}},{match:"form",get:function(t){let e={};for(let a of Array.from(t.elements)){if(a.tagName=="INPUT"&&(a.type=="checkbox"||a.type=="radio")&&!a.checked)return;e[a.name]&&!Array.isArray(e[a.name])&&(e[a.name]=[e[a.name]]),Array.isArray(e[a.name])?e[a.name].push(a.value):e[a.name]=a.value}return e},check:function(t,e){return e.type=="submit"}},{match:"*",get:function(t){return t.dataset.simplyValue},check:function(t,e){return e.type=="click"&&e.ctrlKey==!1&&e.button==0}}];function x(t,e){if(e){let a=t;t=e,t.app=a}if(t.app){let a={apply(s,n,c){try{let l=s(...c);return l instanceof Promise?(t.app.hooks.wait(!0),l.finally(()=>{t.app.hooks.wait(!1,s)})):l}catch{}}},r={apply(s,n,c){try{let l=s(...c);return l instanceof Promise?t.app.hooks.wait?(t.app.hooks.wait(!0,s),l.catch(h=>t.app.hooks.error(h,s)).finally(()=>{t.app.hooks.wait(!1,s)})):l.catch(h=>t.app.hooks.error(h,s)):l}catch(l){return t.app.hooks.error(l,s)}}},i={get(s,n){if(s[n])return t.app.hooks?.error?new Proxy(s[n].bind(t.app),r):t.app.hooks?.wait?new Proxy(s[n].bind(t.app),a):s[n].bind(t.app)}};return new Proxy(t.actions,i)}else return t}var o=Object.freeze({Compose:229,Control:17,Meta:224,Alt:18,Shift:16}),y=class{constructor(e={}){e.app||(e.app={}),e.app.container||(e.app.container=document.body),Object.assign(this,e.keys);let a=r=>{if(r.isComposing||r.keyCode===o.Compose||r.defaultPrevented||!r.target)return;let i="default";r.target.closest("[data-simply-keyboard]")&&(i=r.target.closest("[data-simply-keyboard]").dataset.simplyKeyboard);let s=[];r.ctrlKey&&r.keyCode!=o.Control&&s.push("Control"),r.metaKey&&r.keyCode!=o.Meta&&s.push("Meta"),r.altKey&&r.keyCode!=o.Alt&&s.push("Alt"),r.shiftKey&&r.keyCode!=o.Shift&&s.push("Shift"),s.push(r.key.toLowerCase());let n=[],c=event.target.closest("[data-simply-keyboard]");for(;c;)n.push(c.dataset.simplyKeyboard),c=c.parentNode.closest("[data-simply-keyboard]");n.push("");let l,h,P=["+","-"];for(let A in n){l=n[A],l==""?h="default":(h=l,l+=".");for(let R of P){let u=s.join(R);if(this[h]&&typeof this[h][u]=="function"&&!this[h][u].call(e.app,r)){r.preventDefault();return}if(typeof this[h+u]=="function"&&!this[h+u].call(e.app,r)){r.preventDefault();return}if(this[i]&&this[i][u]){let d=e.app.container.querySelectorAll('[data-simply-accesskey="'+l+u+'"]');d.length&&(d.forEach(T=>T.click()),r.preventDefault())}}}};e.app.container.addEventListener("keydown",a)}};function L(t={},e){if(e){let a=t;t=e,t.app=t}return new y(t)}function E(t,e){if(e){let a=t;t=e,t.app=t}if(t.app){t.app.view=t.view||{};let a=()=>{let r=t.app.view,i=globalThis.editor.data.getDataPath(t.app.container||document.body);t.app.view=globalThis.editor.currentData[i],Object.assign(t.app.view,r)};return globalThis.editor&&globalThis.editor.currentData?a():document.addEventListener("simply-content-loaded",a),t.app.view}else return t.view}var k=class{constructor(e={}){this.container=e.container||document.body;for(let a in e)switch(a){case"commands":this.commands=v({app:this,container:this.container,commands:e.commands});break;case"keys":case"keyboard":this.keys=L({app:this,keys:e.keys});break;case"root":case"baseURL":this.baseURL=e[a];break;case"routes":this.routes=g({app:this,routes:e.routes});break;case"actions":this.actions=x({app:this,actions:e.actions}),this.action=function(s){console.warn("deprecated call to `this.action`");let n=Array.from(arguments).slice();return n.shift(),this.actions[s](...n)};break;case"view":this.view=E({app:this,view:e.view});break;case"hooks":let r={get:(s,n)=>{if(s[n])return typeof s[n]=="function"?new Proxy(s[n],i):s[n]&&typeof s[n]=="object"?new Proxy(s[n],r):s[n]}},i={apply:(s,n,c)=>s.apply(this,c)};this[a]=new Proxy(e[a],r);break;default:console.log('simply.app: unknown initialization option "'+a+'", added as-is'),this[a]=e[a];break}}get app(){return this}async start(){this.hooks?.start&&await this.hooks.start(),this.routes&&(this.baseURL&&this.routes.init({baseURL:this.baseURL}),this.routes.handleEvents(),globalThis.setTimeout(()=>{this.routes.has(globalThis.location?.hash)?this.routes.match(globalThis.location.hash):this.routes.match(globalThis.location?.pathname+globalThis.location?.hash)}))}};function V(t={}){return new k(t)}})();
1
+ (()=>{function w(t,e){if(e){let a=t;t=e,t.app=t}return new d(t)}var d=class{constructor(e={}){this.baseURL=e.baseURL||"/",this.app=e.app||{},this.addMissingSlash=!!e.addMissingSlash,this.matchExact=!!e.matchExact,this.clear(),e.routes&&this.load(e.routes)}load(e){K(e,this.routeInfo,this.matchExact)}clear(){this.routeInfo=[],this.listeners={match:{},call:{},goto:{},finish:{}}}match(e,a){let r={path:e,options:a};r=this.runListeners("match",r),e=r.path?r.path:e;let i;if(!e)return this.match(document.location.pathname+document.location.hash)?!0:this.match(document.location.pathname);e=o(e);for(let n of this.routeInfo)if(i=n.match.exec(e),this.addMissingSlash&&!i?.length&&e&&e[e.length-1]!="/"&&(i=n.match.exec(e+"/"),i&&(e+="/",history.replaceState({},"",g(e,this.baseURL)))),i&&i.length){let s={};n.params.forEach((l,h)=>{l=="*"&&(l="remainder"),s[l]=i[h+1]}),Object.assign(s,a),r.route=n,r.params=s,r=this.runListeners("call",r),s=r.params?r.params:s;let c=new URLSearchParams(document.location.search);return r.result=n.action.call(this.app,s,c),this.runListeners("finish",r),r.result}return!1}runListeners(e,a){if(!(!this.listeners[e]||!Object.keys(this.listeners[e])))return Object.keys(this.listeners[e]).forEach(r=>{var i=v(r);if(i.exec(a.path)){var n;for(let s of this.listeners[e][r])n=s.call(this.app,a),n&&(a=n)}}),a}handleEvents(){globalThis.addEventListener("popstate",()=>{this.match(o(document.location.pathname+document.location.hash,this.baseURL))===!1&&this.match(o(document.location.pathname,this.baseURL))}),this.app.container.addEventListener("click",e=>{if(!e.ctrlKey&&e.which==1){for(var a=e.target;a&&a.tagName!="A";)a=a.parentElement;if(a&&a.pathname&&a.hostname==globalThis.location.hostname&&!a.link&&!a.dataset.simplyCommand){let r=[a.hash,a.pathname+a.hash,a.pathname],i;do i=o(r.shift(),this.baseURL);while(r.length&&!this.has(i));if(this.has(i)){let n=this.runListeners("goto",{path:i});if(n.path&&this.goto(n.path))return e.preventDefault(),!1}}}})}goto(e){return history.pushState({},"",g(e,this.baseURL)),this.match(e)}has(e){e=o(e,this.baseURL);for(let r of this.routeInfo){var a=r.match.exec(e);if(a&&a.length)return!0}return!1}addListener(e,a,r){if(["goto","match","call","finish"].indexOf(e)==-1)throw new Error("Unknown action "+e);this.listeners[e][a]||(this.listeners[e][a]=[]),this.listeners[e][a].push(r)}removeListener(e,a,r){if(["match","call","finish"].indexOf(e)==-1)throw new Error("Unknown action "+e);this.listeners[e][a]&&(this.listeners[e][a]=this.listeners[e][a].filter(i=>i!=r))}init(e){e.baseURL&&(this.baseURL=e.baseURL)}};function o(t,e="/"){return(t.substring(0,e.length)==e||e[e.length-1]=="/"&&t.length==e.length-1&&t==e.substring(0,t.length))&&(t=t.substring(e.length)),t[0]!="/"&&t[0]!="#"&&(t="/"+t),t}function g(t,e){return t=o(t,e),e[e.length-1]==="/"&&t[0]==="/"&&(t=t.substring(1)),t[0]=="#"?t:e+t}function v(t,e=!1){return e?new RegExp("^"+t.replace(/:\w+/g,"([^/]+)").replace(/:\*/,"(.*)")+"(\\?|$)"):new RegExp("^"+t.replace(/:\w+/g,"([^/]+)").replace(/:\*/,"(.*)"))}function K(t,e,a=!1){let r=Object.keys(t),i=/:(\w+|\*)/g;for(let n of r){let s=[],c=[];do s=i.exec(n),s&&c.push(s[1]);while(s);e.push({match:v(n,a),params:c,action:t[n]})}return e}var p=class{constructor(e={}){e.app||(e.app={}),e.app.container||(e.app.container=document.body),this.app=e.app,this.$handlers=e.handlers||D,e.commands&&Object.assign(this,e.commands);let a=r=>{let i=S(r,this.$handlers);if(!i)return;if(!this[i.name]){console.error("simply.command: undefined command "+i.name,i.source);return}if(this[i.name].call(e.app,i.source,i.value)!==!0)return r.preventDefault(),r.stopPropagation(),!1};e.app.container.addEventListener("click",a),e.app.container.addEventListener("submit",a),e.app.container.addEventListener("change",a),e.app.container.addEventListener("input",a)}call(e,a,r){if(!this[e]){console.error("simply.command: undefined command "+e);return}return this[e].call(this.app,a,r)}action(e){console.warn("deprecated call to `this.commands.action`");let a=Array.from(arguments).slice();return a.shift(),this.app.actions[e](...a)}appendHandler(e){this.$handlers.push(e)}prependHandler(e){this.$handlers.unshift(e)}};function x(t={},e){if(e){let a=t;t=e,t.app=t}return new p(t)}function S(t,e){var a=t.target.closest("[data-simply-command]");if(a){for(let r of e)if(a.matches(r.match))return r.check(a,t)?{name:a.dataset.simplyCommand,source:a,value:r.get(a)}:null}return null}var D=[{match:"input,select,textarea",get:function(t){if(t.tagName==="SELECT"&&t.multiple){let e=[];for(let a of t.options)a.selected&&e.push(a.value);return e}return t.dataset.simplyValue||t.value},check:function(t,e){return e.type=="change"||t.dataset.simplyImmediate&&e.type=="input"}},{match:"a,button",get:function(t){return t.dataset.simplyValue||t.href||t.value},check:function(t,e){return e.type=="click"&&e.ctrlKey==!1&&e.button==0}},{match:"form",get:function(t){let e={};for(let a of Array.from(t.elements)){if(a.tagName=="INPUT"&&(a.type=="checkbox"||a.type=="radio")&&!a.checked)return;e[a.name]&&!Array.isArray(e[a.name])&&(e[a.name]=[e[a.name]]),Array.isArray(e[a.name])?e[a.name].push(a.value):e[a.name]=a.value}return e},check:function(t,e){return e.type=="submit"}},{match:"*",get:function(t){return t.dataset.simplyValue},check:function(t,e){return e.type=="click"&&e.ctrlKey==!1&&e.button==0}}];function E(t,e){if(e){let a=t;t=e,t.app=a}if(t.app){let a={apply(n,s,c){try{let l=n(...c);return l instanceof Promise?(t.app.hooks.wait(!0),l.finally(()=>{t.app.hooks.wait(!1,n)})):l}catch{}}},r={apply(n,s,c){try{let l=n(...c);return l instanceof Promise?t.app.hooks.wait?(t.app.hooks.wait(!0,n),l.catch(h=>t.app.hooks.error(h,n)).finally(()=>{t.app.hooks.wait(!1,n)})):l.catch(h=>t.app.hooks.error(h,n)):l}catch(l){return t.app.hooks.error(l,n)}}},i={get(n,s){if(n[s])return t.app.hooks?.error?new Proxy(n[s].bind(t.app),r):t.app.hooks?.wait?new Proxy(n[s].bind(t.app),a):n[s].bind(t.app)}};return new Proxy(t.actions,i)}else return t}var f=Object.freeze({Compose:229,Control:17,Meta:224,Alt:18,Shift:16}),y=class{constructor(e={}){e.app||(e.app={}),e.app.container||(e.app.container=document.body),Object.assign(this,e.keys);let a=r=>{if(r.isComposing||r.keyCode===f.Compose||r.defaultPrevented||!r.target)return;let i="default";r.target.closest("[data-simply-keyboard]")&&(i=r.target.closest("[data-simply-keyboard]").dataset.simplyKeyboard);let n=[];r.ctrlKey&&r.keyCode!=f.Control&&n.push("Control"),r.metaKey&&r.keyCode!=f.Meta&&n.push("Meta"),r.altKey&&r.keyCode!=f.Alt&&n.push("Alt"),r.shiftKey&&r.keyCode!=f.Shift&&n.push("Shift"),n.push(r.key.toLowerCase());let s=[],c=event.target.closest("[data-simply-keyboard]");for(;c;)s.push(c.dataset.simplyKeyboard),c=c.parentNode.closest("[data-simply-keyboard]");s.push("");let l,h,R=["+","-"];for(let j in s){l=s[j],l==""?h="default":(h=l,l+=".");for(let H of R){let u=n.join(H);if(this[h]&&typeof this[h][u]=="function"&&!this[h][u].call(e.app,r)){r.preventDefault();return}if(typeof this[h+u]=="function"&&!this[h+u].call(e.app,r)){r.preventDefault();return}if(this[i]&&this[i][u]){let m=e.app.container.querySelectorAll('[data-simply-accesskey="'+l+u+'"]');m.length&&(m.forEach(U=>U.click()),r.preventDefault())}}}};e.app.container.addEventListener("keydown",a)}};function L(t={},e){if(e){let a=t;t=e,t.app=t}return new y(t)}function T(t,e){if(e){let a=t;t=e,t.app=t}if(t.app){t.app.view=t.view||{};let a=()=>{let r=t.app.view,i=globalThis.editor.data.getDataPath(t.app.container||document.body);t.app.view=globalThis.editor.currentData[i],Object.assign(t.app.view,r)};return globalThis.editor&&globalThis.editor.currentData?a():document.addEventListener("simply-content-loaded",a),t.app.view}else return t.view}function k(t,...e){return e.map((r,i)=>`${t[i]}${r}`).join("")+t[t.length-1]}function C(t,...e){return k(t,...e)}var b=class{constructor(e={}){this.container=e.container||document.body,e.components&&P(e,e.components);for(let a in e)switch(a){case"html":for(let n in e.html){let s=document.createElement("div");s.innerHTML=e.html[n];let c=this.container.querySelector("template#"+n);c?c.content.replaceChildren(...s.children):(c=document.createElement("template"),c.id=n,c.content.append(...s.children),this.container.appendChild(c))}break;case"css":for(let n in e.css){let s=this.container.querySelector("style#"+n);s||(s=document.createElement("style"),s.id=n,this.container.appendChild(s)),s.innerHTML=e.css[n]}break;case"commands":this.commands=x({app:this,container:this.container,commands:e.commands});break;case"keys":case"keyboard":this.keys=L({app:this,keys:e.keys});break;case"root":case"baseURL":this.baseURL=e[a];break;case"routes":this.routes=w({app:this,routes:e.routes});break;case"actions":this.actions=E({app:this,actions:e.actions}),this.action=function(n){console.warn("deprecated call to `this.action`");let s=Array.from(arguments).slice();return s.shift(),this.actions[n](...s)};break;case"view":this.view=T({app:this,view:e.view});break;case"hooks":let r={get:(n,s)=>{if(n[s])return typeof n[s]=="function"?new Proxy(n[s],i):n[s]&&typeof n[s]=="object"?new Proxy(n[s],r):n[s]}},i={apply:(n,s,c)=>n.apply(this,c)};this[a]=new Proxy(e[a],r);break;default:console.log('simply.app: unknown initialization option "'+a+'", added as-is'),this[a]=e[a];break}}get app(){return this}async start(){if(this.components)for(let e in this.components)this.components[e].hooks?.start&&await this.components[e].hooks.start();this.hooks?.start&&await this.hooks.start(),this.routes&&(this.baseURL&&this.routes.init({baseURL:this.baseURL}),this.routes.handleEvents(),globalThis.setTimeout(()=>{this.routes.has(globalThis.location?.hash)?this.routes.match(globalThis.location.hash):this.routes.match(globalThis.location?.pathname+globalThis.location?.hash)}))}};function G(t={}){return new b(t)}globalThis.html||(globalThis.html=k);globalThis.css||(globalThis.css=C);function A(t,e){for(let a in e)switch(typeof e[a]){case"object":if(!e[a])continue;t[a]?A(t[a],e[a]):t[a]=e[a];break;default:t[a]=e[a]}}function P(t,e){for(let a in e){let r=e[a];r.components&&P(t,r.components),t.components[a]=r;for(let i in r)switch(i){case"hooks":case"components":break;default:t[i]||(t[i]=Object.create(null)),A(t[i],r[i]);break}}}})();
2
2
  //# sourceMappingURL=simply.app.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/route.mjs", "../src/command.mjs", "../src/action.mjs", "../src/key.mjs", "../src/view.mjs", "../src/app.mjs"],
4
- "sourcesContent": ["export function routes(options, optionsCompat)\n{\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n return new SimplyRoute(options)\n}\n\nclass SimplyRoute\n{\n constructor(options={})\n {\n this.baseURL = options.baseURL || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let matches;\n if (!path) {\n if (this.match(document.location.pathname+document.location.hash)) {\n return true;\n } else {\n return this.match(document.location.pathname);\n }\n }\n path = getPath(path);\n for ( let route of this.routeInfo) {\n matches = route.match.exec(path)\n if (this.addMissingSlash && !matches?.length) {\n if (path && path[path.length-1]!='/') {\n matches = route.match.exec(path+'/')\n if (matches) {\n path+='/'\n history.replaceState({}, '', getURL(path, this.baseURL))\n }\n }\n }\n if (matches && matches.length) {\n let params = {};\n route.params.forEach((key, i) => {\n if (key=='*') {\n key = 'remainder'\n }\n params[key] = matches[i+1]\n })\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n const searchParams = new URLSearchParams(document.location.search)\n args.result = route.action.call(this.app, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!this.listeners[action] || !Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n var routeRe = getRegexpFromRoute(route);\n if (routeRe.exec(params.path)) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n globalThis.addEventListener('popstate', () => {\n if (this.match(getPath(document.location.pathname + document.location.hash, this.baseURL)) === false) {\n this.match(getPath(document.location.pathname, this.baseURL))\n }\n })\n this.app.container.addEventListener('click', (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let check = [link.hash, link.pathname+link.hash, link.pathname]\n let path\n do {\n path = getPath(check.shift(), this.baseURL);\n } while(check.length && !this.has(path))\n if ( this.has(path) ) {\n let params = this.runListeners('goto', { path: path});\n if (params.path) {\n if (this.goto(params.path)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n })\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.baseURL))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(path, this.baseURL)\n for (let route of this.routeInfo) {\n var matches = route.match.exec(path)\n if (matches && matches.length) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.baseURL) {\n this.baseURL = options.baseURL\n }\n }\n}\n\nfunction getPath(path, baseURL='/')\n{\n if (path.substring(0,baseURL.length)==baseURL\n ||\n ( baseURL[baseURL.length-1]=='/' \n && path.length==(baseURL.length-1)\n && path == baseURL.substring(0,path.length)\n )\n ) {\n path = path.substring(baseURL.length)\n }\n if (path[0]!='/' && path[0]!='#') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, baseURL)\n{\n path = getPath(path, baseURL)\n if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n if (path[0]=='#') {\n return path\n }\n return baseURL + path\n}\n\nfunction getRegexpFromRoute(route, exact=false)\n{\n if (exact) {\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)')+'(\\\\?|$)')\n }\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)'))\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n const matchParams = /:(\\w+|\\*)/g\n for (let path of paths) {\n let matches = []\n let params = []\n do {\n matches = matchParams.exec(path)\n if (matches) {\n params.push(matches[1])\n }\n } while(matches)\n routeInfo.push({\n match: getRegexpFromRoute(path, exact),\n params: params,\n action: routes[path]\n })\n }\n return routeInfo\n}", "class SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n console.error('simply.command: undefined command '+command.name, command.source);\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n options.app.container.addEventListener('click', commandHandler)\n options.app.container.addEventListener('submit', commandHandler)\n options.app.container.addEventListener('change', commandHandler)\n options.app.container.addEventListener('input', commandHandler)\n\t}\n\n call(command, el, value) {\n if (!this[command]) {\n console.error('simply.command: undefined command '+command);\n return\n }\n return this[command].call(this.app, el, value)\n }\n\n action(name) {\n console.warn('deprecated call to `this.commands.action`')\n let params = Array.from(arguments).slice()\n params.shift()\n return this.app.actions[name](...params)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}, optionsCompat) {\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n\treturn new SimplyCommands(options)\n}\n\nfunction getCommand(evt, handlers) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el) {\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.dataset.simplyValue || el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el) {\n return el.dataset.simplyValue || el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el) {\n return el.dataset.simplyValue\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]", "export function actions(options, optionsCompat) \n{\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = app\n\t}\n\n\tif (options.app) {\n\t\tconst waitHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\toptions.app.hooks.wait(true)\n\t\t\t\t\t\treturn result.finally(() => {\n\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst functionHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tif (options.app.hooks.wait) {\n\t\t\t\t\t\t\toptions.app.hooks.wait(true, target)\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst actionHandler = {\n\t\t\tget(target, property)\n\t\t\t{\n\t\t\t\tif (!target[property]) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (options.app.hooks?.error) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else if (options.app.hooks?.wait) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), waitHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}", "const KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyKey {\n\tconstructor(options = {}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.keys)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (!e.target) {\n\t\t\t return\n\t\t\t}\n\n\t\t\tlet selectedKeyboard = 'default'\n\t\t\tif (e.target.closest('[data-simply-keyboard]')) {\n\t\t\t selectedKeyboard = e.target.closest('[data-simply-keyboard]')\n\t\t\t \t\t\t\t\t.dataset.simplyKeyboard\n\t\t\t}\n\t\t\tlet keyCombination = []\n\t\t\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t\t\t keyCombination.push('Control')\n\t\t\t}\n\t\t\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t\t\t keyCombination.push('Meta')\n\t\t\t}\n\t\t\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t\t\t keyCombination.push('Alt')\n\t\t\t}\n\t\t\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t\t\t keyCombination.push('Shift')\n\t\t\t}\n\t\t\tkeyCombination.push(e.key.toLowerCase())\n\n\t\t\tlet keyboards = []\n\t\t\tlet keyboardElement = event.target.closest('[data-simply-keyboard]')\n\t\t\twhile (keyboardElement) {\n\t\t\t\tkeyboards.push(keyboardElement.dataset.simplyKeyboard)\n\t\t\t\tkeyboardElement = keyboardElement.parentNode.closest('[data-simply-keyboard]')\n\t\t\t}\n\t\t\tkeyboards.push('')\n\n\t\t\tlet keyboard, subkeyboard\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (let i in keyboards) {\n\t\t\t\tkeyboard = keyboards[i]\n\t\t\t\tif (keyboard == '') {\n\t\t\t\t\tsubkeyboard = 'default'\n\t\t\t\t} else {\n\t\t\t\t\tsubkeyboard = keyboard\n\t\t\t\t\tkeyboard += '.'\n\t\t\t\t}\n\t\t\t\tfor (let separator of separators) {\n\t\t\t\t\tlet keyString = keyCombination.join(separator)\n\n\t\t\t\t\tif (this[subkeyboard] && (typeof this[subkeyboard][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[subkeyboard][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[subkeyboard + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[subkeyboard + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this[selectedKeyboard] && this[selectedKeyboard][keyString]) {\n\t\t\t\t\t\tlet targets = options.app.container.querySelectorAll('[data-simply-accesskey=\"'\n\t\t\t\t\t\t\t+ keyboard + keyString + '\"]')\n\t\t\t\t\t\tif (targets.length) {\n\t\t\t\t\t\t\ttargets.forEach(t => t.click())\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\toptions.app.container.addEventListener('keydown', keyHandler)\n\t}\n\n}\n\nexport function keys(options={}, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\treturn new SimplyKey(options)\n}\n\n", "export function view(options, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\tif (options.app) {\n\t\toptions.app.view = options.view || {}\n\n\t\tconst load = () => {\n\t\t\tconst data = options.app.view\n\t\t\tconst path = globalThis.editor.data.getDataPath(options.app.container || document.body)\n\t\t\toptions.app.view = globalThis.editor.currentData[path]\n\t\t\tObject.assign(options.app.view, data)\n\t\t}\n\t\tif (globalThis.editor && globalThis.editor.currentData) {\n\t\t\tload()\n\t\t} else {\n\t\t\tdocument.addEventListener('simply-content-loaded', load)\n\t\t}\n\t\treturn options.app.view\n\t} else {\n\t\treturn options.view\n\t}\n}", "import { routes } from './route.mjs'\nimport { commands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { keys } from './key.mjs'\nimport { view } from './view.mjs'\n\nclass SimplyApp {\n\tconstructor(options={}) {\n\t\tthis.container = options.container || document.body\n\t\tfor (let key in options) {\n\t\t\tswitch(key) {\n\t\t\t\tcase 'commands':\n\t\t\t\t\tthis.commands = commands({ app: this, container: this.container, commands: options.commands})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'keys':\n\t\t\t\tcase 'keyboard': // backwards compatible\n\t\t\t\t\tthis.keys = keys({ app: this, keys: options.keys })\n\t\t\t\t\tbreak\n\t\t\t\tcase 'root': // backwards compatibility\n\t\t\t\tcase 'baseURL':\n\t\t\t\t\tthis.baseURL = options[key]\n\t\t\t\t\tbreak\n\t\t\t\tcase 'routes':\n\t\t\t\t\tthis.routes = routes({ app: this, routes: options.routes})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'actions':\n\t\t\t\t\tthis.actions = actions({app: this, actions: options.actions})\n\t\t\t\t\tthis.action = function(name) { // backwards compatible wiht SimplyView2\n\t\t\t\t\t\tconsole.warn('deprecated call to `this.action`')\n\t\t\t\t\t\tlet params = Array.from(arguments).slice()\n\t\t\t\t params.shift()\n\t\t\t\t return this.actions[name](...params)\n\t\t\t\t }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'view':\n\t\t\t\t\tthis.view = view({app: this, view: options.view})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'hooks':\n\t\t\t\t\tconst moduleHandler = {\n\t\t\t\t\t\tget: (target, property) => {\n\t\t\t\t\t\t\tif (!target[property]) {\n\t\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof target[property]=='function') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], functionHandler)\n\t\t\t\t\t\t\t} else if (target[property] && typeof target[property]=='object') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], moduleHandler)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn target[property]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst functionHandler = {\n\t\t\t\t\t\tapply: (target, thisArg, argumentsList) => {\n\t\t\t\t\t\t\t// note: must use short function syntax so this is set to the app\n\t\t\t\t\t\t\treturn target.apply(this, argumentsList)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis[key] = new Proxy(options[key], moduleHandler)\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('simply.app: unknown initialization option \"'+key+'\", added as-is')\n\t\t\t\t\tthis[key] = options[key]\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tget app() {\n\t\treturn this\n\t}\n\tasync start() {\n\t\tif (this.hooks?.start) {\n\t\t\tawait this.hooks.start()\n\t\t}\n\t\tif (this.routes) {\n\t\t\tif (this.baseURL) {\n\t\t\t\tthis.routes.init({ baseURL: this.baseURL })\n\t\t\t}\n\t\t\tthis.routes.handleEvents();\n\t\t\tglobalThis.setTimeout(() => {\n\t\t\t\tif (this.routes.has(globalThis.location?.hash)) {\n\t\t\t\t\tthis.routes.match(globalThis.location.hash)\n\t\t\t\t} else {\n\t\t\t\t\tthis.routes.match(globalThis.location?.pathname+globalThis.location?.hash)\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function app(options={}) {\n\treturn new SimplyApp(options)\n}"],
5
- "mappings": "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",
6
- "names": ["routes", "options", "optionsCompat", "app", "SimplyRoute", "parseRoutes", "path", "args", "matches", "getPath", "route", "getURL", "params", "key", "i", "searchParams", "action", "routeRe", "getRegexpFromRoute", "result", "callback", "evt", "link", "check", "listener", "baseURL", "exact", "routeInfo", "paths", "matchParams", "SimplyCommands", "options", "defaultHandlers", "commandHandler", "evt", "command", "getCommand", "el", "value", "name", "params", "handler", "commands", "optionsCompat", "app", "handlers", "values", "option", "data", "input", "actions", "options", "optionsCompat", "app", "waitHandler", "target", "thisArg", "argumentsList", "result", "functionHandler", "err", "actionHandler", "property", "KEY", "SimplyKey", "options", "keyHandler", "e", "selectedKeyboard", "keyCombination", "keyboards", "keyboardElement", "keyboard", "subkeyboard", "separators", "i", "separator", "keyString", "targets", "t", "keys", "optionsCompat", "app", "view", "options", "optionsCompat", "app", "load", "data", "path", "SimplyApp", "options", "key", "commands", "keys", "routes", "actions", "name", "params", "view", "moduleHandler", "target", "property", "functionHandler", "thisArg", "argumentsList", "app"]
3
+ "sources": ["../src/route.mjs", "../src/command.mjs", "../src/action.mjs", "../src/key.mjs", "../src/view.mjs", "../src/highlight.mjs", "../src/app.mjs"],
4
+ "sourcesContent": ["export function routes(options, optionsCompat)\n{\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n return new SimplyRoute(options)\n}\n\nclass SimplyRoute\n{\n constructor(options={})\n {\n this.baseURL = options.baseURL || '/'\n this.app = options.app || {}\n this.addMissingSlash = !!options.addMissingSlash\n this.matchExact = !!options.matchExact\n this.clear()\n if (options.routes) {\n this.load(options.routes)\n }\n }\n\n load(routes)\n {\n parseRoutes(routes, this.routeInfo, this.matchExact)\n }\n\n clear()\n {\n this.routeInfo = []\n this.listeners = {\n match: {},\n call: {},\n goto: {},\n finish: {}\n }\n }\n\n match(path, options)\n {\n let args = {\n path,\n options\n }\n args = this.runListeners('match',args)\n path = args.path ? args.path : path;\n\n let matches;\n if (!path) {\n if (this.match(document.location.pathname+document.location.hash)) {\n return true;\n } else {\n return this.match(document.location.pathname);\n }\n }\n path = getPath(path);\n for ( let route of this.routeInfo) {\n matches = route.match.exec(path)\n if (this.addMissingSlash && !matches?.length) {\n if (path && path[path.length-1]!='/') {\n matches = route.match.exec(path+'/')\n if (matches) {\n path+='/'\n history.replaceState({}, '', getURL(path, this.baseURL))\n }\n }\n }\n if (matches && matches.length) {\n let params = {};\n route.params.forEach((key, i) => {\n if (key=='*') {\n key = 'remainder'\n }\n params[key] = matches[i+1]\n })\n Object.assign(params, options)\n args.route = route\n args.params = params\n args = this.runListeners('call', args)\n params = args.params ? args.params : params\n const searchParams = new URLSearchParams(document.location.search)\n args.result = route.action.call(this.app, params, searchParams)\n this.runListeners('finish', args)\n return args.result\n }\n }\n return false\n }\n\n runListeners(action, params)\n {\n if (!this.listeners[action] || !Object.keys(this.listeners[action])) {\n return\n }\n Object.keys(this.listeners[action]).forEach((route) => {\n var routeRe = getRegexpFromRoute(route);\n if (routeRe.exec(params.path)) {\n var result;\n for (let callback of this.listeners[action][route]) {\n result = callback.call(this.app, params)\n if (result) {\n params = result\n }\n }\n }\n })\n return params\n }\n\n handleEvents()\n {\n globalThis.addEventListener('popstate', () => {\n if (this.match(getPath(document.location.pathname + document.location.hash, this.baseURL)) === false) {\n this.match(getPath(document.location.pathname, this.baseURL))\n }\n })\n this.app.container.addEventListener('click', (evt) => {\n if (evt.ctrlKey) {\n return;\n }\n if (evt.which != 1) {\n return; // not a 'left' mouse click\n }\n var link = evt.target;\n while (link && link.tagName!='A') {\n link = link.parentElement;\n }\n if (link \n && link.pathname \n && link.hostname==globalThis.location.hostname \n && !link.link\n && !link.dataset.simplyCommand\n ) {\n let check = [link.hash, link.pathname+link.hash, link.pathname]\n let path\n do {\n path = getPath(check.shift(), this.baseURL);\n } while(check.length && !this.has(path))\n if ( this.has(path) ) {\n let params = this.runListeners('goto', { path: path});\n if (params.path) {\n if (this.goto(params.path)) {\n // now cancel the browser navigation, since a route handler was found\n evt.preventDefault();\n return false;\n }\n }\n }\n }\n })\n }\n\n goto(path)\n {\n history.pushState({},'',getURL(path, this.baseURL))\n return this.match(path)\n }\n\n has(path)\n {\n path = getPath(path, this.baseURL)\n for (let route of this.routeInfo) {\n var matches = route.match.exec(path)\n if (matches && matches.length) {\n return true\n }\n }\n return false\n }\n\n addListener(action, route, callback)\n {\n if (['goto','match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n this.listeners[action][route] = []\n }\n this.listeners[action][route].push(callback)\n }\n\n removeListener(action, route, callback)\n {\n if (['match','call','finish'].indexOf(action)==-1) {\n throw new Error('Unknown action '+action)\n }\n if (!this.listeners[action][route]) {\n return\n }\n this.listeners[action][route] = this.listeners[action][route].filter((listener) => {\n return listener != callback\n })\n }\n\n init(options)\n {\n if (options.baseURL) {\n this.baseURL = options.baseURL\n }\n }\n}\n\nfunction getPath(path, baseURL='/')\n{\n if (path.substring(0,baseURL.length)==baseURL\n ||\n ( baseURL[baseURL.length-1]=='/' \n && path.length==(baseURL.length-1)\n && path == baseURL.substring(0,path.length)\n )\n ) {\n path = path.substring(baseURL.length)\n }\n if (path[0]!='/' && path[0]!='#') {\n path = '/'+path\n }\n return path\n}\n\nfunction getURL(path, baseURL)\n{\n path = getPath(path, baseURL)\n if (baseURL[baseURL.length-1]==='/' && path[0]==='/') {\n path = path.substring(1)\n }\n if (path[0]=='#') {\n return path\n }\n return baseURL + path\n}\n\nfunction getRegexpFromRoute(route, exact=false)\n{\n if (exact) {\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)')+'(\\\\?|$)')\n }\n return new RegExp('^'+route.replace(/:\\w+/g, '([^/]+)').replace(/:\\*/, '(.*)'))\n}\n\nfunction parseRoutes(routes, routeInfo, exact=false)\n{\n const paths = Object.keys(routes)\n const matchParams = /:(\\w+|\\*)/g\n for (let path of paths) {\n let matches = []\n let params = []\n do {\n matches = matchParams.exec(path)\n if (matches) {\n params.push(matches[1])\n }\n } while(matches)\n routeInfo.push({\n match: getRegexpFromRoute(path, exact),\n params: params,\n action: routes[path]\n })\n }\n return routeInfo\n}", "class SimplyCommands {\n\tconstructor(options={}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n this.app = options.app\n\t\tthis.$handlers = options.handlers || defaultHandlers\n if (options.commands) {\n \t\tObject.assign(this, options.commands)\n }\n\n\t\tconst commandHandler = (evt) => {\n\t\t\tconst command = getCommand(evt, this.$handlers)\n\t\t\tif (!command) {\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif (!this[command.name]) {\n console.error('simply.command: undefined command '+command.name, command.source);\n return\n\t\t\t}\n const shouldContinue = this[command.name].call(options.app, command.source, command.value)\n if (shouldContinue!==true) {\n evt.preventDefault()\n evt.stopPropagation()\n return false\n }\n\t\t}\n\n options.app.container.addEventListener('click', commandHandler)\n options.app.container.addEventListener('submit', commandHandler)\n options.app.container.addEventListener('change', commandHandler)\n options.app.container.addEventListener('input', commandHandler)\n\t}\n\n call(command, el, value) {\n if (!this[command]) {\n console.error('simply.command: undefined command '+command);\n return\n }\n return this[command].call(this.app, el, value)\n }\n\n action(name) {\n console.warn('deprecated call to `this.commands.action`')\n let params = Array.from(arguments).slice()\n params.shift()\n return this.app.actions[name](...params)\n }\n\n appendHandler(handler) {\n this.$handlers.push(handler)\n }\n\n prependHandler(handler) {\n this.$handlers.unshift(handler)\n }\n}\n\nexport function commands(options={}, optionsCompat) {\n if (optionsCompat) {\n let app = options\n options = optionsCompat\n options.app = options\n }\n\treturn new SimplyCommands(options)\n}\n\nfunction getCommand(evt, handlers) {\n var el = evt.target.closest('[data-simply-command]')\n if (el) {\n for (let handler of handlers) {\n if (el.matches(handler.match)) {\n if (handler.check(el, evt)) {\n return {\n name: el.dataset.simplyCommand,\n source: el,\n value: handler.get(el)\n }\n }\n return null\n }\n }\n }\n return null\n}\n\nconst defaultHandlers = [\n {\n match: 'input,select,textarea',\n get: function(el) {\n if (el.tagName==='SELECT' && el.multiple) {\n let values = []\n for (let option of el.options) {\n if (option.selected) {\n values.push(option.value)\n }\n }\n return values\n }\n return el.dataset.simplyValue || el.value\n },\n check: function(el, evt) {\n return evt.type=='change' || (el.dataset.simplyImmediate && evt.type=='input')\n }\n },\n {\n match: 'a,button',\n get: function(el) {\n return el.dataset.simplyValue || el.href || el.value\n },\n check: function(el,evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n },\n {\n match: 'form',\n get: function(el) {\n let data = {}\n for (let input of Array.from(el.elements)) {\n if (input.tagName=='INPUT' \n && (input.type=='checkbox' || input.type=='radio')\n ) {\n if (!input.checked) {\n return;\n }\n }\n if (data[input.name] && !Array.isArray(data[input.name])) {\n data[input.name] = [data[input.name]]\n }\n if (Array.isArray(data[input.name])) {\n data[input.name].push(input.value)\n } else {\n data[input.name] = input.value\n }\n }\n return data\n },\n check: function(el,evt) {\n return evt.type=='submit'\n }\n },\n {\n \tmatch: '*',\n get: function(el) {\n return el.dataset.simplyValue\n },\n check: function(el, evt) {\n return evt.type=='click' && evt.ctrlKey==false && evt.button==0\n }\n }\n]", "export function actions(options, optionsCompat) \n{\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = app\n\t}\n\n\tif (options.app) {\n\t\tconst waitHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\toptions.app.hooks.wait(true)\n\t\t\t\t\t\treturn result.finally(() => {\n\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t})\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst functionHandler = {\n\t\t\tapply(target, thisArg, argumentsList)\n\t\t\t{\n\t\t\t\ttry {\n\t\t\t\t\tconst result = target(...argumentsList)\n\t\t\t\t\tif (result instanceof Promise) {\n\t\t\t\t\t\tif (options.app.hooks.wait) {\n\t\t\t\t\t\t\toptions.app.hooks.wait(true, target)\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.finally(() => {\n\t\t\t\t\t\t\t\toptions.app.hooks.wait(false, target)\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn result.catch(err => {\n\t\t\t\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t\t\t\t})\t\t\t\t\t\t\t\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn result\n\t\t\t\t} catch(err) {\n\t\t\t\t\treturn options.app.hooks.error(err, target)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst actionHandler = {\n\t\t\tget(target, property)\n\t\t\t{\n\t\t\t\tif (!target[property]) {\n\t\t\t\t\treturn undefined\n\t\t\t\t}\n\t\t\t\tif (options.app.hooks?.error) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), functionHandler)\n\t\t\t\t} else if (options.app.hooks?.wait) {\n\t\t\t\t\treturn new Proxy(target[property].bind(options.app), waitHandler)\n\t\t\t\t} else {\n\t\t\t\t\treturn target[property].bind(options.app)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn new Proxy(options.actions, actionHandler)\n\t} else {\n\t\treturn options\n\t}\n}", "const KEY = Object.freeze({\n\tCompose: 229,\n\tControl: 17,\n\tMeta: 224,\n\tAlt: 18,\n\tShift: 16\n})\n\nclass SimplyKey {\n\tconstructor(options = {}) {\n\t\tif (!options.app) {\n\t\t\toptions.app = {}\n\t\t}\n\t\tif (!options.app.container) {\n\t\t\toptions.app.container = document.body\n\t\t}\n\t\tObject.assign(this, options.keys)\n\n\t\tconst keyHandler = (e) => {\n\t\t\tif (e.isComposing || e.keyCode === KEY.Compose) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t return\n\t\t\t}\n\t\t\tif (!e.target) {\n\t\t\t return\n\t\t\t}\n\n\t\t\tlet selectedKeyboard = 'default'\n\t\t\tif (e.target.closest('[data-simply-keyboard]')) {\n\t\t\t selectedKeyboard = e.target.closest('[data-simply-keyboard]')\n\t\t\t \t\t\t\t\t.dataset.simplyKeyboard\n\t\t\t}\n\t\t\tlet keyCombination = []\n\t\t\tif (e.ctrlKey && e.keyCode!=KEY.Control) {\n\t\t\t keyCombination.push('Control')\n\t\t\t}\n\t\t\tif (e.metaKey && e.keyCode!=KEY.Meta) {\n\t\t\t keyCombination.push('Meta')\n\t\t\t}\n\t\t\tif (e.altKey && e.keyCode!=KEY.Alt) {\n\t\t\t keyCombination.push('Alt')\n\t\t\t}\n\t\t\tif (e.shiftKey && e.keyCode!=KEY.Shift) {\n\t\t\t keyCombination.push('Shift')\n\t\t\t}\n\t\t\tkeyCombination.push(e.key.toLowerCase())\n\n\t\t\tlet keyboards = []\n\t\t\tlet keyboardElement = event.target.closest('[data-simply-keyboard]')\n\t\t\twhile (keyboardElement) {\n\t\t\t\tkeyboards.push(keyboardElement.dataset.simplyKeyboard)\n\t\t\t\tkeyboardElement = keyboardElement.parentNode.closest('[data-simply-keyboard]')\n\t\t\t}\n\t\t\tkeyboards.push('')\n\n\t\t\tlet keyboard, subkeyboard\n\t\t\tlet separators = ['+','-']\n\n\t\t\tfor (let i in keyboards) {\n\t\t\t\tkeyboard = keyboards[i]\n\t\t\t\tif (keyboard == '') {\n\t\t\t\t\tsubkeyboard = 'default'\n\t\t\t\t} else {\n\t\t\t\t\tsubkeyboard = keyboard\n\t\t\t\t\tkeyboard += '.'\n\t\t\t\t}\n\t\t\t\tfor (let separator of separators) {\n\t\t\t\t\tlet keyString = keyCombination.join(separator)\n\n\t\t\t\t\tif (this[subkeyboard] && (typeof this[subkeyboard][keyString]=='function')) {\n\t\t\t\t\t\tlet _continue = this[subkeyboard][keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (typeof this[subkeyboard + keyString] == 'function') {\n\t\t\t\t\t\tlet _continue = this[subkeyboard + keyString].call(options.app, e)\n\t\t\t\t\t\tif (!_continue) {\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t\treturn\n\t\t\t\t\t\t}\t\t\t\t\t\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this[selectedKeyboard] && this[selectedKeyboard][keyString]) {\n\t\t\t\t\t\tlet targets = options.app.container.querySelectorAll('[data-simply-accesskey=\"'\n\t\t\t\t\t\t\t+ keyboard + keyString + '\"]')\n\t\t\t\t\t\tif (targets.length) {\n\t\t\t\t\t\t\ttargets.forEach(t => t.click())\n\t\t\t\t\t\t\te.preventDefault()\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\toptions.app.container.addEventListener('keydown', keyHandler)\n\t}\n\n}\n\nexport function keys(options={}, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\treturn new SimplyKey(options)\n}\n\n", "export function view(options, optionsCompat) {\n\tif (optionsCompat) {\n\t\tlet app = options\n\t\toptions = optionsCompat\n\t\toptions.app = options\n\t}\n\tif (options.app) {\n\t\toptions.app.view = options.view || {}\n\n\t\tconst load = () => {\n\t\t\tconst data = options.app.view\n\t\t\tconst path = globalThis.editor.data.getDataPath(options.app.container || document.body)\n\t\t\toptions.app.view = globalThis.editor.currentData[path]\n\t\t\tObject.assign(options.app.view, data)\n\t\t}\n\t\tif (globalThis.editor && globalThis.editor.currentData) {\n\t\t\tload()\n\t\t} else {\n\t\t\tdocument.addEventListener('simply-content-loaded', load)\n\t\t}\n\t\treturn options.app.view\n\t} else {\n\t\treturn options.view\n\t}\n}", "export function html(strings, ...values) {\n const outputArray = values.map(\n (value, index) =>\n `${strings[index]}${value}`,\n );\n return outputArray.join(\"\") + strings[strings.length - 1];\n}\n\nexport function css(strings, ...values) {\n\treturn html(strings, ...values)\n}\n", "import { routes } from './route.mjs'\nimport { commands } from './command.mjs'\nimport { actions } from './action.mjs'\nimport { keys } from './key.mjs'\nimport { view } from './view.mjs'\nimport { html, css } from './highlight.mjs'\n\nclass SimplyApp\n{\n\n\tconstructor(options={})\n\t{\n\t\tthis.container = options.container || document.body\n\t\tif (options.components) {\n\t\t\tmergeComponents(options, options.components)\n\t\t}\n\t\tfor (let key in options) {\n\t\t\tswitch(key) {\n\t\t\t\tcase 'html':\n\t\t\t\t\tfor (const name in options.html) {\n\t\t\t\t\t\tconst element = document.createElement('div')\n\t\t\t\t\t\telement.innerHTML = options.html[name]\n\t\t\t\t\t\tlet template = this.container.querySelector('template#'+name)\n\t\t\t\t\t\tif (!template) {\n\t\t\t\t\t\t\ttemplate = document.createElement('template')\n\t\t\t\t\t\t\ttemplate.id=name\n\t\t\t\t\t\t\ttemplate.content.append(...element.children)\n\t\t\t\t\t\t\tthis.container.appendChild(template)\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttemplate.content.replaceChildren(...element.children)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'css':\n\t\t\t\t\tfor (const name in options.css) {\n\t\t\t\t\t\tlet style = this.container.querySelector('style#'+name)\n\t\t\t\t\t\tif (!style) {\n\t\t\t\t\t\t\tstyle = document.createElement('style')\n\t\t\t\t\t\t\tstyle.id=name \n\t\t\t\t\t\t\tthis.container.appendChild(style)\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstyle.innerHTML = options.css[name]\n\t\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t\tcase 'commands':\n\t\t\t\t\tthis.commands = commands({ app: this, container: this.container, commands: options.commands})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'keys':\n\t\t\t\tcase 'keyboard': // backwards compatible\n\t\t\t\t\tthis.keys = keys({ app: this, keys: options.keys })\n\t\t\t\t\tbreak\n\t\t\t\tcase 'root': // backwards compatibility\n\t\t\t\tcase 'baseURL':\n\t\t\t\t\tthis.baseURL = options[key]\n\t\t\t\t\tbreak\n\t\t\t\tcase 'routes':\n\t\t\t\t\tthis.routes = routes({ app: this, routes: options.routes})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'actions':\n\t\t\t\t\tthis.actions = actions({app: this, actions: options.actions})\n\t\t\t\t\tthis.action = function(name) { // backwards compatible wiht SimplyView2\n\t\t\t\t\t\tconsole.warn('deprecated call to `this.action`')\n\t\t\t\t\t\tlet params = Array.from(arguments).slice()\n\t\t\t\t params.shift()\n\t\t\t\t return this.actions[name](...params)\n\t\t\t\t }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'view':\n\t\t\t\t\tthis.view = view({app: this, view: options.view})\n\t\t\t\t\tbreak\n\t\t\t\tcase 'hooks':\n\t\t\t\t\tconst moduleHandler = {\n\t\t\t\t\t\tget: (target, property) => {\n\t\t\t\t\t\t\tif (!target[property]) {\n\t\t\t\t\t\t\t\treturn undefined\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof target[property]=='function') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], functionHandler)\n\t\t\t\t\t\t\t} else if (target[property] && typeof target[property]=='object') {\n\t\t\t\t\t\t\t\treturn new Proxy(target[property], moduleHandler)\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn target[property]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tconst functionHandler = {\n\t\t\t\t\t\tapply: (target, thisArg, argumentsList) => {\n\t\t\t\t\t\t\t// note: must use short function syntax so this is set to the app\n\t\t\t\t\t\t\treturn target.apply(this, argumentsList)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis[key] = new Proxy(options[key], moduleHandler)\n\t\t\t\t\tbreak\n\t\t\t\tcomponents:\n\t\t\t\t\tthis.components = components\n\t\t\t\t\tbreak\n\t\t\t\tprototype:\n\t\t\t\t__proto__:\n\t\t\t\t\t// ignore this to avoid prototype pollution\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.log('simply.app: unknown initialization option \"'+key+'\", added as-is')\n\t\t\t\t\tthis[key] = options[key]\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\n\tget app()\n\t{\n\t\treturn this\n\t}\n\n\tasync start()\n\t{\n\t\tif (this.components) {\n\t\t\tfor (const name in this.components) {\n\t\t\t\tif (this.components[name].hooks?.start) {\n\t\t\t\t\tawait this.components[name].hooks.start()\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.hooks?.start) {\n\t\t\tawait this.hooks.start()\n\t\t}\n\t\tif (this.routes) {\n\t\t\tif (this.baseURL) {\n\t\t\t\tthis.routes.init({ baseURL: this.baseURL })\n\t\t\t}\n\t\t\tthis.routes.handleEvents();\n\t\t\tglobalThis.setTimeout(() => {\n\t\t\t\tif (this.routes.has(globalThis.location?.hash)) {\n\t\t\t\t\tthis.routes.match(globalThis.location.hash)\n\t\t\t\t} else {\n\t\t\t\t\tthis.routes.match(globalThis.location?.pathname+globalThis.location?.hash)\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n}\n\nexport function app(options={})\n{\n\treturn new SimplyApp(options)\n}\n\nif (!globalThis.html) {\n\tglobalThis.html = html\n}\nif (!globalThis.css) {\n\tglobalThis.css = css\n}\n\nfunction mergeOptions(options, otherOptions)\n{\n\tfor (const key in otherOptions) {\n\t\tswitch(typeof otherOptions[key]) {\n\t\t\tcase 'object':\n\t\t\t\tif (!otherOptions[key]) {\n\t\t\t\t\tcontinue // null\n\t\t\t\t}\n\t\t\t\tif (!options[key]) {\n\t\t\t\t\toptions[key] = otherOptions[key]\n\t\t\t\t} else {\n\t\t\t\t\t//FIXME: check that options[key] is also an object\n\t\t\t\t\tmergeOptions(options[key], otherOptions[key])\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\tdefault:\n\t\t\t\toptions[key] = otherOptions[key]\n\t\t}\n\t}\n}\n\nfunction mergeComponents(options, components) {\n\tfor (const name in components) {\n\t\tconst component = components[name]\n\t\tif (component.components) {\n\t\t\tmergeComponents(options, component.components)\n\t\t}\n\t\toptions.components[name] = component\n\t\tfor (const key in component) {\n\t\t\tswitch(key) {\n\t\t\t\tcase 'hooks':\n\t\t\t\t\t// don't merge these, app.hooks.start will trigger each components start hook\n\t\t\t\tcase 'components':\n\t\t\t\t\t// already handled\n\t\t\t\t\tbreak\n\t\t\t\tdefault:\n\t\t\t\t\tif (!options[key]) {\n\t\t\t\t\t\toptions[key] = Object.create(null)\n\t\t\t\t\t}\n\t\t\t\t\tmergeOptions(options[key], component[key])\n\t\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n"],
5
+ "mappings": "MAAO,SAASA,EAAOC,EAASC,EAChC,CACI,GAAIA,EAAe,CACf,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAMA,CAClB,CACA,OAAO,IAAIG,EAAYH,CAAO,CAClC,CAEA,IAAMG,EAAN,KACA,CACI,YAAYH,EAAQ,CAAC,EACrB,CACI,KAAK,QAAUA,EAAQ,SAAW,IAClC,KAAK,IAAMA,EAAQ,KAAO,CAAC,EAC3B,KAAK,gBAAkB,CAAC,CAACA,EAAQ,gBACjC,KAAK,WAAa,CAAC,CAACA,EAAQ,WAC5B,KAAK,MAAM,EACPA,EAAQ,QACR,KAAK,KAAKA,EAAQ,MAAM,CAEhC,CAEA,KAAKD,EACL,CACIK,EAAYL,EAAQ,KAAK,UAAW,KAAK,UAAU,CACvD,CAEA,OACA,CACI,KAAK,UAAY,CAAC,EAClB,KAAK,UAAY,CACb,MAAO,CAAC,EACR,KAAM,CAAC,EACP,KAAM,CAAC,EACP,OAAQ,CAAC,CACb,CACJ,CAEA,MAAMM,EAAML,EACZ,CACI,IAAIM,EAAO,CACP,KAAAD,EACA,QAAAL,CACJ,EACAM,EAAO,KAAK,aAAa,QAAQA,CAAI,EACrCD,EAAOC,EAAK,KAAOA,EAAK,KAAOD,EAE/B,IAAIE,EACJ,GAAI,CAACF,EACD,OAAI,KAAK,MAAM,SAAS,SAAS,SAAS,SAAS,SAAS,IAAI,EACrD,GAEA,KAAK,MAAM,SAAS,SAAS,QAAQ,EAGpDA,EAAOG,EAAQH,CAAI,EACnB,QAAUI,KAAS,KAAK,UAWpB,GAVAF,EAAUE,EAAM,MAAM,KAAKJ,CAAI,EAC3B,KAAK,iBAAmB,CAACE,GAAS,QAC9BF,GAAQA,EAAKA,EAAK,OAAO,CAAC,GAAG,MAC7BE,EAAUE,EAAM,MAAM,KAAKJ,EAAK,GAAG,EAC/BE,IACAF,GAAM,IACN,QAAQ,aAAa,CAAC,EAAG,GAAIK,EAAOL,EAAM,KAAK,OAAO,CAAC,IAI/DE,GAAWA,EAAQ,OAAQ,CAC3B,IAAII,EAAS,CAAC,EACdF,EAAM,OAAO,QAAQ,CAACG,EAAKC,IAAM,CACzBD,GAAK,MACLA,EAAM,aAEVD,EAAOC,CAAG,EAAIL,EAAQM,EAAE,CAAC,CAC7B,CAAC,EACD,OAAO,OAAOF,EAAQX,CAAO,EAC7BM,EAAK,MAAQG,EACbH,EAAK,OAASK,EACdL,EAAO,KAAK,aAAa,OAAQA,CAAI,EACrCK,EAASL,EAAK,OAASA,EAAK,OAASK,EACrC,IAAMG,EAAe,IAAI,gBAAgB,SAAS,SAAS,MAAM,EACjE,OAAAR,EAAK,OAASG,EAAM,OAAO,KAAK,KAAK,IAAKE,EAAQG,CAAY,EAC9D,KAAK,aAAa,SAAUR,CAAI,EACzBA,EAAK,MAChB,CAEJ,MAAO,EACX,CAEA,aAAaS,EAAQJ,EACrB,CACI,GAAI,GAAC,KAAK,UAAUI,CAAM,GAAK,CAAC,OAAO,KAAK,KAAK,UAAUA,CAAM,CAAC,GAGlE,cAAO,KAAK,KAAK,UAAUA,CAAM,CAAC,EAAE,QAASN,GAAU,CACnD,IAAIO,EAAUC,EAAmBR,CAAK,EACtC,GAAIO,EAAQ,KAAKL,EAAO,IAAI,EAAG,CAC3B,IAAIO,EACJ,QAASC,KAAY,KAAK,UAAUJ,CAAM,EAAEN,CAAK,EAC7CS,EAASC,EAAS,KAAK,KAAK,IAAKR,CAAM,EACnCO,IACAP,EAASO,EAGrB,CACJ,CAAC,EACMP,CACX,CAEA,cACA,CACI,WAAW,iBAAiB,WAAY,IAAM,CACtC,KAAK,MAAMH,EAAQ,SAAS,SAAS,SAAW,SAAS,SAAS,KAAM,KAAK,OAAO,CAAC,IAAM,IAC3F,KAAK,MAAMA,EAAQ,SAAS,SAAS,SAAU,KAAK,OAAO,CAAC,CAEpE,CAAC,EACD,KAAK,IAAI,UAAU,iBAAiB,QAAUY,GAAQ,CAClD,GAAI,CAAAA,EAAI,SAGJA,EAAI,OAAS,EAIjB,SADIC,EAAOD,EAAI,OACRC,GAAQA,EAAK,SAAS,KACzBA,EAAOA,EAAK,cAEhB,GAAIA,GACGA,EAAK,UACLA,EAAK,UAAU,WAAW,SAAS,UACnC,CAACA,EAAK,MACN,CAACA,EAAK,QAAQ,cACnB,CACE,IAAIC,EAAQ,CAACD,EAAK,KAAMA,EAAK,SAASA,EAAK,KAAMA,EAAK,QAAQ,EAC1DhB,EACJ,GACIA,EAAOG,EAAQc,EAAM,MAAM,EAAG,KAAK,OAAO,QACtCA,EAAM,QAAU,CAAC,KAAK,IAAIjB,CAAI,GACtC,GAAK,KAAK,IAAIA,CAAI,EAAI,CAClB,IAAIM,EAAS,KAAK,aAAa,OAAQ,CAAE,KAAMN,CAAI,CAAC,EACpD,GAAIM,EAAO,MACH,KAAK,KAAKA,EAAO,IAAI,EAErB,OAAAS,EAAI,eAAe,EACZ,EAGnB,CACJ,EACJ,CAAC,CACL,CAEA,KAAKf,EACL,CACI,eAAQ,UAAU,CAAC,EAAE,GAAGK,EAAOL,EAAM,KAAK,OAAO,CAAC,EAC3C,KAAK,MAAMA,CAAI,CAC1B,CAEA,IAAIA,EACJ,CACIA,EAAOG,EAAQH,EAAM,KAAK,OAAO,EACjC,QAASI,KAAS,KAAK,UAAW,CAC9B,IAAIF,EAAUE,EAAM,MAAM,KAAKJ,CAAI,EACnC,GAAIE,GAAWA,EAAQ,OACnB,MAAO,EAEf,CACA,MAAO,EACX,CAEA,YAAYQ,EAAQN,EAAOU,EAC3B,CACI,GAAI,CAAC,OAAO,QAAQ,OAAO,QAAQ,EAAE,QAAQJ,CAAM,GAAG,GAClD,MAAM,IAAI,MAAM,kBAAkBA,CAAM,EAEvC,KAAK,UAAUA,CAAM,EAAEN,CAAK,IAC7B,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAI,CAAC,GAErC,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAE,KAAKU,CAAQ,CAC/C,CAEA,eAAeJ,EAAQN,EAAOU,EAC9B,CACI,GAAI,CAAC,QAAQ,OAAO,QAAQ,EAAE,QAAQJ,CAAM,GAAG,GAC3C,MAAM,IAAI,MAAM,kBAAkBA,CAAM,EAEvC,KAAK,UAAUA,CAAM,EAAEN,CAAK,IAGjC,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAI,KAAK,UAAUM,CAAM,EAAEN,CAAK,EAAE,OAAQc,GAC3DA,GAAYJ,CACtB,EACL,CAEA,KAAKnB,EACL,CACQA,EAAQ,UACR,KAAK,QAAUA,EAAQ,QAE/B,CACJ,EAEA,SAASQ,EAAQH,EAAMmB,EAAQ,IAC/B,CACI,OAAInB,EAAK,UAAU,EAAEmB,EAAQ,MAAM,GAAGA,GAEhCA,EAAQA,EAAQ,OAAO,CAAC,GAAG,KACtBnB,EAAK,QAASmB,EAAQ,OAAO,GAC7BnB,GAAQmB,EAAQ,UAAU,EAAEnB,EAAK,MAAM,KAG9CA,EAAOA,EAAK,UAAUmB,EAAQ,MAAM,GAEpCnB,EAAK,CAAC,GAAG,KAAOA,EAAK,CAAC,GAAG,MACzBA,EAAO,IAAIA,GAERA,CACX,CAEA,SAASK,EAAOL,EAAMmB,EACtB,CAKI,OAJAnB,EAAOG,EAAQH,EAAMmB,CAAO,EACxBA,EAAQA,EAAQ,OAAO,CAAC,IAAI,KAAOnB,EAAK,CAAC,IAAI,MAC7CA,EAAOA,EAAK,UAAU,CAAC,GAEvBA,EAAK,CAAC,GAAG,IACFA,EAEJmB,EAAUnB,CACrB,CAEA,SAASY,EAAmBR,EAAOgB,EAAM,GACzC,CACI,OAAIA,EACO,IAAI,OAAO,IAAIhB,EAAM,QAAQ,QAAS,SAAS,EAAE,QAAQ,MAAO,MAAM,EAAE,SAAS,EAErF,IAAI,OAAO,IAAIA,EAAM,QAAQ,QAAS,SAAS,EAAE,QAAQ,MAAO,MAAM,CAAC,CAClF,CAEA,SAASL,EAAYL,EAAQ2B,EAAWD,EAAM,GAC9C,CACI,IAAME,EAAQ,OAAO,KAAK5B,CAAM,EAC1B6B,EAAc,aACpB,QAASvB,KAAQsB,EAAO,CACpB,IAAIpB,EAAU,CAAC,EACXI,EAAU,CAAC,EACf,GACIJ,EAAUqB,EAAY,KAAKvB,CAAI,EAC3BE,GACAI,EAAO,KAAKJ,EAAQ,CAAC,CAAC,QAEtBA,GACRmB,EAAU,KAAK,CACX,MAAQT,EAAmBZ,EAAMoB,CAAK,EACtC,OAAQd,EACR,OAAQZ,EAAOM,CAAI,CACvB,CAAC,CACL,CACA,OAAOqB,CACX,CCrQA,IAAMG,EAAN,KAAqB,CACpB,YAAYC,EAAQ,CAAC,EAAG,CAClBA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAE5B,KAAK,IAAMA,EAAQ,IACzB,KAAK,UAAYA,EAAQ,UAAYC,EAC3BD,EAAQ,UACd,OAAO,OAAO,KAAMA,EAAQ,QAAQ,EAGxC,IAAME,EAAkBC,GAAQ,CAC/B,IAAMC,EAAUC,EAAWF,EAAK,KAAK,SAAS,EAC9C,GAAI,CAACC,EACJ,OAED,GAAI,CAAC,KAAKA,EAAQ,IAAI,EAAG,CACZ,QAAQ,MAAM,qCAAqCA,EAAQ,KAAMA,EAAQ,MAAM,EAC/E,MACb,CAES,GADuB,KAAKA,EAAQ,IAAI,EAAE,KAAKJ,EAAQ,IAAKI,EAAQ,OAAQA,EAAQ,KAAK,IACpE,GACjB,OAAAD,EAAI,eAAe,EACnBA,EAAI,gBAAgB,EACb,EAErB,EAEMH,EAAQ,IAAI,UAAU,iBAAiB,QAASE,CAAc,EAC9DF,EAAQ,IAAI,UAAU,iBAAiB,SAAUE,CAAc,EAC/DF,EAAQ,IAAI,UAAU,iBAAiB,SAAUE,CAAc,EAC/DF,EAAQ,IAAI,UAAU,iBAAiB,QAASE,CAAc,CACrE,CAEG,KAAKE,EAASE,EAAIC,EAAO,CACrB,GAAI,CAAC,KAAKH,CAAO,EAAG,CAChB,QAAQ,MAAM,qCAAqCA,CAAO,EAC1D,MACJ,CACA,OAAO,KAAKA,CAAO,EAAE,KAAK,KAAK,IAAKE,EAAIC,CAAK,CACjD,CAEA,OAAOC,EAAM,CACT,QAAQ,KAAK,2CAA2C,EACxD,IAAIC,EAAS,MAAM,KAAK,SAAS,EAAE,MAAM,EACzC,OAAAA,EAAO,MAAM,EACN,KAAK,IAAI,QAAQD,CAAI,EAAE,GAAGC,CAAM,CAC3C,CAEA,cAAcC,EAAS,CACnB,KAAK,UAAU,KAAKA,CAAO,CAC/B,CAEA,eAAeA,EAAS,CACpB,KAAK,UAAU,QAAQA,CAAO,CAClC,CACJ,EAEO,SAASC,EAASX,EAAQ,CAAC,EAAGY,EAAe,CAChD,GAAIA,EAAe,CACf,IAAIC,EAAMb,EACVA,EAAUY,EACVZ,EAAQ,IAAMA,CAClB,CACH,OAAO,IAAID,EAAeC,CAAO,CAClC,CAEA,SAASK,EAAWF,EAAKW,EAAU,CAC/B,IAAIR,EAAKH,EAAI,OAAO,QAAQ,uBAAuB,EACnD,GAAIG,GACA,QAASI,KAAWI,EAChB,GAAIR,EAAG,QAAQI,EAAQ,KAAK,EACxB,OAAIA,EAAQ,MAAMJ,EAAIH,CAAG,EACd,CACH,KAAQG,EAAG,QAAQ,cACnB,OAAQA,EACR,MAAQI,EAAQ,IAAIJ,CAAE,CAC1B,EAEG,KAInB,OAAO,IACX,CAEA,IAAML,EAAkB,CACpB,CACI,MAAO,wBACP,IAAK,SAASK,EAAI,CACd,GAAIA,EAAG,UAAU,UAAYA,EAAG,SAAU,CACtC,IAAIS,EAAS,CAAC,EACd,QAASC,KAAUV,EAAG,QACdU,EAAO,UACPD,EAAO,KAAKC,EAAO,KAAK,EAGhC,OAAOD,CACX,CACA,OAAOT,EAAG,QAAQ,aAAeA,EAAG,KACxC,EACA,MAAO,SAASA,EAAIH,EAAK,CACrB,OAAOA,EAAI,MAAM,UAAaG,EAAG,QAAQ,iBAAmBH,EAAI,MAAM,OAC1E,CACJ,EACA,CACI,MAAO,WACP,IAAK,SAASG,EAAI,CACd,OAAOA,EAAG,QAAQ,aAAeA,EAAG,MAAQA,EAAG,KACnD,EACA,MAAO,SAASA,EAAGH,EAAK,CACpB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,EACA,CACI,MAAO,OACP,IAAK,SAASG,EAAI,CACd,IAAIW,EAAO,CAAC,EACZ,QAASC,KAAS,MAAM,KAAKZ,EAAG,QAAQ,EAAG,CACvC,GAAIY,EAAM,SAAS,UACXA,EAAM,MAAM,YAAcA,EAAM,MAAM,UAEtC,CAACA,EAAM,QACP,OAGJD,EAAKC,EAAM,IAAI,GAAK,CAAC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,IACnDD,EAAKC,EAAM,IAAI,EAAI,CAACD,EAAKC,EAAM,IAAI,CAAC,GAEpC,MAAM,QAAQD,EAAKC,EAAM,IAAI,CAAC,EAC9BD,EAAKC,EAAM,IAAI,EAAE,KAAKA,EAAM,KAAK,EAEjCD,EAAKC,EAAM,IAAI,EAAIA,EAAM,KAEjC,CACA,OAAOD,CACX,EACA,MAAO,SAASX,EAAGH,EAAK,CACpB,OAAOA,EAAI,MAAM,QACrB,CACJ,EACA,CACC,MAAO,IACJ,IAAK,SAASG,EAAI,CACd,OAAOA,EAAG,QAAQ,WACtB,EACA,MAAO,SAASA,EAAIH,EAAK,CACrB,OAAOA,EAAI,MAAM,SAAWA,EAAI,SAAS,IAASA,EAAI,QAAQ,CAClE,CACJ,CACJ,ECzJO,SAASgB,EAAQC,EAASC,EACjC,CACC,GAAIA,EAAe,CAClB,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAME,CACf,CAEA,GAAIF,EAAQ,IAAK,CAChB,IAAMG,EAAc,CACnB,MAAMC,EAAQC,EAASC,EACvB,CACC,GAAI,CACH,IAAMC,EAASH,EAAO,GAAGE,CAAa,EACtC,OAAIC,aAAkB,SACrBP,EAAQ,IAAI,MAAM,KAAK,EAAI,EACpBO,EAAO,QAAQ,IAAM,CAC3BP,EAAQ,IAAI,MAAM,KAAK,GAAOI,CAAM,CACrC,CAAC,GAEKG,CACR,MAAa,CACb,CACD,CACD,EAEMC,EAAkB,CACvB,MAAMJ,EAAQC,EAASC,EACvB,CACC,GAAI,CACH,IAAMC,EAASH,EAAO,GAAGE,CAAa,EACtC,OAAIC,aAAkB,QACjBP,EAAQ,IAAI,MAAM,MACrBA,EAAQ,IAAI,MAAM,KAAK,GAAMI,CAAM,EAC5BG,EAAO,MAAME,GACZT,EAAQ,IAAI,MAAM,MAAMS,EAAKL,CAAM,CAC1C,EACA,QAAQ,IAAM,CACdJ,EAAQ,IAAI,MAAM,KAAK,GAAOI,CAAM,CACrC,CAAC,GAEMG,EAAO,MAAME,GACZT,EAAQ,IAAI,MAAM,MAAMS,EAAKL,CAAM,CAC1C,EAGIG,CACR,OAAQE,EAAK,CACZ,OAAOT,EAAQ,IAAI,MAAM,MAAMS,EAAKL,CAAM,CAC3C,CACD,CACD,EAEMM,EAAgB,CACrB,IAAIN,EAAQO,EACZ,CACC,GAAKP,EAAOO,CAAQ,EAGpB,OAAIX,EAAQ,IAAI,OAAO,MACf,IAAI,MAAMI,EAAOO,CAAQ,EAAE,KAAKX,EAAQ,GAAG,EAAGQ,CAAe,EAC1DR,EAAQ,IAAI,OAAO,KACtB,IAAI,MAAMI,EAAOO,CAAQ,EAAE,KAAKX,EAAQ,GAAG,EAAGG,CAAW,EAEzDC,EAAOO,CAAQ,EAAE,KAAKX,EAAQ,GAAG,CAE1C,CACD,EACA,OAAO,IAAI,MAAMA,EAAQ,QAASU,CAAa,CAChD,KACC,QAAOV,CAET,CCxEA,IAAMY,EAAM,OAAO,OAAO,CACzB,QAAS,IACT,QAAS,GACT,KAAS,IACT,IAAS,GACT,MAAS,EACV,CAAC,EAEKC,EAAN,KAAgB,CACf,YAAYC,EAAU,CAAC,EAAG,CACpBA,EAAQ,MACZA,EAAQ,IAAM,CAAC,GAEXA,EAAQ,IAAI,YAChBA,EAAQ,IAAI,UAAY,SAAS,MAElC,OAAO,OAAO,KAAMA,EAAQ,IAAI,EAEhC,IAAMC,EAAcC,GAAM,CAOzB,GANIA,EAAE,aAAeA,EAAE,UAAYJ,EAAI,SAGnCI,EAAE,kBAGF,CAACA,EAAE,OACH,OAGJ,IAAIC,EAAmB,UACnBD,EAAE,OAAO,QAAQ,wBAAwB,IACzCC,EAAmBD,EAAE,OAAO,QAAQ,wBAAwB,EACtD,QAAQ,gBAElB,IAAIE,EAAiB,CAAC,EAClBF,EAAE,SAAWA,EAAE,SAASJ,EAAI,SAC5BM,EAAe,KAAK,SAAS,EAE7BF,EAAE,SAAWA,EAAE,SAASJ,EAAI,MAC5BM,EAAe,KAAK,MAAM,EAE1BF,EAAE,QAAUA,EAAE,SAASJ,EAAI,KAC3BM,EAAe,KAAK,KAAK,EAEzBF,EAAE,UAAYA,EAAE,SAASJ,EAAI,OAC7BM,EAAe,KAAK,OAAO,EAE/BA,EAAe,KAAKF,EAAE,IAAI,YAAY,CAAC,EAEvC,IAAIG,EAAY,CAAC,EACbC,EAAkB,MAAM,OAAO,QAAQ,wBAAwB,EACnE,KAAOA,GACND,EAAU,KAAKC,EAAgB,QAAQ,cAAc,EACrDA,EAAkBA,EAAgB,WAAW,QAAQ,wBAAwB,EAE9ED,EAAU,KAAK,EAAE,EAEjB,IAAIE,EAAUC,EACVC,EAAa,CAAC,IAAI,GAAG,EAEzB,QAASC,KAAKL,EAAW,CACxBE,EAAWF,EAAUK,CAAC,EAClBH,GAAY,GACfC,EAAc,WAEdA,EAAcD,EACdA,GAAY,KAEb,QAASI,KAAaF,EAAY,CACjC,IAAIG,EAAYR,EAAe,KAAKO,CAAS,EAE7C,GAAI,KAAKH,CAAW,GAAM,OAAO,KAAKA,CAAW,EAAEI,CAAS,GAAG,YAE1D,CADY,KAAKJ,CAAW,EAAEI,CAAS,EAAE,KAAKZ,EAAQ,IAAKE,CAAC,EAChD,CACfA,EAAE,eAAe,EACjB,MACD,CAED,GAAI,OAAO,KAAKM,EAAcI,CAAS,GAAK,YAEvC,CADY,KAAKJ,EAAcI,CAAS,EAAE,KAAKZ,EAAQ,IAAKE,CAAC,EACjD,CACfA,EAAE,eAAe,EACjB,MACD,CAGD,GAAI,KAAKC,CAAgB,GAAK,KAAKA,CAAgB,EAAES,CAAS,EAAG,CAChE,IAAIC,EAAUb,EAAQ,IAAI,UAAU,iBAAiB,2BAClDO,EAAWK,EAAY,IAAI,EAC1BC,EAAQ,SACXA,EAAQ,QAAQC,GAAKA,EAAE,MAAM,CAAC,EAC9BZ,EAAE,eAAe,EAEnB,CAED,CACD,CACD,EAEAF,EAAQ,IAAI,UAAU,iBAAiB,UAAWC,CAAU,CAC7D,CAED,EAEO,SAASc,EAAKf,EAAQ,CAAC,EAAGgB,EAAe,CAC/C,GAAIA,EAAe,CAClB,IAAIC,EAAMjB,EACVA,EAAUgB,EACVhB,EAAQ,IAAMA,CACf,CACA,OAAO,IAAID,EAAUC,CAAO,CAC7B,CC/GO,SAASkB,EAAKC,EAASC,EAAe,CAC5C,GAAIA,EAAe,CAClB,IAAIC,EAAMF,EACVA,EAAUC,EACVD,EAAQ,IAAMA,CACf,CACA,GAAIA,EAAQ,IAAK,CAChBA,EAAQ,IAAI,KAAOA,EAAQ,MAAQ,CAAC,EAEpC,IAAMG,EAAO,IAAM,CAClB,IAAMC,EAAOJ,EAAQ,IAAI,KACnBK,EAAO,WAAW,OAAO,KAAK,YAAYL,EAAQ,IAAI,WAAa,SAAS,IAAI,EACtFA,EAAQ,IAAI,KAAO,WAAW,OAAO,YAAYK,CAAI,EACrD,OAAO,OAAOL,EAAQ,IAAI,KAAMI,CAAI,CACrC,EACA,OAAI,WAAW,QAAU,WAAW,OAAO,YAC1CD,EAAK,EAEL,SAAS,iBAAiB,wBAAyBA,CAAI,EAEjDH,EAAQ,IAAI,IACpB,KACC,QAAOA,EAAQ,IAEjB,CCxBO,SAASM,EAAKC,KAAYC,EAAQ,CAKvC,OAJoBA,EAAO,IACzB,CAACC,EAAOC,IACN,GAAGH,EAAQG,CAAK,CAAC,GAAGD,CAAK,EAC7B,EACmB,KAAK,EAAE,EAAIF,EAAQA,EAAQ,OAAS,CAAC,CAC1D,CAEO,SAASI,EAAIJ,KAAYC,EAAQ,CACvC,OAAOF,EAAKC,EAAS,GAAGC,CAAM,CAC/B,CCHA,IAAMI,EAAN,KACA,CAEC,YAAYC,EAAQ,CAAC,EACrB,CACC,KAAK,UAAYA,EAAQ,WAAa,SAAS,KAC3CA,EAAQ,YACXC,EAAgBD,EAASA,EAAQ,UAAU,EAE5C,QAASE,KAAOF,EACf,OAAOE,EAAK,CACX,IAAK,OACJ,QAAWC,KAAQH,EAAQ,KAAM,CAChC,IAAMI,EAAU,SAAS,cAAc,KAAK,EAC5CA,EAAQ,UAAYJ,EAAQ,KAAKG,CAAI,EACrC,IAAIE,EAAW,KAAK,UAAU,cAAc,YAAYF,CAAI,EACvDE,EAMJA,EAAS,QAAQ,gBAAgB,GAAGD,EAAQ,QAAQ,GALpDC,EAAW,SAAS,cAAc,UAAU,EAC5CA,EAAS,GAAGF,EACZE,EAAS,QAAQ,OAAO,GAAGD,EAAQ,QAAQ,EAC3C,KAAK,UAAU,YAAYC,CAAQ,EAIrC,CACD,MACA,IAAK,MACJ,QAAWF,KAAQH,EAAQ,IAAK,CAC/B,IAAIM,EAAQ,KAAK,UAAU,cAAc,SAASH,CAAI,EACjDG,IACJA,EAAQ,SAAS,cAAc,OAAO,EACtCA,EAAM,GAAGH,EACT,KAAK,UAAU,YAAYG,CAAK,GAEjCA,EAAM,UAAYN,EAAQ,IAAIG,CAAI,CACnC,CACD,MACA,IAAK,WACJ,KAAK,SAAWI,EAAS,CAAE,IAAK,KAAM,UAAW,KAAK,UAAW,SAAUP,EAAQ,QAAQ,CAAC,EAC5F,MACD,IAAK,OACL,IAAK,WACJ,KAAK,KAAOQ,EAAK,CAAE,IAAK,KAAM,KAAMR,EAAQ,IAAK,CAAC,EAClD,MACD,IAAK,OACL,IAAK,UACJ,KAAK,QAAUA,EAAQE,CAAG,EAC1B,MACD,IAAK,SACJ,KAAK,OAASO,EAAO,CAAE,IAAK,KAAM,OAAQT,EAAQ,MAAM,CAAC,EACzD,MACD,IAAK,UACJ,KAAK,QAAUU,EAAQ,CAAC,IAAK,KAAM,QAASV,EAAQ,OAAO,CAAC,EAC5D,KAAK,OAAS,SAASG,EAAM,CAC5B,QAAQ,KAAK,kCAAkC,EAC/C,IAAIQ,EAAS,MAAM,KAAK,SAAS,EAAE,MAAM,EACnC,OAAAA,EAAO,MAAM,EACN,KAAK,QAAQR,CAAI,EAAE,GAAGQ,CAAM,CACvC,EACH,MACD,IAAK,OACJ,KAAK,KAAOC,EAAK,CAAC,IAAK,KAAM,KAAMZ,EAAQ,IAAI,CAAC,EAChD,MACD,IAAK,QACJ,IAAMa,EAAgB,CACrB,IAAK,CAACC,EAAQC,IAAa,CAC1B,GAAKD,EAAOC,CAAQ,EAGpB,OAAI,OAAOD,EAAOC,CAAQ,GAAG,WACrB,IAAI,MAAMD,EAAOC,CAAQ,EAAGC,CAAe,EACxCF,EAAOC,CAAQ,GAAK,OAAOD,EAAOC,CAAQ,GAAG,SAChD,IAAI,MAAMD,EAAOC,CAAQ,EAAGF,CAAa,EAEzCC,EAAOC,CAAQ,CAExB,CACD,EACMC,EAAkB,CACvB,MAAO,CAACF,EAAQG,EAASC,IAEjBJ,EAAO,MAAM,KAAMI,CAAa,CAEzC,EACA,KAAKhB,CAAG,EAAI,IAAI,MAAMF,EAAQE,CAAG,EAAGW,CAAa,EACjD,MAQD,QACC,QAAQ,IAAI,8CAA8CX,EAAI,gBAAgB,EAC9E,KAAKA,CAAG,EAAIF,EAAQE,CAAG,EACvB,KACF,CAEF,CAEA,IAAI,KACJ,CACC,OAAO,IACR,CAEA,MAAM,OACN,CACC,GAAI,KAAK,WACR,QAAWC,KAAQ,KAAK,WACnB,KAAK,WAAWA,CAAI,EAAE,OAAO,OAChC,MAAM,KAAK,WAAWA,CAAI,EAAE,MAAM,MAAM,EAIvC,KAAK,OAAO,OACf,MAAM,KAAK,MAAM,MAAM,EAEpB,KAAK,SACJ,KAAK,SACR,KAAK,OAAO,KAAK,CAAE,QAAS,KAAK,OAAQ,CAAC,EAE3C,KAAK,OAAO,aAAa,EACzB,WAAW,WAAW,IAAM,CACvB,KAAK,OAAO,IAAI,WAAW,UAAU,IAAI,EAC5C,KAAK,OAAO,MAAM,WAAW,SAAS,IAAI,EAE1C,KAAK,OAAO,MAAM,WAAW,UAAU,SAAS,WAAW,UAAU,IAAI,CAE3E,CAAC,EAEH,CAED,EAEO,SAASgB,EAAInB,EAAQ,CAAC,EAC7B,CACC,OAAO,IAAID,EAAUC,CAAO,CAC7B,CAEK,WAAW,OACf,WAAW,KAAOoB,GAEd,WAAW,MACf,WAAW,IAAMC,GAGlB,SAASC,EAAatB,EAASuB,EAC/B,CACC,QAAWrB,KAAOqB,EACjB,OAAO,OAAOA,EAAarB,CAAG,EAAG,CAChC,IAAK,SACJ,GAAI,CAACqB,EAAarB,CAAG,EACpB,SAEIF,EAAQE,CAAG,EAIfoB,EAAatB,EAAQE,CAAG,EAAGqB,EAAarB,CAAG,CAAC,EAH5CF,EAAQE,CAAG,EAAIqB,EAAarB,CAAG,EAKhC,MACD,QACCF,EAAQE,CAAG,EAAIqB,EAAarB,CAAG,CACjC,CAEF,CAEA,SAASD,EAAgBD,EAASwB,EAAY,CAC7C,QAAWrB,KAAQqB,EAAY,CAC9B,IAAMC,EAAYD,EAAWrB,CAAI,EAC7BsB,EAAU,YACbxB,EAAgBD,EAASyB,EAAU,UAAU,EAE9CzB,EAAQ,WAAWG,CAAI,EAAIsB,EAC3B,QAAWvB,KAAOuB,EACjB,OAAOvB,EAAK,CACX,IAAK,QAEL,IAAK,aAEJ,MACD,QACMF,EAAQE,CAAG,IACfF,EAAQE,CAAG,EAAI,OAAO,OAAO,IAAI,GAElCoB,EAAatB,EAAQE,CAAG,EAAGuB,EAAUvB,CAAG,CAAC,EACzC,KACF,CAEF,CACD",
6
+ "names": ["routes", "options", "optionsCompat", "app", "SimplyRoute", "parseRoutes", "path", "args", "matches", "getPath", "route", "getURL", "params", "key", "i", "searchParams", "action", "routeRe", "getRegexpFromRoute", "result", "callback", "evt", "link", "check", "listener", "baseURL", "exact", "routeInfo", "paths", "matchParams", "SimplyCommands", "options", "defaultHandlers", "commandHandler", "evt", "command", "getCommand", "el", "value", "name", "params", "handler", "commands", "optionsCompat", "app", "handlers", "values", "option", "data", "input", "actions", "options", "optionsCompat", "app", "waitHandler", "target", "thisArg", "argumentsList", "result", "functionHandler", "err", "actionHandler", "property", "KEY", "SimplyKey", "options", "keyHandler", "e", "selectedKeyboard", "keyCombination", "keyboards", "keyboardElement", "keyboard", "subkeyboard", "separators", "i", "separator", "keyString", "targets", "t", "keys", "optionsCompat", "app", "view", "options", "optionsCompat", "app", "load", "data", "path", "html", "strings", "values", "value", "index", "css", "SimplyApp", "options", "mergeComponents", "key", "name", "element", "template", "style", "commands", "keys", "routes", "actions", "params", "view", "moduleHandler", "target", "property", "functionHandler", "thisArg", "argumentsList", "app", "html", "css", "mergeOptions", "otherOptions", "components", "component"]
7
7
  }