radi
Version:
**Radi** is a tiny javascript framework.
3 lines • 26.9 kB
JavaScript
var GLOBALS={HEADLESS_COMPONENTS:{},FROZEN_STATE:!1,VERSION:'0.4.2',ACTIVE_COMPONENTS:{},CUSTOM_ATTRIBUTES:{},CUSTOM_TAGS:{}},flatten=function e(t){return t.reduce((t,r)=>t.concat(Array.isArray(r)?e(r):r),[])},generateId=()=>{var e='';for(var t=0;t<32;t++){var r=Math.random()*16|0;(t===8||t===12||t===16||t===20)&&(e+='-');e+=(t===12?4:t===16?r&3|8:r).toString(16)}return e},PrivateStore=function(){this.store={}};PrivateStore.prototype.addListener=function(e,t,r){typeof this.store[e]==='undefined'&&this.createItemWrapper(e);this.store[e].listeners[r]=(this.store[e].listeners[r]||[]).filter(e=>e.attached);this.store[e].listeners[r].push(t);return t};PrivateStore.prototype.removeListeners=function(){var e=Object.keys(this.store);for(var t=0;t<e.length;t++)this.store[e[t]].listeners={},this.store[e[t]].value=null};PrivateStore.prototype.setState=function(e){for(var t of Object.keys(e))typeof this.store[t]==='undefined'&&this.createItemWrapper(t),this.store[t].value=e[t],this.triggerListeners(t);return e};PrivateStore.prototype.createItemWrapper=function(e){return this.store[e]={listeners:{},value:null}};PrivateStore.prototype.triggerListeners=function(e){var t=this.store[e];if(t){var r=Object.keys(t.listeners).sort().map(e=>(t.listeners[e].map(e=>e)));for(var n=0;n<r.length;n++){for(var o=r[n].length-1;o>=0;o--)r[n][o].attached&&r[n][o].handleUpdate(t.value)}}};var clone=e=>{if(typeof e!=='object'){return e}if(e===null){return e}if(Array.isArray(e)){return e.map(clone)}var t={};for(var r in e)e.hasOwnProperty(r)&&(t[r]=clone(e[r]));return t},skipInProductionAndTest=e=>{if(typeof process==='undefined'||(process.env.NODE_ENV==='production'||process.env.NODE_ENV==='test')){return!1}return e&&e()},Listener=function(e,...t){var r;this.component=e;(r=t, this.key=r[0]);this.path=t.slice(1,t.length);this.depth=0;this.attached=!0;this.processValue=e=>e;this.changeListener=()=>{};this.addedListeners=[]};Listener.prototype.init=function(){this.value=this.getValue(this.component.state[this.key]);this.component.addListener(this.key,this,this.depth);this.handleUpdate(this.component.state[this.key]);return this};Listener.prototype.unlink=function(){this.value instanceof Node||this.value instanceof Listener&&this.value.deattach()};Listener.prototype.clone=function(e,t){var r={};for(var n in e)r[n]=e[n];for(var o in t)r[o]=t[o];return r};Listener.prototype.setPartialState=function(e,t,r){var n={};if(e.length){n[e[0]]=e.length>1?this.setPartialState(e.slice(1),t,r[e[0]]):t;return this.clone(r,n)}return t};Listener.prototype.updateValue=function(e){var t=this.component.state[this.key];return this.component.setState({[this.key]:this.setPartialState(this.path,e,t)})};Listener.prototype.extractListeners=function(e){if(e instanceof Listener){var t={depth:e.depth,attached:!0,processValue:e=>e,handleUpdate:()=>{this.component&&this.handleUpdate(this.getValue(this.component.state[this.key])),t.attached=!1},changeListener:()=>{}};this.addedListeners.push(t);e.component.addListener(e.key,t,e.depth);var r=e.processValue(e.getValue(e.component.state[e.key]));e.deattach();return this.extractListeners(r)}return e};Listener.prototype.handleUpdate=function(e){var t=this.processValue(this.getValue(e));if(t instanceof Listener){for(var r=0;r<this.addedListeners.length;r++)this.addedListeners[r].attached=!1;this.addedListeners=[];this.value=this.extractListeners(t);this.changeListener(this.value)}else this.unlink(),this.value=t,this.changeListener(this.value)};Listener.prototype.getValue=function(e){var t=0;while(t<this.path.length)e===null||!e[this.path[t]]&&typeof e[this.path[t]]!=='number'?(e=null):(e=e[this.path[t]]),t+=1;return e};Listener.prototype.applyDepth=function(e){this.depth=e;return this};Listener.prototype.onValueChange=function(e){this.changeListener=e;this.changeListener(this.value)};Listener.prototype.process=function(e){this.processValue=e;return this};Listener.prototype.deattach=function(){this.component=null;this.attached=!1;this.key=null;this.childPath=null;this.path=null;this.unlink();this.value=null;this.changeListener=()=>{};this.processValue=()=>{}};var onMountEvent=document.createEvent('Event');onMountEvent.initEvent('mount',!0,!0);var onLoadEvent=document.createEvent('Event');onLoadEvent.initEvent('load',!0,!0);var append=(e,t,r)=>{typeof e.dispatchEvent==='function'&&e.dispatchEvent(onLoadEvent);if(r&&t){t.parentNode&&(t.parentNode.insertBefore(e,t),typeof e.dispatchEvent==='function'&&e.dispatchEvent(onMountEvent));return e}t.appendChild(e);typeof e.dispatchEvent==='function'&&e.dispatchEvent(onMountEvent);return e},getLast=e=>{if(e.$redirect&&e.$redirect[e.$redirect.length-1]){return getLast(e.$redirect[e.$redirect.length-1])}return e},mountChildren=(e,t,r)=>{r===void 0&&(r=0);if(!e){return}e.$redirect&&e.$redirect.length>0?mountChildren(getLast(e),t,r+1):e.children&&e.children.length>0&&(e.html&&e.html.length===1?mount(e.children,e.html[0],e.html[0].nodeType!==1,e.$isSvg,e.$depth):mount(e.children,e.$pointer,!0,e.$isSvg,e.$depth))},textNode=e=>(document.createTextNode((typeof e==='object'?JSON.stringify(e):e))),mount=(e,t,r,n,o)=>{r===void 0&&(r=!1);n===void 0&&(n=!1);o===void 0&&(o=0);t=typeof t==='string'?document.getElementById(t):t;var i=flatten([e]).map(filterNode),u=function(e){var u=i[e];u instanceof Node?append(u,t,r):u&&typeof u.render==='function'&&(u.$pointer=textNode(''),append(u.$pointer,t,r),i[e].render(e=>{if(u.$pointer===!1){return!1}for(var n=0;n<e.length;n++)u.$pointer?append(e[n],u.$pointer,!0):append(e[n],t,r);mountChildren(u,u.$isSvg,o+1)},u,o,n))};for(var s=0;s<i.length;s++)u(s);return i},getElementFromQuery=(e,t)=>{if(typeof e==='string'||typeof e==='number'){return e!=='template'?t||e==='svg'?document.createElementNS("http://www.w3.org/2000/svg",e):document.createElement(e):document.createDocumentFragment()}console.warn('[Radi.js] Warn: Creating a JSX element whose query is not of type string, automatically converting query to string.');return document.createElement(e.toString())},explode=(e,t,r,n,o)=>{n===void 0&&(n=0);var i=flatten([e]).map(filterNode);for(var u=0;u<i.length;u++)(i[u] instanceof Structure||i[u].isStructure)&&!i[u].html&&(t.children.length<=0&&(t.$redirect?t.$redirect.push(i[u]):(t.$redirect=[i[u]])),!t.$redirect&&i[u].children&&(t.children=t.children.concat(i[u].children)),typeof i[u].render==='function'&&i[u].render(e=>{r(e)},i[u],n+1,o));return},parseValue=e=>typeof e==='number'&&!Number.isNaN(e)?`${e}px`:e,setStyles=(e,t,r)=>{t===void 0&&(t={});r===void 0&&(r={});if(!e.html||!e.html[0]){return t}var n=e.html[0];if(t instanceof Listener){if(typeof e.$styleListeners.general!=='undefined'){return n.style}e.$styleListeners.general=t;e.$styleListeners.general.applyDepth(e.depth).init();e.$styleListeners.general.onValueChange(t=>{setStyles(e,t,{})});return n.style}if(typeof t==='string'){n.style=t;return n.style}var o=Object.keys(r).filter(e=>typeof t[e]==='undefined'),i=function(o){if(t.hasOwnProperty(o)){if(typeof r!=='undefined'&&r[o]===t[o]){return}if(!t[o]&&typeof t[o]!=='number'){n.style[o]=null;return}if(t[o] instanceof Listener){if(typeof e.$styleListeners[o]!=='undefined'){return}e.$styleListeners[o]=t[o];e.$styleListeners[o].applyDepth(e.depth).init();e.$styleListeners[o].onValueChange(t=>{setStyles(e,{[o]:t},{})});t[o]=e.$styleListeners[o].value;return}n.style[o]=parseValue(t[o])}};for(var u in t)i(u);for(var s=0;s<o.length;s++)n.style[o[s]]=null;return n.style},parseClass=e=>{if(Array.isArray(e)){return e.filter(e=>e).join(' ')}return e},setAttributes=(e,t,r)=>{t===void 0&&(t={});r===void 0&&(r={});var n=t||{},o=r||{};if(!e.html||!e.html[0]){return e}var i=e.html[0];if(!(i instanceof Node&&i.nodeType!==3)){return e}var u=Object.keys(o).filter(e=>typeof n[e]==='undefined'),s=function(t){if(n.hasOwnProperty(t)){if(typeof o!=='undefined'&&o[t]===n[t]){return}t==='checked'&&(i.checked=n[t]);if(!n[t]&&typeof n[t]!=='number'&&typeof n[t]!=='string'){i.removeAttribute(t);return}if(n[t] instanceof Listener){if(typeof e.$attrListeners[t]!=='undefined'){return}e.$attrListeners[t]=n[t];n[t].applyDepth(e.depth).init();(t.toLowerCase()==='model'||t.toLowerCase()==='checked')&&(i.getAttribute('type')==='radio'?(i.addEventListener('input',r=>{e.$attrListeners[t].updateValue(r.target.checked&&r.target.value||r.target.checked)},!1),e.$attrListeners[t].onValueChange(t=>{setAttributes(e,{checked:i.value===t&&Boolean(t)},{})})):i.getAttribute('type')==='checkbox'?(i.addEventListener('input',r=>{e.$attrListeners[t].updateValue(Boolean(r.target.checked))},!1),e.$attrListeners[t].onValueChange(t=>{setAttributes(e,{checked:Boolean(t)},{})})):i.addEventListener('input',r=>{e.$attrListeners[t].updateValue(r.target.value)},!1));/(checkbox|radio)/.test(i.getAttribute('type'))||e.$attrListeners[t].onValueChange(r=>{setAttributes(e,{[t]:r},{})});n[t]=e.$attrListeners[t].value;return}(t==='value'||t==='model')&&(i.value=n[t]);if(typeof GLOBALS.CUSTOM_ATTRIBUTES[t]!=='undefined'){var r=GLOBALS.CUSTOM_ATTRIBUTES[t],u=r.allowedTags;if(!u||u&&u.length>0&&u.indexOf(i.localName)>=0){typeof GLOBALS.CUSTOM_ATTRIBUTES[t].caller==='function'&&GLOBALS.CUSTOM_ATTRIBUTES[t].caller(i,n[t]);if(!GLOBALS.CUSTOM_ATTRIBUTES[t].addToElement){return}}}if(t.toLowerCase()==='style'){typeof n[t]==='object'?setStyles(e,n[t],o&&o.style||{}):(i.style=n[t]);return}if(t.toLowerCase()==='class'||t.toLowerCase()==='classname'){i.setAttribute('class',parseClass(n[t]));return}if(t.toLowerCase()==='loadfocus'){i.addEventListener('mount',()=>{i.focus()},!1);return}if(t.toLowerCase()==='html'){i.innerHTML=n[t];return}if(t.substring(0,2).toLowerCase()==='on'&&typeof n[t]==='function'){var s=n[t];t.substring(0,8).toLowerCase()==='onsubmit'?(i[t]=t=>{n.prevent&&t.preventDefault();var r=[],o=t.target.elements||[];for(var i of o){if(i.name!==''&&(i.type!=='radio'&&i.type!=='checkbox')||i.checked){var u={name:i.name,el:i,type:i.type,default:i.defaultValue,value:i.value,set(t){e&&e.el&&e.el.value&&(e.el.value=t)},reset(t){e&&e.el&&e.el.value&&(e.el.value=t,e.el.defaultValue=t)}};r.push(u);r[u.name]||Object.defineProperty(r,u.name,{value:u})}}return s(t,r)}):(i[t]=(e,...t)=>s(e,...t));return}i.setAttribute(t,n[t])}};for(var a in n)s(a);for(var l=0;l<u.length;l++)i.removeAttribute(u[l]);e.props=n;return e},Structure=function(e,t,r,n){t===void 0&&(t={});n===void 0&&(n=0);this.query=e;this.props=Boolean!==t?t:{};isComponent(e)||e instanceof Component?(this.$compChildren=flatten(r||[]).map(filterNode),this.children=[]):(this.children=flatten(r||[]).map(filterNode),this.$compChildren=[]);this.html=null;this.$attrListeners=[];this.$styleListeners=[];this.$pointer=null;this.$component=null;this.$listener=null;this.$redirect=null;this.$destroyed=!1;this.$isSvg=e==='svg';this.$depth=n};Structure.prototype.mount=function(){this.$destroyed=!1;this.$component instanceof Component&&this.$component.mount();typeof this.onMount==='function'&&this.onMount()};Structure.prototype.destroy=function(e){e===void 0&&(e=!0);if(this.$destroyed){return!1}for(var t in this.$styleListeners)this.$styleListeners[t]&&typeof this.$styleListeners[t].deattach==='function'&&this.$styleListeners[t].deattach();for(var r in this.$attrListeners)this.$attrListeners[r]&&typeof this.$attrListeners[r].deattach==='function'&&this.$attrListeners[r].deattach();if(this.$redirect){for(var n=0;n<this.$redirect.length;n++)typeof this.$redirect[n].destroy==='function'&&this.$redirect[n].destroy()}if(e&&this.children){for(var o=0;o<this.children.length;o++)typeof this.children[o].destroy==='function'&&this.children[o].destroy()}if(this.html){var i=this.html,u=function(e){if(i[e].parentNode){var t=()=>i[e].parentNode.removeChild(i[e]);typeof i[e].beforedestroy==='function'?i[e].beforedestroy(t):t()}};for(var s=0;s<this.html.length;s++)u(s)}this.$component instanceof Component&&this.$component.destroy();this.$listener instanceof Listener&&this.$listener.deattach();this.$pointer&&this.$pointer.parentNode&&this.$pointer.parentNode.removeChild(this.$pointer);typeof this.onDestroy==='function'&&this.onDestroy();this.$pointer=null;this.$redirect=null;this.$component=null;this.render=()=>{};this.html=null;this.$destroyed=!0;return!0};Structure.prototype.render=function(e,t,r,n){r===void 0&&(r=0);n===void 0&&(n=!1);this.$depth=Math.max(this.$depth,r);this.$isSvg=n||t&&t.$isSvg||this.query==='svg';if(this.query==='#text'){this.html=[textNode(this.props)];return e(this.html)}if(typeof this.query==='string'||typeof this.query==='number'){this.html=[getElementFromQuery(this.query,this.$isSvg)];setAttributes(this,this.props,{});return e(this.html)}if(this.query instanceof Listener){this.$listener||(this.$listener=this.query.applyDepth(this.$depth).init(),this.mount());return this.query.onValueChange(r=>{if(this.html){var n=this.html[0];this.$pointer?(this.$redirect=patch(this.$redirect,r,this.$pointer,!0,this.$isSvg,this.$depth+1)):(this.$redirect=patch(this.$redirect,r,n,!0,this.$isSvg,this.$depth+1))}else explode(r,t||this,t=>{this.html=t,e(t)},this.$depth+1,this.$isSvg)})}if(this.query instanceof Promise||this.query.constructor.name==='LazyPromise'){return this.query.then(r=>{var n=r.default||r;explode(n,t||this,t=>{this.html=t,e(t)},this.$depth,this.$isSvg)})}if(this.query instanceof Component&&typeof this.query.render==='function'){this.$component=this.query;return explode(this.$component.render(),t||this,t=>{this.html=t,e(t),this.mount()},this.$depth,this.$isSvg)}if(isComponent(this.query)){this.$component||(this.$component=new this.query(this.$compChildren).setProps(this.props));typeof this.$component.render==='function'&&(explode(this.$component.render(),t||this,t=>{this.html=t,e(t)},this.$depth,this.$isSvg),this.mount());return null}if(typeof this.query==='function'){return explode(this.query(this.props),t||this,t=>{this.html=t,e(t)},this.$depth,this.$isSvg)}return e(textNode(this.query))};Structure.prototype.isStructure=function(){return!0};var patch=(e,t,r,n,o,i)=>{n===void 0&&(n=!1);o===void 0&&(o=!1);i===void 0&&(i=0);var u=flatten([e]),s=flatten([t]).map(filterNode),a=Math.max(u.length,s.length),l=function(e){if(typeof u[e]==='undefined'){mount(s[e],r,n,o,i);return}if(typeof s[e]==='undefined'){typeof u[e].destroy==='function'&&u[e].destroy();return}s[e].$depth=i;if((u[e] instanceof Structure||u[e].isStructure)&&(s[e] instanceof Structure||s[e].isStructure)&&u[e]!==s[e]){if(u[e].html&&u[e].query==='#text'&&s[e].query==='#text'){for(var t=0;t<u[e].html.length;t++)u[e].props!==s[e].props&&(u[e].html[t].textContent=u[e].props=s[e].props);s[e].html=u[e].html;u[e].html=null;u[e].$pointer&&(s[e].$pointer&&s[e].$pointer.parentNode&&s[e].$pointer.parentNode.removeChild(s[e].$pointer),s[e].$pointer=u[e].$pointer,u[e].$pointer=null);u[e].destroy();return}if(u[e].html&&typeof u[e].query==='string'&&typeof s[e].query==='string'&&u[e].query===s[e].query){s[e].html=u[e].html;u[e].html=null;u[e].$pointer&&(s[e].$pointer&&s[e].$pointer.parentNode&&s[e].$pointer.parentNode.removeChild(s[e].$pointer),s[e].$pointer=u[e].$pointer,u[e].$pointer=null);setAttributes(s[e],s[e].props,u[e].props);s[e].html[0]&&s[e].children&&s[e].children.length>0&&(s[e].children=patch(u[e].children,s[e].children,s[e].html[0],!1,s[e].$isSvg,s[e].$depth+1));u[e].destroy();return}var a=u[e],l=s[e];l.$pointer=textNode('');append(l.$pointer,r,n);l.render(t=>{a.$pointer&&(l.$pointer&&l.$pointer.parentNode&&l.$pointer.parentNode.removeChild(l.$pointer),l.$pointer=a.$pointer,a.$pointer=null);for(var r=0;r<t.length;r++)a.html&&!a.html[e]||!a.html?append(t[r],l.$pointer,!0):append(t[r],a.html[e],!0);mountChildren(l,o,i+1);a.destroy(!1)},l,i,o)}};for(var p=0;p<a;p++)l(p);return s},capitalise=e=>e.charAt(0).toUpperCase()+e.substr(1),Component=function(e,t){this.addNonEnumerableProperties({$id:generateId(),$name:this.constructor.name,$config:typeof this.config==='function'?this.config():{listen:!0},__$events:{},__$privateStore:new PrivateStore});if(typeof this.on!=='function'||typeof this.on==='function'&&typeof this.on()==='object'){throw new Error('[Radi.js] Using `on.eventName()` is deprecated. Please use `onEventName()`.')}this.children=[];for(var r in GLOBALS.HEADLESS_COMPONENTS)this[r]&&typeof this[r].on==='function'&&this[r].on('update',()=>this.setState());this.state=typeof this.state==='function'?this.state():(this.state||{});skipInProductionAndTest(()=>Object.freeze(this.state));e&&this.setChildren(e);t&&this.setProps(t)};Component.prototype.render=function(){if(typeof this.view!=='function'){return null}return this.html=this.view()};Component.prototype.setProps=function(e){var t={},r=this,n=function(n){typeof e[n]==='function'&&n.substr(0,2)==='on'?r.on(n.substring(2,n.length),e[n]):e[n] instanceof Listener?(t[n]=e[n].init().value,e[n].changeListener=(e=>{r.setState({[n]:e})})):(t[n]=e[n])};for(var o in e)n(o);this.setState(t);return this};Component.prototype.setChildren=function(e){this.children=e;this.setState();for(var t=0;t<this.children.length;t++)typeof this.children[t].on==='function'&&this.children[t].on('update',()=>this.setState());return this};Component.prototype.addNonEnumerableProperties=function(e){for(var t in e){if(typeof this[t]!=='undefined'){continue}Object.defineProperty(this,t,{value:e[t]})}};Component.prototype.addListener=function(e,t,r){this.__$privateStore.addListener(e,t,r)};Component.prototype.mount=function(){this.trigger('mount')};Component.prototype.destroy=function(){this.html=null;this.trigger('destroy');this.__$privateStore.removeListeners()};Component.prototype.when=function(){throw new Error('[Radi.js] Using `.when(\'Event\')` is deprecated. Use `.on(\'Event\')` instead.')};Component.prototype.on=function(e,t){typeof this.__$events[e]==='undefined'&&(this.__$events[e]=[]);this.__$events[e].push(t);return t};Component.prototype.trigger=function(e,...t){var r=this[`on${capitalise(e)}`];typeof r==='function'&&r.call(this,...t);if(typeof this.__$events[e]!=='undefined'){for(var n in this.__$events[e])this.__$events[e][n].call(this,...t)}};Component.prototype.setState=function(e,t){if(typeof e==='object'){var r=this.state;skipInProductionAndTest(()=>r=clone(this.state));this.state=Object.assign(r,e);skipInProductionAndTest(()=>Object.freeze(this.state));this.$config.listen&&this.__$privateStore.setState(e)}!this.$config.listen&&typeof this.view==='function'&&this.html&&(this.html=patch(this.html,this.view()));typeof t==='string'&&typeof this[t]==='function'&&this.trigger(`after${capitalise(t)}`,e);this.trigger('update');return e};Component.isComponent=function(){return!0};var isComponent=e=>{if(e){if(e.prototype instanceof Component){return!0}if(e.isComponent){return!0}}return!1},filterNode=e=>{if(Array.isArray(e)){return e.map(filterNode)}if(typeof e==='string'||typeof e==='number'){return r('#text',e)}if(!e||typeof e==='boolean'){return r('#text','')}if(e instanceof Listener){return r(e)}if(isComponent(e)||e instanceof Component){return r(e)}if(typeof e==='function'){return r(e)}if(e instanceof Promise||e.constructor.name==='LazyPromise'){return r(e)}return e},r=(e,t,...r)=>{if(typeof GLOBALS.CUSTOM_TAGS[e]!=='undefined'){return GLOBALS.CUSTOM_TAGS[e].onmount(t||{},r&&flatten([r]).map(filterNode)||[],filterNode,t=>GLOBALS.CUSTOM_TAGS[e].saved=t)||null}if(e==='await'){var n=null;t.src&&t.src instanceof Promise&&t.src.then(e=>{var r=filterNode(typeof t.transform==='function'?t.transform(e):e);n?(n=patch(n,r,n.html[0].parentNode)):(n=r)}).catch(e=>{var r=filterNode(typeof t.error==='function'?t.error(e):t.error);n?(n=patch(n,r,n.html[0].parentNode)):(n=r)});n||(n=filterNode(t.placeholder));return n}if(e==='template'){return new Structure('section',t,flatten([r]).map(filterNode))}return new Structure(e,t,flatten([r]).map(filterNode))},listen=(e,...t)=>new Listener(e,...t),headless=(e,t)=>{var r='$'.concat(e),n=new t;n.mount();Component.prototype[r]=n;return GLOBALS.HEADLESS_COMPONENTS[r]=n},action=(e,t,r)=>{var n=r.value;return{configurable:!0,value(...e){return this.setState.call(this,n.call(this,...e),t)}}},createWorker=e=>{var t=()=>{},r=new window.Blob([`self.onmessage = function(e) {
self.postMessage((${e.toString()})(e.data));
}`],{type:'text/javascript'}),n=window.URL.createObjectURL(r),o=new window.Worker(n);o.onmessage=e=>{t(e.data,null)};o.onerror=e=>{t(null,e.data)};return e=>new Promise((r,n)=>{t=(e,t)=>!t?r(e):n(e),o.postMessage(e)})},worker=(e,t,r)=>{var n=r.value,o=createWorker(n);r.value=function(...e){o(...e).then(e=>{this.setState.call(this,e)})};return r},subscribe=(e,t)=>(r,n,o)=>{var i=o.value,u=()=>{};if(typeof i!=='function'){throw new Error(` decorator can only be applied to methods not: ${typeof i}`)}var s=!1;e[t]=(...e)=>u(...e);return{configurable:!0,get(){if(s||this===r.prototype||this.hasOwnProperty(n)||typeof i!=='function'){return i}u=i.bind(this);s=!0;Object.defineProperty(this,n,{configurable:!0,get(){return u},set(e){i=e;delete this[n]}});s=!1;return u},set(e){i=e}}},customTag=(e,t,r)=>GLOBALS.CUSTOM_TAGS[e]={name:e,onmount:t||(()=>{}),ondestroy:r||(()=>{}),saved:null},customAttribute=(e,t,r)=>{r===void 0&&(r={});var n=r.allowedTags,o=r.addToElement;return GLOBALS.CUSTOM_ATTRIBUTES[e]={name:e,caller:t,allowedTags:n||null,addToElement:o}},remountActiveComponents=()=>{Object.values(GLOBALS.ACTIVE_COMPONENTS).forEach(e=>{typeof e.onMount==='function'&&e.onMount(e)})},animate=(e,t,r,n)=>{var o=r[t];if(typeof o!=='function'){console.warn(`[Radi.js] Animation \`${t}\` for node \`${e.nodeName.toLowerCase}\` should be function`);return}return o(e,n)};customAttribute('animation',(e,t)=>{animate(e,'in',t,()=>{}),e.beforedestroy=r=>animate(e,'out',t,r)});var Modal=(function(e){function t(){e.apply(this,arguments)}e&&(t.__proto__=e);t.prototype=Object.create(e&&e.prototype);t.prototype.constructor=t;t.prototype.state=function(){return{registry:{}}};t.prototype.register=function(e,t){if(typeof this.state.registry[e]!=='undefined'){console.warn(`[Radi.js] Warn: Modal with name "${e}" is already registerd!`);return}this.setState({registry:Object.assign({},this.state.registry,{[e]:{status:!1,element:t}})},'register')};t.prototype.exists=function(e){if(typeof this.state.registry[e]==='undefined'){console.warn(`[Radi.js] Warn: Modal with name "${e}" is not registerd!`);return!1}return!0};t.prototype.open=function(e){if(!this.exists(e)||this.state.registry[e].status){return}return this.setState({registry:Object.assign({},this.state.registry,{[e]:{status:!0,element:this.state.registry[e].element}})},'open')};t.prototype.close=function(e){if(!this.exists(e)||!this.state.registry[e].status){return}return this.setState({registry:Object.assign({},this.state.registry,{[e]:{status:!1,element:this.state.registry[e].element}})},'close')};t.prototype.closeAll=function(){var e=Object.keys(this.state.registry),t=e.reduce((e,t)=>Object.assign(e,{[t]:{status:!1,element:this.state.registry[t].element}}),{});return this.setState({registry:t},'closeAll')};return t}(Component)),$modal=headless('modal',Modal);customTag('modal',(e,t,n)=>{var o=e.name||'default';$modal.register(o,null);typeof e.name==='undefined'&&console.warn('[Radi.js] Warn: Every <modal> tag needs to have `name` attribute!');var i=mount(listen($modal,'registry',o).process(e=>e.status&&r('div',{class:'radi-modal',name:o},r('div',{class:'radi-modal-backdrop',onclick:()=>$modal.close(o)}),r('div',{class:'radi-modal-content'},...(t.slice())))),document.body),u=n(null);u.onDestroy=()=>{for(var e=0;e<i.length;e++)typeof i[e].destroy==='function'&&i[e].destroy()};return u},()=>{});var extract=e=>{var t={},r=e.elements||[];for(var n of r)(n.name!==''&&(n.type!=='radio'&&n.type!=='checkbox')||n.checked)&&(t[n.name]=n.value);return t},findButton=e=>{var t=null;for(var r of e)r.submitButton&&(t=r);return t};function validate(e){var t=(function(e){function t(){e.apply(this,arguments)}e&&(t.__proto__=e);t.prototype=Object.create(e&&e.prototype);t.prototype.constructor=t;t.prototype.state=function(){return{}};t.prototype.add=function(e,t){var r=this.setState({[e]:t});this.trigger('update:'+e,t);return r};t.prototype.remove=function(e){return this.add(e,[])};return t}(e.Component)),r=e.headless('errors',t);e.customTag('errors',(t,n,o,i)=>{var u=o(null);r.on('update:'+t.name,r=>{var n;!r||r.length<=0?(n=o(null)):(n=o(t.onrender(r||[])));u=e.patch(u,n,u.html[0].parentNode)[0]});return u},()=>{});e.customAttribute('error',(e,t)=>{e.onerror=e=>r.add(t,e),e.onvalid=()=>r.remove(t)},{allowedTags:['form'],addToElement:!1});e.customAttribute('validate-submit',(e,t)=>{e.submitButton=!0},{allowedTags:['button']});e.customAttribute('validate',(e,t)=>{var r=e.form,n=null,o=t=>{r||(r=e.form);if(r&&typeof r.onvalidate==='function'){n=findButton(r.elements);var o=extract(r),i=r.onvalidate(r),u=r.touched||[];if(i){if(typeof i==='object'){var s=[];for(var a in i){if(i.hasOwnProperty(a)){if(typeof i[a]==='function'){var l=i[a](o[a]);typeof l==='string'&&u.indexOf(a)<0?s.push({field:a,reason:null}):typeof l==='string'&&s.push({field:a,reason:l||null})}}}if(s.length>0){n&&(n.disabled=!0);typeof r.onerror==='function'&&r.onerror(s.filter(e=>e.reason));return}}n&&(n.disabled=!1);r&&typeof r.onvalid==='function'&&r.onvalid();return}}n&&(n.disabled=!0);r&&typeof r.onerror==='function'&&r.onerror(null);return};e.addEventListener('change',t=>{if(r){var n=e.name;typeof r.touched==='undefined'&&(r.touched=[]);r.touched.indexOf(n)<0&&(r.touched.push(e.name),o(t))}});e.addEventListener('input',o);return!0},{allowedTags:['input','textarea','select']})}var Validator=function(e){this.value=e;this.rules=[]};Validator.prototype.register=function(e){var t=e.type,r=e.validate,n=e.error,o=this.rules.push({type:t,validate:e=>e&&r(e),error:n||'Invalid field'});this.error=e=>{this.rules[o-1].error=e||n;return this};return this};Validator.prototype.check=function(e){typeof e!=='undefined'&&(this.value=e);return this.rules.reduce((e,t)=>typeof e==='string'?e:!t.validate(this.value)&&t.error||e,!0)};Validator.prototype.required=function(){return this.register({type:'required',validate:e=>e!=='',error:'Field is required'})};Validator.prototype.min=function(e){return this.register({type:'min',validate:t=>t.length>=e,error:'Min char length is '+e})};Validator.prototype.max=function(e){return this.register({type:'max',validate:t=>t.length<e,error:'Max char length is '+e})};Validator.prototype.email=function(){return this.register({type:'email',validate:e=>/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(e),error:'Email is not valid'})};var Radi={version:GLOBALS.VERSION,activeComponents:GLOBALS.ACTIVE_COMPONENTS,r,listen,l:listen,worker,Component,component:Component,action,subscribe,customTag,customAttribute,headless,update:patch,patch,mount,freeze:()=>{GLOBALS.FROZEN_STATE=!0},unfreeze:()=>{GLOBALS.FROZEN_STATE=!1,remountActiveComponents()},Validator};Radi.plugin=(e,...t)=>e(Radi,...t);Radi.plugin(validate);window&&(window.Radi=Radi);export default Radi