diff --git a/deno.lock b/deno.lock
index 15e2ab1..9b82683 100644
--- a/deno.lock
+++ b/deno.lock
@@ -104,6 +104,8 @@
"https://deno.land/std@0.224.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7",
"https://deno.land/std@0.224.0/path/windows/resolve.ts": "8dae1dadfed9d46ff46cc337c9525c0c7d959fb400a6308f34595c45bdca1972",
"https://deno.land/std@0.224.0/path/windows/to_file_url.ts": "40e560ee4854fe5a3d4d12976cef2f4e8914125c81b11f1108e127934ced502e",
- "https://deno.land/std@0.224.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c"
+ "https://deno.land/std@0.224.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c",
+ "https://vanjs.org/code/van-1.5.5.nomodule.min.js": "32403d4dd6203a46513f000fd64b18e4eaef0823bf757ca0092e70130d059aa3",
+ "https://vanjs.org/code/van-x-0.6.3.nomodule.min.js": "e4b7de89bf2f84c22669ce7bcef592fb398d9dcf8b8a36f4562b8ac6354b1f2f"
}
}
diff --git a/dist/bundle_entry.js b/dist/bundle_entry.js
new file mode 100644
index 0000000..f88e866
--- /dev/null
+++ b/dist/bundle_entry.js
@@ -0,0 +1,3 @@
+var pe=Object.defineProperty;var _e=(e,t)=>{for(var r in t)pe(e,r,{get:t[r],enumerable:!0})};var p=Object.getPrototypeOf,A,M,S,b,Q={isConnected:1},me=1e3,O,we={},Se=p(Q),U=p(p),_,Z=(e,t,r,l)=>(e??(setTimeout(r,l),new Set)).add(t),q=(e,t,r)=>{let l=S;S=t;try{return e(r)}catch(n){return console.error(n),r}finally{S=l}},D=e=>e.filter(t=>t._dom?.isConnected),Y=e=>O=Z(O,e,()=>{for(let t of O)t._bindings=D(t._bindings),t._listeners=D(t._listeners);O=_},me),$={get val(){return S?._getters?.add(this),this.rawVal},get oldVal(){return S?._getters?.add(this),this._oldVal},set val(e){S?._setters?.add(this),e!==this.rawVal&&(this.rawVal=e,this._bindings.length+this._listeners.length?(M?.add(this),A=Z(A,this,ve)):this._oldVal=e)}},j=e=>({__proto__:$,rawVal:e,_oldVal:e,_bindings:[],_listeners:[]}),V=(e,t)=>{let r={_getters:new Set,_setters:new Set},l={f:e},n=b;b=[];let a=q(e,r,t);a=(a??document).nodeType?a:new Text(a);for(let o of r._getters)r._setters.has(o)||(Y(o),o._bindings.push(l));for(let o of b)o._dom=a;return b=n,l._dom=a},k=(e,t=j(),r)=>{let l={_getters:new Set,_setters:new Set},n={f:e,s:t};n._dom=r??b?.push(n)??Q,t.val=q(e,l,t.rawVal);for(let a of l._getters)l._setters.has(a)||(Y(a),a._listeners.push(n));return t},ee=(e,...t)=>{for(let r of t.flat(1/0)){let l=p(r??0),n=l===$?V(()=>r.val):l===U?V(r):r;n!=_&&e.append(n)}return e},te=(e,t,...r)=>{let[{is:l,...n},...a]=p(r[0]??0)===Se?r:[{},...r],o=e?document.createElementNS(e,t,{is:l}):document.createElement(t,{is:l});for(let[d,h]of Object.entries(n)){let y=u=>u?Object.getOwnPropertyDescriptor(u,d)??y(p(u)):_,T=t+","+d,c=we[T]??=y(p(o))?.set??0,i=d.startsWith("on")?(u,g)=>{let f=d.slice(2);o.removeEventListener(f,g),o.addEventListener(f,u)}:c?c.bind(o):o.setAttribute.bind(o,d),s=p(h??0);d.startsWith("on")||s===U&&(h=k(h),s=$),s===$?V(()=>(i(h.val,h._oldVal),o)):i(h)}return ee(o,a)},z=e=>({get:(t,r)=>te.bind(_,e,r)}),re=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),ve=()=>{let e=0,t=[...A].filter(l=>l.rawVal!==l._oldVal);do{M=new Set;for(let l of new Set(t.flatMap(n=>n._listeners=D(n._listeners))))k(l.f,l.s,l._dom),l._dom=_}while(++e<100&&(t=[...M]).length);let r=[...A].filter(l=>l.rawVal!==l._oldVal);A=_;for(let l of new Set(r.flatMap(n=>n._bindings=D(n._bindings))))re(l._dom,V(l.f,l._dom)),l._dom=_;for(let l of r)l._oldVal=l.rawVal},x={tags:new Proxy(e=>new Proxy(te,z(e)),z()),hydrate:(e,t)=>re(e,V(t,e)),add:ee,state:j,derive:k};var H={};_e(H,{calc:()=>De,compact:()=>B,list:()=>Fe,noreactive:()=>xe,raw:()=>ce,reactive:()=>E,replace:()=>ge,stateFields:()=>Ke});var{fromEntries:ne,entries:P,keys:L,hasOwn:X,getPrototypeOf:I,create:be,assign:Ae}=Object,{get:oe,set:le,deleteProperty:Ve,ownKeys:Ce}=Reflect,{state:N,derive:Pe,add:Te}=x,K,Oe=1e3,J,W,w=Symbol(),ae=Symbol(),G=Symbol(),m=Symbol(),C=Symbol(),ie=Symbol(),De=e=>(e[ae]=1,e),v=e=>e instanceof Object&&!(e instanceof Function)&&!e[ie],se=e=>{if(e?.[ae]){let t=N();return Pe(()=>{let r=e();v(t.rawVal)&&v(r)?ge(t.rawVal,r):t.val=E(r)}),t}else return N(E(e))},$e=e=>{let t=Array.isArray(e)?[]:{__proto__:I(e)};for(let[r,l]of P(e))t[r]=se(l);return t[G]=[],t[m]=N(1),t},de={get:(e,t,r)=>t===w?e:X(e,t)?Array.isArray(e)&&t==="length"?(e[m].val,e.length):e[t].val:oe(e,t,r),set:(e,t,r,l)=>X(e,t)?Array.isArray(e)&&t==="length"?(r!==e.length&&++e[m].val,e.length=r,1):(e[t].val=E(r),1):t in e?le(e,t,r,l):le(e,t,se(r))&&(++e[m].val,F(e).forEach(fe.bind(J,l,t,e[t],W)),1),deleteProperty:(e,t)=>(Ve(e,t)&&Ee(e,t),++e[m].val),ownKeys:e=>(e[m].val,Ce(e))},E=e=>!v(e)||e[w]?e:new Proxy($e(e),de),xe=e=>(e[ie]=1,e),Ke=e=>e[w],Ne=I(N()),Ge=e=>new Proxy(e,{get:(t,r,l)=>I(t[r]??0)===Ne?{val:ce(t[r].rawVal)}:oe(t,r,l)}),ce=e=>e?.[w]?new Proxy(Ge(e[w]),de):e,F=e=>e[G]=e[G].filter(t=>t._containerDom.isConnected),fe=(e,t,r,l,{_containerDom:n,f:a})=>{let o=Array.isArray(e),d=o?Number(t):t;Te(n,()=>n[C][t]=a(r,()=>delete e[t],d)),o&&!l&&d!==e.length-1&&n.insertBefore(n.lastChild,n[C][L(e).find(h=>Number(h)>d)])},Ee=(e,t)=>{for(let r of F(e)){let l=r._containerDom[C];l[t]?.remove(),delete l[t]}},Ie=e=>(K??(K=(setTimeout(()=>(K.forEach(F),K=J),Oe),new Set))).add(e),Fe=(e,t,r)=>{let l={_containerDom:e instanceof Function?e():e,f:r},n=t[w];l._containerDom[C]={},n[G].push(l),Ie(n);for(let[a,o]of P(n))fe(t,a,o,1,l);return l._containerDom},he=(e,t)=>{for(let[n,a]of P(t)){let o=e[n];v(o)&&v(a)?he(o,a):e[n]=a}for(let n in e)X(t,n)||delete e[n];let r=L(t),l=Array.isArray(e);if(l||L(e).some((n,a)=>n!==r[a])){let n=e[w];if(l)e.length=t.length;else{++n[m].val;let a={...n};for(let o of r)delete n[o];for(let o of r)n[o]=a[o]}for(let{_containerDom:a}of F(n)){let{firstChild:o,[C]:d}=a;for(let h of r)o===d[h]?o=o.nextSibling:a.insertBefore(d[h],o)}}return e},ge=(e,t)=>{W=1;try{return he(e,t instanceof Function?Array.isArray(e)?t(e.filter(r=>1)):ne(t(P(e))):t)}finally{W=J}},B=e=>Array.isArray(e)?e.filter(t=>1).map(B):v(e)?Ae(be(I(e)),ne(P(e).map(([t,r])=>[t,B(r)]))):e;var ye=(e,t="")=>{let r="@",l=":",n=".",a="^",o=(c,i,s)=>{let u=Object.keys(i).map(g=>{let f=i[g];switch(g[0]){case r:return o(`@media(max-width:${g.substring(r.length)})`,f,s);case l:return o(`&${g}`,f,s);case n:return o(`${g}${s}`,f,s);case a:return o(`&:hover .${g.substring(a.length)}${s}`,f,s)}return`${g.replace(/([a-z])([A-Z])/g,"$1-$2")}: ${f};`});return`${c}{${u.join(`
+`)}}`},d=(c,i)=>{let s=i.lastIndexOf(c)+c.length;return s?i.substring(s):i},h=c=>{let i=van.tags[c],s=[],u=new Proxy((...g)=>{let f=i(...g);return f.className=s.join(y+" ")+y+" "+f.className,s=[],f},{get(g,f){return s.push(f.substring(f.lastIndexOf(".")+1)),u}});return u},y=t?"_"+t:"",T=Object.keys(e).map(c=>o("."+c+y,e[c],y)).join(`
+`);return globalThis.document?.head.insertAdjacentHTML("beforeend",``),{Tag(...c){return c.map(i=>d(a,d(n,i))).join(y+" ")+y},CSS:T,DOM:new Proxy({},{get(c,i){return h(i)}}),Div:new Proxy({},{get(c,i){return h("div")[i]}})}};globalThis.van=x;globalThis.vanX=H;globalThis.Gale=ye;var R=new URL(import.meta.url).searchParams;vanX.Store=(e,t)=>{let r=localStorage.getItem(t),l=vanX.reactive(r?JSON.parse(r):e);return van.derive(()=>localStorage.setItem(t,JSON.stringify(vanX.compact(l)))),l};R.has("hmr")&&await import("./hmr-NY37ZYM7.js");var ue=R.get("root")||"/";fetch(ue+"deno.json").then(e=>e.json()).then(e=>{let t=(l,n)=>{let a=document.createElement("script");return a.type=l,a.textContent=n,document.head.appendChild(a),a},r=e.imports;for(let l in r){let n=r[l];n.startsWith("./")&&(r[l]=ue+n.substring(2))}R.has("map")&&t("importmap",JSON.stringify({imports:r})),t("module").src=r.entry});
diff --git a/dist/core.d.ts b/dist/core.d.ts
deleted file mode 100644
index ddadce9..0000000
--- a/dist/core.d.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-export {}
-declare global
-{
- namespace Van {
-
- interface State {
- val: T
- readonly oldVal: T
- readonly rawVal: T
- }
-
- // Defining readonly view of State for covariance.
- // Basically we want StateView to implement StateView
- type StateView = Readonly>
-
- type Val = State | T
-
- type Primitive = string | number | boolean | bigint
-
- // deno-lint-ignore no-explicit-any
- type PropValue = Primitive | ((e: any) => void) | null
-
- type PropValueOrDerived = PropValue | StateView | (() => PropValue)
-
- type Props = Record & { class?: PropValueOrDerived; is?: string }
-
- type PropsWithKnownKeys = Partial<{[K in keyof ElementType]: PropValueOrDerived}>
-
- type ValidChildDomValue = Primitive | Node | null | undefined
-
- type BindingFunc = ((dom?: Node) => ValidChildDomValue) | ((dom?: Element) => Element)
-
- type ChildDom = ValidChildDomValue | StateView | BindingFunc | readonly ChildDom[]
-
- type TagFunc = (first?: Props & PropsWithKnownKeys | ChildDom, ...rest: readonly ChildDom[]) => Result
-
- type Tags = Readonly>> & {
- [K in keyof HTMLElementTagNameMap]: TagFunc
- }
- }
- const van:{
- readonly state: (initVal: T, HMRKey?:string)=> Van.State
- readonly derive: (f: () => T) => Van.State
- readonly add: (dom: Element, ...children: readonly Van.ChildDom[]) => Element
- readonly tags: Van.Tags & ((namespaceURI: string) => Readonly>>)
- readonly hydrate: (dom: T, f: (dom: T) => T | null | undefined) => T
- };
-
-
- namespace VanX
- {
- type StateOf = { readonly [K in keyof T]: Van.State }
- type ValueType = T extends (infer V)[] ? V : T[keyof T]
- type KeyType = T extends unknown[] ? number : string
- type ReplacementFunc =
- T extends (infer V)[] ? (items: V[]) => readonly V[] :
- (items: [string, T[keyof T]][]) => readonly [string, T[keyof T]][]
- }
- const vanX:{
- readonly calc: (f: () => R) => R
- readonly reactive: (obj: T, HMRKey?:string) => T
- readonly noreactive: (obj: T) => T
- readonly stateFields: (obj: T) => VanX.StateOf
- readonly raw: (obj: T) => T
- readonly list: (
- container: (() => ElementType) | ElementType,
- items: T,itemFunc: (v: Van.State>, deleter: () => void, k: VanX.KeyType) => Node
- ) => ElementType
- readonly replace: (obj: T, replacement: VanX.ReplacementFunc | T) => T
- readonly compact: (obj: T) => T
- // my addition
- readonly Store: (obj:T, key:string)=>T
- };
-
- namespace Gale {
- type KeyQuery = "@";
- type KeyState = ":";
- type KeyChild = ".";
- type KeyGroup = "^";
- type UserStyles = Partial & {[key: `${KeyQuery|KeyState|KeyChild|KeyGroup}${string}`]: UserStyles }
- type UserSheet = Record
- type CollectKeys = {[Key in keyof Obj]: Obj[Key] extends object ? Key | CollectKeys : Key }[keyof Obj]
- type FilterKeys = Keys extends `${KeyChild|KeyGroup}${infer Rest}` ? Keys : never
- type CrossMultiply = A extends string ? B extends string ? `${A}${B}` : never : never
- type CrossMultiplyRecord = keyof Rec | { [K in keyof Rec]: K extends string ? CrossMultiply>> : never }[keyof Rec]
- type Tier = (selector:string, obj:UserStyles, suffix:string)=>string;
- type CreateSheet = (sheet:UserSheet&T, hash?:string)=>{
- Tag:(...args:CrossMultiplyRecord[])=>string,
- CSS:string,
- DOM:Elemental>,
- Div:Circular, Van.TagFunc>
- }
-
-
- type Elemental = {[K in keyof HTMLElementTagNameMap]: Van.TagFunc&Circular>}
-
- type Circular = {
- [K in Keys]: Circular&Func
- };
-
- }
- const Gale:Gale.CreateSheet
-}
\ No newline at end of file
diff --git a/dist/core.js b/dist/core.js
deleted file mode 100644
index 52127cf..0000000
--- a/dist/core.js
+++ /dev/null
@@ -1,3 +0,0 @@
-var we=Object.defineProperty;var be=(e,t)=>{for(var r in t)we(e,r,{get:t[r],enumerable:!0})};var _=Object.getPrototypeOf,A,F,w,T,q={isConnected:1},Te=1e3,D,Ae={},Ve=_(q),U=_(_),S,Y=(e,t,r,l)=>(e??(setTimeout(r,l),new Set)).add(t),j=(e,t,r)=>{let l=w;w=t;try{return e(r)}catch(n){return console.error(n),r}finally{w=l}},P=e=>e.filter(t=>t._dom?.isConnected),ee=e=>D=Y(D,e,()=>{for(let t of D)t._bindings=P(t._bindings),t._listeners=P(t._listeners);D=S},Te),I={get val(){return w?._getters?.add(this),this.rawVal},get oldVal(){return w?._getters?.add(this),this._oldVal},set val(e){w?._setters?.add(this),e!==this.rawVal&&(this.rawVal=e,this._bindings.length+this._listeners.length?(F?.add(this),A=Y(A,this,Oe)):this._oldVal=e)}},te=e=>({__proto__:I,rawVal:e,_oldVal:e,_bindings:[],_listeners:[]}),V=(e,t)=>{let r={_getters:new Set,_setters:new Set},l={f:e},n=T;T=[];let a=j(e,r,t);a=(a??document).nodeType?a:new Text(a);for(let o of r._getters)r._setters.has(o)||(ee(o),o._bindings.push(l));for(let o of T)o._dom=a;return T=n,l._dom=a},J=(e,t=te(),r)=>{let l={_getters:new Set,_setters:new Set},n={f:e,s:t};n._dom=r??T?.push(n)??q,t.val=j(e,l,t.rawVal);for(let a of l._getters)l._setters.has(a)||(ee(a),a._listeners.push(n));return t},re=(e,...t)=>{for(let r of t.flat(1/0)){let l=_(r??0),n=l===I?V(()=>r.val):l===U?V(r):r;n!=S&&e.append(n)}return e},le=(e,t,...r)=>{let[{is:l,...n},...a]=_(r[0]??0)===Ve?r:[{},...r],o=e?document.createElementNS(e,t,{is:l}):document.createElement(t,{is:l});for(let[i,s]of Object.entries(n)){let u=y=>y?Object.getOwnPropertyDescriptor(y,i)??u(_(y)):S,p=t+","+i,f=Ae[p]??=u(_(o))?.set??0,d=i.startsWith("on")?(y,h)=>{let g=i.slice(2);o.removeEventListener(g,h),o.addEventListener(g,y)}:f?f.bind(o):o.setAttribute.bind(o,i),c=_(s??0);i.startsWith("on")||c===U&&(s=J(s),c=I),c===I?V(()=>(d(s.val,s._oldVal),o)):d(s)}return re(o,a)},Z=e=>({get:(t,r)=>le.bind(S,e,r)}),ne=(e,t)=>t?t!==e&&e.replaceWith(t):e.remove(),Oe=()=>{let e=0,t=[...A].filter(l=>l.rawVal!==l._oldVal);do{F=new Set;for(let l of new Set(t.flatMap(n=>n._listeners=P(n._listeners))))J(l.f,l.s,l._dom),l._dom=S}while(++e<100&&(t=[...F]).length);let r=[...A].filter(l=>l.rawVal!==l._oldVal);A=S;for(let l of new Set(r.flatMap(n=>n._bindings=P(n._bindings))))ne(l._dom,V(l.f,l._dom)),l._dom=S;for(let l of r)l._oldVal=l.rawVal},x={tags:new Proxy(e=>new Proxy(le,Z(e)),Z()),hydrate:(e,t)=>ne(e,V(t,e)),add:re,state:te,derive:J};var R={};be(R,{calc:()=>Ke,compact:()=>W,list:()=>Xe,noreactive:()=>Ee,raw:()=>ge,reactive:()=>k,replace:()=>pe,stateFields:()=>Ge});var{fromEntries:ae,entries:C,keys:L,hasOwn:X,getPrototypeOf:E,create:Ce,assign:De}=Object,{get:ie,set:oe,deleteProperty:Pe,ownKeys:Ie}=Reflect,{state:$,derive:xe,add:Ne}=x,N,$e=1e3,H,B,v=Symbol(),se=Symbol(),K=Symbol(),m=Symbol(),O=Symbol(),de=Symbol(),Ke=e=>(e[se]=1,e),b=e=>e instanceof Object&&!(e instanceof Function)&&!e[de],ce=e=>{if(e?.[se]){let t=$();return xe(()=>{let r=e();b(t.rawVal)&&b(r)?pe(t.rawVal,r):t.val=k(r)}),t}else return $(k(e))},ke=e=>{let t=Array.isArray(e)?[]:{__proto__:E(e)};for(let[r,l]of C(e))t[r]=ce(l);return t[K]=[],t[m]=$(1),t},fe={get:(e,t,r)=>t===v?e:X(e,t)?Array.isArray(e)&&t==="length"?(e[m].val,e.length):e[t].val:ie(e,t,r),set:(e,t,r,l)=>X(e,t)?Array.isArray(e)&&t==="length"?(r!==e.length&&++e[m].val,e.length=r,1):(e[t].val=k(r),1):t in e?oe(e,t,r,l):oe(e,t,ce(r))&&(++e[m].val,G(e).forEach(ue.bind(H,l,t,e[t],B)),1),deleteProperty:(e,t)=>(Pe(e,t)&&Je(e,t),++e[m].val),ownKeys:e=>(e[m].val,Ie(e))},k=e=>!b(e)||e[v]?e:new Proxy(ke(e),fe),Ee=e=>(e[de]=1,e),Ge=e=>e[v],Me=E($()),Fe=e=>new Proxy(e,{get:(t,r,l)=>E(t[r]??0)===Me?{val:ge(t[r].rawVal)}:ie(t,r,l)}),ge=e=>e?.[v]?new Proxy(Fe(e[v]),fe):e,G=e=>e[K]=e[K].filter(t=>t._containerDom.isConnected),ue=(e,t,r,l,{_containerDom:n,f:a})=>{let o=Array.isArray(e),i=o?Number(t):t;Ne(n,()=>n[O][t]=a(r,()=>delete e[t],i)),o&&!l&&i!==e.length-1&&n.insertBefore(n.lastChild,n[O][L(e).find(s=>Number(s)>i)])},Je=(e,t)=>{for(let r of G(e)){let l=r._containerDom[O];l[t]?.remove(),delete l[t]}},Le=e=>(N??(N=(setTimeout(()=>(N.forEach(G),N=H),$e),new Set))).add(e),Xe=(e,t,r)=>{let l={_containerDom:e instanceof Function?e():e,f:r},n=t[v];l._containerDom[O]={},n[K].push(l),Le(n);for(let[a,o]of C(n))ue(t,a,o,1,l);return l._containerDom},he=(e,t)=>{for(let[n,a]of C(t)){let o=e[n];b(o)&&b(a)?he(o,a):e[n]=a}for(let n in e)X(t,n)||delete e[n];let r=L(t),l=Array.isArray(e);if(l||L(e).some((n,a)=>n!==r[a])){let n=e[v];if(l)e.length=t.length;else{++n[m].val;let a={...n};for(let o of r)delete n[o];for(let o of r)n[o]=a[o]}for(let{_containerDom:a}of G(n)){let{firstChild:o,[O]:i}=a;for(let s of r)o===i[s]?o=o.nextSibling:a.insertBefore(i[s],o)}}return e},pe=(e,t)=>{B=1;try{return he(e,t instanceof Function?Array.isArray(e)?t(e.filter(r=>1)):ae(t(C(e))):t)}finally{B=H}},W=e=>Array.isArray(e)?e.filter(t=>1).map(W):b(e)?De(Ce(E(e)),ae(C(e).map(([t,r])=>[t,W(r)]))):e;var ye=(e,t="")=>{let r="@",l=":",n=".",a="^",o=(f,d,c)=>{let y=Object.keys(d).map(h=>{let g=d[h];switch(h[0]){case r:return o(`@media(max-width:${h.substring(r.length)})`,g,c);case l:return o(`&${h}`,g,c);case n:return o(`${h}${c}`,g,c);case a:return o(`&:hover .${h.substring(a.length)}${c}`,g,c)}return`${h.replace(/([a-z])([A-Z])/g,"$1-$2")}: ${g};`});return`${f}{${y.join(`
-`)}}`},i=(f,d)=>{let c=d.lastIndexOf(f)+f.length;return c?d.substring(c):d},s=f=>{let d=van.tags[f],c=[],y=new Proxy((...h)=>{let g=d(...h);return g.className=c.join(u+" ")+u+" "+g.className,c=[],g},{get(h,g){return c.push(g.substring(g.lastIndexOf(".")+1)),y}});return y},u=t?"_"+t:"",p=Object.keys(e).map(f=>o("."+f+u,e[f],u)).join(`
-`);return globalThis.document?.head.insertAdjacentHTML("beforeend",``),{Tag(...f){return f.map(d=>i(a,i(n,d))).join(u+" ")+u},CSS:p,DOM:new Proxy({},{get(f,d){return s(d)}}),Div:new Proxy({},{get(f,d){return s("div")[d]}})}};var z=0,M={};function Be(){for(let e in M)sessionStorage.setItem(e,M[e]);M={},z=0}function We(e,t){M[e]=t,z||(z=setTimeout(Be,500)),console.log("SAVE",e,t)}function He(e){let t=sessionStorage.getItem(e);return console.log("LOAD",e,t),t}var Q,Se=0;function _e(e){Se=0,Q=e}function Re(){return Q?Q+"_"+Se+++"_":""}var me=()=>{let e=globalThis.van.state;globalThis.van.state=(r,l="")=>{let n=typeof r,a=p=>p,o=p=>p?.toString()||null;switch(n){case"boolean":a=p=>p==="true";break;case"number":a=parseFloat;break;case"object":a=JSON.parse,o=JSON.stringify;break}let i="HMR_"+Re()+l,s=He(i),u=e(s?a(s):r);return van.derive(()=>We(i,o(u.val))),u};let t=globalThis.vanX.reactive;globalThis.vanX.reactive=(r,l)=>{_e(l);let n=t(r);return _e(),n},new WebSocket("ws://"+window.location.host+"/ws").addEventListener("message",r=>r.data==="reload"&&window.location.reload()),vanX.Store=(r,l)=>{let n=JSON.stringify(r),a=localStorage.getItem(l+"check");localStorage.setItem(l+"check",n);let o;if(n==a){let s=localStorage.getItem(l);try{o=JSON.parse(s)||r}catch{o=r}}else o=r;let i=vanX.reactive(o);return van.derive(()=>localStorage.setItem(l,JSON.stringify(vanX.compact(i)))),i}};var ve=(e="/")=>fetch(e+"deno.json").then(t=>t.json()).then(t=>{let r=(n,a)=>{let o=document.createElement("script");o.type=n,o.textContent=a,document.head.appendChild(o)},l=t.imports;for(let n in l){let a=l[n];a.startsWith("./")&&(l[n]=e+a.substring(2))}r("importmap",JSON.stringify({imports:l})),r("module",'import "entry"; ')});globalThis.van=x;globalThis.vanX=R;globalThis.Gale=ye;me();ve();
diff --git a/dist/hmr-NY37ZYM7.js b/dist/hmr-NY37ZYM7.js
new file mode 100644
index 0000000..972dda6
--- /dev/null
+++ b/dist/hmr-NY37ZYM7.js
@@ -0,0 +1 @@
+var g=0,c={};function d(){for(let e in c)sessionStorage.setItem(e,c[e]);c={},g=0}function f(e,t){c[e]=t,g||(g=setTimeout(d,500)),console.log("SAVE",e,t)}function m(e){let t=sessionStorage.getItem(e);return console.log("LOAD",e,t),t}var S,u=0;function v(e){u=0,S=e}function h(){return S?S+"_"+u+++"_":""}var I=globalThis.van.state;globalThis.van.state=(e,t="")=>{let n=typeof e,o=l=>l,a=l=>l?.toString()||null;switch(n){case"boolean":o=l=>l==="true";break;case"number":o=parseFloat;break;case"object":o=JSON.parse,a=JSON.stringify;break}let r="HMR_"+h()+t,s=m(r),i=I(s?o(s):e);return van.derive(()=>f(r,a(i.val))),i};var w=globalThis.vanX.reactive;globalThis.vanX.reactive=(e,t)=>{v(t);let n=w(e);return v(),n};new WebSocket("ws://"+window.location.host+"/ws").addEventListener("message",e=>e.data==="reload"&&window.location.reload());vanX.Store=(e,t)=>{let n=JSON.stringify(e),o=localStorage.getItem(t+"check");localStorage.setItem(t+"check",n);let a;if(n==o){let s=localStorage.getItem(t);try{a=JSON.parse(s)||e}catch{a=e}}else a=e;let r=vanX.reactive(a);return van.derive(()=>localStorage.setItem(t,JSON.stringify(vanX.compact(r)))),r};
diff --git a/scripts/assemble_files.ts b/scripts/assemble_files.ts
index 97e93f6..9cade63 100644
--- a/scripts/assemble_files.ts
+++ b/scripts/assemble_files.ts
@@ -1,6 +1,5 @@
-const bundle = await fetch(import.meta.resolve("../dist/core.js")).then(r=>r.text());
const index = await fetch(import.meta.resolve("../dist/index.html")).then(r=>r.text());
-export const HTML = index.replace(``, ``);
+export const HTML = index.replace(``, ``);
export const Root = import.meta.resolve("../");
export const Load =async(file:string)=> await fetch(Root + file).then(resp=>resp.text());
export const Save =async(text:string, name:string)=> await Deno.writeTextFile(name, text);
\ No newline at end of file
diff --git a/scripts/bundle_entry.ts b/scripts/bundle_entry.ts
index d2ecbb2..5f5c4a7 100644
--- a/scripts/bundle_entry.ts
+++ b/scripts/bundle_entry.ts
@@ -7,8 +7,27 @@ globalThis.vanX = VanX;
import Gale from "../src/gale.js";
globalThis.Gale = Gale;
-import BindHMR from "../src/hmr.js";
-BindHMR();
+const args = new URL(import.meta.url).searchParams;
-import Boot from "../src/boot.js";
-Boot();
\ No newline at end of file
+//Store
+vanX.Store=(e,t)=>{const a=localStorage.getItem(t),r=vanX.reactive(a?JSON.parse(a):e);return van.derive((()=>localStorage.setItem(t,JSON.stringify(vanX.compact(r))))),r};
+
+if(args.has("hmr"))
+{
+ await import("../src/hmr.js");
+}
+
+const root = args.get("root")||"/";
+fetch(root+"deno.json")
+.then(text=>text.json())
+.then(json=>{
+ const Script=(t,e)=>{let n=document.createElement("script"); n.type=t; n.textContent=e; document.head.appendChild(n); return n;};
+ const imports = json.imports;
+ for(let n in imports)
+ {
+ const path=imports[n];
+ path.startsWith("./")&&(imports[n]=root+path.substring(2))
+ }
+ args.has("map") && Script("importmap",JSON.stringify({imports}));
+ Script("module").src=imports.entry;
+});
\ No newline at end of file
diff --git a/scripts/bundle_subprocess.ts b/scripts/bundle_subprocess.ts
index 2baf808..a49177e 100644
--- a/scripts/bundle_subprocess.ts
+++ b/scripts/bundle_subprocess.ts
@@ -5,8 +5,14 @@ const command = new Deno.Command("deno", {
"--platform=browser",
"--inline-imports=true",
"--output=dist/core.js",
+ "--outdir=dist",
"--minify",
+ "--code-splitting",
"scripts/bundle_entry.ts"
]
});
-command.outputSync();
\ No newline at end of file
+const result = command.outputSync();
+
+const textDecoder = new TextDecoder();
+console.log("stdout:", textDecoder.decode(result.stdout));
+console.log("stderr:", textDecoder.decode(result.stderr));
\ No newline at end of file
diff --git a/src/boot.js b/src/boot.js
deleted file mode 100644
index b0b0318..0000000
--- a/src/boot.js
+++ /dev/null
@@ -1,13 +0,0 @@
-export default (root="/")=>fetch(root+"deno.json")
-.then(text=>text.json())
-.then(json=>{
- const n=(t,e)=>{let n=document.createElement("script");n.type=t,n.textContent=e,document.head.appendChild(n)};
- const imports = json.imports;
- for(let n in imports)
- {
- const path=imports[n];
- path.startsWith("./")&&(imports[n]=root+path.substring(2))
- }
- n("importmap",JSON.stringify({imports})),
- n("module",'import "entry"; ')
-})
\ No newline at end of file
diff --git a/src/hmr.js b/src/hmr.js
index 3e3cf34..2402368 100644
--- a/src/hmr.js
+++ b/src/hmr.js
@@ -47,75 +47,74 @@ function NextID()
return _ID ? _ID + "_" + (_index++) + "_" : "";
}
-export default()=>{
- //bind Van
- const origninalState = globalThis.van.state;
- globalThis.van.state =(value, key="")=>
+
+//bind Van
+const origninalState = globalThis.van.state;
+globalThis.van.state =(value, key="")=>
+{
+ const type = typeof value;
+ let reader =d=>d;
+ let writer =d=>d?.toString() || null;
+
+ switch(type)
{
- const type = typeof value;
- let reader =d=>d;
- let writer =d=>d?.toString() || null;
-
- switch(type)
- {
- case "boolean" :
- reader =(data)=> data === "true"; break;
- case "number" :
- reader = parseFloat; break;
- case "object" :
- reader = JSON.parse;
- writer = JSON.stringify;
- break;
- }
-
- const fullKey = "HMR_" + NextID() + key;
- const stringValue = Load(fullKey);
- const signal = origninalState((stringValue ? reader(stringValue) : value));
- van.derive(()=>Save(fullKey, writer(signal.val)));
-
- return signal;
- };
-
- //bind VanX
- const originalReactive = globalThis.vanX.reactive;
- globalThis.vanX.reactive =(obj, id)=>
- {
- StartID(id);
- const state = originalReactive(obj);
- StartID();
- return state;
+ case "boolean" :
+ reader =(data)=> data === "true"; break;
+ case "number" :
+ reader = parseFloat; break;
+ case "object" :
+ reader = JSON.parse;
+ writer = JSON.stringify;
+ break;
}
- // added in devmode to index.html
- new WebSocket('ws://'+window.location.host+'/ws').addEventListener('message',e=>e.data==='reload'&&window.location.reload());
+ const fullKey = "HMR_" + NextID() + key;
+ const stringValue = Load(fullKey);
+ const signal = origninalState((stringValue ? reader(stringValue) : value));
+ van.derive(()=>Save(fullKey, writer(signal.val)));
- vanX.Store =(obj, key)=>
+ return signal;
+};
+
+//bind VanX
+const originalReactive = globalThis.vanX.reactive;
+globalThis.vanX.reactive =(obj, id)=>
+{
+ StartID(id);
+ const state = originalReactive(obj);
+ StartID();
+ return state;
+}
+
+// added in devmode to index.html
+new WebSocket('ws://'+window.location.host+'/ws').addEventListener('message',e=>e.data==='reload'&&window.location.reload());
+
+vanX.Store =(obj, key)=>
+{
+ let checkInit = JSON.stringify(obj);
+ let checkStore = localStorage.getItem(key+"check");
+ localStorage.setItem(key+"check", checkInit);
+
+ let recallJSON;
+ if(checkInit == checkStore)
+ {
+ let recallText = localStorage.getItem(key);
+ try
+ {
+ recallJSON = JSON.parse(recallText) || obj;
+ }
+ catch(e)
+ {
+ recallJSON = obj;
+ }
+ }
+ else
{
- let checkInit = JSON.stringify(obj);
- let checkStore = localStorage.getItem(key+"check");
- localStorage.setItem(key+"check", checkInit);
- let recallJSON;
- if(checkInit == checkStore)
- {
- let recallText = localStorage.getItem(key);
- try
- {
- recallJSON = JSON.parse(recallText) || obj;
- }
- catch(e)
- {
- recallJSON = obj;
- }
- }
- else
- {
-
- recallJSON = obj;
- }
+ recallJSON = obj;
+ }
- const store = vanX.reactive( recallJSON );
- van.derive(() => localStorage.setItem(key, JSON.stringify(vanX.compact(store))));
- return store;
- }
-}
\ No newline at end of file
+ const store = vanX.reactive( recallJSON );
+ van.derive(() => localStorage.setItem(key, JSON.stringify(vanX.compact(store))));
+ return store;
+}
diff --git a/types.d.ts b/types.d.ts
new file mode 100644
index 0000000..30164f1
--- /dev/null
+++ b/types.d.ts
@@ -0,0 +1,45 @@
+import type * as VAN from "https://vanjs.org/code/van-1.5.5.d.ts";
+import type * as VANX from "https://vanjs.org/code/van-x-0.6.3.d.ts";
+type Replace = Omit & { readonly [P in K]: R };
+declare module "vanjs-core" { export type State = VAN.State }
+declare global
+{
+ namespace Van { export type * from "https://vanjs.org/code/van-1.5.5.d.ts"; }
+ namespace VanX { export type * from "https://vanjs.org/code/van-x-0.6.3.d.ts"; }
+ const van: Replace(arg:T, HMRKey?:string)=>VAN.State>
+ const vanX: Replace(obj: T, HMRKey?:string) => T> & {Store:(obj:T, key:string)=>T}
+}
+
+declare global {
+
+ namespace Gale {
+ type KeyQuery = "@";
+ type KeyState = ":";
+ type KeyChild = ".";
+ type KeyGroup = "^";
+ type UserStyles = Partial & {[key: `${KeyQuery|KeyState|KeyChild|KeyGroup}${string}`]: UserStyles }
+ type UserSheet = Record
+ type CollectKeys = {[Key in keyof Obj]: Obj[Key] extends object ? Key | CollectKeys : Key }[keyof Obj]
+ type FilterKeys = Keys extends `${KeyChild|KeyGroup}${infer Rest}` ? Keys : never
+ type CrossMultiply = A extends string ? B extends string ? `${A}${B}` : never : never
+ type CrossMultiplyRecord = keyof Rec | { [K in keyof Rec]: K extends string ? CrossMultiply>> : never }[keyof Rec]
+ type Tier = (selector:string, obj:UserStyles, suffix:string)=>string;
+ type CreateSheet = (sheet:UserSheet&T, hash?:string)=>{
+ Tag:(...args:CrossMultiplyRecord[])=>string,
+ CSS:string,
+ DOM:Elemental>,
+ Div:Circular, Van.TagFunc>
+ }
+
+
+ type Elemental = {[K in keyof HTMLElementTagNameMap]: Van.TagFunc&Circular>}
+
+ type Circular = {
+ [K in Keys]: Circular&Func
+ };
+ }
+
+ const Gale:Gale.CreateSheet
+
+}
+