diff --git a/sigpro2.js b/sigpro2.js index 6687d13..e420017 100644 --- a/sigpro2.js +++ b/sigpro2.js @@ -342,19 +342,31 @@ const If = (cond, ifYes, ifNot = null, trans = null) => { const root = Tag("div", { style: "display:contents" }, [anchor]) let currentView = null let last = null + let exitPromise = null + Watch( () => !!(isFunc(cond) ? cond() : cond), show => { if (show === last) return last = show + const disposeView = () => { if (currentView) { currentView.destroy() currentView = null } } - if (currentView && !show && trans?.out) trans.out(currentView.container, disposeView) - else disposeView() + + if (currentView && !show && trans?.out) { + if (exitPromise && exitPromise.cancel) exitPromise.cancel() + const anim = trans.out(currentView.container, disposeView) + exitPromise = anim + if (anim && anim.finished) anim.finished.then(disposeView) + else disposeView() + } else { + disposeView() + } + const content = show ? ifYes : ifNot if (content) { currentView = Render(() => isFunc(content) ? content() : content) @@ -439,7 +451,20 @@ const Mount = (comp, target) => { return inst } -const SigPro = Object.freeze({ $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount }) +const set = (signal, path, value) => { + if (value === undefined) { + signal(isFunc(path) ? path(signal()) : path); + } else { + const keys = path.split('.'); + const last = keys.pop(); + const current = signal(); + const obj = keys.reduce((o, k) => ({ ...o, [k]: { ...o[k] } }), { ...current }); + obj[last] = value; + signal(obj); + } +}; + +const SigPro = Object.freeze({ $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, set }) if (typeof window !== "undefined") { Object.assign(window, SigPro) @@ -447,5 +472,5 @@ if (typeof window !== "undefined") { .split(" ").forEach(t => window[t[0].toUpperCase() + t.slice(1)] = (p, c) => SigPro.Tag(t, p, c)) } -export { $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount } +export { $, Watch, Tag, Render, If, For, Router, Mount, onMount, onUnmount, set } export default SigPro \ No newline at end of file diff --git a/sigpro2.min.js b/sigpro2.min.js new file mode 100644 index 0000000..7f28d58 --- /dev/null +++ b/sigpro2.min.js @@ -0,0 +1 @@ +const isFunc=e=>"function"==typeof e,isObj=e=>e&&"object"==typeof e,isArr=Array.isArray,doc="undefined"!=typeof document?document:null,ensureNode=e=>e?._isRuntime?e.container:e instanceof Node?e:doc.createTextNode(null==e?"":String(e));let activeEffect=null,activeOwner=null,isFlushing=!1;const effectQueue=new Set,MOUNTED_NODES=new WeakMap,dispose=e=>{if(!e||e._disposed)return;e._disposed=!0;const t=[e];for(;t.length;){const e=t.pop();e._cleanups&&(e._cleanups.forEach((e=>e())),e._cleanups.clear()),e._children&&(e._children.forEach((e=>t.push(e))),e._children.clear()),e._deps&&(e._deps.forEach((t=>t.delete(e))),e._deps.clear())}},onUnmount=e=>{activeOwner&&(activeOwner._cleanups||=new Set).add(e)},createEffect=(e,t=!1)=>{const n=()=>{if(n._disposed)return;n._deps&&n._deps.forEach((e=>e.delete(n))),n._cleanups&&(n._cleanups.forEach((e=>e())),n._cleanups.clear());const o=activeEffect,r=activeOwner;activeEffect=activeOwner=n;try{const c=t?e():void e();return t||(n._result=c),c}finally{activeEffect=o,activeOwner=r}};return n._deps=n._cleanups=n._children=null,n._disposed=!1,n._isComputed=t,n._depth=activeEffect?activeEffect._depth+1:0,n._mounts=[],n._parent=activeOwner,activeOwner&&(activeOwner._children||=new Set).add(n),n},flush=()=>{if(isFlushing)return;isFlushing=!0;const e=Array.from(effectQueue).sort(((e,t)=>e._depth-t._depth));effectQueue.clear();for(const t of e)t._disposed||t();isFlushing=!1},trackUpdate=(e,t=!1)=>{if(t||!activeEffect||activeEffect._disposed){if(t){let t=!1;e.forEach((e=>{e===activeEffect||e._disposed||(e._isComputed?(e._dirty=!0,e._subs&&trackUpdate(e._subs,!0)):(effectQueue.add(e),t=!0))})),t&&!isFlushing&&queueMicrotask(flush)}}else e.add(activeEffect),(activeEffect._deps||=new Set).add(e)},untrack=e=>{const t=activeEffect;activeEffect=null;try{return e()}finally{activeEffect=t}},onMount=e=>{activeOwner&&(activeOwner._mounts||=[]).push(e)},$=(e,t=null)=>{const n=new Set;if(isFunc(e)){let t,o=!0;const r=()=>{if(o){const c=activeEffect;activeEffect=r;try{const r=e();Object.is(t,r)||(t=r,o=!1,trackUpdate(n,!0))}finally{activeEffect=c}}return trackUpdate(n),t};return r._isComputed=!0,r._subs=n,r._dirty=!0,r._deps=null,r._disposed=!1,r.markDirty=()=>{o=!0},r.stop=()=>{r._disposed=!0,r._deps&&(r._deps.forEach((e=>e.delete(r))),r._deps.clear()),n.clear()},activeOwner&&onUnmount(r.stop),r}if(t)try{e=JSON.parse(localStorage.getItem(t))??e}catch(e){}return(...o)=>{if(o.length){const r=isFunc(o[0])?o[0](e):o[0];Object.is(e,r)||(e=r,t&&localStorage.setItem(t,JSON.stringify(e)),trackUpdate(n,!0))}return trackUpdate(n),e}},Watch=(e,t)=>{if(void 0===t){const t=createEffect(e);return t(),()=>dispose(t)}const n=createEffect((()=>{const n=Array.isArray(e)?e.map((e=>e())):e();untrack((()=>t(n)))}));return n(),()=>dispose(n)},cleanupNode=e=>{e._cleanups&&(e._cleanups.forEach((e=>e())),e._cleanups.clear()),e._ownerEffect&&dispose(e._ownerEffect),e.childNodes&&e.childNodes.forEach(cleanupNode)},DANGEROUS_PROTOCOL=/^\s*(javascript|data|vbscript):/i,isDangerousAttr=e=>"src"===e||"href"===e||e.startsWith("on"),validateAttr=(e,t)=>{if(null==t||!1===t)return null;if(isDangerousAttr(e)){const e=String(t);if(DANGEROUS_PROTOCOL.test(e))return"#"}return t},Tag=(e,t={},n=[])=>{var o;if((t instanceof Node||isArr(t)||(!(o=t)||"object"!=typeof o))&&(n=t,t={}),isFunc(e)){const o={_mounts:[],_cleanups:new Set},r=createEffect((()=>{const o=e(t,{children:n,emit:(e,...n)=>t[`on${e[0].toUpperCase()}${e.slice(1)}`]?.(...n)});return r._result=o,o}));r(),o._mounts=r._mounts||[],o._cleanups=r._cleanups||new Set;const c=r._result,s=e=>e&&"object"==typeof e&&!e._isRuntime&&(e._mounts=o._mounts,e._cleanups=o._cleanups,e._ownerEffect=r);return isArr(c)?c.forEach(s):s(c),null==c?null:c instanceof Node||isArr(c)&&c.every((e=>e instanceof Node))?c:doc.createTextNode(String(c))}const r=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use)$/.test(e),c=r?doc.createElementNS("http://www.w3.org/2000/svg",e):doc.createElement(e);c._cleanups=new Set;for(let e in t){if(!t.hasOwnProperty(e))continue;let n=t[e];if("ref"!==e)if(e.startsWith("on")){const t=e.slice(2).toLowerCase();c.addEventListener(t,n);const o=()=>c.removeEventListener(t,n);c._cleanups.add(o),onUnmount(o)}else if(isFunc(n)){const t=createEffect((()=>{const t=validateAttr(e,n());"class"===e?c.className=t||"":null==t?c.removeAttribute(e):e in c&&!r?c[e]=t:c.setAttribute(e,!0===t?"":t)}));if(t(),c._cleanups.add((()=>dispose(t))),onUnmount((()=>dispose(t))),/^(INPUT|TEXTAREA|SELECT)$/.test(c.tagName)&&("value"===e||"checked"===e)){const t="checked"===e?"change":"input";c.addEventListener(t,(t=>n(t.target[e])))}}else{const t=validateAttr(e,n);null!=t&&(e in c&&!r?c[e]=t:c.setAttribute(e,!0===t?"":t))}else isFunc(n)?n(c):n.current=c}const s=e=>{if(isArr(e))return e.forEach(s);if(isFunc(e)){const t=doc.createTextNode("");c.appendChild(t);let n=[];const o=createEffect((()=>{const o=e(),r=(isArr(o)?o:[o]).map(ensureNode);n.forEach((e=>{e._isRuntime?e.destroy():cleanupNode(e),e.parentNode&&e.remove()}));let c=t;for(let e=r.length-1;e>=0;e--){const t=r[e];t.parentNode!==c.parentNode&&c.parentNode?.insertBefore(t,c),t._mounts&&t._mounts.forEach((e=>e())),c=t}n=r}));o(),c._cleanups.add((()=>dispose(o))),onUnmount((()=>dispose(o)))}else{const t=ensureNode(e);c.appendChild(t),t._mounts&&t._mounts.forEach((e=>e()))}};return s(n),c},Render=e=>{const t=new Set,n=[],o=activeOwner,r=doc.createElement("div");r.style.display="contents",r.setAttribute("role","presentation"),activeOwner={_cleanups:t,_mounts:n};const c=e=>{e&&(e._isRuntime?(t.add(e.destroy),r.appendChild(e.container)):isArr(e)?e.forEach(c):r.appendChild(e instanceof Node?e:doc.createTextNode(String(null==e?"":e))))};try{c(e({onCleanup:e=>t.add(e)}))}finally{activeOwner=o}return n.forEach((e=>e())),{_isRuntime:!0,container:r,destroy:()=>{t.forEach((e=>e())),cleanupNode(r),r.remove()}}},If=(e,t,n=null,o=null)=>{const r=doc.createTextNode(""),c=Tag("div",{style:"display:contents"},[r]);let s=null,a=null;return Watch((()=>!!(isFunc(e)?e():e)),(e=>{if(e===a)return;a=e;const i=()=>{s&&(s.destroy(),s=null)};s&&!e&&o?.out?o.out(s.container,i):i();const l=e?t:n;l&&(s=Render((()=>isFunc(l)?l():l)),c.insertBefore(s.container,r),o?.in&&o.in(s.container))})),c},For=(e,t,n)=>{const o=doc.createTextNode(""),r=Tag("div",{style:"display:contents"},[o]);let c=new Map;return Watch((()=>(isFunc(e)?e():e)||[]),(e=>{const s=new Map,a=[],i=e||[];for(let e=0;et(o,e))),s.set(r,l),a.push(l)}c.forEach((e=>e.destroy()));let l=o;for(let e=a.length-1;e>=0;e--){const t=a[e].container;t.nextSibling!==l&&r.insertBefore(t,l),l=t}c=s})),r},Router=e=>{const t=()=>window.location.hash.slice(1)||"/",n=$(t()),o=()=>n(t());window.addEventListener("hashchange",o),onUnmount((()=>window.removeEventListener("hashchange",o)));const r=Tag("div",{class:"router-outlet"});let c=null;return Watch([n],(()=>{const t=n(),o=e.find((e=>{const n=e.path.split("/").filter(Boolean),o=t.split("/").filter(Boolean);return n.length===o.length&&n.every(((e,t)=>":"===e[0]||e===o[t]))}))||e.find((e=>"*"===e.path));if(o){c?.destroy();const e={};o.path.split("/").filter(Boolean).forEach(((n,o)=>{":"===n[0]&&(e[n.slice(1)]=t.split("/").filter(Boolean)[o])})),Router.params(e),c=Render((()=>isFunc(o.component)?o.component(e):o.component)),r.replaceChildren(c.container)}})),r};Router.params=$({}),Router.to=e=>window.location.hash=e.replace(/^#?\/?/,"#/"),Router.back=()=>window.history.back(),Router.path=()=>window.location.hash.replace(/^#/,"")||"/";const Mount=(e,t)=>{const n="string"==typeof t?doc.querySelector(t):t;if(!n)return;MOUNTED_NODES.has(n)&&MOUNTED_NODES.get(n).destroy();const o=Render(isFunc(e)?e:()=>e);return n.replaceChildren(o.container),MOUNTED_NODES.set(n,o),o},SigPro=Object.freeze({$:$,Watch:Watch,Tag:Tag,Render:Render,If:If,For:For,Router:Router,Mount:Mount,onMount:onMount,onUnmount:onUnmount});"undefined"!=typeof window&&(Object.assign(window,SigPro),"div span p h1 h2 h3 h4 h5 h6 br hr section article aside nav main header footer ul ol li a em strong pre code form label input textarea select button img svg".split(" ").forEach((e=>window[e[0].toUpperCase()+e.slice(1)]=(t,n)=>SigPro.Tag(e,t,n))));export{$,Watch,Tag,Render,If,For,Router,Mount,onMount,onUnmount};export default SigPro; \ No newline at end of file diff --git a/sigworkPro.min.js b/sigworkPro.min.js new file mode 100644 index 0000000..c9867eb --- /dev/null +++ b/sigworkPro.min.js @@ -0,0 +1 @@ +const isFunction=e=>"function"==typeof e,isNode=e=>e instanceof Node,doc="undefined"!=typeof document?document:null;let activeEffect=null;const pendingEffects=new Set;let flushScheduled=!1;const nodeDisposers=new WeakMap,registerNodeCleanup=(e,t)=>{nodeDisposers.has(e)||nodeDisposers.set(e,[]),nodeDisposers.get(e).push(t)},flushEffects=()=>{if(0===pendingEffects.size)return;const e=Array.from(pendingEffects);pendingEffects.clear(),e.sort(((e,t)=>e.depth-t.depth));for(let t=0;t{flushScheduled||(flushScheduled=!0,queueMicrotask(flushEffects))},disposeEffectTree=e=>{if(e.disposed)return;e.disposed=!0;const t=[e];for(;t.length;){const e=t.pop();if(e.cleanups){for(const t of e.cleanups)t();e.cleanups.clear()}if(e.dependencies){for(const t of e.dependencies)t.delete(e);e.dependencies.clear()}if(e.children){for(const n of e.children)t.push(n);e.children.clear()}}},createEffect=e=>{const t={execute:(null,()=>{if(t.disposed)return;if(t.dependencies){for(const e of t.dependencies)e.delete(t);t.dependencies.clear()}if(t.cleanups){for(const e of t.cleanups)e();t.cleanups.clear()}const n=activeEffect;activeEffect=t;try{const o=e();isFunction(o)&&t.cleanups.add(o)}finally{activeEffect=n}}),dependencies:new Set,cleanups:new Set,children:new Set,depth:activeEffect?activeEffect.depth+1:0,disposed:!1,owner:activeEffect};return activeEffect&&activeEffect.children.add(t),t.execute(),()=>disposeEffectTree(t)};export const Watch=createEffect;const getComponentContext=()=>{let e=activeEffect;for(;e;){if(e.componentContext)return e.componentContext;e=e.owner}return null};export const removeNode=e=>{if(!e)return;e.childNodes&&[...e.childNodes].forEach(removeNode);const t=nodeDisposers.get(e);t&&(t.forEach((e=>e())),nodeDisposers.delete(e)),e._raf&&cancelAnimationFrame(e._raf),e._stop&&e._stop();const n=e.componentContext;n&&(n.unmount.forEach((e=>e())),n.unmount=[]),e.leaveTransition?e.leaveTransition((()=>e.remove())):e.remove?.()};const track=e=>{activeEffect&&!activeEffect.disposed&&(e.add(activeEffect),activeEffect.dependencies.add(e))},trigger=e=>{if(e){for(const t of e)t===activeEffect||t.disposed||pendingEffects.add(t);flushScheduled||(flushScheduled=!0,queueMicrotask(flushEffects))}};export const $=(e,t)=>{if(isFunction(e)){let t,n=!0;const o=$(),r=Watch((()=>{const r=e();Object.is(r,t)||(t=r,n=!1,o(r))})),c=getComponentContext();c&&c.unmount.push(r);return r=>void 0===r?(n&&(t=e(),n=!1,o(t)),o()):o(r)}const n=new Set;let o=e;if(t)try{const e=localStorage.getItem(t);null!==e&&(o=JSON.parse(e))}catch(e){}const r=e=>{if(void 0===e)return track(n),o;const r=isFunction(e)?e(o):e;if(!Object.is(r,o)){if(o=r,t)try{localStorage.setItem(t,JSON.stringify(o))}catch(e){}trigger(n)}return o};if(t){const e=Watch((()=>{r(o)})),t=getComponentContext();t&&t.unmount.push(e)}return r};export const computed=e=>{let t,n=!0;const o=new Set;createEffect((()=>{e(),n=!0,trigger(o)}));return()=>(track(o),(()=>{if(!n)return t;const r=activeEffect;activeEffect=null;try{t=e()}finally{activeEffect=r}return n=!1,trigger(o),t})())};export const set=(e,t,n)=>{if(void 0===n)e(isFunction(t)?t(e()):t);else{const o=t.split("."),r=o.pop(),c=o.reduce(((e,t)=>({...e,[t]:{...e[t]}})),{...e()});c[r]=n,e(c)}};export const watch=(e,t)=>{let n,o=!0;return Watch((()=>{const r=isFunction(e)?e():e;o?o=!1:untrack((()=>t(r,n))),n=r}))};export const untrack=e=>{const t=activeEffect;activeEffect=null;try{return e()}finally{activeEffect=t}};export const onMount=e=>{const t=getComponentContext();t&&t.mount.push(e)};export const onUnmount=e=>{const t=getComponentContext();t&&t.unmount.push(e)};const DANGEROUS_PROTOCOL=/^\s*(javascript|data|vbscript):/i,isDangerousAttr=e=>"src"===e||"href"===e||e.startsWith("on"),validateAttr=(e,t)=>{if(null==t||!1===t)return null;if(isDangerousAttr(e)){const e=String(t);if(DANGEROUS_PROTOCOL.test(e))return"#"}return t},setProperty=(e,t,n,o)=>{n=validateAttr(t,n),"class"===t||"className"===t?e.className=n||"":"style"===t&&"object"==typeof n?Object.assign(e.style,n):t in e&&!o?e[t]=n:o?t.startsWith("xlink:")?null==n||!1===n?e.removeAttributeNS("http://www.w3.org/1999/xlink",t.slice(6)):e.setAttributeNS("http://www.w3.org/1999/xlink",t,n):"xmlns"===t||t.startsWith("xmlns:")?null==n||!1===n?e.removeAttributeNS("http://www.w3.org/2000/xmlns/",t):e.setAttributeNS("http://www.w3.org/2000/xmlns/",t,n):null==n||!1===n?e.removeAttribute(t):!0===n?e.setAttribute(t,""):e.setAttribute(t,n):null==n||!1===n?e.removeAttribute(t):!0===n?e.setAttribute(t,""):e.setAttribute(t,n)},appendChildNode=(e,t)=>{if(null!=t)if(isFunction(t)){const n=doc.createTextNode("");e.appendChild(n);let o=[];const r=Watch((()=>{const r=t();if(r?._isFor)r._reconcile(e),o=r();else{const t=(Array.isArray(r)?r:[r]).flat(1/0).filter((e=>null!=e)).map((e=>isNode(e)?e:doc.createTextNode(String(e))));for(const e of o)t.includes(e)||removeNode(e);let c=n;for(let n=t.length-1;n>=0;n--){const o=t[n];(o.parentNode!==e||o.nextSibling!==t[n+1])&&e.insertBefore(o,c),o.componentContext&&o.componentContext.mount.forEach((e=>e())),c=o}o=t}}));registerNodeCleanup(n,r)}else isNode(t)?e.appendChild(t):e.appendChild(doc.createTextNode(String(t)))},SVG_TAGS=/^(svg|path|circle|rect|line|polyline|polygon|g|defs|text|tspan|use|image|ellipse|foreignObject|linearGradient|radialGradient|stop|pattern|mask|clipPath|filter|feColorMatrix|feBlend|feGaussianBlur|animate|animateTransform|set|metadata|desc|title|symbol|marker|view)$/i;export const Tag=(e,t={},...n)=>{if(n=n.flat(1/0),isFunction(e)){const o={mount:[],unmount:[],provisions:{}};let r;const c=Watch((()=>{activeEffect&&(activeEffect.componentContext=o),r=e(t,{children:n,emit:(e,...n)=>{const o=t[`on${e[0].toUpperCase()}${e.slice(1)}`];isFunction(o)&&o(...n)}}),activeEffect&&(activeEffect.componentContext=null)}));return isNode(r)?(r.componentContext=o,r._stop=c,queueMicrotask((()=>o.mount.forEach((e=>e()))))):Array.isArray(r)&&(r.forEach((e=>{isNode(e)&&(e.componentContext=o,e._stop=c)})),queueMicrotask((()=>o.mount.forEach((e=>e()))))),r}const o=SVG_TAGS.test(e),r=o?doc.createElementNS("http://www.w3.org/2000/svg",e):doc.createElement(e);for(const[e,n]of Object.entries(t))if(e.startsWith("on")){const t=e.slice(2).toLowerCase();r.addEventListener(t,n),onUnmount((()=>r.removeEventListener(t,n)))}else if(isFunction(n)){const t=Watch((()=>setProperty(r,e,n(),o)));if(registerNodeCleanup(r,t),/^(INPUT|TEXTAREA|SELECT)$/.test(r.tagName)&&("value"===e||"checked"===e)){const t="checked"===e?"change":"input",o=t=>n(t.target[e]);r.addEventListener(t,o),onUnmount((()=>r.removeEventListener(t,o)))}}else setProperty(r,e,n,o);for(const e of n)appendChildNode(r,e);return r};export const If=(e,t,n=null,o={})=>{let r=null,c=[],s=null;return()=>{const i=!!(isFunction(e)?e():e);if(i===r)return 1===c.length?c[0]:c;if(c.length)if(o.leave){s&&s.cancel&&s.cancel();const e=o.leave(c);s=e,e&&e.finished?e.finished.then((()=>c.forEach((e=>removeNode(e))))):c.forEach((e=>removeNode(e)))}else c.forEach((e=>removeNode(e)));r=i;const a=i?t():n?.()??[],l=(Array.isArray(a)?a:[a]).flat(1/0).filter((e=>null!=e));return c=l,c.length&&o.enter&&o.enter(c),1===c.length?c[0]:c}};export const For=({each:e,key:t,children:n})=>{let o=new Map,r=[];const c=()=>r;return c._isFor=!0,c._reconcile=c=>{const s=isFunction(e)?e():e||[],i=new Map,a=[],l=(e,n)=>t?isFunction(t)?t(e,n):e[t]:n;for(let e=0;e=0;t--){const n=a[t];n.nextSibling!==a[t+1]&&c.insertBefore(n,e),e=n}}for(const e of o.values())removeNode(e);o=i,r=a},c};export const Router=({routes:e})=>{const t=Tag("div",{class:"router-outlet"}),n=()=>window.location.hash.slice(1)||"/",o=$(n()),r=()=>{o(n())};return window.addEventListener("hashchange",r),registerNodeCleanup(t,(()=>window.removeEventListener("hashchange",r))),Watch((()=>{const n=o(),r=e.find((e=>{const t=e.path.split("/").filter(Boolean),o=n.split("/").filter(Boolean);return t.length===o.length&&t.every(((e,t)=>":"===e[0]||e===o[t]))}))||e.find((e=>"*"===e.path));if(r){for(;t.firstChild;)removeNode(t.firstChild);const e={};r.path.split("/").filter(Boolean).forEach(((t,o)=>{":"===t[0]&&(e[t.slice(1)]=n.split("/").filter(Boolean)[o])})),Router.params(e);const o=Tag(r.component,{params:e});t.appendChild(o)}})),t};Router.params=$({});export const navigate=e=>{window.location.hash=e};export const currentPath=()=>window.location.hash.slice(1)||"/";export const createApp=(e,t={})=>n=>{const o="string"==typeof n?doc.querySelector(n):n;o.appUnmount&&o.appUnmount();const r=Tag(e,t);return o.appendChild(r),r.componentContext&&r.componentContext.mount.forEach((e=>e())),o.appUnmount=()=>removeNode(r),o.appUnmount};"div span p a button input form label ul li ol header footer main section article nav aside h1 h2 h3 h4 h5 h6 img svg path circle rect line polyline polygon g defs text tspan use image ellipse foreignObject linearGradient radialGradient stop pattern mask clipPath filter feColorMatrix feBlend feGaussianBlur animate animateTransform set metadata desc title symbol marker view br hr pre code strong em table tr td th thead tbody tfoot select option textarea iframe video audio canvas".split(" ").forEach((e=>{globalThis[e[0].toUpperCase()+e.slice(1)]=(t,...n)=>Tag(e,t,...n)}));export default{$:$,set:set,Watch:Watch,watch:watch,computed:computed,untrack:untrack,Tag:Tag,If:If,For:For,Router:Router,createApp:createApp,removeNode:removeNode,navigate:navigate,currentPath:currentPath,onMount:onMount,onUnmount:onUnmount}; \ No newline at end of file