diff --git a/packages/engine/src/ui.html b/packages/engine/src/ui.html index c9655d9..dbbe060 100644 --- a/packages/engine/src/ui.html +++ b/packages/engine/src/ui.html @@ -4,7 +4,7 @@ OGraph UI - - + */var rp;function my(){if(rp)return Qa;rp=1;var n=Mi();function l(h,v){return h===v&&(h!==0||1/h===1/v)||h!==h&&v!==v}var o=typeof Object.is=="function"?Object.is:l,s=n.useSyncExternalStore,a=n.useRef,c=n.useEffect,f=n.useMemo,p=n.useDebugValue;return Qa.useSyncExternalStoreWithSelector=function(h,v,x,E,w){var b=a(null);if(b.current===null){var S={hasValue:!1,value:null};b.current=S}else S=b.current;b=f(function(){function j(A){if(!M){if(M=!0,I=A,A=E(A),w!==void 0&&S.hasValue){var H=S.value;if(w(H,A))return P=H}return P=A}if(H=P,o(I,A))return H;var J=E(A);return w!==void 0&&w(H,J)?(I=A,H):(I=A,P=J)}var M=!1,I,P,_=x===void 0?null:x;return[function(){return j(v())},_===null?void 0:function(){return j(_())}]},[v,x,E,w]);var C=s(h,b[0],b[1]);return c(function(){S.hasValue=!0,S.value=C},[C]),p(C),C},Qa}var op;function hy(){return op||(op=1,Ka.exports=my()),Ka.exports}var gy=hy();function je(n,l,o=bm){return gy.useSyncExternalStoreWithSelector(xe(s=>n.subscribe(vy,s)),xe(()=>n.state),xe(()=>n.state),xe(l),o)}function vy(n){return n}function Em(n,l){let o=y.useId(),s=Zo.get(l),[a,c]=je(s,y.useCallback(f=>[s.selectors.isTop(f,o),s.selectors.inStack(f,o)],[s,o]));return Le(()=>{if(n)return s.actions.push(o),()=>s.actions.pop(o)},[s,n,o]),n?c?a:!0:!1}let cu=new Map,Ho=new Map;function lp(n){var l;let o=(l=Ho.get(n))!=null?l:0;return Ho.set(n,o+1),o!==0?()=>ip(n):(cu.set(n,{"aria-hidden":n.getAttribute("aria-hidden"),inert:n.inert}),n.setAttribute("aria-hidden","true"),n.inert=!0,()=>ip(n))}function ip(n){var l;let o=(l=Ho.get(n))!=null?l:1;if(o===1?Ho.delete(n):Ho.set(n,o-1),o!==1)return;let s=cu.get(n);s&&(s["aria-hidden"]===null?n.removeAttribute("aria-hidden"):n.setAttribute("aria-hidden",s["aria-hidden"]),n.inert=s.inert,cu.delete(n))}function km(n,{allowed:l,disallowed:o}={}){let s=Em(n,"inert-others");Le(()=>{var a,c;if(!s)return;let f=gt();for(let h of(a=o?.())!=null?a:[])h&&f.add(lp(h));let p=(c=l?.())!=null?c:[];for(let h of p){if(!h)continue;let v=Go(h);if(!v)continue;let x=h.parentElement;for(;x&&x!==v.body;){for(let E of x.children)p.some(w=>E.contains(w))||f.add(lp(E));x=x.parentElement}}return f.dispose},[s,l,o])}function Cm(n,l,o){let s=Dn(a=>{let c=a.getBoundingClientRect();c.x===0&&c.y===0&&c.width===0&&c.height===0&&o()});y.useEffect(()=>{if(!n)return;let a=l===null?null:Gt(l)?l:l.current;if(!a)return;let c=gt();if(typeof ResizeObserver<"u"){let f=new ResizeObserver(()=>s.current(a));f.observe(a),c.add(()=>f.disconnect())}if(typeof IntersectionObserver<"u"){let f=new IntersectionObserver(()=>s.current(a));f.observe(a),c.add(()=>f.disconnect())}return()=>c.dispose()},[l,s,n])}let Oi=["[contentEditable=true]","[tabindex]","a[href]","area[href]","button:not([disabled])","iframe","input:not([disabled])","select:not([disabled])","details>summary","textarea:not([disabled])"].map(n=>`${n}:not([tabindex='-1'])`).join(","),yy=["[data-autofocus]"].map(n=>`${n}:not([tabindex='-1'])`).join(",");var du=(n=>(n[n.First=1]="First",n[n.Previous=2]="Previous",n[n.Next=4]="Next",n[n.Last=8]="Last",n[n.WrapAround=16]="WrapAround",n[n.NoScroll=32]="NoScroll",n[n.AutoFocus=64]="AutoFocus",n))(du||{}),xy=(n=>(n[n.Error=0]="Error",n[n.Overflow=1]="Overflow",n[n.Success=2]="Success",n[n.Underflow=3]="Underflow",n))(xy||{}),wy=(n=>(n[n.Previous=-1]="Previous",n[n.Next=1]="Next",n))(wy||{});function Nm(n=document.body){return n==null?[]:Array.from(n.querySelectorAll(Oi)).sort((l,o)=>Math.sign((l.tabIndex||Number.MAX_SAFE_INTEGER)-(o.tabIndex||Number.MAX_SAFE_INTEGER)))}function by(n=document.body){return n==null?[]:Array.from(n.querySelectorAll(yy)).sort((l,o)=>Math.sign((l.tabIndex||Number.MAX_SAFE_INTEGER)-(o.tabIndex||Number.MAX_SAFE_INTEGER)))}var ju=(n=>(n[n.Strict=0]="Strict",n[n.Loose=1]="Loose",n))(ju||{});function jm(n,l=0){var o;return n===((o=Go(n))==null?void 0:o.body)?!1:tt(l,{0(){return n.matches(Oi)},1(){let s=n;for(;s!==null;){if(s.matches(Oi))return!0;s=s.parentElement}return!1}})}var Sy=(n=>(n[n.Keyboard=0]="Keyboard",n[n.Mouse=1]="Mouse",n))(Sy||{});typeof window<"u"&&typeof document<"u"&&(document.addEventListener("keydown",n=>{n.metaKey||n.altKey||n.ctrlKey||(document.documentElement.dataset.headlessuiFocusVisible="")},!0),document.addEventListener("click",n=>{n.detail===1?delete document.documentElement.dataset.headlessuiFocusVisible:n.detail===0&&(document.documentElement.dataset.headlessuiFocusVisible="")},!0));let Ey=["textarea","input"].join(",");function ky(n){var l,o;return(o=(l=n?.matches)==null?void 0:l.call(n,Ey))!=null?o:!1}function Ou(n,l=o=>o){return n.slice().sort((o,s)=>{let a=l(o),c=l(s);if(a===null||c===null)return 0;let f=a.compareDocumentPosition(c);return f&Node.DOCUMENT_POSITION_FOLLOWING?-1:f&Node.DOCUMENT_POSITION_PRECEDING?1:0})}function Cy(n,l,o=n===null?document.body:Ni(n)){return Ny(Nm(o),l,{relativeTo:n})}function Ny(n,l,{sorted:o=!0,relativeTo:s=null,skipElements:a=[]}={}){let c=Array.isArray(n)?n.length>0?Ni(n[0]):document:Ni(n),f=Array.isArray(n)?o?Ou(n):n:l&64?by(n):Nm(n);a.length>0&&f.length>1&&(f=f.filter(b=>!a.some(S=>S!=null&&"current"in S?S?.current===b:S===b))),s=s??c?.activeElement;let p=(()=>{if(l&5)return 1;if(l&10)return-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),h=(()=>{if(l&1)return 0;if(l&2)return Math.max(0,f.indexOf(s))-1;if(l&4)return Math.max(0,f.indexOf(s))+1;if(l&8)return f.length-1;throw new Error("Missing Focus.First, Focus.Previous, Focus.Next or Focus.Last")})(),v=l&32?{preventScroll:!0}:{},x=0,E=f.length,w;do{if(x>=E||x+E<=0)return 0;let b=h+x;if(l&16)b=(b+E)%E;else{if(b<0)return 3;if(b>=E)return 1}w=f[b],w?.focus(v),x+=p}while(w!==Gp(w));return l&6&&ky(w)&&w.select(),2}function Om(){return/iPhone/gi.test(window.navigator.platform)||/Mac/gi.test(window.navigator.platform)&&window.navigator.maxTouchPoints>0}function jy(){return/Android/gi.test(window.navigator.userAgent)}function fu(){return Om()||jy()}function Fr(n,l,o,s){let a=Dn(o);y.useEffect(()=>{if(!n)return;function c(f){a.current(f)}return document.addEventListener(l,c,s),()=>document.removeEventListener(l,c,s)},[n,l,s])}function Oy(n,l,o,s){let a=Dn(o);y.useEffect(()=>{if(!n)return;function c(f){a.current(f)}return window.addEventListener(l,c,s),()=>window.removeEventListener(l,c,s)},[n,l,s])}const sp=30;function Pm(n,l,o){let s=Dn(o),a=y.useCallback(function(p,h){if(p.defaultPrevented)return;let v=h(p);if(v===null||!v.getRootNode().contains(v)||!v.isConnected)return;let x=(function E(w){return typeof w=="function"?E(w()):Array.isArray(w)||w instanceof Set?w:[w]})(l);for(let E of x)if(E!==null&&(E.contains(v)||p.composed&&p.composedPath().includes(E)))return;return!jm(v,ju.Loose)&&v.tabIndex!==-1&&p.preventDefault(),s.current(p,v)},[s,l]),c=y.useRef(null);Fr(n,"pointerdown",p=>{var h,v;fu()||(c.current=((v=(h=p.composedPath)==null?void 0:h.call(p))==null?void 0:v[0])||p.target)},!0),Fr(n,"pointerup",p=>{if(fu()||!c.current)return;let h=c.current;return c.current=null,a(p,()=>h)},!0);let f=y.useRef({x:0,y:0});Fr(n,"touchstart",p=>{f.current.x=p.touches[0].clientX,f.current.y=p.touches[0].clientY},!0),Fr(n,"touchend",p=>{let h={x:p.changedTouches[0].clientX,y:p.changedTouches[0].clientY};if(!(Math.abs(h.x-f.current.x)>=sp||Math.abs(h.y-f.current.y)>=sp))return a(p,()=>rr(p.target)?p.target:null)},!0),Oy(n,"blur",p=>a(p,()=>Fv(window.document.activeElement)?window.document.activeElement:null),!0)}function Uo(...n){return y.useMemo(()=>Go(...n),[...n])}var Py=(n=>(n[n.Ignore=0]="Ignore",n[n.Select=1]="Select",n[n.Close=2]="Close",n))(Py||{});const sn={Ignore:{kind:0},Select:n=>({kind:1,target:n}),Close:{kind:2}},Ty=200,ap=5;function Tm(n,{trigger:l,action:o,close:s,select:a}){let c=y.useRef(null),f=y.useRef(null),p=y.useRef(null);Fr(n&&l!==null,"pointerdown",h=>{am(h?.target)&&l!=null&&l.contains(h.target)&&(f.current=h.x,p.current=h.y,c.current=h.timeStamp)}),Fr(n&&l!==null,"pointerup",h=>{var v,x;let E=c.current;if(E===null||(c.current=null,!rr(h.target))||Math.abs(h.x-((v=f.current)!=null?v:h.x))Ty&&(a(w.target),s());break}case 2:{s();break}}},{capture:!0})}function Ry(n,l,o,s){let a=Dn(o);y.useEffect(()=>{n=n??window;function c(f){a.current(f)}return n.addEventListener(l,c,s),()=>n.removeEventListener(l,c,s)},[n,l,s])}function Rm(n){let l=y.useRef({value:"",selectionStart:null,selectionEnd:null});return Ry(n,"blur",o=>{let s=o.target;ji(s)&&(l.current={value:s.value,selectionStart:s.selectionStart,selectionEnd:s.selectionEnd})}),xe(()=>{if(!wu(n)&&ji(n)&&n.isConnected){if(n.focus({preventScroll:!0}),n.value!==l.current.value)n.setSelectionRange(n.value.length,n.value.length);else{let{selectionStart:o,selectionEnd:s}=l.current;o!==null&&s!==null&&n.setSelectionRange(o,s)}l.current={value:"",selectionStart:null,selectionEnd:null}}})}function $m(n,l){return y.useMemo(()=>{var o;if(n.type)return n.type;let s=(o=n.as)!=null?o:"button";if(typeof s=="string"&&s.toLowerCase()==="button"||l?.tagName==="BUTTON"&&!l.hasAttribute("type"))return"button"},[n.type,n.as,l])}function $y(n){return y.useSyncExternalStore(n.subscribe,n.getSnapshot,n.getSnapshot)}function My(n,l){let o=n(),s=new Set;return{getSnapshot(){return o},subscribe(a){return s.add(a),()=>s.delete(a)},dispatch(a,...c){let f=l[a].call(o,...c);f&&(o=f,s.forEach(p=>p()))}}}function _y(){let n;return{before({doc:l}){var o;let s=l.documentElement,a=(o=l.defaultView)!=null?o:window;n=Math.max(0,a.innerWidth-s.clientWidth)},after({doc:l,d:o}){let s=l.documentElement,a=Math.max(0,s.clientWidth-s.offsetWidth),c=Math.max(0,n-a);o.style(s,"paddingRight",`${c}px`)}}}function Ly(){return Om()?{before({doc:n,d:l,meta:o}){function s(a){for(let c of o().containers)for(let f of c())if(f.contains(a))return!0;return!1}l.microTask(()=>{var a;if(window.getComputedStyle(n.documentElement).scrollBehavior!=="auto"){let p=gt();p.style(n.documentElement,"scrollBehavior","auto"),l.add(()=>l.microTask(()=>p.dispose()))}let c=(a=window.scrollY)!=null?a:window.pageYOffset,f=null;l.addEventListener(n,"click",p=>{if(rr(p.target))try{let h=p.target.closest("a");if(!h)return;let{hash:v}=new URL(h.href),x=n.querySelector(v);rr(x)&&!s(x)&&(f=x)}catch{}},!0),l.group(p=>{l.addEventListener(n,"touchstart",h=>{if(p.dispose(),rr(h.target)&&Iv(h.target))if(s(h.target)){let v=h.target;for(;v.parentElement&&s(v.parentElement);)v=v.parentElement;p.style(v,"overscrollBehavior","contain")}else p.style(h.target,"touchAction","none")})}),l.addEventListener(n,"touchmove",p=>{if(rr(p.target)){if(ji(p.target))return;if(s(p.target)){let h=p.target;for(;h.parentElement&&h.dataset.headlessuiPortal!==""&&!(h.scrollHeight>h.clientHeight||h.scrollWidth>h.clientWidth);)h=h.parentElement;h.dataset.headlessuiPortal===""&&p.preventDefault()}else p.preventDefault()}},{passive:!1}),l.add(()=>{var p;let h=(p=window.scrollY)!=null?p:window.pageYOffset;c!==h&&window.scrollTo(0,c),f&&f.isConnected&&(f.scrollIntoView({block:"nearest"}),f=null)})})}}:{}}function Iy(){return{before({doc:n,d:l}){l.style(n.documentElement,"overflow","hidden")}}}function up(n){let l={};for(let o of n)Object.assign(l,o(l));return l}let or=My(()=>new Map,{PUSH(n,l){var o;let s=(o=this.get(n))!=null?o:{doc:n,count:0,d:gt(),meta:new Set,computedMeta:{}};return s.count++,s.meta.add(l),s.computedMeta=up(s.meta),this.set(n,s),this},POP(n,l){let o=this.get(n);return o&&(o.count--,o.meta.delete(l),o.computedMeta=up(o.meta)),this},SCROLL_PREVENT(n){let l={doc:n.doc,d:n.d,meta(){return n.computedMeta}},o=[Ly(),_y(),Iy()];o.forEach(({before:s})=>s?.(l)),o.forEach(({after:s})=>s?.(l))},SCROLL_ALLOW({d:n}){n.dispose()},TEARDOWN({doc:n}){this.delete(n)}});or.subscribe(()=>{let n=or.getSnapshot(),l=new Map;for(let[o]of n)l.set(o,o.documentElement.style.overflow);for(let o of n.values()){let s=l.get(o.doc)==="hidden",a=o.count!==0;(a&&!s||!a&&s)&&or.dispatch(o.count>0?"SCROLL_PREVENT":"SCROLL_ALLOW",o),o.count===0&&or.dispatch("TEARDOWN",o)}});function Fy(n,l,o=()=>({containers:[]})){let s=$y(or),a=l?s.get(l):void 0,c=a?a.count>0:!1;return Le(()=>{if(!(!l||!n))return or.dispatch("PUSH",l,o),()=>or.dispatch("POP",l,o)},[n,l]),c}function Mm(n,l,o=()=>[document.body]){let s=Em(n,"scroll-lock");Fy(s,l,a=>{var c;return{containers:[...(c=a.containers)!=null?c:[],o]}})}function cp(n){return[n.screenX,n.screenY]}function _m(){let n=y.useRef([-1,-1]);return{wasMoved(l){let o=cp(l);return n.current[0]===o[0]&&n.current[1]===o[1]?!1:(n.current=o,!0)},update(l){n.current=cp(l)}}}function Dy(n=0){let[l,o]=y.useState(n),s=y.useCallback(h=>o(h),[]),a=y.useCallback(h=>o(v=>v|h),[]),c=y.useCallback(h=>(l&h)===h,[l]),f=y.useCallback(h=>o(v=>v&~h),[]),p=y.useCallback(h=>o(v=>v^h),[]);return{flags:l,setFlag:s,addFlag:a,hasFlag:c,removeFlag:f,toggleFlag:p}}var Ay={},dp,fp;typeof process<"u"&&typeof globalThis<"u"&&typeof Element<"u"&&((dp=process==null?void 0:Ay)==null?void 0:dp.NODE_ENV)==="test"&&typeof((fp=Element?.prototype)==null?void 0:fp.getAnimations)>"u"&&(Element.prototype.getAnimations=function(){return console.warn(["Headless UI has polyfilled `Element.prototype.getAnimations` for your tests.","Please install a proper polyfill e.g. `jsdom-testing-mocks`, to silence these warnings.","","Example usage:","```js","import { mockAnimationsApi } from 'jsdom-testing-mocks'","mockAnimationsApi()","```"].join(` +`)),[]});var zy=(n=>(n[n.None=0]="None",n[n.Closed=1]="Closed",n[n.Enter=2]="Enter",n[n.Leave=4]="Leave",n))(zy||{});function Lm(n){let l={};for(let o in n)n[o]===!0&&(l[`data-${o}`]="");return l}function Im(n,l,o,s){let[a,c]=y.useState(o),{hasFlag:f,addFlag:p,removeFlag:h}=Dy(n&&a?3:0),v=y.useRef(!1),x=y.useRef(!1),E=cr();return Le(()=>{var w;if(n){if(o&&c(!0),!l){o&&p(3);return}return(w=void 0)==null||w.call(s,o),Wy(l,{inFlight:v,prepare(){x.current?x.current=!1:x.current=v.current,v.current=!0,!x.current&&(o?(p(3),h(4)):(p(4),h(2)))},run(){x.current?o?(h(3),p(4)):(h(4),p(3)):o?h(1):p(1)},done(){var b;x.current&&By(l)||(v.current=!1,h(7),o||c(!1),(b=void 0)==null||b.call(s,o))}})}},[n,o,l,E]),n?[a,{closed:f(1),enter:f(2),leave:f(4),transition:f(2)||f(4)}]:[o,{closed:void 0,enter:void 0,leave:void 0,transition:void 0}]}function Wy(n,{prepare:l,run:o,done:s,inFlight:a}){let c=gt();return Vy(n,{prepare:l,inFlight:a}),c.nextFrame(()=>{o(),c.requestAnimationFrame(()=>{c.add(Hy(n,s))})}),c.dispose}function Hy(n,l){var o,s;let a=gt();if(!n)return a.dispose;let c=!1;a.add(()=>{c=!0});let f=(s=(o=n.getAnimations)==null?void 0:o.call(n).filter(p=>p instanceof CSSTransition))!=null?s:[];return f.length===0?(l(),a.dispose):(Promise.allSettled(f.map(p=>p.finished)).then(()=>{c||l()}),a.dispose)}function Vy(n,{inFlight:l,prepare:o}){if(l!=null&&l.current){o();return}let s=n.style.transition;n.style.transition="none",o(),n.offsetHeight,n.style.transition=s}function By(n){var l,o;return((o=(l=n.getAnimations)==null?void 0:l.call(n))!=null?o:[]).some(s=>s instanceof CSSTransition&&s.playState!=="finished")}function Uy(n,{container:l,accept:o,walk:s}){let a=y.useRef(o),c=y.useRef(s);y.useEffect(()=>{a.current=o,c.current=s},[o,s]),Le(()=>{if(!l||!n)return;let f=Go(l);if(!f)return;let p=a.current,h=c.current,v=Object.assign(E=>p(E),{acceptNode:p}),x=f.createTreeWalker(l,NodeFilter.SHOW_ELEMENT,v,!1);for(;x.nextNode();)h(x.currentNode)},[l,n,a,c])}function pp(n,l){let o=y.useRef([]),s=xe(n);y.useEffect(()=>{let a=[...o.current];for(let[c,f]of l.entries())if(o.current[c]!==f){let p=s(l,a);return o.current=l,p}},[s,...l])}function Di(){return typeof window<"u"}function Ur(n){return Fm(n)?(n.nodeName||"").toLowerCase():"#document"}function Et(n){var l;return(n==null||(l=n.ownerDocument)==null?void 0:l.defaultView)||window}function qt(n){var l;return(l=(Fm(n)?n.ownerDocument:n.document)||window.document)==null?void 0:l.documentElement}function Fm(n){return Di()?n instanceof Node||n instanceof Et(n).Node:!1}function at(n){return Di()?n instanceof Element||n instanceof Et(n).Element:!1}function pn(n){return Di()?n instanceof HTMLElement||n instanceof Et(n).HTMLElement:!1}function mp(n){return!Di()||typeof ShadowRoot>"u"?!1:n instanceof ShadowRoot||n instanceof Et(n).ShadowRoot}function el(n){const{overflow:l,overflowX:o,overflowY:s,display:a}=zt(n);return/auto|scroll|overlay|hidden|clip/.test(l+s+o)&&a!=="inline"&&a!=="contents"}function Ky(n){return/^(table|td|th)$/.test(Ur(n))}function Ai(n){try{if(n.matches(":popover-open"))return!0}catch{}try{return n.matches(":modal")}catch{return!1}}const Qy=/transform|translate|scale|rotate|perspective|filter/,Yy=/paint|layout|strict|content/,Jn=n=>!!n&&n!=="none";let Ya;function Pu(n){const l=at(n)?zt(n):n;return Jn(l.transform)||Jn(l.translate)||Jn(l.scale)||Jn(l.rotate)||Jn(l.perspective)||!Tu()&&(Jn(l.backdropFilter)||Jn(l.filter))||Qy.test(l.willChange||"")||Yy.test(l.contain||"")}function Xy(n){let l=_n(n);for(;pn(l)&&!Hr(l);){if(Pu(l))return l;if(Ai(l))return null;l=_n(l)}return null}function Tu(){return Ya==null&&(Ya=typeof CSS<"u"&&CSS.supports&&CSS.supports("-webkit-backdrop-filter","none")),Ya}function Hr(n){return/^(html|body|#document)$/.test(Ur(n))}function zt(n){return Et(n).getComputedStyle(n)}function zi(n){return at(n)?{scrollLeft:n.scrollLeft,scrollTop:n.scrollTop}:{scrollLeft:n.scrollX,scrollTop:n.scrollY}}function _n(n){if(Ur(n)==="html")return n;const l=n.assignedSlot||n.parentNode||mp(n)&&n.host||qt(n);return mp(l)?l.host:l}function Dm(n){const l=_n(n);return Hr(l)?n.ownerDocument?n.ownerDocument.body:n.body:pn(l)&&el(l)?l:Dm(l)}function Ko(n,l,o){var s;l===void 0&&(l=[]),o===void 0&&(o=!0);const a=Dm(n),c=a===((s=n.ownerDocument)==null?void 0:s.body),f=Et(a);if(c){const p=pu(f);return l.concat(f,f.visualViewport||[],el(a)?a:[],p&&o?Ko(p):[])}else return l.concat(a,Ko(a,[],o))}function pu(n){return n.parent&&Object.getPrototypeOf(n.parent)?n.frameElement:null}function Gy(){const n=navigator.userAgentData;return n&&Array.isArray(n.brands)?n.brands.map(l=>{let{brand:o,version:s}=l;return o+"/"+s}).join(" "):navigator.userAgent}const sr=Math.min,Ze=Math.max,Qo=Math.round,vi=Math.floor,Yt=n=>({x:n,y:n}),qy={left:"right",right:"left",bottom:"top",top:"bottom"};function hp(n,l,o){return Ze(n,sr(l,o))}function Kr(n,l){return typeof n=="function"?n(l):n}function Ln(n){return n.split("-")[0]}function tl(n){return n.split("-")[1]}function Am(n){return n==="x"?"y":"x"}function zm(n){return n==="y"?"height":"width"}function un(n){const l=n[0];return l==="t"||l==="b"?"y":"x"}function Wm(n){return Am(un(n))}function Jy(n,l,o){o===void 0&&(o=!1);const s=tl(n),a=Wm(n),c=zm(a);let f=a==="x"?s===(o?"end":"start")?"right":"left":s==="start"?"bottom":"top";return l.reference[c]>l.floating[c]&&(f=Pi(f)),[f,Pi(f)]}function Zy(n){const l=Pi(n);return[mu(n),l,mu(l)]}function mu(n){return n.includes("start")?n.replace("start","end"):n.replace("end","start")}const gp=["left","right"],vp=["right","left"],ex=["top","bottom"],tx=["bottom","top"];function nx(n,l,o){switch(n){case"top":case"bottom":return o?l?vp:gp:l?gp:vp;case"left":case"right":return l?ex:tx;default:return[]}}function rx(n,l,o,s){const a=tl(n);let c=nx(Ln(n),o==="start",s);return a&&(c=c.map(f=>f+"-"+a),l&&(c=c.concat(c.map(mu)))),c}function Pi(n){const l=Ln(n);return qy[l]+n.slice(l.length)}function ox(n){return{top:0,right:0,bottom:0,left:0,...n}}function lx(n){return typeof n!="number"?ox(n):{top:n,right:n,bottom:n,left:n}}function Ti(n){const{x:l,y:o,width:s,height:a}=n;return{width:s,height:a,top:o,left:l,right:l+s,bottom:o+a,x:l,y:o}}function yp(n,l,o){let{reference:s,floating:a}=n;const c=un(l),f=Wm(l),p=zm(f),h=Ln(l),v=c==="y",x=s.x+s.width/2-a.width/2,E=s.y+s.height/2-a.height/2,w=s[p]/2-a[p]/2;let b;switch(h){case"top":b={x,y:s.y-a.height};break;case"bottom":b={x,y:s.y+s.height};break;case"right":b={x:s.x+s.width,y:E};break;case"left":b={x:s.x-a.width,y:E};break;default:b={x:s.x,y:s.y}}switch(tl(l)){case"start":b[f]-=w*(o&&v?-1:1);break;case"end":b[f]+=w*(o&&v?-1:1);break}return b}async function Hm(n,l){var o;l===void 0&&(l={});const{x:s,y:a,platform:c,rects:f,elements:p,strategy:h}=n,{boundary:v="clippingAncestors",rootBoundary:x="viewport",elementContext:E="floating",altBoundary:w=!1,padding:b=0}=Kr(l,n),S=lx(b),j=p[w?E==="floating"?"reference":"floating":E],M=Ti(await c.getClippingRect({element:(o=await(c.isElement==null?void 0:c.isElement(j)))==null||o?j:j.contextElement||await(c.getDocumentElement==null?void 0:c.getDocumentElement(p.floating)),boundary:v,rootBoundary:x,strategy:h})),I=E==="floating"?{x:s,y:a,width:f.floating.width,height:f.floating.height}:f.reference,P=await(c.getOffsetParent==null?void 0:c.getOffsetParent(p.floating)),_=await(c.isElement==null?void 0:c.isElement(P))?await(c.getScale==null?void 0:c.getScale(P))||{x:1,y:1}:{x:1,y:1},A=Ti(c.convertOffsetParentRelativeRectToViewportRelativeRect?await c.convertOffsetParentRelativeRectToViewportRelativeRect({elements:p,rect:I,offsetParent:P,strategy:h}):I);return{top:(M.top-A.top+S.top)/_.y,bottom:(A.bottom-M.bottom+S.bottom)/_.y,left:(M.left-A.left+S.left)/_.x,right:(A.right-M.right+S.right)/_.x}}const ix=50,sx=async(n,l,o)=>{const{placement:s="bottom",strategy:a="absolute",middleware:c=[],platform:f}=o,p=f.detectOverflow?f:{...f,detectOverflow:Hm},h=await(f.isRTL==null?void 0:f.isRTL(l));let v=await f.getElementRects({reference:n,floating:l,strategy:a}),{x,y:E}=yp(v,s,h),w=s,b=0;const S={};for(let C=0;Cae<=0)){var ce,B;const ae=(((ce=c.flip)==null?void 0:ce.index)||0)+1,X=J[ae];if(X&&(!(E==="alignment"?I!==un(X):!1)||q.every(D=>un(D.placement)===I?D.overflows[0]>0:!0)))return{data:{index:ae,overflows:q},reset:{placement:X}};let ue=(B=q.filter(ve=>ve.overflows[0]<=0).sort((ve,D)=>ve.overflows[1]-D.overflows[1])[0])==null?void 0:B.placement;if(!ue)switch(b){case"bestFit":{var se;const ve=(se=q.filter(D=>{if(H){const Y=un(D.placement);return Y===I||Y==="y"}return!0}).map(D=>[D.placement,D.overflows.filter(Y=>Y>0).reduce((Y,K)=>Y+K,0)]).sort((D,Y)=>D[1]-Y[1])[0])==null?void 0:se[0];ve&&(ue=ve);break}case"initialPlacement":ue=p;break}if(a!==ue)return{reset:{placement:ue}}}return{}}}},ux=new Set(["left","top"]);async function cx(n,l){const{placement:o,platform:s,elements:a}=n,c=await(s.isRTL==null?void 0:s.isRTL(a.floating)),f=Ln(o),p=tl(o),h=un(o)==="y",v=ux.has(f)?-1:1,x=c&&h?-1:1,E=Kr(l,n);let{mainAxis:w,crossAxis:b,alignmentAxis:S}=typeof E=="number"?{mainAxis:E,crossAxis:0,alignmentAxis:null}:{mainAxis:E.mainAxis||0,crossAxis:E.crossAxis||0,alignmentAxis:E.alignmentAxis};return p&&typeof S=="number"&&(b=p==="end"?S*-1:S),h?{x:b*x,y:w*v}:{x:w*v,y:b*x}}const dx=function(n){return n===void 0&&(n=0),{name:"offset",options:n,async fn(l){var o,s;const{x:a,y:c,placement:f,middlewareData:p}=l,h=await cx(l,n);return f===((o=p.offset)==null?void 0:o.placement)&&(s=p.arrow)!=null&&s.alignmentOffset?{}:{x:a+h.x,y:c+h.y,data:{...h,placement:f}}}}},fx=function(n){return n===void 0&&(n={}),{name:"shift",options:n,async fn(l){const{x:o,y:s,placement:a,platform:c}=l,{mainAxis:f=!0,crossAxis:p=!1,limiter:h={fn:M=>{let{x:I,y:P}=M;return{x:I,y:P}}},...v}=Kr(n,l),x={x:o,y:s},E=await c.detectOverflow(l,v),w=un(Ln(a)),b=Am(w);let S=x[b],C=x[w];if(f){const M=b==="y"?"top":"left",I=b==="y"?"bottom":"right",P=S+E[M],_=S-E[I];S=hp(P,S,_)}if(p){const M=w==="y"?"top":"left",I=w==="y"?"bottom":"right",P=C+E[M],_=C-E[I];C=hp(P,C,_)}const j=h.fn({...l,[b]:S,[w]:C});return{...j,data:{x:j.x-o,y:j.y-s,enabled:{[b]:f,[w]:p}}}}}},px=function(n){return n===void 0&&(n={}),{name:"size",options:n,async fn(l){var o,s;const{placement:a,rects:c,platform:f,elements:p}=l,{apply:h=()=>{},...v}=Kr(n,l),x=await f.detectOverflow(l,v),E=Ln(a),w=tl(a),b=un(a)==="y",{width:S,height:C}=c.floating;let j,M;E==="top"||E==="bottom"?(j=E,M=w===(await(f.isRTL==null?void 0:f.isRTL(p.floating))?"start":"end")?"left":"right"):(M=E,j=w==="end"?"top":"bottom");const I=C-x.top-x.bottom,P=S-x.left-x.right,_=sr(C-x[j],I),A=sr(S-x[M],P),H=!l.middlewareData.shift;let J=_,ee=A;if((o=l.middlewareData.shift)!=null&&o.enabled.x&&(ee=P),(s=l.middlewareData.shift)!=null&&s.enabled.y&&(J=I),H&&!w){const q=Ze(x.left,0),ce=Ze(x.right,0),B=Ze(x.top,0),se=Ze(x.bottom,0);b?ee=S-2*(q!==0||ce!==0?q+ce:Ze(x.left,x.right)):J=C-2*(B!==0||se!==0?B+se:Ze(x.top,x.bottom))}await h({...l,availableWidth:ee,availableHeight:J});const he=await f.getDimensions(p.floating);return S!==he.width||C!==he.height?{reset:{rects:!0}}:{}}}};function Vm(n){const l=zt(n);let o=parseFloat(l.width)||0,s=parseFloat(l.height)||0;const a=pn(n),c=a?n.offsetWidth:o,f=a?n.offsetHeight:s,p=Qo(o)!==c||Qo(s)!==f;return p&&(o=c,s=f),{width:o,height:s,$:p}}function Ru(n){return at(n)?n:n.contextElement}function zr(n){const l=Ru(n);if(!pn(l))return Yt(1);const o=l.getBoundingClientRect(),{width:s,height:a,$:c}=Vm(l);let f=(c?Qo(o.width):o.width)/s,p=(c?Qo(o.height):o.height)/a;return(!f||!Number.isFinite(f))&&(f=1),(!p||!Number.isFinite(p))&&(p=1),{x:f,y:p}}const mx=Yt(0);function Bm(n){const l=Et(n);return!Tu()||!l.visualViewport?mx:{x:l.visualViewport.offsetLeft,y:l.visualViewport.offsetTop}}function hx(n,l,o){return l===void 0&&(l=!1),!o||l&&o!==Et(n)?!1:l}function ar(n,l,o,s){l===void 0&&(l=!1),o===void 0&&(o=!1);const a=n.getBoundingClientRect(),c=Ru(n);let f=Yt(1);l&&(s?at(s)&&(f=zr(s)):f=zr(n));const p=hx(c,o,s)?Bm(c):Yt(0);let h=(a.left+p.x)/f.x,v=(a.top+p.y)/f.y,x=a.width/f.x,E=a.height/f.y;if(c){const w=Et(c),b=s&&at(s)?Et(s):s;let S=w,C=pu(S);for(;C&&s&&b!==S;){const j=zr(C),M=C.getBoundingClientRect(),I=zt(C),P=M.left+(C.clientLeft+parseFloat(I.paddingLeft))*j.x,_=M.top+(C.clientTop+parseFloat(I.paddingTop))*j.y;h*=j.x,v*=j.y,x*=j.x,E*=j.y,h+=P,v+=_,S=Et(C),C=pu(S)}}return Ti({width:x,height:E,x:h,y:v})}function Wi(n,l){const o=zi(n).scrollLeft;return l?l.left+o:ar(qt(n)).left+o}function Um(n,l){const o=n.getBoundingClientRect(),s=o.left+l.scrollLeft-Wi(n,o),a=o.top+l.scrollTop;return{x:s,y:a}}function gx(n){let{elements:l,rect:o,offsetParent:s,strategy:a}=n;const c=a==="fixed",f=qt(s),p=l?Ai(l.floating):!1;if(s===f||p&&c)return o;let h={scrollLeft:0,scrollTop:0},v=Yt(1);const x=Yt(0),E=pn(s);if((E||!E&&!c)&&((Ur(s)!=="body"||el(f))&&(h=zi(s)),E)){const b=ar(s);v=zr(s),x.x=b.x+s.clientLeft,x.y=b.y+s.clientTop}const w=f&&!E&&!c?Um(f,h):Yt(0);return{width:o.width*v.x,height:o.height*v.y,x:o.x*v.x-h.scrollLeft*v.x+x.x+w.x,y:o.y*v.y-h.scrollTop*v.y+x.y+w.y}}function vx(n){return Array.from(n.getClientRects())}function yx(n){const l=qt(n),o=zi(n),s=n.ownerDocument.body,a=Ze(l.scrollWidth,l.clientWidth,s.scrollWidth,s.clientWidth),c=Ze(l.scrollHeight,l.clientHeight,s.scrollHeight,s.clientHeight);let f=-o.scrollLeft+Wi(n);const p=-o.scrollTop;return zt(s).direction==="rtl"&&(f+=Ze(l.clientWidth,s.clientWidth)-a),{width:a,height:c,x:f,y:p}}const xp=25;function xx(n,l){const o=Et(n),s=qt(n),a=o.visualViewport;let c=s.clientWidth,f=s.clientHeight,p=0,h=0;if(a){c=a.width,f=a.height;const x=Tu();(!x||x&&l==="fixed")&&(p=a.offsetLeft,h=a.offsetTop)}const v=Wi(s);if(v<=0){const x=s.ownerDocument,E=x.body,w=getComputedStyle(E),b=x.compatMode==="CSS1Compat"&&parseFloat(w.marginLeft)+parseFloat(w.marginRight)||0,S=Math.abs(s.clientWidth-E.clientWidth-b);S<=xp&&(c-=S)}else v<=xp&&(c+=v);return{width:c,height:f,x:p,y:h}}function wx(n,l){const o=ar(n,!0,l==="fixed"),s=o.top+n.clientTop,a=o.left+n.clientLeft,c=pn(n)?zr(n):Yt(1),f=n.clientWidth*c.x,p=n.clientHeight*c.y,h=a*c.x,v=s*c.y;return{width:f,height:p,x:h,y:v}}function wp(n,l,o){let s;if(l==="viewport")s=xx(n,o);else if(l==="document")s=yx(qt(n));else if(at(l))s=wx(l,o);else{const a=Bm(n);s={x:l.x-a.x,y:l.y-a.y,width:l.width,height:l.height}}return Ti(s)}function Km(n,l){const o=_n(n);return o===l||!at(o)||Hr(o)?!1:zt(o).position==="fixed"||Km(o,l)}function bx(n,l){const o=l.get(n);if(o)return o;let s=Ko(n,[],!1).filter(p=>at(p)&&Ur(p)!=="body"),a=null;const c=zt(n).position==="fixed";let f=c?_n(n):n;for(;at(f)&&!Hr(f);){const p=zt(f),h=Pu(f);!h&&p.position==="fixed"&&(a=null),(c?!h&&!a:!h&&p.position==="static"&&!!a&&(a.position==="absolute"||a.position==="fixed")||el(f)&&!h&&Km(n,f))?s=s.filter(x=>x!==f):a=p,f=_n(f)}return l.set(n,s),s}function Sx(n){let{element:l,boundary:o,rootBoundary:s,strategy:a}=n;const f=[...o==="clippingAncestors"?Ai(l)?[]:bx(l,this._c):[].concat(o),s],p=wp(l,f[0],a);let h=p.top,v=p.right,x=p.bottom,E=p.left;for(let w=1;w{f(!1,1e-7)},1e3)}J===1&&!Ym(v,n.getBoundingClientRect())&&f(),_=!1}try{o=new IntersectionObserver(A,{...P,root:a.ownerDocument})}catch{o=new IntersectionObserver(A,P)}o.observe(n)}return f(!0),c}function Px(n,l,o,s){s===void 0&&(s={});const{ancestorScroll:a=!0,ancestorResize:c=!0,elementResize:f=typeof ResizeObserver=="function",layoutShift:p=typeof IntersectionObserver=="function",animationFrame:h=!1}=s,v=Ru(n),x=a||c?[...v?Ko(v):[],...l?Ko(l):[]]:[];x.forEach(M=>{a&&M.addEventListener("scroll",o,{passive:!0}),c&&M.addEventListener("resize",o)});const E=v&&p?Ox(v,o):null;let w=-1,b=null;f&&(b=new ResizeObserver(M=>{let[I]=M;I&&I.target===v&&b&&l&&(b.unobserve(l),cancelAnimationFrame(w),w=requestAnimationFrame(()=>{var P;(P=b)==null||P.observe(l)})),o()}),v&&!h&&b.observe(v),l&&b.observe(l));let S,C=h?ar(n):null;h&&j();function j(){const M=ar(n);C&&!Ym(C,M)&&o(),C=M,S=requestAnimationFrame(j)}return o(),()=>{var M;x.forEach(I=>{a&&I.removeEventListener("scroll",o),c&&I.removeEventListener("resize",o)}),E?.(),(M=b)==null||M.disconnect(),b=null,h&&cancelAnimationFrame(S)}}const Ga=Hm,Tx=dx,Rx=fx,$x=ax,Mx=px,_x=(n,l,o)=>{const s=new Map,a={platform:jx,...o},c={...a.platform,_c:s};return sx(n,l,{...a,platform:c})};var Lx=typeof document<"u",Ix=function(){},wi=Lx?y.useLayoutEffect:Ix;function Ri(n,l){if(n===l)return!0;if(typeof n!=typeof l)return!1;if(typeof n=="function"&&n.toString()===l.toString())return!0;let o,s,a;if(n&&l&&typeof n=="object"){if(Array.isArray(n)){if(o=n.length,o!==l.length)return!1;for(s=o;s--!==0;)if(!Ri(n[s],l[s]))return!1;return!0}if(a=Object.keys(n),o=a.length,o!==Object.keys(l).length)return!1;for(s=o;s--!==0;)if(!{}.hasOwnProperty.call(l,a[s]))return!1;for(s=o;s--!==0;){const c=a[s];if(!(c==="_owner"&&n.$$typeof)&&!Ri(n[c],l[c]))return!1}return!0}return n!==n&&l!==l}function Xm(n){return typeof window>"u"?1:(n.ownerDocument.defaultView||window).devicePixelRatio||1}function Sp(n,l){const o=Xm(n);return Math.round(l*o)/o}function qa(n){const l=y.useRef(n);return wi(()=>{l.current=n}),l}function Fx(n){n===void 0&&(n={});const{placement:l="bottom",strategy:o="absolute",middleware:s=[],platform:a,elements:{reference:c,floating:f}={},transform:p=!0,whileElementsMounted:h,open:v}=n,[x,E]=y.useState({x:0,y:0,strategy:o,placement:l,middlewareData:{},isPositioned:!1}),[w,b]=y.useState(s);Ri(w,s)||b(s);const[S,C]=y.useState(null),[j,M]=y.useState(null),I=y.useCallback(D=>{D!==H.current&&(H.current=D,C(D))},[]),P=y.useCallback(D=>{D!==J.current&&(J.current=D,M(D))},[]),_=c||S,A=f||j,H=y.useRef(null),J=y.useRef(null),ee=y.useRef(x),he=h!=null,q=qa(h),ce=qa(a),B=qa(v),se=y.useCallback(()=>{if(!H.current||!J.current)return;const D={placement:l,strategy:o,middleware:w};ce.current&&(D.platform=ce.current),_x(H.current,J.current,D).then(Y=>{const K={...Y,isPositioned:B.current!==!1};ae.current&&!Ri(ee.current,K)&&(ee.current=K,Ye.flushSync(()=>{E(K)}))})},[w,l,o,ce,B]);wi(()=>{v===!1&&ee.current.isPositioned&&(ee.current.isPositioned=!1,E(D=>({...D,isPositioned:!1})))},[v]);const ae=y.useRef(!1);wi(()=>(ae.current=!0,()=>{ae.current=!1}),[]),wi(()=>{if(_&&(H.current=_),A&&(J.current=A),_&&A){if(q.current)return q.current(_,A,se);se()}},[_,A,se,q,he]);const X=y.useMemo(()=>({reference:H,floating:J,setReference:I,setFloating:P}),[I,P]),ue=y.useMemo(()=>({reference:_,floating:A}),[_,A]),ve=y.useMemo(()=>{const D={position:o,left:0,top:0};if(!ue.floating)return D;const Y=Sp(ue.floating,x.x),K=Sp(ue.floating,x.y);return p?{...D,transform:"translate("+Y+"px, "+K+"px)",...Xm(ue.floating)>=1.5&&{willChange:"transform"}}:{position:o,left:Y,top:K}},[o,p,ue.floating,x.x,x.y]);return y.useMemo(()=>({...x,update:se,refs:X,elements:ue,floatingStyles:ve}),[x,se,X,ue,ve])}const Gm=(n,l)=>{const o=Tx(n);return{name:o.name,fn:o.fn,options:[n,l]}},Dx=(n,l)=>{const o=Rx(n);return{name:o.name,fn:o.fn,options:[n,l]}},Ax=(n,l)=>{const o=$x(n);return{name:o.name,fn:o.fn,options:[n,l]}},zx=(n,l)=>{const o=Mx(n);return{name:o.name,fn:o.fn,options:[n,l]}},qm={...ru},Wx=qm.useInsertionEffect,Hx=Wx||(n=>n());function Jm(n){const l=y.useRef(()=>{});return Hx(()=>{l.current=n}),y.useCallback(function(){for(var o=arguments.length,s=new Array(o),a=0;a"floating-ui-"+Math.random().toString(36).slice(2,6)+Vx++;function Bx(){const[n,l]=y.useState(()=>Ep?kp():void 0);return hu(()=>{n==null&&l(kp())},[]),y.useEffect(()=>{Ep=!0},[]),n}const Ux=qm.useId,Kx=Ux||Bx;function Qx(){const n=new Map;return{emit(l,o){var s;(s=n.get(l))==null||s.forEach(a=>a(o))},on(l,o){n.set(l,[...n.get(l)||[],o])},off(l,o){var s;n.set(l,((s=n.get(l))==null?void 0:s.filter(a=>a!==o))||[])}}}const Yx=y.createContext(null),Xx=y.createContext(null),Gx=()=>{var n;return((n=y.useContext(Yx))==null?void 0:n.id)||null},qx=()=>y.useContext(Xx),Jx="data-floating-ui-focusable";function Zx(n){const{open:l=!1,onOpenChange:o,elements:s}=n,a=Kx(),c=y.useRef({}),[f]=y.useState(()=>Qx()),p=Gx()!=null,[h,v]=y.useState(s.reference),x=Jm((b,S,C)=>{c.current.openEvent=b?S:void 0,f.emit("openchange",{open:b,event:S,reason:C,nested:p}),o?.(b,S,C)}),E=y.useMemo(()=>({setPositionReference:v}),[]),w=y.useMemo(()=>({reference:h||s.reference||null,floating:s.floating||null,domReference:s.reference}),[h,s.reference,s.floating]);return y.useMemo(()=>({dataRef:c,open:l,onOpenChange:x,elements:w,events:f,floatingId:a,refs:E}),[l,x,w,f,a,E])}function e1(n){n===void 0&&(n={});const{nodeId:l}=n,o=Zx({...n,elements:{reference:null,floating:null,...n.elements}}),s=n.rootContext||o,a=s.elements,[c,f]=y.useState(null),[p,h]=y.useState(null),x=a?.domReference||c,E=y.useRef(null),w=qx();hu(()=>{x&&(E.current=x)},[x]);const b=Fx({...n,elements:{...a,...p&&{reference:p}}}),S=y.useCallback(P=>{const _=at(P)?{getBoundingClientRect:()=>P.getBoundingClientRect(),contextElement:P}:P;h(_),b.refs.setReference(_)},[b.refs]),C=y.useCallback(P=>{(at(P)||P===null)&&(E.current=P,f(P)),(at(b.refs.reference.current)||b.refs.reference.current===null||P!==null&&!at(P))&&b.refs.setReference(P)},[b.refs]),j=y.useMemo(()=>({...b.refs,setReference:C,setPositionReference:S,domReference:E}),[b.refs,C,S]),M=y.useMemo(()=>({...b.elements,domReference:x}),[b.elements,x]),I=y.useMemo(()=>({...b,...s,refs:j,elements:M,nodeId:l}),[b,j,M,l,s]);return hu(()=>{s.dataRef.current.floatingContext=I;const P=w?.nodesRef.current.find(_=>_.id===l);P&&(P.context=I)}),y.useMemo(()=>({...b,context:I,refs:j,elements:M}),[b,j,M,I])}const Cp="active",Np="selected";function Ja(n,l,o){const s=new Map,a=o==="item";let c=n;if(a&&n){const{[Cp]:f,[Np]:p,...h}=n;c=h}return{...o==="floating"&&{tabIndex:-1,[Jx]:""},...c,...l.map(f=>{const p=f?f[o]:null;return typeof p=="function"?n?p(n):null:p}).concat(n).reduce((f,p)=>(p&&Object.entries(p).forEach(h=>{let[v,x]=h;if(!(a&&[Cp,Np].includes(v)))if(v.indexOf("on")===0){if(s.has(v)||s.set(v,[]),typeof x=="function"){var E;(E=s.get(v))==null||E.push(x),f[v]=function(){for(var w,b=arguments.length,S=new Array(b),C=0;Cj(...S)).find(j=>j!==void 0)}}}else f[v]=x}),f),{})}}function t1(n){n===void 0&&(n=[]);const l=n.map(p=>p?.reference),o=n.map(p=>p?.floating),s=n.map(p=>p?.item),a=y.useCallback(p=>Ja(p,n,"reference"),l),c=y.useCallback(p=>Ja(p,n,"floating"),o),f=y.useCallback(p=>Ja(p,n,"item"),s);return y.useMemo(()=>({getReferenceProps:a,getFloatingProps:c,getItemProps:f}),[a,c,f])}function jp(n,l){return{...n,rects:{...n.rects,floating:{...n.rects.floating,height:l}}}}const n1=n=>({name:"inner",options:n,async fn(l){const{listRef:o,overflowRef:s,onFallbackChange:a,offset:c=0,index:f=0,minItemsVisible:p=4,referenceOverflowThreshold:h=0,scrollRef:v,...x}=Kr(n,l),{rects:E,elements:{floating:w}}=l,b=o.current[f],S=v?.current||w,C=w.clientTop||S.clientTop,j=w.clientTop!==0,M=S.clientTop!==0,I=w===S;if(!b)return{};const P={...l,...await Gm(-b.offsetTop-w.clientTop-E.reference.height/2-b.offsetHeight/2-c).fn(l)},_=await Ga(jp(P,S.scrollHeight+C+w.clientTop),x),A=await Ga(P,{...x,elementContext:"reference"}),H=Ze(0,_.top),J=P.y+H,q=(S.scrollHeight>S.clientHeight?ce=>ce:Qo)(Ze(0,S.scrollHeight+(j&&I||M?C*2:0)-H-Ze(0,_.bottom)));if(S.style.maxHeight=q+"px",S.scrollTop=H,a){const ce=S.offsetHeight=-h||A.bottom>=-h;Ye.flushSync(()=>a(ce))}return s&&(s.current=await Ga(jp({...P,y:J},S.offsetHeight+C+w.clientTop),x)),{y:J}}});function r1(n,l){const{open:o,elements:s}=n,{enabled:a=!0,overflowRef:c,scrollRef:f,onChange:p}=l,h=Jm(p),v=y.useRef(!1),x=y.useRef(null),E=y.useRef(null);y.useEffect(()=>{if(!a)return;function b(C){if(C.ctrlKey||!S||c.current==null)return;const j=C.deltaY,M=c.current.top>=-.5,I=c.current.bottom>=-.5,P=S.scrollHeight-S.clientHeight,_=j<0?-1:1,A=j<0?"max":"min";S.scrollHeight<=S.clientHeight||(!M&&j>0||!I&&j<0?(C.preventDefault(),Ye.flushSync(()=>{h(H=>H+Math[A](j,P*_))})):/firefox/i.test(Gy())&&(S.scrollTop+=j))}const S=f?.current||s.floating;if(o&&S)return S.addEventListener("wheel",b),requestAnimationFrame(()=>{x.current=S.scrollTop,c.current!=null&&(E.current={...c.current})}),()=>{x.current=null,E.current=null,S.removeEventListener("wheel",b)}},[a,o,s.floating,c,f,h]);const w=y.useMemo(()=>({onKeyDown(){v.current=!0},onWheel(){v.current=!1},onPointerMove(){v.current=!1},onScroll(){const b=f?.current||s.floating;if(!(!c.current||!b||!v.current)){if(x.current!==null){const S=b.scrollTop-x.current;(c.current.bottom<-.5&&S<-1||c.current.top<-.5&&S>1)&&Ye.flushSync(()=>h(C=>C+S))}requestAnimationFrame(()=>{x.current=b.scrollTop})}}}),[s.floating,h,c,f]);return y.useMemo(()=>a?{floating:w}:{},[a,w])}let Qr=y.createContext({styles:void 0,setReference:()=>{},setFloating:()=>{},getReferenceProps:()=>({}),getFloatingProps:()=>({}),slot:{}});Qr.displayName="FloatingContext";let $u=y.createContext(null);$u.displayName="PlacementContext";function Zm(n){return y.useMemo(()=>n?typeof n=="string"?{to:n}:n:null,[n])}function eh(){return y.useContext(Qr).setReference}function o1(){return y.useContext(Qr).getReferenceProps}function th(){let{getFloatingProps:n,slot:l}=y.useContext(Qr);return y.useCallback((...o)=>Object.assign({},n(...o),{"data-anchor":l.anchor}),[n,l])}function nh(n=null){n===!1&&(n=null),typeof n=="string"&&(n={to:n});let l=y.useContext($u),o=y.useMemo(()=>n,[JSON.stringify(n,(a,c)=>{var f;return(f=c?.outerHTML)!=null?f:c})]);Le(()=>{l?.(o??null)},[l,o]);let s=y.useContext(Qr);return y.useMemo(()=>[s.setFloating,n?s.styles:{}],[s.setFloating,n,s.styles])}let Op=4;function rh({children:n,enabled:l=!0}){let[o,s]=y.useState(null),[a,c]=y.useState(0),f=y.useRef(null),[p,h]=y.useState(null);l1(p);let v=l&&o!==null&&p!==null,{to:x="bottom",gap:E=0,offset:w=0,padding:b=0,inner:S}=i1(o,p),[C,j="center"]=x.split(" ");Le(()=>{v&&c(0)},[v]);let{refs:M,floatingStyles:I,context:P}=e1({open:v,placement:C==="selection"?j==="center"?"bottom":`bottom-${j}`:j==="center"?`${C}`:`${C}-${j}`,strategy:"absolute",transform:!1,middleware:[Gm({mainAxis:C==="selection"?0:E,crossAxis:w}),Dx({padding:b}),C!=="selection"&&Ax({padding:b}),C==="selection"&&S?n1({...S,padding:b,overflowRef:f,offset:a,minItemsVisible:Op,referenceOverflowThreshold:b,onFallbackChange(ce){var B,se;if(!ce)return;let ae=P.elements.floating;if(!ae)return;let X=parseFloat(getComputedStyle(ae).scrollPaddingBottom)||0,ue=Math.min(Op,ae.childElementCount),ve=0,D=0;for(let Y of(se=(B=P.elements.floating)==null?void 0:B.childNodes)!=null?se:[])if(Gt(Y)){let K=Y.offsetTop,T=K+Y.clientHeight+X,R=ae.scrollTop,ne=R+ae.clientHeight;if(K>=R&&T<=ne)ue--;else{D=Math.max(0,Math.min(T,ne)-Math.max(K,R)),ve=Y.clientHeight;break}}ue>=1&&c(Y=>{let K=ve*ue-D+X;return Y>=K?Y:K})}}):null,zx({padding:b,apply({availableWidth:ce,availableHeight:B,elements:se}){Object.assign(se.floating.style,{overflow:"auto",maxWidth:`${ce}px`,maxHeight:`min(var(--anchor-max-height, 100vh), ${B}px)`})}})].filter(Boolean),whileElementsMounted:Px}),[_=C,A=j]=P.placement.split("-");C==="selection"&&(_="selection");let H=y.useMemo(()=>({anchor:[_,A].filter(Boolean).join(" ")}),[_,A]),J=r1(P,{overflowRef:f,onChange:c}),{getReferenceProps:ee,getFloatingProps:he}=t1([J]),q=xe(ce=>{h(ce),M.setFloating(ce)});return y.createElement($u.Provider,{value:s},y.createElement(Qr.Provider,{value:{setFloating:q,setReference:M.setReference,styles:I,getReferenceProps:ee,getFloatingProps:he,slot:H}},n))}function l1(n){Le(()=>{if(!n)return;let l=new MutationObserver(()=>{let o=window.getComputedStyle(n).maxHeight,s=parseFloat(o);if(isNaN(s))return;let a=parseInt(o);isNaN(a)||s!==a&&(n.style.maxHeight=`${Math.ceil(s)}px`)});return l.observe(n,{attributes:!0,attributeFilter:["style"]}),()=>{l.disconnect()}},[n])}function i1(n,l){var o,s,a;let c=Za((o=n?.gap)!=null?o:"var(--anchor-gap, 0)",l),f=Za((s=n?.offset)!=null?s:"var(--anchor-offset, 0)",l),p=Za((a=n?.padding)!=null?a:"var(--anchor-padding, 0)",l);return{...n,gap:c,offset:f,padding:p}}function Za(n,l,o=void 0){let s=cr(),a=xe((h,v)=>{if(h==null)return[o,null];if(typeof h=="number")return[h,null];if(typeof h=="string"){if(!v)return[o,null];let x=Pp(h,v);return[x,E=>{let w=oh(h);{let b=w.map(S=>window.getComputedStyle(v).getPropertyValue(S));s.requestAnimationFrame(function S(){s.nextFrame(S);let C=!1;for(let[M,I]of w.entries()){let P=window.getComputedStyle(v).getPropertyValue(I);if(b[M]!==P){b[M]=P,C=!0;break}}if(!C)return;let j=Pp(h,v);x!==j&&(E(j),x=j)})}return s.dispose}]}return[o,null]}),c=y.useMemo(()=>a(n,l)[0],[n,l]),[f=c,p]=y.useState();return Le(()=>{let[h,v]=a(n,l);if(p(h),!!v)return v(p)},[n,l]),f}function oh(n){let l=/var\((.*)\)/.exec(n);if(l){let o=l[1].indexOf(",");if(o===-1)return[l[1]];let s=l[1].slice(0,o).trim(),a=l[1].slice(o+1).trim();return a?[s,...oh(a)]:[s]}return[]}function Pp(n,l){let o=document.createElement("div");l.appendChild(o),o.style.setProperty("margin-top","0px","important"),o.style.setProperty("margin-top",n,"important");let s=parseFloat(window.getComputedStyle(o).marginTop)||0;return l.removeChild(o),s}function s1({children:n,freeze:l},o){let s=$i(l,n);return y.isValidElement(s)?y.cloneElement(s,{ref:o}):ye.createElement(ye.Fragment,null,s)}const a1=ye.forwardRef(s1);function $i(n,l){let[o,s]=y.useState(l);return!n&&o!==l&&s(l),n?o:l}let Mu=y.createContext(null);Mu.displayName="OpenClosedContext";var dn=(n=>(n[n.Open=1]="Open",n[n.Closed=2]="Closed",n[n.Closing=4]="Closing",n[n.Opening=8]="Opening",n))(dn||{});function lh(){return y.useContext(Mu)}function ih({value:n,children:l}){return ye.createElement(Mu.Provider,{value:n},l)}function u1(n){function l(){document.readyState!=="loading"&&(n(),document.removeEventListener("DOMContentLoaded",l))}typeof window<"u"&&typeof document<"u"&&(document.addEventListener("DOMContentLoaded",l),l())}let er=[];u1(()=>{function n(l){if(!rr(l.target)||l.target===document.body||er[0]===l.target)return;let o=l.target;o=o.closest(Oi),er.unshift(o??l.target),er=er.filter(s=>s!=null&&s.isConnected),er.splice(10)}window.addEventListener("click",n,{capture:!0}),window.addEventListener("mousedown",n,{capture:!0}),window.addEventListener("focus",n,{capture:!0}),document.body.addEventListener("click",n,{capture:!0}),document.body.addEventListener("mousedown",n,{capture:!0}),document.body.addEventListener("focus",n,{capture:!0})});function c1(n){throw new Error("Unexpected object: "+n)}var we=(n=>(n[n.First=0]="First",n[n.Previous=1]="Previous",n[n.Next=2]="Next",n[n.Last=3]="Last",n[n.Specific=4]="Specific",n[n.Nothing=5]="Nothing",n))(we||{});function Dr(n,l){let o=l.resolveItems();if(o.length<=0)return null;let s=l.resolveActiveIndex(),a=s??-1;switch(n.focus){case 0:{for(let c=0;c=0;--c)if(!l.resolveDisabled(o[c],c,o))return c;return s}case 2:{for(let c=a+1;c=0;--c)if(!l.resolveDisabled(o[c],c,o))return c;return s}case 4:{for(let c=0;c(o.current=!1,()=>{o.current=!0,qp(()=>{o.current&&l()})}),[l])}function d1(){let n=typeof document>"u";return"useSyncExternalStore"in ru?(l=>l.useSyncExternalStore)(ru)(()=>()=>{},()=>!1,()=>!n):!1}function f1(){let n=d1(),[l,o]=y.useState(Qt.isHandoffComplete);return l&&Qt.isHandoffComplete===!1&&o(!1),y.useEffect(()=>{l!==!0&&o(!0)},[l]),y.useEffect(()=>Qt.handoff(),[]),n?!1:l}let p1=y.createContext(!1);function m1(){return y.useContext(p1)}function h1(n){let l=m1(),o=y.useContext(ah),[s,a]=y.useState(()=>{var c;if(!l&&o!==null)return(c=o.current)!=null?c:null;if(Qt.isServer)return null;let f=n?.getElementById("headlessui-portal-root");if(f)return f;if(n===null)return null;let p=n.createElement("div");return p.setAttribute("id","headlessui-portal-root"),n.body.appendChild(p)});return y.useEffect(()=>{s!==null&&(n!=null&&n.body.contains(s)||n==null||n.body.appendChild(s))},[s,n]),y.useEffect(()=>{l||o!==null&&a(o.current)},[o,a,l]),s}let sh=y.Fragment,g1=rt(function(n,l){let{ownerDocument:o=null,...s}=n,a=y.useRef(null),c=vt(Wv(b=>{a.current=b}),l),f=Uo(a.current),p=o??f,h=h1(p),v=y.useContext(w1),x=cr(),E=f1(),w=nt();return _u(()=>{var b;h&&h.childNodes.length<=0&&((b=h.parentElement)==null||b.removeChild(h))}),!h||!E?null:Ye.createPortal(ye.createElement("div",{"data-headlessui-portal":"",ref:b=>{x.dispose(),v&&b&&x.add(v.register(b))}},w({ourProps:{ref:c},theirProps:s,slot:{},defaultTag:sh,name:"Portal"})),h)});function v1(n,l){let o=vt(l),{enabled:s=!0,ownerDocument:a,...c}=n,f=nt();return s?ye.createElement(g1,{...c,ownerDocument:a,ref:o}):f({ourProps:{ref:o},theirProps:c,slot:{},defaultTag:sh,name:"Portal"})}let y1=y.Fragment,ah=y.createContext(null);function x1(n,l){let{target:o,...s}=n,a={ref:vt(l)},c=nt();return ye.createElement(ah.Provider,{value:o},c({ourProps:a,theirProps:s,defaultTag:y1,name:"Popover.Group"}))}let w1=y.createContext(null),b1=rt(v1),S1=rt(x1),uh=Object.assign(b1,{Group:S1});const cn={Idle:{kind:"Idle"},Tracked:n=>({kind:"Tracked",position:n}),Moved:{kind:"Moved"}};function Lu(n){let l=n.getBoundingClientRect();return`${l.x},${l.y}`}function ch(n,l,o){let s=gt();if(l.kind==="Tracked"){let a=function(){c!==Lu(n)&&(s.dispose(),o())},{position:c}=l,f=new ResizeObserver(a);f.observe(n),s.add(()=>f.disconnect()),s.addEventListener(window,"scroll",a,{passive:!0}),s.addEventListener(window,"resize",a)}return()=>s.dispose()}var E1=Object.defineProperty,k1=(n,l,o)=>l in n?E1(n,l,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[l]=o,Tp=(n,l,o)=>(k1(n,typeof l!="symbol"?l+"":l,o),o),Se=(n=>(n[n.Open=0]="Open",n[n.Closed=1]="Closed",n))(Se||{}),St=(n=>(n[n.Single=0]="Single",n[n.Multi=1]="Multi",n))(St||{}),Xt=(n=>(n[n.Pointer=0]="Pointer",n[n.Focus=1]="Focus",n[n.Other=2]="Other",n))(Xt||{}),dh=(n=>(n[n.OpenCombobox=0]="OpenCombobox",n[n.CloseCombobox=1]="CloseCombobox",n[n.GoToOption=2]="GoToOption",n[n.SetTyping=3]="SetTyping",n[n.RegisterOption=4]="RegisterOption",n[n.UnregisterOption=5]="UnregisterOption",n[n.DefaultToFirstOption=6]="DefaultToFirstOption",n[n.SetActivationTrigger=7]="SetActivationTrigger",n[n.UpdateVirtualConfiguration=8]="UpdateVirtualConfiguration",n[n.SetInputElement=9]="SetInputElement",n[n.SetButtonElement=10]="SetButtonElement",n[n.SetOptionsElement=11]="SetOptionsElement",n[n.MarkInputAsMoved=12]="MarkInputAsMoved",n))(dh||{});function eu(n,l=o=>o){let o=n.activeOptionIndex!==null?n.options[n.activeOptionIndex]:null,s=l(n.options.slice()),a=s.length>0&&s[0].dataRef.current.order!==null?s.sort((f,p)=>f.dataRef.current.order-p.dataRef.current.order):Ou(s,f=>f.dataRef.current.domRef.current),c=o?a.indexOf(o):null;return c===-1&&(c=null),{options:a,activeOptionIndex:c}}let C1={1(n){var l;if((l=n.dataRef.current)!=null&&l.disabled||n.comboboxState===1)return n;let o=n.inputElement?cn.Tracked(Lu(n.inputElement)):n.inputPositionState;return{...n,activeOptionIndex:null,comboboxState:1,isTyping:!1,activationTrigger:2,inputPositionState:o,__demoMode:!1}},0(n){var l,o;if((l=n.dataRef.current)!=null&&l.disabled||n.comboboxState===0)return n;if((o=n.dataRef.current)!=null&&o.value){let s=n.dataRef.current.calculateIndex(n.dataRef.current.value);if(s!==-1)return{...n,activeOptionIndex:s,comboboxState:0,__demoMode:!1,inputPositionState:cn.Idle}}return{...n,comboboxState:0,inputPositionState:cn.Idle,__demoMode:!1}},3(n,l){return n.isTyping===l.isTyping?n:{...n,isTyping:l.isTyping}},2(n,l){var o,s,a,c;if((o=n.dataRef.current)!=null&&o.disabled||n.optionsElement&&!((s=n.dataRef.current)!=null&&s.optionsPropsRef.current.static)&&n.comboboxState===1)return n;if(n.virtual){let{options:v,disabled:x}=n.virtual,E=l.focus===we.Specific?l.idx:Dr(l,{resolveItems:()=>v,resolveActiveIndex:()=>{var b,S;return(S=(b=n.activeOptionIndex)!=null?b:v.findIndex(C=>!x(C)))!=null?S:null},resolveDisabled:x,resolveId(){throw new Error("Function not implemented.")}}),w=(a=l.trigger)!=null?a:2;return n.activeOptionIndex===E&&n.activationTrigger===w?n:{...n,activeOptionIndex:E,activationTrigger:w,isTyping:!1,__demoMode:!1}}let f=eu(n);if(f.activeOptionIndex===null){let v=f.options.findIndex(x=>!x.dataRef.current.disabled);v!==-1&&(f.activeOptionIndex=v)}let p=l.focus===we.Specific?l.idx:Dr(l,{resolveItems:()=>f.options,resolveActiveIndex:()=>f.activeOptionIndex,resolveId:v=>v.id,resolveDisabled:v=>v.dataRef.current.disabled}),h=(c=l.trigger)!=null?c:2;return n.activeOptionIndex===p&&n.activationTrigger===h?n:{...n,...f,isTyping:!1,activeOptionIndex:p,activationTrigger:h,__demoMode:!1}},4:(n,l)=>{var o,s,a,c;if((o=n.dataRef.current)!=null&&o.virtual)return{...n,options:[...n.options,l.payload]};let f=l.payload,p=eu(n,v=>(v.push(f),v));n.activeOptionIndex===null&&(a=(s=n.dataRef.current).isSelected)!=null&&a.call(s,l.payload.dataRef.current.value)&&(p.activeOptionIndex=p.options.indexOf(f));let h={...n,...p,activationTrigger:2};return(c=n.dataRef.current)!=null&&c.__demoMode&&n.dataRef.current.value===void 0&&(h.activeOptionIndex=0),h},5:(n,l)=>{var o;if((o=n.dataRef.current)!=null&&o.virtual)return{...n,options:n.options.filter(a=>a.id!==l.id)};let s=eu(n,a=>{let c=a.findIndex(f=>f.id===l.id);return c!==-1&&a.splice(c,1),a});return{...n,...s,activationTrigger:2}},6:(n,l)=>n.defaultToFirstOption===l.value?n:{...n,defaultToFirstOption:l.value},7:(n,l)=>n.activationTrigger===l.trigger?n:{...n,activationTrigger:l.trigger},8:(n,l)=>{var o,s;if(n.virtual===null)return{...n,virtual:{options:l.options,disabled:(o=l.disabled)!=null?o:()=>!1}};if(n.virtual.options===l.options&&n.virtual.disabled===l.disabled)return n;let a=n.activeOptionIndex;if(n.activeOptionIndex!==null){let c=l.options.indexOf(n.virtual.options[n.activeOptionIndex]);c!==-1?a=c:a=null}return{...n,activeOptionIndex:a,virtual:{options:l.options,disabled:(s=l.disabled)!=null?s:()=>!1}}},9:(n,l)=>n.inputElement===l.element?n:{...n,inputElement:l.element},10:(n,l)=>n.buttonElement===l.element?n:{...n,buttonElement:l.element},11:(n,l)=>n.optionsElement===l.element?n:{...n,optionsElement:l.element},12(n){return n.inputPositionState.kind!=="Tracked"?n:{...n,inputPositionState:cn.Moved}}},N1=class fh extends Cu{constructor(l){super(l),Tp(this,"actions",{onChange:o=>{let{onChange:s,compare:a,mode:c,value:f}=this.state.dataRef.current;return tt(c,{0:()=>s?.(o),1:()=>{let p=f.slice(),h=p.findIndex(v=>a(v,o));return h===-1?p.push(o):p.splice(h,1),s?.(p)}})},registerOption:(o,s)=>(this.send({type:4,payload:{id:o,dataRef:s}}),()=>{this.state.activeOptionIndex===this.state.dataRef.current.calculateIndex(s.current.value)&&this.send({type:6,value:!0}),this.send({type:5,id:o})}),goToOption:(o,s)=>(this.send({type:6,value:!1}),this.send({type:2,...o,trigger:s})),setIsTyping:o=>{this.send({type:3,isTyping:o})},closeCombobox:()=>{var o,s;this.send({type:1}),this.send({type:6,value:!1}),(s=(o=this.state.dataRef.current).onClose)==null||s.call(o)},openCombobox:()=>{this.send({type:0}),this.send({type:6,value:!0})},setActivationTrigger:o=>{this.send({type:7,trigger:o})},selectActiveOption:()=>{let o=this.selectors.activeOptionIndex(this.state);if(o!==null){if(this.actions.setIsTyping(!1),this.state.virtual)this.actions.onChange(this.state.virtual.options[o]);else{let{dataRef:s}=this.state.options[o];this.actions.onChange(s.current.value)}this.actions.goToOption({focus:we.Specific,idx:o})}},setInputElement:o=>{this.send({type:9,element:o})},setButtonElement:o=>{this.send({type:10,element:o})},setOptionsElement:o=>{this.send({type:11,element:o})}}),Tp(this,"selectors",{activeDescendantId:o=>{var s,a;let c=this.selectors.activeOptionIndex(o);if(c!==null)return o.virtual?(a=o.options.find(f=>!f.dataRef.current.disabled&&o.dataRef.current.compare(f.dataRef.current.value,o.virtual.options[c])))==null?void 0:a.id:(s=o.options[c])==null?void 0:s.id},activeOptionIndex:o=>{if(o.defaultToFirstOption&&o.activeOptionIndex===null&&(o.virtual?o.virtual.options.length>0:o.options.length>0)){if(o.virtual){let{options:a,disabled:c}=o.virtual,f=a.findIndex(p=>{var h;return!((h=c?.(p))!=null&&h)});if(f!==-1)return f}let s=o.options.findIndex(a=>!a.dataRef.current.disabled);if(s!==-1)return s}return o.activeOptionIndex},activeOption:o=>{var s,a;let c=this.selectors.activeOptionIndex(o);return c===null?null:o.virtual?o.virtual.options[c??0]:(a=(s=o.options[c])==null?void 0:s.dataRef.current.value)!=null?a:null},isActive:(o,s,a)=>{var c;let f=this.selectors.activeOptionIndex(o);return f===null?!1:o.virtual?f===o.dataRef.current.calculateIndex(s):((c=o.options[f])==null?void 0:c.id)===a},shouldScrollIntoView:(o,s,a)=>!(o.virtual||o.__demoMode||o.comboboxState!==0||o.activationTrigger===0||!this.selectors.isActive(o,s,a)),didInputMove(o){return o.inputPositionState.kind==="Moved"}});{let o=this.state.id,s=Zo.get(null);this.disposables.add(s.on(Nu.Push,a=>{!s.selectors.isTop(a,o)&&this.state.comboboxState===0&&this.actions.closeCombobox()})),this.on(0,()=>s.actions.push(o)),this.on(1,()=>s.actions.pop(o))}this.disposables.group(o=>{this.on(1,s=>{s.inputElement&&(o.dispose(),o.add(ch(s.inputElement,s.inputPositionState,()=>{this.send({type:12})})))})})}static new({id:l,virtual:o=null,__demoMode:s=!1}){var a;return new fh({id:l,dataRef:{current:{}},comboboxState:s?0:1,isTyping:!1,options:[],virtual:o?{options:o.options,disabled:(a=o.disabled)!=null?a:()=>!1}:null,activeOptionIndex:null,activationTrigger:2,inputElement:null,buttonElement:null,optionsElement:null,__demoMode:s,inputPositionState:cn.Idle})}reduce(l,o){return tt(o.type,C1,l,o)}};const ph=y.createContext(null);function nl(n){let l=y.useContext(ph);if(l===null){let o=new Error(`<${n} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(o,mh),o}return l}function mh({id:n,virtual:l=null,__demoMode:o=!1}){let s=y.useMemo(()=>N1.new({id:n,virtual:l,__demoMode:o}),[]);return _u(()=>s.dispose()),s}let Yo=y.createContext(null);Yo.displayName="ComboboxDataContext";function Yr(n){let l=y.useContext(Yo);if(l===null){let o=new Error(`<${n} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(o,Yr),o}return l}let hh=y.createContext(null);function j1(n){let l=nl("VirtualProvider"),o=Yr("VirtualProvider"),{options:s}=o.virtual,a=je(l,b=>b.optionsElement),[c,f]=y.useMemo(()=>{let b=a;if(!b)return[0,0];let S=window.getComputedStyle(b);return[parseFloat(S.paddingBlockStart||S.paddingTop),parseFloat(S.paddingBlockEnd||S.paddingBottom)]},[a]),p=ly({enabled:s.length!==0,scrollPaddingStart:c,scrollPaddingEnd:f,count:s.length,estimateSize(){return 40},getScrollElement(){return l.state.optionsElement},overscan:12}),[h,v]=y.useState(0);Le(()=>{v(b=>b+1)},[s]);let x=p.getVirtualItems(),E=je(l,b=>b.activationTrigger===Xt.Pointer),w=je(l,l.selectors.activeOptionIndex);return x.length===0?null:ye.createElement(hh.Provider,{value:p},ye.createElement("div",{style:{position:"relative",width:"100%",height:`${p.getTotalSize()}px`},ref:b=>{b&&(E||w!==null&&s.length>w&&p.scrollToIndex(w))}},x.map(b=>{var S;return ye.createElement(y.Fragment,{key:b.key},ye.cloneElement((S=n.children)==null?void 0:S.call(n,{...n.slot,option:s[b.index]}),{key:`${h}-${b.key}`,"data-index":b.index,"aria-setsize":s.length,"aria-posinset":b.index+1,style:{position:"absolute",top:0,left:0,transform:`translateY(${b.start}px)`,overflowAnchor:"none"}}))})))}let O1=y.Fragment;function P1(n,l){let o=y.useId(),s=Li(),{value:a,defaultValue:c,onChange:f,form:p,name:h,by:v,invalid:x=!1,disabled:E=s||!1,onClose:w,__demoMode:b=!1,multiple:S=!1,immediate:C=!1,virtual:j=null,nullable:M,...I}=n,P=nm(c),[_=S?[]:void 0,A]=tm(a,f,P),H=mh({id:o,virtual:j,__demoMode:b}),J=y.useRef({static:!1,hold:!1}),ee=vm(v),he=xe(le=>j?v===null?j.options.indexOf(le):j.options.findIndex(Ee=>ee(Ee,le)):H.state.options.findIndex(Ee=>ee(Ee.dataRef.current.value,le))),q=y.useCallback(le=>tt(se.mode,{[St.Multi]:()=>_.some(Ee=>ee(Ee,le)),[St.Single]:()=>ee(_,le)}),[_]),ce=je(H,le=>le.virtual),B=xe(()=>w?.()),se=y.useMemo(()=>({__demoMode:b,immediate:C,optionsPropsRef:J,value:_,defaultValue:P,disabled:E,invalid:x,mode:S?St.Multi:St.Single,virtual:j?ce:null,onChange:A,isSelected:q,calculateIndex:he,compare:ee,onClose:B}),[b,C,J,_,P,E,x,S,j,ce,A,q,he,ee,B]);Le(()=>{var le;j&&H.send({type:dh.UpdateVirtualConfiguration,options:j.options,disabled:(le=j.disabled)!=null?le:null})},[j,j?.options,j?.disabled]),Le(()=>{H.state.dataRef.current=se},[se]);let[ae,X,ue,ve]=je(H,le=>[le.comboboxState,le.buttonElement,le.inputElement,le.optionsElement]),D=Zo.get(null),Y=je(D,y.useCallback(le=>D.selectors.isTop(le,o),[D,o]));Pm(Y,[X,ue,ve],()=>H.actions.closeCombobox());let K=je(H,H.selectors.activeOptionIndex),T=je(H,H.selectors.activeOption),R=kt({open:ae===Se.Open,disabled:E,invalid:x,activeIndex:K,activeOption:T,value:_}),[ne,oe]=mm(),pe=l===null?{}:{ref:l},U=y.useCallback(()=>{if(P!==void 0)return A?.(P)},[A,P]),me=nt();return ye.createElement(oe,{value:ne,props:{htmlFor:ue?.id},slot:{open:ae===Se.Open,disabled:E}},ye.createElement(rh,null,ye.createElement(Yo.Provider,{value:se},ye.createElement(ph.Provider,{value:H},ye.createElement(ih,{value:tt(ae,{[Se.Open]:dn.Open,[Se.Closed]:dn.Closed})},h!=null&&ye.createElement(sm,{disabled:E,data:_!=null?{[h]:_}:{},form:p,onReset:U}),me({ourProps:pe,theirProps:I,slot:R,defaultTag:O1,name:"Combobox"}))))))}let T1="input";function R1(n,l){var o,s;let a=nl("Combobox.Input"),c=Yr("Combobox.Input"),f=y.useId(),p=Su(),{id:h=p||`headlessui-combobox-input-${f}`,onChange:v,displayValue:x,disabled:E=c.disabled||!1,autoFocus:w=!1,type:b="text",...S}=n,C=y.useRef(null),j=vt(C,l,eh(),a.actions.setInputElement),[M,I]=je(a,R=>[R.comboboxState,R.isTyping]),P=cr(),_=xe(()=>{a.actions.onChange(null),a.state.optionsElement&&(a.state.optionsElement.scrollTop=0),a.actions.goToOption({focus:we.Nothing})}),A=y.useMemo(()=>{var R;return typeof x=="function"&&c.value!==void 0?(R=x(c.value))!=null?R:"":typeof c.value=="string"?c.value:""},[c.value,x]);pp(([R,ne],[oe,pe])=>{if(a.state.isTyping)return;let U=C.current;U&&((pe===Se.Open&&ne===Se.Closed||R!==oe)&&(U.value=R),requestAnimationFrame(()=>{if(a.state.isTyping||!U||wu(U))return;let{selectionStart:me,selectionEnd:le}=U;Math.abs((le??0)-(me??0))===0&&me===0&&U.setSelectionRange(U.value.length,U.value.length)}))},[A,M,I]),pp(([R],[ne])=>{if(R===Se.Open&&ne===Se.Closed){if(a.state.isTyping)return;let oe=C.current;if(!oe)return;let pe=oe.value,{selectionStart:U,selectionEnd:me,selectionDirection:le}=oe;oe.value="",oe.value=pe,le!==null?oe.setSelectionRange(U,me,le):oe.setSelectionRange(U,me)}},[M]);let H=y.useRef(!1),J=xe(()=>{H.current=!0}),ee=xe(()=>{P.nextFrame(()=>{H.current=!1})}),he=xe(R=>{switch(a.actions.setIsTyping(!0),R.key){case Ne.Enter:if(a.state.comboboxState!==Se.Open||H.current)return;if(R.preventDefault(),R.stopPropagation(),a.selectors.activeOptionIndex(a.state)===null){a.actions.closeCombobox();return}a.actions.selectActiveOption(),c.mode===St.Single&&a.actions.closeCombobox();break;case Ne.ArrowDown:return R.preventDefault(),R.stopPropagation(),tt(a.state.comboboxState,{[Se.Open]:()=>a.actions.goToOption({focus:we.Next}),[Se.Closed]:()=>a.actions.openCombobox()});case Ne.ArrowUp:return R.preventDefault(),R.stopPropagation(),tt(a.state.comboboxState,{[Se.Open]:()=>a.actions.goToOption({focus:we.Previous}),[Se.Closed]:()=>{Ye.flushSync(()=>a.actions.openCombobox()),c.value||a.actions.goToOption({focus:we.Last})}});case Ne.Home:if(a.state.comboboxState===Se.Closed||R.shiftKey)break;return R.preventDefault(),R.stopPropagation(),a.actions.goToOption({focus:we.First});case Ne.PageUp:return R.preventDefault(),R.stopPropagation(),a.actions.goToOption({focus:we.First});case Ne.End:if(a.state.comboboxState===Se.Closed||R.shiftKey)break;return R.preventDefault(),R.stopPropagation(),a.actions.goToOption({focus:we.Last});case Ne.PageDown:return R.preventDefault(),R.stopPropagation(),a.actions.goToOption({focus:we.Last});case Ne.Escape:return a.state.comboboxState!==Se.Open?void 0:(R.preventDefault(),a.state.optionsElement&&!c.optionsPropsRef.current.static&&R.stopPropagation(),c.mode===St.Single&&c.value===null&&_(),a.actions.closeCombobox());case Ne.Tab:if(a.actions.setIsTyping(!1),a.state.comboboxState!==Se.Open)return;c.mode===St.Single&&a.state.activationTrigger!==Xt.Focus&&a.actions.selectActiveOption(),a.actions.closeCombobox();break}}),q=xe(R=>{v?.(R),c.mode===St.Single&&R.target.value===""&&_(),a.actions.openCombobox()}),ce=xe(R=>{var ne,oe,pe;let U=(ne=R.relatedTarget)!=null?ne:er.find(me=>me!==R.currentTarget);if(!((oe=a.state.optionsElement)!=null&&oe.contains(U))&&!((pe=a.state.buttonElement)!=null&&pe.contains(U))&&a.state.comboboxState===Se.Open)return R.preventDefault(),c.mode===St.Single&&c.value===null&&_(),a.actions.closeCombobox()}),B=xe(R=>{var ne,oe,pe;let U=(ne=R.relatedTarget)!=null?ne:er.find(me=>me!==R.currentTarget);(oe=a.state.buttonElement)!=null&&oe.contains(U)||(pe=a.state.optionsElement)!=null&&pe.contains(U)||c.disabled||c.immediate&&a.state.comboboxState!==Se.Open&&P.microTask(()=>{Ye.flushSync(()=>a.actions.openCombobox()),a.actions.setActivationTrigger(Xt.Focus)})}),se=Jo(),ae=fm(),{isFocused:X,focusProps:ue}=xu({autoFocus:w}),{isHovered:ve,hoverProps:D}=yu({isDisabled:E}),Y=je(a,R=>R.optionsElement),K=kt({open:M===Se.Open,disabled:E,invalid:c.invalid,hover:ve,focus:X,autofocus:w}),T=qo({ref:j,id:h,role:"combobox",type:b,"aria-controls":Y?.id,"aria-expanded":M===Se.Open,"aria-activedescendant":je(a,a.selectors.activeDescendantId),"aria-labelledby":se,"aria-describedby":ae,"aria-autocomplete":"list",defaultValue:(s=(o=n.defaultValue)!=null?o:c.defaultValue!==void 0?x?.(c.defaultValue):null)!=null?s:c.defaultValue,disabled:E||void 0,autoFocus:w,onCompositionStart:J,onCompositionEnd:ee,onKeyDown:he,onChange:q,onFocus:B,onBlur:ce},ue,D);return nt()({ourProps:T,theirProps:S,slot:K,defaultTag:T1,name:"Combobox.Input"})}let $1="button";function M1(n,l){let o=nl("Combobox.Button"),s=Yr("Combobox.Button"),[a,c]=y.useState(null),f=vt(l,c,o.actions.setButtonElement),p=y.useId(),{id:h=`headlessui-combobox-button-${p}`,disabled:v=s.disabled||!1,autoFocus:x=!1,...E}=n,[w,b,S]=je(o,B=>[B.comboboxState,B.inputElement,B.optionsElement]),C=Rm(b),j=w===Se.Open;Tm(j,{trigger:a,action:y.useCallback(B=>{if(a!=null&&a.contains(B.target)||b!=null&&b.contains(B.target))return sn.Ignore;let se=B.target.closest('[role="option"]:not([data-disabled])');return Gt(se)?sn.Select(se):S!=null&&S.contains(B.target)?sn.Ignore:sn.Close},[a,b,S]),close:o.actions.closeCombobox,select:o.actions.selectActiveOption});let M=xe(B=>{switch(B.key){case Ne.Space:case Ne.Enter:B.preventDefault(),B.stopPropagation(),o.state.comboboxState===Se.Closed&&Ye.flushSync(()=>o.actions.openCombobox()),C();return;case Ne.ArrowDown:B.preventDefault(),B.stopPropagation(),o.state.comboboxState===Se.Closed&&(Ye.flushSync(()=>o.actions.openCombobox()),o.state.dataRef.current.value||o.actions.goToOption({focus:we.First})),C();return;case Ne.ArrowUp:B.preventDefault(),B.stopPropagation(),o.state.comboboxState===Se.Closed&&(Ye.flushSync(()=>o.actions.openCombobox()),o.state.dataRef.current.value||o.actions.goToOption({focus:we.Last})),C();return;case Ne.Escape:if(o.state.comboboxState!==Se.Open)return;B.preventDefault(),o.state.optionsElement&&!s.optionsPropsRef.current.static&&B.stopPropagation(),Ye.flushSync(()=>o.actions.closeCombobox()),C();return;default:return}}),I=ym(()=>{o.state.comboboxState===Se.Open?o.actions.closeCombobox():o.actions.openCombobox(),C()}),P=Jo([h]),{isFocusVisible:_,focusProps:A}=xu({autoFocus:x}),{isHovered:H,hoverProps:J}=yu({isDisabled:v}),{pressed:ee,pressProps:he}=Jp({disabled:v}),q=kt({open:w===Se.Open,active:ee||w===Se.Open,disabled:v,invalid:s.invalid,value:s.value,hover:H,focus:_}),ce=qo({ref:f,id:h,type:$m(n,a),tabIndex:-1,"aria-haspopup":"listbox","aria-controls":S?.id,"aria-expanded":w===Se.Open,"aria-labelledby":P,disabled:v||void 0,autoFocus:x,onKeyDown:M},I,A,J,he);return nt()({ourProps:ce,theirProps:E,slot:q,defaultTag:$1,name:"Combobox.Button"})}let _1="div",L1=Bo.RenderStrategy|Bo.Static;function I1(n,l){var o,s,a;let c=y.useId(),{id:f=`headlessui-combobox-options-${c}`,hold:p=!1,anchor:h,portal:v=!1,modal:x=!0,transition:E=!1,...w}=n,b=nl("Combobox.Options"),S=Yr("Combobox.Options"),C=Zm(h);C&&(v=!0);let[j,M]=nh(C),[I,P]=y.useState(null),_=th(),A=vt(l,C?j:null,b.actions.setOptionsElement,P),[H,J,ee,he,q]=je(b,Ie=>[Ie.comboboxState,Ie.inputElement,Ie.buttonElement,Ie.optionsElement,Ie.activationTrigger]),ce=Uo(J||ee),B=Uo(he),se=lh(),[ae,X]=Im(E,I,se!==null?(se&dn.Open)===dn.Open:H===Se.Open);Cm(ae,J,b.actions.closeCombobox);let ue=S.__demoMode?!1:x&&H===Se.Open;Mm(ue,B);let ve=S.__demoMode?!1:x&&H===Se.Open;km(ve,{allowed:y.useCallback(()=>[J,ee,he],[J,ee,he])});let D=je(b,b.selectors.didInputMove)?!1:ae;Le(()=>{var Ie;S.optionsPropsRef.current.static=(Ie=n.static)!=null?Ie:!1},[S.optionsPropsRef,n.static]),Le(()=>{S.optionsPropsRef.current.hold=p},[S.optionsPropsRef,p]),Uy(H===Se.Open,{container:he,accept(Ie){return Ie.getAttribute("role")==="option"?NodeFilter.FILTER_REJECT:Ie.hasAttribute("role")?NodeFilter.FILTER_SKIP:NodeFilter.FILTER_ACCEPT},walk(Ie){Ie.setAttribute("role","none")}});let Y=Jo([ee?.id]),K=kt({open:H===Se.Open,option:void 0}),T=xe(()=>{b.actions.setActivationTrigger(Xt.Pointer)}),R=xe(Ie=>{Ie.preventDefault(),b.actions.setActivationTrigger(Xt.Pointer)}),ne=qo(C?_():{},{"aria-labelledby":Y,role:"listbox","aria-multiselectable":S.mode===St.Multi?!0:void 0,id:f,ref:A,style:{...w.style,...M,"--input-width":uu(ae,J,!0).width,"--button-width":uu(ae,ee,!0).width},onWheel:q===Xt.Pointer?void 0:T,onMouseDown:R,...Lm(X)}),oe=ae&&H===Se.Closed&&!n.static,pe=$i(oe,(o=S.virtual)==null?void 0:o.options),U=$i(oe,S.value),me=y.useCallback(Ie=>S.compare(U,Ie),[S.compare,U]),le=y.useMemo(()=>{if(!S.virtual)return S;if(pe===void 0)throw new Error("Missing `options` in virtual mode");return pe!==S.virtual.options?{...S,virtual:{...S.virtual,options:pe}}:S},[S,pe,(s=S.virtual)==null?void 0:s.options]);S.virtual&&Object.assign(w,{children:ye.createElement(Yo.Provider,{value:le},ye.createElement(j1,{slot:K},w.children))});let Ee=nt(),ot=y.useMemo(()=>S.mode===St.Multi?S:{...S,isSelected:me},[S,me]);return ye.createElement(uh,{enabled:v?n.static||ae:!1,ownerDocument:ce},ye.createElement(Yo.Provider,{value:ot},Ee({ourProps:ne,theirProps:{...w,children:ye.createElement(a1,{freeze:oe},typeof w.children=="function"?(a=w.children)==null?void 0:a.call(w,K):w.children)},slot:K,defaultTag:_1,features:L1,visible:D,name:"Combobox.Options"})))}let F1="div";function D1(n,l){var o,s,a;let c=Yr("Combobox.Option"),f=nl("Combobox.Option"),p=y.useId(),{id:h=`headlessui-combobox-option-${p}`,value:v,disabled:x=(a=(s=(o=c.virtual)==null?void 0:o.disabled)==null?void 0:s.call(o,v))!=null?a:!1,order:E=null,...w}=n,[b]=je(f,X=>[X.inputElement]),S=Rm(b),C=je(f,y.useCallback(X=>f.selectors.isActive(X,v,h),[v,h])),j=c.isSelected(v),M=y.useRef(null),I=Dn({disabled:x,value:v,domRef:M,order:E}),P=y.useContext(hh),_=vt(l,M,P?P.measureElement:null),A=xe(()=>{f.actions.setIsTyping(!1),f.actions.onChange(v)});Le(()=>f.actions.registerOption(h,I),[I,h]);let H=je(f,y.useCallback(X=>f.selectors.shouldScrollIntoView(X,v,h),[v,h]));Le(()=>{if(H)return gt().requestAnimationFrame(()=>{var X,ue;(ue=(X=M.current)==null?void 0:X.scrollIntoView)==null||ue.call(X,{block:"nearest"})})},[H,M]);let J=xe(X=>{X.preventDefault(),X.button===ku.Left&&(x||(A(),fu()||requestAnimationFrame(()=>S()),c.mode===St.Single&&f.actions.closeCombobox()))}),ee=xe(()=>{if(x)return f.actions.goToOption({focus:we.Nothing});let X=c.calculateIndex(v);f.actions.goToOption({focus:we.Specific,idx:X})}),he=_m(),q=xe(X=>he.update(X)),ce=xe(X=>{if(!he.wasMoved(X)||x||C&&f.state.activationTrigger===Xt.Pointer)return;let ue=c.calculateIndex(v);f.actions.goToOption({focus:we.Specific,idx:ue},Xt.Pointer)}),B=xe(X=>{he.wasMoved(X)&&(x||C&&(c.optionsPropsRef.current.hold||f.state.activationTrigger===Xt.Pointer&&f.actions.goToOption({focus:we.Nothing})))}),se=kt({active:C,focus:C,selected:j,disabled:x}),ae={id:h,ref:_,role:"option",tabIndex:x===!0?void 0:-1,"aria-disabled":x===!0?!0:void 0,"aria-selected":j,disabled:void 0,onMouseDown:J,onFocus:ee,onPointerEnter:q,onMouseEnter:q,onPointerMove:ce,onMouseMove:ce,onPointerLeave:B,onMouseLeave:B};return nt()({ourProps:ae,theirProps:w,slot:se,defaultTag:F1,name:"Combobox.Option"})}let A1=rt(P1),z1=rt(M1),W1=rt(R1),H1=hm,V1=rt(I1),B1=rt(D1),Io=Object.assign(A1,{Input:W1,Button:z1,Label:H1,Options:V1,Option:B1}),Rp=/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g;function $p(n){var l,o;let s=(l=n.innerText)!=null?l:"",a=n.cloneNode(!0);if(!Gt(a))return s;let c=!1;for(let p of a.querySelectorAll('[hidden],[aria-hidden],[role="img"]'))p.remove(),c=!0;let f=c?(o=a.innerText)!=null?o:"":s;return Rp.test(f)&&(f=f.replace(Rp,"")),f}function U1(n){let l=n.getAttribute("aria-label");if(typeof l=="string")return l.trim();let o=n.getAttribute("aria-labelledby");if(o){let s=o.split(" ").map(a=>{let c=document.getElementById(a);if(c){let f=c.getAttribute("aria-label");return typeof f=="string"?f.trim():$p(c).trim()}return null}).filter(Boolean);if(s.length>0)return s.join(", ")}return $p(n).trim()}function K1(n){let l=y.useRef(""),o=y.useRef("");return xe(()=>{let s=n.current;if(!s)return"";let a=s.innerText;if(l.current===a)return o.current;let c=U1(s).trim().toLowerCase();return l.current=a,o.current=c,c})}var Q1=Object.defineProperty,Y1=(n,l,o)=>l in n?Q1(n,l,{enumerable:!0,configurable:!0,writable:!0,value:o}):n[l]=o,Mp=(n,l,o)=>(Y1(n,typeof l!="symbol"?l+"":l,o),o),et=(n=>(n[n.Open=0]="Open",n[n.Closed=1]="Closed",n))(et||{}),Mn=(n=>(n[n.Single=0]="Single",n[n.Multi=1]="Multi",n))(Mn||{}),bi=(n=>(n[n.Pointer=0]="Pointer",n[n.Other=1]="Other",n))(bi||{}),gh=(n=>(n[n.OpenListbox=0]="OpenListbox",n[n.CloseListbox=1]="CloseListbox",n[n.GoToOption=2]="GoToOption",n[n.Search=3]="Search",n[n.ClearSearch=4]="ClearSearch",n[n.SelectOption=5]="SelectOption",n[n.RegisterOptions=6]="RegisterOptions",n[n.UnregisterOptions=7]="UnregisterOptions",n[n.SetButtonElement=8]="SetButtonElement",n[n.SetOptionsElement=9]="SetOptionsElement",n[n.SortOptions=10]="SortOptions",n[n.MarkButtonAsMoved=11]="MarkButtonAsMoved",n))(gh||{});function _p(n,l=o=>o){let o=n.activeOptionIndex!==null?n.options[n.activeOptionIndex]:null,s=Ou(l(n.options.slice()),c=>c.dataRef.current.domRef.current),a=o?s.indexOf(o):null;return a===-1&&(a=null),{options:s,activeOptionIndex:a}}let X1={1(n){if(n.dataRef.current.disabled||n.listboxState===1)return n;let l=n.buttonElement?cn.Tracked(Lu(n.buttonElement)):n.buttonPositionState;return{...n,activeOptionIndex:null,pendingFocus:{focus:we.Nothing},listboxState:1,__demoMode:!1,buttonPositionState:l}},0(n,l){if(n.dataRef.current.disabled||n.listboxState===0)return n;let o=n.activeOptionIndex,{isSelected:s}=n.dataRef.current,a=n.options.findIndex(c=>s(c.dataRef.current.value));return a!==-1&&(o=a),{...n,frozenValue:!1,pendingFocus:l.focus,listboxState:0,activeOptionIndex:o,__demoMode:!1,buttonPositionState:cn.Idle}},2(n,l){var o,s,a,c,f;if(n.dataRef.current.disabled||n.listboxState===1)return n;let p={...n,searchQuery:"",activationTrigger:(o=l.trigger)!=null?o:1,__demoMode:!1};if(l.focus===we.Nothing)return{...p,activeOptionIndex:null};if(l.focus===we.Specific)return{...p,activeOptionIndex:n.options.findIndex(x=>x.id===l.id)};if(l.focus===we.Previous){let x=n.activeOptionIndex;if(x!==null){let E=n.options[x].dataRef.current.domRef,w=Dr(l,{resolveItems:()=>n.options,resolveActiveIndex:()=>n.activeOptionIndex,resolveId:b=>b.id,resolveDisabled:b=>b.dataRef.current.disabled});if(w!==null){let b=n.options[w].dataRef.current.domRef;if(((s=E.current)==null?void 0:s.previousElementSibling)===b.current||((a=b.current)==null?void 0:a.previousElementSibling)===null)return{...p,activeOptionIndex:w}}}}else if(l.focus===we.Next){let x=n.activeOptionIndex;if(x!==null){let E=n.options[x].dataRef.current.domRef,w=Dr(l,{resolveItems:()=>n.options,resolveActiveIndex:()=>n.activeOptionIndex,resolveId:b=>b.id,resolveDisabled:b=>b.dataRef.current.disabled});if(w!==null){let b=n.options[w].dataRef.current.domRef;if(((c=E.current)==null?void 0:c.nextElementSibling)===b.current||((f=b.current)==null?void 0:f.nextElementSibling)===null)return{...p,activeOptionIndex:w}}}}let h=_p(n),v=Dr(l,{resolveItems:()=>h.options,resolveActiveIndex:()=>h.activeOptionIndex,resolveId:x=>x.id,resolveDisabled:x=>x.dataRef.current.disabled});return{...p,...h,activeOptionIndex:v}},3:(n,l)=>{if(n.dataRef.current.disabled||n.listboxState===1)return n;let o=n.searchQuery!==""?0:1,s=n.searchQuery+l.value.toLowerCase(),a=(n.activeOptionIndex!==null?n.options.slice(n.activeOptionIndex+o).concat(n.options.slice(0,n.activeOptionIndex+o)):n.options).find(f=>{var p;return!f.dataRef.current.disabled&&((p=f.dataRef.current.textValue)==null?void 0:p.startsWith(s))}),c=a?n.options.indexOf(a):-1;return c===-1||c===n.activeOptionIndex?{...n,searchQuery:s}:{...n,searchQuery:s,activeOptionIndex:c,activationTrigger:1}},4(n){return n.dataRef.current.disabled||n.listboxState===1||n.searchQuery===""?n:{...n,searchQuery:""}},5(n){return n.dataRef.current.mode===0?{...n,frozenValue:!0}:{...n}},6:(n,l)=>{let o=n.options.concat(l.options),s=n.activeOptionIndex;if(n.pendingFocus.focus!==we.Nothing&&(s=Dr(n.pendingFocus,{resolveItems:()=>o,resolveActiveIndex:()=>n.activeOptionIndex,resolveId:a=>a.id,resolveDisabled:a=>a.dataRef.current.disabled})),n.activeOptionIndex===null){let{isSelected:a}=n.dataRef.current;if(a){let c=o.findIndex(f=>a?.(f.dataRef.current.value));c!==-1&&(s=c)}}return{...n,options:o,activeOptionIndex:s,pendingFocus:{focus:we.Nothing},pendingShouldSort:!0}},7:(n,l)=>{let o=n.options,s=[],a=new Set(l.options);for(let[c,f]of o.entries())if(a.has(f.id)&&(s.push(c),a.delete(f.id),a.size===0))break;if(s.length>0){o=o.slice();for(let c of s.reverse())o.splice(c,1)}return{...n,options:o,activationTrigger:1}},8:(n,l)=>n.buttonElement===l.element?n:{...n,buttonElement:l.element},9:(n,l)=>n.optionsElement===l.element?n:{...n,optionsElement:l.element},10:n=>n.pendingShouldSort?{...n,..._p(n),pendingShouldSort:!1}:n,11(n){return n.buttonPositionState.kind!=="Tracked"?n:{...n,buttonPositionState:cn.Moved}}};class Iu extends Cu{constructor(l){super(l),Mp(this,"actions",{onChange:o=>{let{onChange:s,compare:a,mode:c,value:f}=this.state.dataRef.current;return tt(c,{0:()=>s?.(o),1:()=>{let p=f.slice(),h=p.findIndex(v=>a(v,o));return h===-1?p.push(o):p.splice(h,1),s?.(p)}})},registerOption:Ua(()=>{let o=[],s=new Set;return[(a,c)=>{s.has(c)||(s.add(c),o.push({id:a,dataRef:c}))},()=>(s.clear(),this.send({type:6,options:o.splice(0)}))]}),unregisterOption:Ua(()=>{let o=[];return[s=>o.push(s),()=>{this.send({type:7,options:o.splice(0)})}]}),goToOption:Ua(()=>{let o=null;return[(s,a)=>{o={type:2,...s,trigger:a}},()=>o&&this.send(o)]}),closeListbox:()=>{this.send({type:1})},openListbox:o=>{this.send({type:0,focus:o})},selectActiveOption:()=>{var o;if(this.state.activeOptionIndex!==null){let{dataRef:s}=this.state.options[this.state.activeOptionIndex];this.actions.selectOption(s.current.value)}else this.state.dataRef.current.mode===0&&(this.actions.closeListbox(),(o=this.state.buttonElement)==null||o.focus({preventScroll:!0}))},selectOption:o=>{this.send({type:5,value:o})},search:o=>{this.send({type:3,value:o})},clearSearch:()=>{this.send({type:4})},setButtonElement:o=>{this.send({type:8,element:o})},setOptionsElement:o=>{this.send({type:9,element:o})}}),Mp(this,"selectors",{activeDescendantId(o){var s;let a=o.activeOptionIndex,c=o.options;return a===null||(s=c[a])==null?void 0:s.id},isActive(o,s){var a;let c=o.activeOptionIndex,f=o.options;return c!==null?((a=f[c])==null?void 0:a.id)===s:!1},hasFrozenValue(o){return o.frozenValue},shouldScrollIntoView(o,s){return o.__demoMode||o.listboxState!==0||o.activationTrigger===0?!1:this.isActive(o,s)},didButtonMove(o){return o.buttonPositionState.kind==="Moved"}}),this.on(6,()=>{requestAnimationFrame(()=>{this.send({type:10})})});{let o=this.state.id,s=Zo.get(null);this.disposables.add(s.on(Nu.Push,a=>{!s.selectors.isTop(a,o)&&this.state.listboxState===0&&this.actions.closeListbox()})),this.on(0,()=>s.actions.push(o)),this.on(1,()=>s.actions.pop(o))}this.disposables.group(o=>{this.on(1,s=>{s.buttonElement&&(o.dispose(),o.add(ch(s.buttonElement,s.buttonPositionState,()=>{this.send({type:11})})))})}),this.on(5,(o,s)=>{var a;this.actions.onChange(s.value),this.state.dataRef.current.mode===0&&(this.actions.closeListbox(),(a=this.state.buttonElement)==null||a.focus({preventScroll:!0}))})}static new({id:l,__demoMode:o=!1}){return new Iu({id:l,dataRef:{current:{}},listboxState:o?0:1,options:[],searchQuery:"",activeOptionIndex:null,activationTrigger:1,buttonElement:null,optionsElement:null,pendingShouldSort:!1,pendingFocus:{focus:we.Nothing},frozenValue:!1,__demoMode:o,buttonPositionState:cn.Idle})}reduce(l,o){return tt(o.type,X1,l,o)}}const vh=y.createContext(null);function Fu(n){let l=y.useContext(vh);if(l===null){let o=new Error(`<${n} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(o,yh),o}return l}function yh({id:n,__demoMode:l=!1}){let o=y.useMemo(()=>Iu.new({id:n,__demoMode:l}),[]);return _u(()=>o.dispose()),o}let Hi=y.createContext(null);Hi.displayName="ListboxDataContext";function rl(n){let l=y.useContext(Hi);if(l===null){let o=new Error(`<${n} /> is missing a parent component.`);throw Error.captureStackTrace&&Error.captureStackTrace(o,rl),o}return l}let G1=y.Fragment;function q1(n,l){let o=y.useId(),s=Li(),{value:a,defaultValue:c,form:f,name:p,onChange:h,by:v,invalid:x=!1,disabled:E=s||!1,horizontal:w=!1,multiple:b=!1,__demoMode:S=!1,...C}=n;const j=w?"horizontal":"vertical";let M=vt(l),I=nm(c),[P=b?[]:void 0,_]=tm(a,h,I),A=yh({id:o,__demoMode:S}),H=y.useRef({static:!1,hold:!1}),J=y.useRef(new Map),ee=vm(v),he=y.useCallback(R=>tt(q.mode,{[Mn.Multi]:()=>P.some(ne=>ee(ne,R)),[Mn.Single]:()=>ee(P,R)}),[P]),q=kt({value:P,disabled:E,invalid:x,mode:b?Mn.Multi:Mn.Single,orientation:j,onChange:_,compare:ee,isSelected:he,optionsPropsRef:H,listRef:J});Le(()=>{A.state.dataRef.current=q},[q]);let ce=je(A,R=>R.listboxState),B=Zo.get(null),se=je(B,y.useCallback(R=>B.selectors.isTop(R,o),[B,o])),[ae,X]=je(A,R=>[R.buttonElement,R.optionsElement]);Pm(se,[ae,X],(R,ne)=>{A.send({type:gh.CloseListbox}),jm(ne,ju.Loose)||(R.preventDefault(),ae?.focus())});let ue=kt({open:ce===et.Open,disabled:E,invalid:x,value:P}),[ve,D]=mm({inherit:!0}),Y={ref:M},K=y.useCallback(()=>{if(I!==void 0)return _?.(I)},[_,I]),T=nt();return ye.createElement(D,{value:ve,props:{htmlFor:ae?.id},slot:{open:ce===et.Open,disabled:E}},ye.createElement(rh,null,ye.createElement(vh.Provider,{value:A},ye.createElement(Hi.Provider,{value:q},ye.createElement(ih,{value:tt(ce,{[et.Open]:dn.Open,[et.Closed]:dn.Closed})},p!=null&&P!=null&&ye.createElement(sm,{disabled:E,data:{[p]:P},form:f,onReset:K}),T({ourProps:Y,theirProps:C,slot:ue,defaultTag:G1,name:"Listbox"}))))))}let J1="button";function Z1(n,l){let o=y.useId(),s=Su(),a=rl("Listbox.Button"),c=Fu("Listbox.Button"),{id:f=s||`headlessui-listbox-button-${o}`,disabled:p=a.disabled||!1,autoFocus:h=!1,...v}=n,x=vt(l,eh(),c.actions.setButtonElement),E=o1(),[w,b,S]=je(c,X=>[X.listboxState,X.buttonElement,X.optionsElement]),C=w===et.Open;Tm(C,{trigger:b,action:y.useCallback(X=>{if(b!=null&&b.contains(X.target))return sn.Ignore;let ue=X.target.closest('[role="option"]:not([data-disabled])');return Gt(ue)?sn.Select(ue):S!=null&&S.contains(X.target)?sn.Ignore:sn.Close},[b,S]),close:c.actions.closeListbox,select:c.actions.selectActiveOption});let j=xe(X=>{switch(X.key){case Ne.Enter:Ov(X.currentTarget);break;case Ne.Space:case Ne.ArrowDown:X.preventDefault(),c.actions.openListbox({focus:a.value?we.Nothing:we.First});break;case Ne.ArrowUp:X.preventDefault(),c.actions.openListbox({focus:a.value?we.Nothing:we.Last});break}}),M=xe(X=>{switch(X.key){case Ne.Space:X.preventDefault();break}}),I=ym(X=>{var ue;c.state.listboxState===et.Open?(Ye.flushSync(()=>c.actions.closeListbox()),(ue=c.state.buttonElement)==null||ue.focus({preventScroll:!0})):(X.preventDefault(),c.actions.openListbox({focus:we.Nothing}))}),P=xe(X=>X.preventDefault()),_=Jo([f]),A=fm(),{isFocusVisible:H,focusProps:J}=xu({autoFocus:h}),{isHovered:ee,hoverProps:he}=yu({isDisabled:p}),{pressed:q,pressProps:ce}=Jp({disabled:p}),B=kt({open:w===et.Open,active:q||w===et.Open,disabled:p,invalid:a.invalid,value:a.value,hover:ee,focus:H,autofocus:h}),se=je(c,X=>X.listboxState===et.Open),ae=qo(E(),{ref:x,id:f,type:$m(n,b),"aria-haspopup":"listbox","aria-controls":S?.id,"aria-expanded":se,"aria-labelledby":_,"aria-describedby":A,disabled:p||void 0,autoFocus:h,onKeyDown:j,onKeyUp:M,onKeyPress:P},I,J,he,ce);return nt()({ourProps:ae,theirProps:v,slot:B,defaultTag:J1,name:"Listbox.Button"})}let xh=y.createContext(!1),ew="div",tw=Bo.RenderStrategy|Bo.Static;function nw(n,l){let o=y.useId(),{id:s=`headlessui-listbox-options-${o}`,anchor:a,portal:c=!1,modal:f=!0,transition:p=!1,...h}=n,v=Zm(a),[x,E]=y.useState(null);v&&(c=!0);let w=rl("Listbox.Options"),b=Fu("Listbox.Options"),[S,C,j,M]=je(b,U=>[U.listboxState,U.buttonElement,U.optionsElement,U.__demoMode]),I=Uo(C),P=Uo(j),_=lh(),[A,H]=Im(p,x,_!==null?(_&dn.Open)===dn.Open:S===et.Open);Cm(A,C,b.actions.closeListbox);let J=M?!1:f&&S===et.Open;Mm(J,P);let ee=M?!1:f&&S===et.Open;km(ee,{allowed:y.useCallback(()=>[C,j],[C,j])});let he=je(b,b.selectors.didButtonMove)?!1:A,q=je(b,b.selectors.hasFrozenValue)&&!n.static,ce=$i(q,w.value),B=y.useCallback(U=>w.compare(ce,U),[w.compare,ce]),se=je(b,U=>{var me;if(v==null||!((me=v?.to)!=null&&me.includes("selection")))return null;let le=U.options.findIndex(Ee=>B(Ee.dataRef.current.value));return le===-1&&(le=0),le}),ae=(()=>{if(v==null)return;if(se===null)return{...v,inner:void 0};let U=Array.from(w.listRef.current.values());return{...v,inner:{listRef:{current:U},index:se}}})(),[X,ue]=nh(ae),ve=th(),D=vt(l,v?X:null,b.actions.setOptionsElement,E),Y=cr();y.useEffect(()=>{let U=j;U&&S===et.Open&&(wu(U)||U==null||U.focus({preventScroll:!0}))},[S,j]);let K=xe(U=>{var me;switch(Y.dispose(),U.key){case Ne.Space:if(b.state.searchQuery!=="")return U.preventDefault(),U.stopPropagation(),b.actions.search(U.key);case Ne.Enter:U.preventDefault(),U.stopPropagation(),b.actions.selectActiveOption();break;case tt(w.orientation,{vertical:Ne.ArrowDown,horizontal:Ne.ArrowRight}):return U.preventDefault(),U.stopPropagation(),b.actions.goToOption({focus:we.Next});case tt(w.orientation,{vertical:Ne.ArrowUp,horizontal:Ne.ArrowLeft}):return U.preventDefault(),U.stopPropagation(),b.actions.goToOption({focus:we.Previous});case Ne.Home:case Ne.PageUp:return U.preventDefault(),U.stopPropagation(),b.actions.goToOption({focus:we.First});case Ne.End:case Ne.PageDown:return U.preventDefault(),U.stopPropagation(),b.actions.goToOption({focus:we.Last});case Ne.Escape:U.preventDefault(),U.stopPropagation(),Ye.flushSync(()=>b.actions.closeListbox()),(me=b.state.buttonElement)==null||me.focus({preventScroll:!0});return;case Ne.Tab:U.preventDefault(),U.stopPropagation(),Ye.flushSync(()=>b.actions.closeListbox()),Cy(b.state.buttonElement,U.shiftKey?du.Previous:du.Next);break;default:U.key.length===1&&(b.actions.search(U.key),Y.setTimeout(()=>b.actions.clearSearch(),350));break}}),T=je(b,U=>{var me;return(me=U.buttonElement)==null?void 0:me.id}),R=kt({open:S===et.Open}),ne=qo(v?ve():{},{id:s,ref:D,"aria-activedescendant":je(b,b.selectors.activeDescendantId),"aria-multiselectable":w.mode===Mn.Multi?!0:void 0,"aria-labelledby":T,"aria-orientation":w.orientation,onKeyDown:K,role:"listbox",tabIndex:S===et.Open?0:void 0,style:{...h.style,...ue,"--button-width":uu(A,C,!0).width},...Lm(H)}),oe=nt(),pe=y.useMemo(()=>w.mode===Mn.Multi?w:{...w,isSelected:B},[w,B]);return ye.createElement(uh,{enabled:c?n.static||A:!1,ownerDocument:I},ye.createElement(Hi.Provider,{value:pe},oe({ourProps:ne,theirProps:h,slot:R,defaultTag:ew,features:tw,visible:he,name:"Listbox.Options"})))}let rw="div";function ow(n,l){let o=y.useId(),{id:s=`headlessui-listbox-option-${o}`,disabled:a=!1,value:c,...f}=n,p=y.useContext(xh)===!0,h=rl("Listbox.Option"),v=Fu("Listbox.Option"),x=je(v,q=>v.selectors.isActive(q,s)),E=h.isSelected(c),w=y.useRef(null),b=K1(w),S=Dn({disabled:a,value:c,domRef:w,get textValue(){return b()}}),C=vt(l,w,q=>{q?h.listRef.current.set(s,q):h.listRef.current.delete(s)}),j=je(v,q=>v.selectors.shouldScrollIntoView(q,s));Le(()=>{if(j)return gt().requestAnimationFrame(()=>{var q,ce;(ce=(q=w.current)==null?void 0:q.scrollIntoView)==null||ce.call(q,{block:"nearest"})})},[j,w]),Le(()=>{if(!p)return v.actions.registerOption(s,S),()=>v.actions.unregisterOption(s)},[S,s,p]);let M=xe(q=>{if(a)return q.preventDefault();v.actions.selectOption(c)}),I=xe(()=>{if(a)return v.actions.goToOption({focus:we.Nothing});v.actions.goToOption({focus:we.Specific,id:s})}),P=_m(),_=xe(q=>P.update(q)),A=xe(q=>{P.wasMoved(q)&&(a||x&&v.state.activationTrigger===bi.Pointer||v.actions.goToOption({focus:we.Specific,id:s},bi.Pointer))}),H=xe(q=>{P.wasMoved(q)&&(a||x&&v.state.activationTrigger===bi.Pointer&&v.actions.goToOption({focus:we.Nothing}))}),J=kt({active:x,focus:x,selected:E,disabled:a,selectedOption:E&&p}),ee=p?{}:{id:s,ref:C,role:"option",tabIndex:a===!0?void 0:-1,"aria-disabled":a===!0?!0:void 0,"aria-selected":E,disabled:void 0,onClick:M,onFocus:I,onPointerEnter:_,onMouseEnter:_,onPointerMove:A,onMouseMove:A,onPointerLeave:H,onMouseLeave:H},he=nt();return!E&&p?null:he({ourProps:ee,theirProps:f,slot:J,defaultTag:rw,name:"Listbox.Option"})}let lw=y.Fragment;function iw(n,l){let{options:o,placeholder:s,...a}=n,c={ref:vt(l)},f=rl("ListboxSelectedOption"),p=kt({}),h=f.value===void 0||f.value===null||f.mode===Mn.Multi&&Array.isArray(f.value)&&f.value.length===0,v=nt();return ye.createElement(xh.Provider,{value:!0},v({ourProps:c,theirProps:{...a,children:ye.createElement(ye.Fragment,null,s&&h?s:o)},slot:p,defaultTag:lw,name:"ListboxSelectedOption"}))}let sw=rt(q1),aw=rt(Z1),uw=hm,cw=rt(nw),dw=rt(ow),fw=rt(iw),an=Object.assign(sw,{Button:aw,Label:uw,Options:cw,Option:dw,SelectedOption:fw});const yi=43200,Lp=1440,Ip=Symbol.for("constructDateFrom");function Du(n,l){return typeof n=="function"?n(l):n&&typeof n=="object"&&Ip in n?n[Ip](l):n instanceof Date?new n.constructor(l):new Date(l)}function In(n,l){return Du(n,n)}let pw={};function mw(){return pw}function Fp(n){const l=In(n),o=new Date(Date.UTC(l.getFullYear(),l.getMonth(),l.getDate(),l.getHours(),l.getMinutes(),l.getSeconds(),l.getMilliseconds()));return o.setUTCFullYear(l.getFullYear()),+n-+o}function Au(n,...l){const o=Du.bind(null,n||l.find(s=>typeof s=="object"));return l.map(o)}function Si(n,l){const o=+In(n)-+In(l);return o<0?-1:o>0?1:o}function hw(n){return Du(n,Date.now())}function gw(n,l,o){const[s,a]=Au(o?.in,n,l),c=s.getFullYear()-a.getFullYear(),f=s.getMonth()-a.getMonth();return c*12+f}function vw(n){return l=>{const s=(n?Math[n]:Math.trunc)(l);return s===0?0:s}}function yw(n,l){return+In(n)-+In(l)}function xw(n,l){const o=In(n);return o.setHours(23,59,59,999),o}function ww(n,l){const o=In(n),s=o.getMonth();return o.setFullYear(o.getFullYear(),s+1,0),o.setHours(23,59,59,999),o}function bw(n,l){const o=In(n);return+xw(o)==+ww(o)}function Sw(n,l,o){const[s,a,c]=Au(o?.in,n,n,l),f=Si(a,c),p=Math.abs(gw(a,c));if(p<1)return 0;a.getMonth()===1&&a.getDate()>27&&a.setDate(30),a.setMonth(a.getMonth()-f*p);let h=Si(a,c)===-f;bw(s)&&p===1&&Si(s,c)===1&&(h=!1);const v=f*(p-+h);return v===0?0:v}function Ew(n,l,o){const s=yw(n,l)/1e3;return vw(o?.roundingMethod)(s)}const kw={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}},Cw=(n,l,o)=>{let s;const a=kw[n];return typeof a=="string"?s=a:l===1?s=a.one:s=a.other.replace("{{count}}",l.toString()),o?.addSuffix?o.comparison&&o.comparison>0?"in "+s:s+" ago":s};function tu(n){return(l={})=>{const o=l.width?String(l.width):n.defaultWidth;return n.formats[o]||n.formats[n.defaultWidth]}}const Nw={full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},jw={full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},Ow={full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Pw={date:tu({formats:Nw,defaultWidth:"full"}),time:tu({formats:jw,defaultWidth:"full"}),dateTime:tu({formats:Ow,defaultWidth:"full"})},Tw={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"},Rw=(n,l,o,s)=>Tw[n];function Fo(n){return(l,o)=>{const s=o?.context?String(o.context):"standalone";let a;if(s==="formatting"&&n.formattingValues){const f=n.defaultFormattingWidth||n.defaultWidth,p=o?.width?String(o.width):f;a=n.formattingValues[p]||n.formattingValues[f]}else{const f=n.defaultWidth,p=o?.width?String(o.width):n.defaultWidth;a=n.values[p]||n.values[f]}const c=n.argumentCallback?n.argumentCallback(l):l;return a[c]}}const $w={narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},Mw={narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},_w={narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},Lw={narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},Iw={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},Fw={narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},Dw=(n,l)=>{const o=Number(n),s=o%100;if(s>20||s<10)switch(s%10){case 1:return o+"st";case 2:return o+"nd";case 3:return o+"rd"}return o+"th"},Aw={ordinalNumber:Dw,era:Fo({values:$w,defaultWidth:"wide"}),quarter:Fo({values:Mw,defaultWidth:"wide",argumentCallback:n=>n-1}),month:Fo({values:_w,defaultWidth:"wide"}),day:Fo({values:Lw,defaultWidth:"wide"}),dayPeriod:Fo({values:Iw,defaultWidth:"wide",formattingValues:Fw,defaultFormattingWidth:"wide"})};function Do(n){return(l,o={})=>{const s=o.width,a=s&&n.matchPatterns[s]||n.matchPatterns[n.defaultMatchWidth],c=l.match(a);if(!c)return null;const f=c[0],p=s&&n.parsePatterns[s]||n.parsePatterns[n.defaultParseWidth],h=Array.isArray(p)?Ww(p,E=>E.test(f)):zw(p,E=>E.test(f));let v;v=n.valueCallback?n.valueCallback(h):h,v=o.valueCallback?o.valueCallback(v):v;const x=l.slice(f.length);return{value:v,rest:x}}}function zw(n,l){for(const o in n)if(Object.prototype.hasOwnProperty.call(n,o)&&l(n[o]))return o}function Ww(n,l){for(let o=0;o{const s=l.match(n.matchPattern);if(!s)return null;const a=s[0],c=l.match(n.parsePattern);if(!c)return null;let f=n.valueCallback?n.valueCallback(c[0]):c[0];f=o.valueCallback?o.valueCallback(f):f;const p=l.slice(a.length);return{value:f,rest:p}}}const Vw=/^(\d+)(th|st|nd|rd)?/i,Bw=/\d+/i,Uw={narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},Kw={any:[/^b/i,/^(a|c)/i]},Qw={narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},Yw={any:[/1/i,/2/i,/3/i,/4/i]},Xw={narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},Gw={narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},qw={narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},Jw={narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},Zw={narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},eb={any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},tb={ordinalNumber:Hw({matchPattern:Vw,parsePattern:Bw,valueCallback:n=>parseInt(n,10)}),era:Do({matchPatterns:Uw,defaultMatchWidth:"wide",parsePatterns:Kw,defaultParseWidth:"any"}),quarter:Do({matchPatterns:Qw,defaultMatchWidth:"wide",parsePatterns:Yw,defaultParseWidth:"any",valueCallback:n=>n+1}),month:Do({matchPatterns:Xw,defaultMatchWidth:"wide",parsePatterns:Gw,defaultParseWidth:"any"}),day:Do({matchPatterns:qw,defaultMatchWidth:"wide",parsePatterns:Jw,defaultParseWidth:"any"}),dayPeriod:Do({matchPatterns:Zw,defaultMatchWidth:"any",parsePatterns:eb,defaultParseWidth:"any"})},nb={code:"en-US",formatDistance:Cw,formatLong:Pw,formatRelative:Rw,localize:Aw,match:tb,options:{weekStartsOn:0,firstWeekContainsDate:1}};function rb(n,l,o){const s=mw(),a=o?.locale??s.locale??nb,c=2520,f=Si(n,l);if(isNaN(f))throw new RangeError("Invalid time value");const p=Object.assign({},o,{addSuffix:o?.addSuffix,comparison:f}),[h,v]=Au(o?.in,...f>0?[l,n]:[n,l]),x=Ew(v,h),E=(Fp(v)-Fp(h))/1e3,w=Math.round((x-E)/60);let b;if(w<2)return o?.includeSeconds?x<5?a.formatDistance("lessThanXSeconds",5,p):x<10?a.formatDistance("lessThanXSeconds",10,p):x<20?a.formatDistance("lessThanXSeconds",20,p):x<40?a.formatDistance("halfAMinute",0,p):x<60?a.formatDistance("lessThanXMinutes",1,p):a.formatDistance("xMinutes",1,p):w===0?a.formatDistance("lessThanXMinutes",1,p):a.formatDistance("xMinutes",w,p);if(w<45)return a.formatDistance("xMinutes",w,p);if(w<90)return a.formatDistance("aboutXHours",1,p);if(w{Ap().then(M=>s(M.object_defs.map(I=>I.name))).catch(()=>{})},[]),y.useEffect(()=>{v(!0),zp(a||void 0,w,S).then(M=>{l(M.objects),E(M.total)}).catch(M=>p(M.message)).finally(()=>v(!1))},[a,w,S]);const j=M=>{c(M),C(0)};return h?m.jsx($t,{}):f?m.jsxs("div",{className:"text-red-500",children:["Error: ",f]}):m.jsxs("div",{className:"max-w-6xl mx-auto",children:[m.jsxs("div",{className:"flex items-center justify-between mb-6",children:[m.jsx("h2",{className:"text-2xl font-bold",children:"Objects"}),m.jsx(an,{value:a,onChange:j,children:m.jsxs("div",{className:"relative w-64",children:[m.jsxs(an.Button,{className:"w-full px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg text-left focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-all",children:[m.jsx("span",{className:a?"text-gray-100":"text-gray-500",children:a||"All Types"}),m.jsx("span",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:m.jsx("svg",{className:"h-5 w-5 text-gray-400",viewBox:"0 0 20 20",fill:"currentColor",children:m.jsx("path",{fillRule:"evenodd",d:"M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z",clipRule:"evenodd"})})})]}),m.jsxs(an.Options,{className:"absolute z-10 mt-1 w-full bg-gray-800 border border-gray-700 rounded-lg shadow-lg max-h-60 overflow-auto focus:outline-none",children:[m.jsx(an.Option,{value:"",className:({active:M})=>`cursor-pointer select-none px-4 py-2 transition-colors ${M?"bg-blue-600 text-white":"text-gray-100"}`,children:({selected:M})=>m.jsx("span",{className:M?"font-semibold":"font-normal",children:"All Types"})}),o.map(M=>m.jsx(an.Option,{value:M,className:({active:I})=>`cursor-pointer select-none px-4 py-2 transition-colors ${I?"bg-blue-600 text-white":"text-gray-100"}`,children:({selected:I})=>m.jsx("span",{className:I?"font-semibold":"font-normal",children:M})},M))]})]})})]}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No objects found"}):m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Type"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((M,I)=>m.jsxs("tr",{className:`transition-colors ${I%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:M.id}),m.jsx("td",{className:"px-4 py-3 text-gray-100",children:m.jsx("span",{className:"inline-block px-2 py-1 bg-blue-900/30 text-blue-300 rounded text-sm",children:M.type})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(M.created_at)})]},I))})]}),m.jsx(Vr,{total:x,limit:w,offset:S,onPageChange:C,onLimitChange:b})]})]})}function ib({eventDef:n,onClose:l,onSuccess:o}){const s=n.schema?.properties||{},a=Object.keys(s),[c,f]=y.useState(()=>{const C={};for(const[j,M]of Object.entries(s))M.type==="boolean"?C[j]=!1:(M.type==="number"||M.type,C[j]="");return C}),[p,h]=y.useState(!1),[v,x]=y.useState(""),[E,w]=y.useState(null),b=async C=>{C.preventDefault(),h(!0),x(""),w(null);try{const j={};for(const[I,P]of Object.entries(s)){const _=c[I];P.type==="number"||P.type==="ref"?j[I]=_===""?0:Number(_):P.type==="boolean"?j[I]=!!_:j[I]=String(_)}const M=await A0(n.name,j);w({eventId:M.event?.id??"?",reactionsFired:M.reactions_fired??0}),setTimeout(()=>{o(),l()},2e3)}catch(j){x(j.message||"Failed to emit event")}finally{h(!1)}},S=(C,j)=>{if(j.type==="boolean")return m.jsxs("label",{className:"flex items-center gap-3 py-2",children:[m.jsx("input",{type:"checkbox",checked:!!c[C],onChange:P=>f(_=>({..._,[C]:P.target.checked})),className:"w-4 h-4 rounded border-gray-600 bg-gray-800 text-blue-500 focus:ring-blue-500 focus:ring-offset-0"}),m.jsx("span",{className:"text-sm text-gray-200 font-mono",children:C})]},C);const M=j.type==="number"||j.type==="ref",I=j.type==="ref"?`${C} (Object ID)`:C;return m.jsxs("div",{className:"space-y-1",children:[m.jsx("label",{className:"block text-sm text-gray-300 font-mono",children:I}),m.jsx("input",{type:M?"number":"text",value:c[C],onChange:P=>f(_=>({..._,[C]:P.target.value})),className:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-gray-100 text-sm font-mono placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent",placeholder:j.type==="ref"?"Enter object ID":`Enter ${j.type}`})]},C)};return m.jsx("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm",onClick:l,children:m.jsxs("div",{className:"bg-gray-900 border border-gray-700 rounded-xl shadow-2xl w-full max-w-md mx-4",onClick:C=>C.stopPropagation(),children:[m.jsxs("div",{className:"flex items-center justify-between px-6 py-4 border-b border-gray-800",children:[m.jsxs("h3",{className:"text-lg font-semibold text-gray-100",children:["Emit ",m.jsx("span",{className:"text-blue-400 font-mono",children:n.name})]}),m.jsx("button",{onClick:l,className:"text-gray-400 hover:text-gray-200 transition-colors",children:m.jsx("svg",{className:"w-5 h-5",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",children:m.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),m.jsxs("form",{onSubmit:b,className:"px-6 py-4 space-y-4",children:[a.length===0?m.jsx("p",{className:"text-sm text-gray-500 italic",children:"No payload fields — event will be emitted with empty payload."}):a.map(C=>S(C,s[C])),E&&m.jsxs("div",{className:"p-3 bg-green-900/40 border border-green-700 rounded-lg text-sm text-green-300",children:["✓ Event ",m.jsx("span",{className:"font-mono font-bold",children:E.eventId})," emitted",E.reactionsFired>0&&m.jsxs("span",{children:[" — ",E.reactionsFired," reaction",E.reactionsFired>1?"s":""," fired"]})]}),v&&m.jsxs("div",{className:"p-3 bg-red-900/40 border border-red-700 rounded-lg text-sm text-red-300",children:["✗ ",v]}),m.jsxs("div",{className:"flex justify-end gap-3 pt-2",children:[m.jsx("button",{type:"button",onClick:l,className:"px-4 py-2 text-sm text-gray-400 hover:text-gray-200 transition-colors",children:"Cancel"}),m.jsxs("button",{type:"submit",disabled:p||!!E,className:"px-4 py-2 bg-blue-600 hover:bg-blue-500 disabled:bg-blue-800 disabled:cursor-not-allowed text-white text-sm font-medium rounded-lg transition-colors flex items-center gap-2",children:[p&&m.jsx("div",{className:"animate-spin rounded-full h-4 w-4 border-2 border-white/30 border-t-white"}),p?"Emitting…":"▶ Emit"]})]})]})]})})}function sb(){const[n,l]=y.useState([]),[o,s]=y.useState(new Set),[a,c]=y.useState(""),[f,p]=y.useState(!0),[h,v]=y.useState(null),x=()=>{p(!0),$0().then(w=>l(w.event_defs)).catch(w=>c(w.message)).finally(()=>p(!1))};y.useEffect(()=>{x()},[]);const E=w=>{s(b=>{const S=new Set(b);return S.has(w)?S.delete(w):S.add(w),S})};return f?m.jsx($t,{}):a?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",a]}):m.jsxs("div",{className:"max-w-6xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Event Definitions"}),m.jsx("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:n.length===0?m.jsx(fn,{message:"No event definitions found"}):m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Name"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Hash"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Parent"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Schema"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Actions"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((w,b)=>m.jsxs("tr",{className:`transition-colors ${b%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-gray-100",children:w.name}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(lr,{hash:w.hash})}),m.jsx("td",{className:"px-4 py-3",children:w.parent_hash?m.jsx(lr,{hash:w.parent_hash}):m.jsx("span",{className:"text-gray-600",children:"-"})}),m.jsxs("td",{className:"px-4 py-3",children:[m.jsx("button",{onClick:()=>E(w.hash),className:"text-blue-400 hover:text-blue-300 text-sm font-medium transition-colors",children:o.has(w.hash)?"Hide":"Show"}),o.has(w.hash)&&m.jsx("pre",{className:"mt-2 p-3 bg-gray-950 rounded-lg text-xs overflow-x-auto border border-gray-800",children:JSON.stringify(w.schema,null,2).split(` +`).map((S,C)=>{if(S.includes(":")){const[j,...M]=S.split(":");return m.jsxs("div",{children:[m.jsxs("span",{className:"text-blue-400",children:[j,":"]}),m.jsx("span",{className:"text-green-300",children:M.join(":")})]},C)}return m.jsx("div",{className:"text-gray-300",children:S},C)})})]}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("button",{onClick:()=>v({name:w.name,schema:w.schema}),className:"px-3 py-1.5 bg-green-700/30 hover:bg-green-600/40 text-green-300 hover:text-green-200 border border-green-700/50 rounded-lg text-sm font-medium transition-colors",children:"▶ Emit"})})]},b))})]})}),h&&m.jsx(ib,{eventDef:h,onClose:()=>v(null),onSuccess:()=>{}})]})}function ab(){const[n,l]=y.useState([]),[o,s]=y.useState(new Set),[a,c]=y.useState(""),[f,p]=y.useState(""),[h,v]=y.useState(!0),[x,E]=y.useState(0),[w,b]=y.useState(50),[S,C]=y.useState(0),j=()=>{v(!0),M0(a||void 0,w,S).then(P=>{l(P.events),E(P.total)}).catch(P=>p(P.message)).finally(()=>v(!1))};y.useEffect(()=>{j()},[w,S]);const M=()=>{C(0),j()},I=P=>{s(_=>{const A=new Set(_);return A.has(P)?A.delete(P):A.add(P),A})};return h?m.jsx($t,{}):f?m.jsxs("div",{className:"text-red-500",children:["Error: ",f]}):m.jsxs("div",{className:"max-w-6xl mx-auto",children:[m.jsxs("div",{className:"flex items-center justify-between mb-6",children:[m.jsx("h2",{className:"text-2xl font-bold",children:"Events"}),m.jsxs("div",{className:"flex gap-2",children:[m.jsx("input",{type:"text",className:"px-4 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-all",placeholder:"Filter by ref...",value:a,onChange:P=>c(P.target.value)}),m.jsx("button",{onClick:M,className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded-lg font-semibold transition-all shadow-lg shadow-blue-500/20 hover:shadow-blue-500/40",children:"Search"})]})]}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No events yet"}):m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Type Hash"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Payload"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((P,_)=>m.jsxs("tr",{className:`transition-colors ${_%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:P.id}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(lr,{hash:P.type_hash})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(P.created_at)}),m.jsxs("td",{className:"px-4 py-3",children:[m.jsx("button",{onClick:()=>I(P.id),className:"text-blue-400 hover:text-blue-300 text-sm font-medium transition-colors",children:o.has(P.id)?"Hide":"Show"}),o.has(P.id)&&m.jsx("pre",{className:"mt-2 p-3 bg-gray-950 rounded-lg text-xs overflow-x-auto border border-gray-800",children:JSON.stringify(P.payload,null,2).split(` +`).map((A,H)=>{if(A.includes(":")){const[J,...ee]=A.split(":");return m.jsxs("div",{children:[m.jsxs("span",{className:"text-blue-400",children:[J,":"]}),m.jsx("span",{className:"text-green-300",children:ee.join(":")})]},H)}return m.jsx("div",{className:"text-gray-300",children:A},H)})})]})]},_))})]}),m.jsx(Vr,{total:x,limit:w,offset:S,onPageChange:C,onLimitChange:b})]})]})}function ub(){const[n,l]=y.useState([]),[o,s]=y.useState(new Set),[a,c]=y.useState(""),[f,p]=y.useState(!0);y.useEffect(()=>{Wp().then(v=>l(v.projection_defs)).catch(v=>c(v.message)).finally(()=>p(!1))},[]);const h=v=>{s(x=>{const E=new Set(x);return E.has(v)?E.delete(v):E.add(v),E})};return f?m.jsx($t,{}):a?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",a]}):m.jsxs("div",{className:"max-w-5xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Projection Definitions"}),n.length===0?m.jsx(fn,{message:"No projection definitions found"}):m.jsx("div",{className:"space-y-4",children:n.map((v,x)=>m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg p-5 border border-gray-800 hover:border-gray-700 transition-colors",children:[m.jsxs("div",{className:"flex items-start justify-between mb-3",children:[m.jsxs("div",{children:[m.jsx("h3",{className:"font-mono text-lg text-gray-100",children:v.name}),m.jsx("div",{className:"mt-1",children:m.jsx(lr,{hash:v.hash||"unknown",short:!1})})]}),m.jsx("button",{onClick:()=>h(v.hash||x),className:"text-blue-400 hover:text-blue-300 text-sm font-medium transition-colors",children:o.has(v.hash||x)?"Hide Details":"Show Details"})]}),o.has(v.hash||x)&&m.jsxs("div",{className:"mt-4 space-y-3 text-sm bg-gray-800/30 rounded-lg p-4 border border-gray-700/50",children:[v.sources&&m.jsxs("div",{children:[m.jsx("span",{className:"text-gray-400 font-medium",children:"Sources:"}),m.jsx("div",{className:"mt-2 space-y-3",children:v.sources.map((E,w)=>m.jsxs("div",{className:"pl-3 border-l-2 border-gray-600",children:[m.jsx("div",{className:"text-gray-200 font-mono text-xs",children:E.event_def_hash}),m.jsxs("div",{className:"mt-1",children:[m.jsx("span",{className:"text-gray-500 text-xs",children:"bindings:"})," ",m.jsx("span",{className:"text-yellow-400 text-xs",children:JSON.stringify(E.bindings)})]}),m.jsxs("div",{className:"mt-0.5",children:[m.jsx("span",{className:"text-gray-500 text-xs",children:"expression:"})," ",m.jsx("code",{className:"text-green-400 text-xs",children:E.expression})]})]},w))})]}),v.params&&m.jsxs("div",{children:[m.jsx("span",{className:"text-gray-400 font-medium",children:"Params:"}),m.jsx("pre",{className:"mt-1.5 p-3 bg-gray-950 rounded-lg text-xs overflow-x-auto border border-gray-800",children:JSON.stringify(v.params,null,2).split(` +`).map((E,w)=>{if(E.includes(":")){const[b,...S]=E.split(":");return m.jsxs("div",{children:[m.jsxs("span",{className:"text-blue-400",children:[b,":"]}),m.jsx("span",{className:"text-green-300",children:S.join(":")})]},w)}return m.jsx("div",{className:"text-gray-300",children:E},w)})})]}),v.value_schema&&m.jsxs("div",{children:[m.jsx("span",{className:"text-gray-400 font-medium",children:"Value Schema:"}),m.jsx("pre",{className:"mt-1.5 p-3 bg-gray-950 rounded-lg text-xs overflow-x-auto border border-gray-800 text-purple-300",children:JSON.stringify(v.value_schema,null,2)})]}),v.initial_value!==void 0&&m.jsxs("div",{children:[m.jsx("span",{className:"text-gray-400 font-medium",children:"Initial Value:"}),m.jsx("pre",{className:"mt-1.5 p-3 bg-gray-950 rounded-lg text-xs overflow-x-auto border border-gray-800 text-blue-300",children:JSON.stringify(v.initial_value,null,2)})]})]})]},x))})]})}function cb(){const[n,l]=y.useState([]),[o,s]=y.useState(null),[a,c]=y.useState({}),[f,p]=y.useState([]),[h,v]=y.useState(null),[x,E]=y.useState(""),[w,b]=y.useState(!1),[S,C]=y.useState(!0);y.useEffect(()=>{Promise.all([Wp(),zp()]).then(([P,_])=>{l(P.projection_defs),p(_.objects.map(A=>({...A,id:String(A.id)})))}).catch(()=>{}).finally(()=>C(!1))},[]);const j=P=>{if(s(P),v(null),E(""),P){const _={};for(const A of Object.keys(P.params))_[A]="";c(_)}else c({})},M=async()=>{if(!o)return;b(!0),E(""),v(null);const P=new URLSearchParams;for(const[_,A]of Object.entries(a))A.trim()&&P.set(_,A.trim());try{const _=await ut(`/projections/${o.name}?${P.toString()}`);v(_.value)}catch(_){E(_.message)}finally{b(!1)}},I=y.useMemo(()=>{const P={};for(const _ of f)P[_.type]||(P[_.type]=[]),P[_.type].push(String(_.id));return P},[f]);return S?m.jsx($t,{}):m.jsxs("div",{className:"max-w-4xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Query Projections"}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg p-6 space-y-6 border border-gray-800",children:[m.jsxs("div",{children:[m.jsx("label",{className:"block text-sm font-medium text-gray-400 mb-2",children:"Projection"}),m.jsx(an,{value:o,onChange:j,children:m.jsxs("div",{className:"relative",children:[m.jsxs(an.Button,{className:"w-full px-4 py-2.5 bg-gray-800 border border-gray-700 rounded-lg text-left focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-all",children:[m.jsx("span",{className:o?"text-gray-100":"text-gray-500",children:o?.name||"Select a projection..."}),m.jsx("span",{className:"absolute inset-y-0 right-0 flex items-center pr-3 pointer-events-none",children:m.jsx("svg",{className:"h-5 w-5 text-gray-400",viewBox:"0 0 20 20",fill:"currentColor",children:m.jsx("path",{fillRule:"evenodd",d:"M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z",clipRule:"evenodd"})})})]}),m.jsx(an.Options,{className:"absolute z-10 mt-1 w-full bg-gray-800 border border-gray-700 rounded-lg shadow-lg max-h-60 overflow-auto focus:outline-none",children:n.map(P=>m.jsx(an.Option,{value:P,className:({active:_})=>`cursor-pointer select-none px-4 py-2.5 transition-colors ${_?"bg-blue-600 text-white":"text-gray-100"}`,children:({selected:_})=>m.jsx("span",{className:_?"font-semibold":"font-normal",children:P.name})},P.name))})]})})]}),o&&m.jsxs("div",{className:"space-y-4",children:[m.jsxs("div",{className:"flex items-baseline gap-2",children:[m.jsx("label",{className:"block text-sm font-medium text-gray-400",children:"Parameters"}),m.jsxs("span",{className:"text-xs text-gray-600",children:["→ ",o.value_schema?.type||"any",o.initial_value!==void 0&&m.jsxs("span",{className:"ml-1",children:["(initial: ",JSON.stringify(o.initial_value),")"]})]})]}),m.jsx("div",{className:"space-y-3 bg-gray-800/30 rounded-lg p-4 border border-gray-700/50",children:Object.entries(o.params).map(([P,_])=>m.jsxs("div",{children:[m.jsxs("label",{className:"block text-xs font-medium text-gray-500 mb-1.5",children:[P,m.jsxs("span",{className:"ml-2 px-1.5 py-0.5 bg-gray-700 rounded text-xs text-gray-400",children:[_.type,_.object_type?` → ${_.object_type}`:""]})]}),_.type==="ref"?m.jsx(db,{value:a[P]||"",onChange:A=>c({...a,[P]:A}),objects:f,objectsByType:I,objectType:_.object_type}):m.jsx("input",{type:_.type==="number"?"number":"text",className:"w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-all",placeholder:`Enter ${_.type} value...`,value:a[P]||"",onChange:A=>c({...a,[P]:A.target.value})})]},P))})]}),o&&m.jsx("div",{className:"text-xs space-y-2 bg-gray-800/20 rounded-lg p-4 border border-gray-700/30",children:m.jsxs("div",{children:[m.jsx("span",{className:"text-gray-500 font-medium",children:"sources:"}),m.jsx("div",{className:"mt-1 space-y-2",children:o.sources?.map((P,_)=>m.jsxs("div",{className:"pl-3 border-l border-gray-700",children:[m.jsx("div",{className:"flex items-center gap-2",children:m.jsx(lr,{hash:P.event_def_hash,short:!1})}),m.jsxs("div",{className:"text-xs mt-1",children:[m.jsx("span",{className:"text-gray-500",children:"bindings:"})," ",Object.keys(P.bindings).length===0?m.jsx("span",{className:"text-gray-500 italic",children:"none"}):m.jsx("span",{className:"text-yellow-400",children:Object.entries(P.bindings).map(([A,H])=>`${A}=${H}`).join(", ")})]}),m.jsxs("div",{className:"text-xs mt-0.5",children:[m.jsx("span",{className:"text-gray-500",children:"expression:"})," ",m.jsx("code",{className:"text-green-400",children:P.expression})]})]},_))})]})}),m.jsx("button",{onClick:M,disabled:!o||w,className:"w-full px-4 py-3 bg-blue-600 hover:bg-blue-700 rounded-lg font-semibold disabled:opacity-50 disabled:cursor-not-allowed transition-all shadow-lg shadow-blue-500/20 hover:shadow-blue-500/40",children:w?"Querying...":"Query Projection"}),x&&m.jsx("div",{className:"p-4 bg-red-900/20 border border-red-800 rounded-lg text-red-400 text-sm",children:x}),h!==null&&m.jsxs("div",{children:[m.jsx("h3",{className:"text-sm font-medium text-gray-400 mb-2",children:"Result"}),m.jsx("pre",{className:"p-4 bg-gray-950 rounded-lg overflow-x-auto text-sm text-green-300 border border-gray-800",children:JSON.stringify(h,null,2)})]})]})]})}function db({value:n,onChange:l,objects:o,objectsByType:s,objectType:a}){const[c,f]=y.useState(""),p=y.useMemo(()=>a?o.filter(x=>x.type===a):o,[o,a]),h=y.useMemo(()=>{if(!a)return s;const x={};return s[a]&&(x[a]=s[a]),x},[s,a]),v=y.useMemo(()=>{if(!c)return p;const x=c.toLowerCase();return p.filter(E=>String(E.id).toLowerCase().includes(x)||E.type.toLowerCase().includes(x))},[p,c]);return m.jsx(Io,{value:n,onChange:x=>l(x||""),children:m.jsxs("div",{className:"relative",children:[m.jsxs("div",{className:"relative",children:[m.jsx(Io.Input,{className:"w-full px-3 py-2 pr-10 bg-gray-800 border border-gray-700 rounded-lg focus:border-blue-500 focus:outline-none focus:ring-2 focus:ring-blue-500/20 transition-all",placeholder:"Type object ID or select...",onChange:x=>f(x.target.value),displayValue:x=>x}),m.jsx(Io.Button,{className:"absolute inset-y-0 right-0 flex items-center pr-3",children:m.jsx("svg",{className:"h-5 w-5 text-gray-400",viewBox:"0 0 20 20",fill:"currentColor",children:m.jsx("path",{fillRule:"evenodd",d:"M10 3a1 1 0 01.707.293l3 3a1 1 0 01-1.414 1.414L10 5.414 7.707 7.707a1 1 0 01-1.414-1.414l3-3A1 1 0 0110 3zm-3.707 9.293a1 1 0 011.414 0L10 14.586l2.293-2.293a1 1 0 011.414 1.414l-3 3a1 1 0 01-1.414 0l-3-3a1 1 0 010-1.414z",clipRule:"evenodd"})})})]}),m.jsxs(Io.Options,{className:"absolute z-10 mt-1 w-full bg-gray-800 border border-gray-700 rounded-lg shadow-lg max-h-60 overflow-auto focus:outline-none",children:[Object.entries(h).map(([x,E])=>{const w=E.filter(b=>!c||b.toLowerCase().includes(c.toLowerCase()));return w.length===0?null:m.jsxs("div",{children:[m.jsx("div",{className:"sticky top-0 px-3 py-1.5 text-xs font-medium text-gray-500 bg-gray-850 border-b border-gray-700",children:x}),w.map(b=>m.jsx(Io.Option,{value:b,className:({active:S})=>`cursor-pointer select-none px-3 py-2 text-sm transition-colors ${S?"bg-blue-600 text-white":"text-gray-100"}`,children:({selected:S})=>m.jsx("span",{className:S?"font-semibold":"font-normal",children:b})},b))]},x)}),v.length===0&&m.jsx("div",{className:"px-3 py-2 text-sm text-gray-500",children:"No objects found"})]})]})})}function fb(){const[n,l]=y.useState([]),[o,s]=y.useState(""),[a,c]=y.useState(!0),[f,p]=y.useState(0),[h,v]=y.useState(50),[x,E]=y.useState(0),w=()=>{c(!0),_0(h,x).then(S=>{l(S.reactions),p(S.total)}).catch(S=>s(S.message)).finally(()=>c(!1))};y.useEffect(()=>{w()},[h,x]);const b=async S=>{if(confirm("Delete this reaction?"))try{await L0(S),w()}catch(C){s(C.message)}};return a?m.jsx($t,{}):o?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",o]}):m.jsxs("div",{className:"max-w-7xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Reactions"}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No reactions found"}):m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Projection Def"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Params Hash"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Action"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Target"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"}),m.jsx("th",{className:"px-4 py-3"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((S,C)=>m.jsxs("tr",{className:`transition-colors ${C%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:S.id}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(lr,{hash:S.projection_def_hash||"unknown"})}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(lr,{hash:S.params_hash||"unknown"})}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium ${S.action==="emit_event"?"bg-purple-500/20 text-purple-300 border border-purple-500/30":"bg-blue-500/20 text-blue-300 border border-blue-500/30"}`,children:S.action||"webhook"})}),m.jsx("td",{className:"px-4 py-3 text-sm truncate max-w-xs font-mono",children:S.action==="emit_event"?m.jsxs("div",{children:[m.jsxs("span",{className:"text-purple-400",children:["→ ",S.emit_event_type]}),S.emit_payload_template&&m.jsxs("div",{className:"text-gray-500 text-xs mt-1 truncate",children:["template: ",m.jsx("code",{className:"text-green-400",children:S.emit_payload_template})]})]}):m.jsx("span",{className:"text-blue-400",children:S.webhook_url})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(S.created_at)}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("button",{onClick:()=>b(S.id),className:"px-3 py-1.5 bg-red-600 hover:bg-red-700 rounded text-sm font-medium transition-colors shadow-lg shadow-red-500/20 hover:shadow-red-500/40",children:"Delete"})})]},C))})]}),m.jsx(Vr,{total:f,limit:h,offset:x,onPageChange:E,onLimitChange:v})]})]})}function pb(){const[n,l]=y.useState([]),[o,s]=y.useState(""),[a,c]=y.useState(!0),[f,p]=y.useState(0),[h,v]=y.useState(50),[x,E]=y.useState(0),[w,b]=y.useState(""),[S,C]=y.useState(""),[j,M]=y.useState(""),[I,P]=y.useState(!1),[_,A]=y.useState(""),[H,J]=y.useState(!1),ee=()=>{c(!0),I0(h,x).then(B=>{l(B.api_keys),p(B.total)}).catch(B=>s(B.message)).finally(()=>c(!1))};y.useEffect(()=>{ee()},[h,x]);const he=async()=>{if(w.trim()){P(!0);try{const B={name:w.trim()};S.trim()&&(B.allowed_events=S.split(",").map(ae=>ae.trim()).filter(Boolean)),j.trim()&&(B.rate_limit=parseInt(j,10));const se=await F0(B);A(se.plaintext_key),J(!1),b(""),C(""),M(""),ee()}catch(B){s(B.message)}finally{P(!1)}}},q=async B=>{if(confirm("Delete this API key?"))try{await D0(B),ee()}catch(se){s(se.message)}},ce=()=>{navigator.clipboard.writeText(_),J(!0)};return a?m.jsx($t,{}):o?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",o]}):m.jsxs("div",{className:"max-w-7xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"API Keys"}),_&&m.jsx("div",{className:"fixed inset-0 bg-black/60 backdrop-blur-sm flex items-center justify-center z-50",children:m.jsxs("div",{className:"bg-gray-900 border border-gray-700 rounded-xl p-6 max-w-lg w-full mx-4 shadow-2xl",children:[m.jsx("h3",{className:"text-lg font-bold text-yellow-400 mb-2",children:"Save your API key"}),m.jsx("p",{className:"text-sm text-gray-400 mb-4",children:"This key will only be shown once. Copy it now and store it securely."}),m.jsx("div",{className:"bg-gray-800 rounded-lg p-3 font-mono text-sm text-green-400 break-all mb-4",children:_}),m.jsxs("div",{className:"flex gap-3 justify-end",children:[m.jsx("button",{onClick:ce,className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded-lg text-sm font-medium transition-colors",children:H?"Copied!":"Copy"}),m.jsx("button",{onClick:()=>A(""),className:"px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg text-sm font-medium transition-colors",children:"Close"})]})]})}),m.jsx("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg border border-gray-800 p-4 mb-6",children:m.jsxs("div",{className:"flex flex-wrap items-end gap-3",children:[m.jsxs("div",{children:[m.jsx("label",{className:"block text-xs text-gray-400 mb-1",children:"Name"}),m.jsx("input",{type:"text",value:w,onChange:B=>b(B.target.value),placeholder:"my-service",className:"px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500"})]}),m.jsxs("div",{children:[m.jsx("label",{className:"block text-xs text-gray-400 mb-1",children:"Allowed Events (comma-separated)"}),m.jsx("input",{type:"text",value:S,onChange:B=>C(B.target.value),placeholder:"order.created, user.signed_up",className:"px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-64"})]}),m.jsxs("div",{children:[m.jsx("label",{className:"block text-xs text-gray-400 mb-1",children:"Rate Limit"}),m.jsx("input",{type:"number",value:j,onChange:B=>M(B.target.value),placeholder:"1000",className:"px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-24"})]}),m.jsx("button",{onClick:he,disabled:I||!w.trim(),className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 disabled:opacity-50 rounded-lg text-sm font-medium transition-colors shadow-lg shadow-blue-500/20",children:I?"Creating...":"Create"})]})}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No API keys found"}):m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Name"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Role"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Allowed Events"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Rate Limit"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Last Used"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"}),m.jsx("th",{className:"px-4 py-3"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((B,se)=>m.jsxs("tr",{className:`transition-colors ${se%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:B.id}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-200 font-medium",children:B.name}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-purple-500/20 text-purple-300 border border-purple-500/30",children:B.role||"default"})}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("div",{className:"flex flex-wrap gap-1",children:B.allowed_events&&B.allowed_events.length>0?B.allowed_events.map((ae,X)=>m.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-500/20 text-blue-300 border border-blue-500/30",children:ae},X)):m.jsx("span",{className:"text-gray-500 text-xs",children:"all"})})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 font-mono",children:B.rate_limit??"—"}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:B.last_used_at?ur(B.last_used_at):"—"}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(B.created_at)}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("button",{onClick:()=>q(B.id),className:"px-3 py-1.5 bg-red-600 hover:bg-red-700 rounded text-sm font-medium transition-colors shadow-lg shadow-red-500/20 hover:shadow-red-500/40",children:"Delete"})})]},B.id))})]}),m.jsx(Vr,{total:f,limit:h,offset:x,onPageChange:E,onLimitChange:v})]})]})}function mb({status:n}){const l={success:"bg-green-500/20 text-green-300 border-green-500/30",failed:"bg-red-500/20 text-red-300 border-red-500/30",skipped:"bg-gray-500/20 text-gray-400 border-gray-500/30"};return m.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-medium border ${l[n]||l.skipped}`,children:n})}function nu(n,l=60){if(n==null)return"—";const o=typeof n=="string"?n:JSON.stringify(n);return o.length>l?o.slice(0,l)+"...":o}function hb(){const[n,l]=y.useState([]),[o,s]=y.useState(""),[a,c]=y.useState(!0),[f,p]=y.useState(0),[h,v]=y.useState(50),[x,E]=y.useState(0),[w,b]=y.useState(""),[S,C]=y.useState(new Set),j=()=>{c(!0);const I=w.trim()?parseInt(w,10):void 0;z0(h,x,I).then(P=>{l(P.reaction_logs),p(P.total)}).catch(P=>s(P.message)).finally(()=>c(!1))};y.useEffect(()=>{j()},[h,x]);const M=I=>{C(P=>{const _=new Set(P);return _.has(I)?_.delete(I):_.add(I),_})};return a?m.jsx($t,{}):o?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",o]}):m.jsxs("div",{className:"max-w-7xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Reaction Logs"}),m.jsx("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg border border-gray-800 p-4 mb-6",children:m.jsxs("div",{className:"flex items-end gap-3",children:[m.jsxs("div",{children:[m.jsx("label",{className:"block text-xs text-gray-400 mb-1",children:"Filter by Reaction ID"}),m.jsx("input",{type:"number",value:w,onChange:I=>b(I.target.value),placeholder:"Reaction ID",className:"px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40"})]}),m.jsx("button",{onClick:()=>{E(0),j()},className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded-lg text-sm font-medium transition-colors",children:"Filter"}),w&&m.jsx("button",{onClick:()=>{b(""),E(0),setTimeout(j,0)},className:"px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg text-sm font-medium transition-colors",children:"Clear"})]})}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No reaction logs found"}):m.jsx("div",{className:"overflow-x-auto",children:m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Reaction"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Trigger Event"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Projection"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Old Value"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"New Value"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Action"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Status"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Output"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Duration"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((I,P)=>m.jsxs("tr",{className:`transition-colors ${P%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:I.id}),m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:I.reaction_id}),m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:I.trigger_event_id}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 max-w-[120px] truncate",children:nu(I.projection_def,30)}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 font-mono max-w-[120px] truncate",children:nu(I.old_value)}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 font-mono max-w-[120px] truncate",children:nu(I.new_value)}),m.jsx("td",{className:"px-4 py-3",children:m.jsx("span",{className:"inline-flex items-center px-2 py-0.5 rounded text-xs font-medium bg-blue-500/20 text-blue-300 border border-blue-500/30",children:I.action})}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(mb,{status:I.status})}),m.jsx("td",{className:"px-4 py-3 text-sm",children:I.handler_output?m.jsxs("div",{children:[m.jsx("button",{onClick:()=>M(I.id),className:"text-blue-400 hover:text-blue-300 text-xs underline",children:S.has(I.id)?"Hide":"Show"}),S.has(I.id)&&m.jsx("pre",{className:"mt-2 p-2 bg-gray-800 rounded text-xs text-gray-300 max-w-xs overflow-auto whitespace-pre-wrap",children:typeof I.handler_output=="string"?I.handler_output:JSON.stringify(I.handler_output,null,2)})]}):m.jsx("span",{className:"text-gray-600",children:"—"})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 font-mono",children:I.duration_ms!=null?`${I.duration_ms}ms`:"—"}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(I.created_at)})]},I.id))})]})}),m.jsx(Vr,{total:f,limit:h,offset:x,onPageChange:E,onLimitChange:v})]})]})}function gb({method:n}){const l={GET:"bg-blue-500/20 text-blue-300 border-blue-500/30",POST:"bg-green-500/20 text-green-300 border-green-500/30",PUT:"bg-yellow-500/20 text-yellow-300 border-yellow-500/30",PATCH:"bg-orange-500/20 text-orange-300 border-orange-500/30",DELETE:"bg-red-500/20 text-red-300 border-red-500/30"};return m.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-bold border ${l[n]||"bg-gray-500/20 text-gray-300 border-gray-500/30"}`,children:n})}function vb({code:n}){let l="bg-gray-500/20 text-gray-300 border-gray-500/30";return n>=200&&n<300?l="bg-green-500/20 text-green-300 border-green-500/30":n>=400&&n<500?l="bg-yellow-500/20 text-yellow-300 border-yellow-500/30":n>=500&&(l="bg-red-500/20 text-red-300 border-red-500/30"),m.jsx("span",{className:`inline-flex items-center px-2 py-0.5 rounded text-xs font-bold border ${l}`,children:n})}function yb(){const[n,l]=y.useState([]),[o,s]=y.useState(""),[a,c]=y.useState(!0),[f,p]=y.useState(0),[h,v]=y.useState(50),[x,E]=y.useState(0),[w,b]=y.useState(""),S=()=>{c(!0);const C=w.trim()?parseInt(w,10):void 0;W0(h,x,C).then(j=>{l(j.request_logs),p(j.total)}).catch(j=>s(j.message)).finally(()=>c(!1))};return y.useEffect(()=>{S()},[h,x]),a?m.jsx($t,{}):o?m.jsxs("div",{className:"text-red-500 text-center p-8",children:["Error: ",o]}):m.jsxs("div",{className:"max-w-7xl mx-auto",children:[m.jsx("h2",{className:"text-2xl font-bold mb-6",children:"Request Logs"}),m.jsx("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg border border-gray-800 p-4 mb-6",children:m.jsxs("div",{className:"flex items-end gap-3",children:[m.jsxs("div",{children:[m.jsx("label",{className:"block text-xs text-gray-400 mb-1",children:"Filter by API Key ID"}),m.jsx("input",{type:"number",value:w,onChange:C=>b(C.target.value),placeholder:"API Key ID",className:"px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40"})]}),m.jsx("button",{onClick:()=>{E(0),S()},className:"px-4 py-2 bg-blue-600 hover:bg-blue-700 rounded-lg text-sm font-medium transition-colors",children:"Filter"}),w&&m.jsx("button",{onClick:()=>{b(""),E(0),setTimeout(S,0)},className:"px-4 py-2 bg-gray-700 hover:bg-gray-600 rounded-lg text-sm font-medium transition-colors",children:"Clear"})]})}),m.jsxs("div",{className:"bg-gray-900/50 backdrop-blur rounded-lg overflow-hidden border border-gray-800",children:[n.length===0?m.jsx(fn,{message:"No request logs found"}):m.jsx("div",{className:"overflow-x-auto",children:m.jsxs("table",{className:"w-full",children:[m.jsx("thead",{className:"bg-gray-800/80 border-b border-gray-700",children:m.jsxs("tr",{children:[m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"ID"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Method"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Path"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"API Key"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Status"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Error"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Duration"}),m.jsx("th",{className:"px-4 py-3 text-left text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Created"})]})}),m.jsx("tbody",{className:"divide-y divide-gray-800",children:n.map((C,j)=>m.jsxs("tr",{className:`transition-colors ${j%2===0?"bg-gray-900/30":"bg-gray-850/30"} hover:bg-gray-800/60`,children:[m.jsx("td",{className:"px-4 py-3 font-mono text-sm text-gray-300",children:C.id}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(gb,{method:C.method})}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-300 font-mono",children:C.path}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:C.api_key_name||"—"}),m.jsx("td",{className:"px-4 py-3",children:m.jsx(vb,{code:C.status_code})}),m.jsx("td",{className:"px-4 py-3 text-sm text-red-400 max-w-[200px] truncate",children:C.error||"—"}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400 font-mono",children:C.duration_ms!=null?`${C.duration_ms}ms`:"—"}),m.jsx("td",{className:"px-4 py-3 text-sm text-gray-400",children:ur(C.created_at)})]},C.id))})]})}),m.jsx(Vr,{total:f,limit:h,offset:x,onPageChange:E,onLimitChange:v})]})]})}function xb(){const[n,l]=y.useState("health"),[o,s]=y.useState(!1),[a,c]=y.useState(""),[f,p]=y.useState(!0);y.useEffect(()=>{setTimeout(()=>{T0()||s(!0),p(!1)},100)},[]);const h=()=>{a.trim()&&(P0(a.trim()),s(!1))};return f?m.jsx("div",{className:"flex items-center justify-center h-screen bg-gray-950",children:m.jsx($t,{})}):o?m.jsx("div",{className:"flex items-center justify-center h-screen bg-gray-950 text-gray-100 px-4",children:m.jsxs("div",{className:"bg-gray-900/80 backdrop-blur border border-gray-800 p-8 rounded-xl shadow-2xl max-w-md w-full animate-fadeIn",children:[m.jsxs("div",{className:"text-center mb-6",children:[m.jsx("h2",{className:"text-3xl font-bold mb-2 bg-gradient-to-r from-blue-400 to-purple-500 bg-clip-text text-transparent",children:"OGraph UI"}),m.jsx("p",{className:"text-gray-400 text-sm",children:"Enter your API token to continue"})]}),m.jsx("input",{type:"text",className:"w-full px-4 py-3 bg-gray-800 border border-gray-700 rounded-lg mb-4 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all",placeholder:"API Token",value:a,onChange:v=>c(v.target.value),onKeyDown:v=>v.key==="Enter"&&h(),autoFocus:!0}),m.jsx("button",{onClick:h,className:"w-full px-4 py-3 bg-blue-600 hover:bg-blue-700 rounded-lg font-semibold shadow-lg shadow-blue-500/30 hover:shadow-blue-500/50 transition-all",children:"Continue"})]})}):m.jsx(j0,{page:n,onPageChange:l,children:m.jsxs("div",{className:"animate-fadeIn",children:[n==="health"&&m.jsx(H0,{}),n==="object-defs"&&m.jsx(V0,{}),n==="objects"&&m.jsx(lb,{}),n==="event-defs"&&m.jsx(sb,{}),n==="events"&&m.jsx(ab,{}),n==="projection-defs"&&m.jsx(ub,{}),n==="projections"&&m.jsx(cb,{}),n==="reactions"&&m.jsx(fb,{}),n==="api-keys"&&m.jsx(pb,{}),n==="reaction-logs"&&m.jsx(hb,{}),n==="request-logs"&&m.jsx(yb,{})]})})}C0.createRoot(document.getElementById("root")).render(m.jsx(y.StrictMode,{children:m.jsx(xb,{})})); +
diff --git a/packages/engine/ui/POLISH_REPORT.md b/packages/engine/ui/POLISH_REPORT.md new file mode 100644 index 0000000..702e8c2 --- /dev/null +++ b/packages/engine/ui/POLISH_REPORT.md @@ -0,0 +1,116 @@ +# OGraph UI 美化完成报告 🍊 + +## 完成情况 ✅ + +### 1. 依赖安装 + +- ✅ 安装 `@headlessui/react`(无障碍 UI 组件库) +- ✅ 安装 `date-fns`(时间格式化) + +### 2. Headless UI 集成 + +- ✅ **Projections.tsx**: 自定义 RefCombobox → Headless UI Combobox +- ✅ **Projections.tsx**: 投影选择器 → Headless UI Listbox +- ✅ **Objects.tsx**: 类型筛选 → Headless UI Listbox + +### 3. 整体美化 + +#### 3.1 表格样式 + +- ✅ Striped rows(奇偶行背景色区分) +- ✅ Hover highlight(悬停高亮) +- ✅ 更好的 padding(py-3 px-4) +- ✅ 表头样式提升(uppercase, tracking-wider, 半透明背景) + +#### 3.2 JSON 显示 + +- ✅ 简单的 syntax highlighting(key 蓝色,value 绿色) +- ✅ 边框 + 圆角 + 背景优化 + +#### 3.3 卡片式布局 + +- ✅ 所有页面内容区域改用卡片(bg-gray-900/50 + backdrop-blur + border) +- ✅ ProjectionDefs 用展开式卡片布局 + +#### 3.4 状态标签 + +- ✅ Hash 标签:monospace + 浅色背景 pill(`HashBadge` 组件) +- ✅ Type 标签:蓝色 pill 样式 + +#### 3.5 时间戳格式化 + +- ✅ 相对时间显示("2 min ago")用 `formatRelativeTime` 工具函数 +- ✅ 应用于 Events、Objects、Reactions + +#### 3.6 空状态提示 + +- ✅ `EmptyState` 组件(图标 + "No xxx found") +- ✅ 应用于所有列表页面 + +#### 3.7 Loading Spinner + +- ✅ `Spinner` 组件(蓝色环形动画) +- ✅ 应用于所有异步加载场景 +- ✅ App.tsx 登录检查也加了 spinner + +### 4. 全局样式优化 + +- ✅ 自定义深色滚动条 +- ✅ 渐变背景(from-gray-950 via-gray-900 to-gray-950) +- ✅ 平滑过渡动画(transition-all) +- ✅ fadeIn 动画(页面切换) + +### 5. 组件优化 + +- ✅ Layout: 渐变标题 + 状态指示器 + 改进导航样式 +- ✅ App.tsx: 登录页美化 + 渐变标题 + 初始 loading 状态 +- ✅ Health: 心跳动画(脉冲绿点) + +### 6. 构建 & 部署 + +- ✅ `npm run build` 成功 +- ✅ dist/index.html: **331KB** < 500KB ✅ +- ✅ 已复制到 `../src/ui.html` + +## 关键文件变更 + +``` +ui/src/ +├── components/ +│ ├── Common.tsx (新增) — Spinner, EmptyState, HashBadge +│ ├── Projections.tsx (重写) — Headless UI Combobox + Listbox +│ ├── Objects.tsx (重写) — Headless UI Listbox +│ ├── Events.tsx (美化) — 相对时间 + JSON 高亮 +│ ├── EventDefs.tsx (美化) — 卡片 + 标签 +│ ├── ProjectionDefs.tsx (美化) — 展开式卡片 + JSON 高亮 +│ ├── Reactions.tsx (美化) — 相对时间 + 按钮美化 +│ ├── ObjectDefs.tsx (美化) — 表格优化 +│ ├── Health.tsx (美化) — 心跳动画 +│ ├── Layout.tsx (美化) — 渐变标题 + 导航优化 +│ └── App.tsx (优化) — 登录页美化 + loading +├── utils.ts (新增) — 时间格式化 +└── index.css (扩展) — 全局样式 + 动画 +``` + +## 技术亮点 + +- 🎨 **Headless UI**: 无障碍组件库,键盘导航友好 +- ⏰ **date-fns**: 轻量时间格式化(相对时间) +- 🎭 **backdrop-blur**: 毛玻璃效果,现代感强 +- 🌈 **渐变标题**: bg-clip-text 文字渐变 +- ⚡ **CSS 动画**: 脉冲、淡入、旋转 spinner +- 📦 **单文件构建**: vite-plugin-singlefile,331KB + +## 最终效果 + +- 暗色主题(bg-gray-950, text-gray-100)✅ +- 响应式卡片布局 ✅ +- 高对比度表格(striped + hover)✅ +- JSON 语法高亮 ✅ +- 相对时间显示 ✅ +- 空状态友好提示 ✅ +- 流畅加载动画 ✅ +- 文件体积 < 500KB ✅ + +小橘 🍊 (NEKO Team) +2026-04-12 diff --git a/packages/engine/ui/index.html b/packages/engine/ui/index.html new file mode 100644 index 0000000..1318d47 --- /dev/null +++ b/packages/engine/ui/index.html @@ -0,0 +1,12 @@ + + + + + + OGraph UI + + +
+ + + diff --git a/packages/engine/ui/package-lock.json b/packages/engine/ui/package-lock.json new file mode 100644 index 0000000..e80308f --- /dev/null +++ b/packages/engine/ui/package-lock.json @@ -0,0 +1,3043 @@ +{ + "name": "ograph-ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ograph-ui", + "version": "0.0.0", + "dependencies": { + "@headlessui/react": "^2.2.10", + "date-fns": "^4.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.3", + "vite": "^6.0.5", + "vite-plugin-singlefile": "^2.0.2" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.28", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.28.tgz", + "integrity": "sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==", + "license": "MIT", + "dependencies": { + "@floating-ui/react-dom": "^2.1.2", + "@floating-ui/utils": "^0.2.8", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.8.tgz", + "integrity": "sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.6" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@headlessui/react": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-2.2.10.tgz", + "integrity": "sha512-5pVLNK9wlpxTUTy9GpgbX/SdcRh+HBnPktjM2wbiLTH4p+2EPHBO1aoSryUCuKUIItdDWO9ITlhUL8UnUN/oIA==", + "license": "MIT", + "dependencies": { + "@floating-ui/react": "^0.26.16", + "@react-aria/focus": "^3.20.2", + "@react-aria/interactions": "^3.25.0", + "@tanstack/react-virtual": "^3.13.9", + "use-sync-external-store": "^1.5.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^18 || ^19 || ^19.0.0-rc", + "react-dom": "^18 || ^19 || ^19.0.0-rc" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@react-aria/focus": { + "version": "3.21.5", + "resolved": "https://registry.npmjs.org/@react-aria/focus/-/focus-3.21.5.tgz", + "integrity": "sha512-V18fwCyf8zqgJdpLQeDU5ZRNd9TeOfBbhLgmX77Zr5ae9XwaoJ1R3SFJG1wCJX60t34AW+aLZSEEK+saQElf3Q==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/interactions": "^3.27.1", + "@react-aria/utils": "^3.33.1", + "@react-types/shared": "^3.33.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/interactions": { + "version": "3.27.1", + "resolved": "https://registry.npmjs.org/@react-aria/interactions/-/interactions-3.27.1.tgz", + "integrity": "sha512-M3wLpTTmDflI0QGNK0PJNUaBXXfeBXue8ZxLMngfc1piHNiH4G5lUvWd9W14XVbqrSCVY8i8DfGrNYpyyZu0tw==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.10", + "@react-aria/utils": "^3.33.1", + "@react-stately/flags": "^3.1.2", + "@react-types/shared": "^3.33.1", + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/ssr": { + "version": "3.9.10", + "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.10.tgz", + "integrity": "sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-aria/utils": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@react-aria/utils/-/utils-3.33.1.tgz", + "integrity": "sha512-kIx1Sj6bbAT0pdqCegHuPanR9zrLn5zMRiM7LN12rgRf55S19ptd9g3ncahArifYTRkfEU9VIn+q0HjfMqS9/w==", + "license": "Apache-2.0", + "dependencies": { + "@react-aria/ssr": "^3.9.10", + "@react-stately/flags": "^3.1.2", + "@react-stately/utils": "^3.11.0", + "@react-types/shared": "^3.33.1", + "@swc/helpers": "^0.5.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1", + "react-dom": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-stately/flags": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@react-stately/flags/-/flags-3.1.2.tgz", + "integrity": "sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@react-stately/utils": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/@react-stately/utils/-/utils-3.11.0.tgz", + "integrity": "sha512-8LZpYowJ9eZmmYLpudbo/eclIRnbhWIJZ994ncmlKlouNzKohtM8qTC6B1w1pwUbiwGdUoyzLuQbeaIor5Dvcw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@react-types/shared": { + "version": "3.33.1", + "resolved": "https://registry.npmjs.org/@react-types/shared/-/shared-3.33.1.tgz", + "integrity": "sha512-oJHtjvLG43VjwemQDadlR5g/8VepK56B/xKO2XORPHt9zlW6IZs3tZrYlvH29BMvoqC7RtE7E5UjgbnbFtDGag==", + "license": "Apache-2.0", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/helpers": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.21.tgz", + "integrity": "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tanstack/react-virtual": { + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.23.tgz", + "integrity": "sha512-XnMRnHQ23piOVj2bzJqHrRrLg4r+F86fuBcwteKfbIjJrtGxb4z7tIvPVAe4B+4UVwo9G4Giuz5fmapcrnZ0OQ==", + "license": "MIT", + "dependencies": { + "@tanstack/virtual-core": "3.13.23" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/virtual-core": { + "version": "3.13.23", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.23.tgz", + "integrity": "sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.28", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.28.tgz", + "integrity": "sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.27.tgz", + "integrity": "sha512-NP9APE+tO+LuJGn7/9+cohklunJsXWiaWEfV3si4Gi/XHDwVNgkwr1J3RQYFIvPy76GmJ9/bW8vyoU1LcxwKHA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz", + "integrity": "sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/date-fns": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", + "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.4.0.tgz", + "integrity": "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg==", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-singlefile": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-2.3.2.tgz", + "integrity": "sha512-b8SxCi/gG7K298oJDcKOuZeU6gf6wIcCJAaEqUmmZXdjfuONlkyNyWZC3tEbN6QockRCNUd3it9eGTtpHGoYmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">18.0.0" + }, + "peerDependencies": { + "rollup": "^4.59.0", + "vite": "^5.4.11 || ^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/packages/engine/ui/package.json b/packages/engine/ui/package.json new file mode 100644 index 0000000..5d3284f --- /dev/null +++ b/packages/engine/ui/package.json @@ -0,0 +1,28 @@ +{ + "name": "ograph-ui", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview" + }, + "dependencies": { + "@headlessui/react": "^2.2.10", + "date-fns": "^4.1.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.49", + "tailwindcss": "^3.4.17", + "typescript": "^5.7.3", + "vite": "^6.0.5", + "vite-plugin-singlefile": "^2.0.2" + } +} diff --git a/packages/engine/ui/postcss.config.js b/packages/engine/ui/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/packages/engine/ui/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/engine/ui/src/App.tsx b/packages/engine/ui/src/App.tsx new file mode 100644 index 0000000..3f00f79 --- /dev/null +++ b/packages/engine/ui/src/App.tsx @@ -0,0 +1,109 @@ +import { useState, useEffect } from 'react' +import Layout from './components/Layout' +import Health from './components/Health' +import ObjectDefs from './components/ObjectDefs' +import Objects from './components/Objects' +import EventDefs from './components/EventDefs' +import Events from './components/Events' +import ProjectionDefs from './components/ProjectionDefs' +import Projections from './components/Projections' +import Reactions from './components/Reactions' +import ApiKeys from './components/ApiKeys' +import ReactionLogs from './components/ReactionLogs' +import RequestLogs from './components/RequestLogs' +import { getToken, setToken } from './api' +import { Spinner } from './components/Common' + +type Page = + | 'health' + | 'object-defs' + | 'objects' + | 'event-defs' + | 'events' + | 'projection-defs' + | 'projections' + | 'reactions' + | 'api-keys' + | 'reaction-logs' + | 'request-logs' + +function App() { + const [page, setPage] = useState('health') + const [needsAuth, setNeedsAuth] = useState(false) + const [tokenInput, setTokenInput] = useState('') + const [checking, setChecking] = useState(true) + + useEffect(() => { + setTimeout(() => { + if (!getToken()) { + setNeedsAuth(true) + } + setChecking(false) + }, 100) + }, []) + + const handleAuth = () => { + if (tokenInput.trim()) { + setToken(tokenInput.trim()) + setNeedsAuth(false) + } + } + + if (checking) { + return ( +
+ +
+ ) + } + + if (needsAuth) { + return ( +
+
+
+

+ OGraph UI +

+

Enter your API token to continue

+
+ setTokenInput(e.target.value)} + onKeyDown={(e) => e.key === 'Enter' && handleAuth()} + autoFocus + /> + +
+
+ ) + } + + return ( + +
+ {page === 'health' && } + {page === 'object-defs' && } + {page === 'objects' && } + {page === 'event-defs' && } + {page === 'events' && } + {page === 'projection-defs' && } + {page === 'projections' && } + {page === 'reactions' && } + {page === 'api-keys' && } + {page === 'reaction-logs' && } + {page === 'request-logs' && } +
+
+ ) +} + +export default App diff --git a/packages/engine/ui/src/api.ts b/packages/engine/ui/src/api.ts new file mode 100644 index 0000000..867c4e6 --- /dev/null +++ b/packages/engine/ui/src/api.ts @@ -0,0 +1,103 @@ +const BASE = '' + +let token = localStorage.getItem('ograph_token') || '' + +export function setToken(t: string) { + token = t + localStorage.setItem('ograph_token', t) +} + +export function getToken() { + return token +} + +export async function api(path: string, opts?: RequestInit): Promise { + const res = await fetch(BASE + path, { + ...opts, + headers: { + Authorization: token ? `Bearer ${token}` : '', + 'Content-Type': 'application/json', + ...opts?.headers, + }, + }) + + if (res.status === 401) { + throw new Error('UNAUTHORIZED') + } + + if (!res.ok) { + throw new Error(`API error: ${res.status}`) + } + + return res.json() +} + +// Health +export const getHealth = () => api<{ version: string }>('/health') + +// Object Defs +export const getObjectDefs = () => api<{ object_defs: Array<{ name: string }> }>('/object-defs') + +// Objects +export const getObjects = (type?: string, limit = 50, offset = 0) => + api<{ objects: Array<{ id: string; type: string; created_at: string }>; total: number }>( + type ? `/objects?type=${type}&limit=${limit}&offset=${offset}` : `/objects?limit=${limit}&offset=${offset}`, + ) + +// Event Defs +export const getEventDefs = () => + api<{ event_defs: Array<{ name: string; hash: string; parent_hash: string | null; schema: any }> }>('/event-defs') + +// Events +export const getEvents = (ref?: string, limit = 50, offset = 0) => + api<{ events: Array<{ id: string; type_hash: string; payload: any; created_at: string }>; total: number }>( + ref ? `/events?ref=${ref}&limit=${limit}&offset=${offset}` : `/events?limit=${limit}&offset=${offset}`, + ) + +// Projection Defs +export const getProjectionDefs = () => api<{ projection_defs: Array }>('/projection-defs') + +// Query Projection +export const queryProjection = (name: string, params: Record) => { + const qs = new URLSearchParams() + for (const [k, v] of Object.entries(params)) { + if (v !== '' && v !== undefined) qs.set(k, String(v)) + } + return api<{ value: any }>(`/projections/${name}?${qs.toString()}`) +} + +// Reactions +export const getReactions = (limit = 50, offset = 0) => + api<{ reactions: Array; total: number }>(`/reactions?limit=${limit}&offset=${offset}`) + +export const deleteReaction = (id: string) => api(`/reactions/${id}`, { method: 'DELETE' }) + +// API Keys +export const getApiKeys = (limit = 50, offset = 0) => + api<{ api_keys: Array; total: number }>(`/api-keys?limit=${limit}&offset=${offset}`) + +export const createApiKey = (data: { name: string; allowed_events?: string[]; rate_limit?: number }) => + api<{ api_key: any; plaintext_key: string }>('/api-keys', { method: 'POST', body: JSON.stringify(data) }) + +export const deleteApiKey = (id: number) => api(`/api-keys/${id}`, { method: 'DELETE' }) + +// Emit Event +export const createEvent = (type: string, payload: Record) => + api<{ event: any; reactions_fired: number; reaction_results: any[] }>('/events', { + method: 'POST', + body: JSON.stringify({ type, payload }), + }) + +// Reaction Logs +export const getReactionLogs = (limit = 50, offset = 0, reactionId?: number) => { + let url = `/reaction-logs?limit=${limit}&offset=${offset}` + if (reactionId) url += `&reaction_id=${reactionId}` + return api<{ reaction_logs: Array; total: number }>(url) +} + +// Request Logs +export const getRequestLogs = (limit = 50, offset = 0, apiKeyId?: number) => { + let url = `/request-logs?limit=${limit}&offset=${offset}` + if (apiKeyId) url += `&api_key_id=${apiKeyId}` + return api<{ request_logs: Array; total: number }>(url) +} diff --git a/packages/engine/ui/src/components/ApiKeys.tsx b/packages/engine/ui/src/components/ApiKeys.tsx new file mode 100644 index 0000000..d0d1ccc --- /dev/null +++ b/packages/engine/ui/src/components/ApiKeys.tsx @@ -0,0 +1,238 @@ +import { useState, useEffect } from 'react' +import { getApiKeys, createApiKey, deleteApiKey } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, Pagination } from './Common' + +export default function ApiKeys() { + const [data, setData] = useState([]) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + + const [name, setName] = useState('') + const [allowedEvents, setAllowedEvents] = useState('') + const [rateLimit, setRateLimit] = useState('') + const [creating, setCreating] = useState(false) + const [shownKey, setShownKey] = useState('') + const [copied, setCopied] = useState(false) + + const load = () => { + setLoading(true) + getApiKeys(limit, offset) + .then((res) => { + setData(res.api_keys) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + load() + }, [limit, offset]) + + const handleCreate = async () => { + if (!name.trim()) return + setCreating(true) + try { + const payload: { name: string; allowed_events?: string[]; rate_limit?: number } = { name: name.trim() } + if (allowedEvents.trim()) { + payload.allowed_events = allowedEvents + .split(',') + .map((s) => s.trim()) + .filter(Boolean) + } + if (rateLimit.trim()) { + payload.rate_limit = parseInt(rateLimit, 10) + } + const res = await createApiKey(payload) + setShownKey(res.plaintext_key) + setCopied(false) + setName('') + setAllowedEvents('') + setRateLimit('') + load() + } catch (e: any) { + setError(e.message) + } finally { + setCreating(false) + } + } + + const handleDelete = async (id: number) => { + if (!confirm('Delete this API key?')) return + try { + await deleteApiKey(id) + load() + } catch (e: any) { + setError(e.message) + } + } + + const handleCopy = () => { + navigator.clipboard.writeText(shownKey) + setCopied(true) + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

API Keys

+ + {/* Key reveal modal */} + {shownKey && ( +
+
+

Save your API key

+

+ This key will only be shown once. Copy it now and store it securely. +

+
{shownKey}
+
+ + +
+
+
+ )} + + {/* Create form */} +
+
+
+ + setName(e.target.value)} + placeholder="my-service" + className="px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+
+ + setAllowedEvents(e.target.value)} + placeholder="order.created, user.signed_up" + className="px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-64" + /> +
+
+ + setRateLimit(e.target.value)} + placeholder="1000" + className="px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-24" + /> +
+ +
+
+ +
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + + + + + + + + {data.map((key, i) => ( + + + + + + + + + + + ))} + +
ID + Name + + Role + + Allowed Events + + Rate Limit + + Last Used + + Created +
{key.id}{key.name} + + {key.role || 'default'} + + +
+ {key.allowed_events && key.allowed_events.length > 0 ? ( + key.allowed_events.map((evt: string, j: number) => ( + + {evt} + + )) + ) : ( + all + )} +
+
{key.rate_limit ?? '—'} + {key.last_used_at ? formatRelativeTime(key.last_used_at) : '—'} + {formatRelativeTime(key.created_at)} + +
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/Common.tsx b/packages/engine/ui/src/components/Common.tsx new file mode 100644 index 0000000..370054a --- /dev/null +++ b/packages/engine/ui/src/components/Common.tsx @@ -0,0 +1,98 @@ +export function Spinner() { + return ( +
+
+
+ ) +} + +export function EmptyState({ message = 'No data found' }: { message?: string }) { + return ( +
+
+ + + +

{message}

+
+
+ ) +} + +export function HashBadge({ hash, short = true }: { hash: string; short?: boolean }) { + const display = short && hash.length > 8 ? hash.slice(0, 8) : hash + return ( + {display} + ) +} + +export function Pagination({ + total, + limit, + offset, + onPageChange, + onLimitChange, +}: { + total: number + limit: number + offset: number + onPageChange: (newOffset: number) => void + onLimitChange: (newLimit: number) => void +}) { + const currentPage = Math.floor(offset / limit) + 1 + const totalPages = Math.ceil(total / limit) + const startItem = total === 0 ? 0 : offset + 1 + const endItem = Math.min(offset + limit, total) + + const canPrev = offset > 0 + const canNext = offset + limit < total + + return ( +
+
+ + {startItem}-{endItem} of {total} + +
+ + +
+
+
+ + + Page {currentPage} / {totalPages || 1} + + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/EmitEventModal.tsx b/packages/engine/ui/src/components/EmitEventModal.tsx new file mode 100644 index 0000000..6628812 --- /dev/null +++ b/packages/engine/ui/src/components/EmitEventModal.tsx @@ -0,0 +1,174 @@ +import { useState } from 'react' +import { createEvent } from '../api' + +interface EventDef { + name: string + schema: { + properties?: Record + } +} + +interface EmitEventModalProps { + eventDef: EventDef + onClose: () => void + onSuccess: () => void +} + +export default function EmitEventModal({ eventDef, onClose, onSuccess }: EmitEventModalProps) { + const properties = eventDef.schema?.properties || {} + const fieldNames = Object.keys(properties) + + const [values, setValues] = useState>(() => { + const init: Record = {} + for (const [key, def] of Object.entries(properties)) { + if (def.type === 'boolean') init[key] = false + else if (def.type === 'number' || def.type === 'ref') init[key] = '' + else init[key] = '' + } + return init + }) + + const [loading, setLoading] = useState(false) + const [error, setError] = useState('') + const [success, setSuccess] = useState<{ eventId: string; reactionsFired: number } | null>(null) + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault() + setLoading(true) + setError('') + setSuccess(null) + + try { + // Build payload with correct types + const payload: Record = {} + for (const [key, def] of Object.entries(properties)) { + const val = values[key] + if (def.type === 'number' || def.type === 'ref') { + payload[key] = val === '' ? 0 : Number(val) + } else if (def.type === 'boolean') { + payload[key] = Boolean(val) + } else { + payload[key] = String(val) + } + } + + const res = await createEvent(eventDef.name, payload) + setSuccess({ + eventId: res.event?.id ?? '?', + reactionsFired: res.reactions_fired ?? 0, + }) + + setTimeout(() => { + onSuccess() + onClose() + }, 2000) + } catch (err: any) { + setError(err.message || 'Failed to emit event') + } finally { + setLoading(false) + } + } + + const renderField = (name: string, def: { type: string }) => { + if (def.type === 'boolean') { + return ( + + ) + } + + const isNumeric = def.type === 'number' || def.type === 'ref' + const label = def.type === 'ref' ? `${name} (Object ID)` : name + + return ( +
+ + setValues((v) => ({ ...v, [name]: e.target.value }))} + className="w-full px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-gray-100 text-sm font-mono placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent" + placeholder={def.type === 'ref' ? 'Enter object ID' : `Enter ${def.type}`} + /> +
+ ) + } + + return ( +
+
e.stopPropagation()} + > + {/* Header */} +
+

+ Emit {eventDef.name} +

+ +
+ + {/* Body */} +
+ {fieldNames.length === 0 ? ( +

No payload fields — event will be emitted with empty payload.

+ ) : ( + fieldNames.map((name) => renderField(name, properties[name])) + )} + + {/* Success message */} + {success && ( +
+ ✓ Event {success.eventId} emitted + {success.reactionsFired > 0 && ( + — {success.reactionsFired} reaction{success.reactionsFired > 1 ? 's' : ''} fired + )} +
+ )} + + {/* Error message */} + {error && ( +
+ ✗ {error} +
+ )} + + {/* Actions */} +
+ + +
+
+
+
+ ) +} diff --git a/packages/engine/ui/src/components/EventDefs.tsx b/packages/engine/ui/src/components/EventDefs.tsx new file mode 100644 index 0000000..b224073 --- /dev/null +++ b/packages/engine/ui/src/components/EventDefs.tsx @@ -0,0 +1,136 @@ +import { useState, useEffect } from 'react' +import { getEventDefs } from '../api' +import { Spinner, EmptyState, HashBadge } from './Common' +import EmitEventModal from './EmitEventModal' + +export default function EventDefs() { + const [data, setData] = useState>([]) + const [expanded, setExpanded] = useState>(new Set()) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [emitTarget, setEmitTarget] = useState<{ name: string; schema: any } | null>(null) + + const fetchData = () => { + setLoading(true) + getEventDefs() + .then((res) => setData(res.event_defs)) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + fetchData() + }, []) + + const toggleExpand = (hash: string) => { + setExpanded((prev) => { + const next = new Set(prev) + if (next.has(hash)) { + next.delete(hash) + } else { + next.add(hash) + } + return next + }) + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Event Definitions

+
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + + + + + {data.map((def, i) => ( + + + + + + + + ))} + +
+ Name + + Hash + + Parent + + Schema + + Actions +
{def.name} + + + {def.parent_hash ? : -} + + + {expanded.has(def.hash) && ( +
+                        {JSON.stringify(def.schema, null, 2)
+                          .split('\n')
+                          .map((line, i) => {
+                            if (line.includes(':')) {
+                              const [key, ...rest] = line.split(':')
+                              return (
+                                
+ {key}: + {rest.join(':')} +
+ ) + } + return ( +
+ {line} +
+ ) + })} +
+ )} +
+ +
+ )} +
+ + {emitTarget && ( + setEmitTarget(null)} + onSuccess={() => {}} + /> + )} +
+ ) +} diff --git a/packages/engine/ui/src/components/Events.tsx b/packages/engine/ui/src/components/Events.tsx new file mode 100644 index 0000000..d80bb12 --- /dev/null +++ b/packages/engine/ui/src/components/Events.tsx @@ -0,0 +1,142 @@ +import { useState, useEffect } from 'react' +import { getEvents } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, HashBadge, Pagination } from './Common' + +export default function Events() { + const [data, setData] = useState>([]) + const [expanded, setExpanded] = useState>(new Set()) + const [refFilter, setRefFilter] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + + const load = () => { + setLoading(true) + getEvents(refFilter || undefined, limit, offset) + .then((res) => { + setData(res.events) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + load() + }, [limit, offset]) + + const handleSearch = () => { + setOffset(0) // reset to first page + load() + } + + const toggleExpand = (id: string) => { + setExpanded((prev) => { + const next = new Set(prev) + if (next.has(id)) { + next.delete(id) + } else { + next.add(id) + } + return next + }) + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+
+

Events

+
+ setRefFilter(e.target.value)} + /> + +
+
+
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + + + + {data.map((event, i) => ( + + + + + + + ))} + +
ID + Type Hash + + Created + + Payload +
{event.id} + + {formatRelativeTime(event.created_at)} + + {expanded.has(event.id) && ( +
+                        {JSON.stringify(event.payload, null, 2)
+                          .split('\n')
+                          .map((line, i) => {
+                            if (line.includes(':')) {
+                              const [key, ...rest] = line.split(':')
+                              return (
+                                
+ {key}: + {rest.join(':')} +
+ ) + } + return ( +
+ {line} +
+ ) + })} +
+ )} +
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/Health.tsx b/packages/engine/ui/src/components/Health.tsx new file mode 100644 index 0000000..54e52e2 --- /dev/null +++ b/packages/engine/ui/src/components/Health.tsx @@ -0,0 +1,38 @@ +import { useState, useEffect } from 'react' +import { getHealth } from '../api' +import { Spinner } from './Common' + +export default function Health() { + const [data, setData] = useState<{ version: string } | null>(null) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + + useEffect(() => { + getHealth() + .then(setData) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + }, []) + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Health Check

+
+
+
+
+
+
+ System Online +
+
+ Version: + {data?.version} +
+
+
+ ) +} diff --git a/packages/engine/ui/src/components/Layout.tsx b/packages/engine/ui/src/components/Layout.tsx new file mode 100644 index 0000000..1630e23 --- /dev/null +++ b/packages/engine/ui/src/components/Layout.tsx @@ -0,0 +1,108 @@ +import { ReactNode } from 'react' + +type Page = + | 'health' + | 'object-defs' + | 'objects' + | 'event-defs' + | 'events' + | 'projection-defs' + | 'projections' + | 'reactions' + | 'api-keys' + | 'reaction-logs' + | 'request-logs' + +interface Props { + page: Page + onPageChange: (page: Page) => void + children: ReactNode +} + +const navGroups: Array<{ label: string; items: Array<{ id: Page; label: string; icon: string }> }> = [ + { + label: 'Schema', + items: [ + { id: 'object-defs', label: 'Object Defs', icon: '📦' }, + { id: 'event-defs', label: 'Event Defs', icon: '📋' }, + { id: 'projection-defs', label: 'Projection Defs', icon: '📊' }, + ], + }, + { + label: 'Data', + items: [ + { id: 'objects', label: 'Objects', icon: '🗂️' }, + { id: 'events', label: 'Events', icon: '⚡' }, + { id: 'projections', label: 'Projections', icon: '📈' }, + { id: 'reactions', label: 'Reactions', icon: '🔔' }, + ], + }, + { + label: 'Observability', + items: [ + { id: 'reaction-logs', label: 'Reaction Logs', icon: '📜' }, + { id: 'request-logs', label: 'Request Logs', icon: '📝' }, + ], + }, + { + label: 'Security', + items: [{ id: 'api-keys', label: 'API Keys', icon: '🔑' }], + }, + { + label: 'System', + items: [{ id: 'health', label: 'Health', icon: '🏠' }], + }, +] + +export default function Layout({ page, onPageChange, children }: Props) { + return ( +
+ {/* Sidebar */} + + + {/* Main content */} +
+
{children}
+
+
+ ) +} diff --git a/packages/engine/ui/src/components/ObjectDefs.tsx b/packages/engine/ui/src/components/ObjectDefs.tsx new file mode 100644 index 0000000..0d4a9ca --- /dev/null +++ b/packages/engine/ui/src/components/ObjectDefs.tsx @@ -0,0 +1,52 @@ +import { useState, useEffect } from 'react' +import { getObjectDefs } from '../api' +import { Spinner, EmptyState } from './Common' + +export default function ObjectDefs() { + const [data, setData] = useState>([]) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + + useEffect(() => { + getObjectDefs() + .then((res) => setData(res.object_defs)) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + }, []) + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Object Definitions

+
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + {data.map((def, i) => ( + + + + ))} + +
+ Name +
{def.name}
+ )} +
+
+ ) +} diff --git a/packages/engine/ui/src/components/Objects.tsx b/packages/engine/ui/src/components/Objects.tsx new file mode 100644 index 0000000..dc1da48 --- /dev/null +++ b/packages/engine/ui/src/components/Objects.tsx @@ -0,0 +1,128 @@ +import { useState, useEffect } from 'react' +import { Listbox } from '@headlessui/react' +import { getObjects, getObjectDefs } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, Pagination } from './Common' + +export default function Objects() { + const [data, setData] = useState>([]) + const [types, setTypes] = useState([]) + const [filter, setFilter] = useState('') + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + + useEffect(() => { + getObjectDefs() + .then((res) => setTypes(res.object_defs.map((d) => d.name))) + .catch(() => {}) + }, []) + + useEffect(() => { + setLoading(true) + getObjects(filter || undefined, limit, offset) + .then((res) => { + setData(res.objects) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + }, [filter, limit, offset]) + + const handleFilterChange = (newFilter: string) => { + setFilter(newFilter) + setOffset(0) // reset to first page + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+
+

Objects

+ +
+ + {filter || 'All Types'} + + + + + + + + + `cursor-pointer select-none px-4 py-2 transition-colors ${ + active ? 'bg-blue-600 text-white' : 'text-gray-100' + }` + } + > + {({ selected }) => All Types} + + {types.map((t) => ( + + `cursor-pointer select-none px-4 py-2 transition-colors ${ + active ? 'bg-blue-600 text-white' : 'text-gray-100' + }` + } + > + {({ selected }) => {t}} + + ))} + +
+
+
+
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + + + {data.map((obj, i) => ( + + + + + + ))} + +
ID + Type + + Created +
{obj.id} + + {obj.type} + + {formatRelativeTime(obj.created_at)}
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/ProjectionDefs.tsx b/packages/engine/ui/src/components/ProjectionDefs.tsx new file mode 100644 index 0000000..9b9822b --- /dev/null +++ b/packages/engine/ui/src/components/ProjectionDefs.tsx @@ -0,0 +1,130 @@ +import { useState, useEffect } from 'react' +import { getProjectionDefs } from '../api' +import { Spinner, EmptyState, HashBadge } from './Common' + +export default function ProjectionDefs() { + const [data, setData] = useState([]) + const [expanded, setExpanded] = useState>(new Set()) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + + useEffect(() => { + getProjectionDefs() + .then((res) => setData(res.projection_defs)) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + }, []) + + const toggleExpand = (hash: string) => { + setExpanded((prev) => { + const next = new Set(prev) + if (next.has(hash)) { + next.delete(hash) + } else { + next.add(hash) + } + return next + }) + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Projection Definitions

+ {data.length === 0 ? ( + + ) : ( +
+ {data.map((def, i) => ( +
+
+
+

{def.name}

+
+ +
+
+ +
+ {expanded.has(def.hash || i) && ( +
+ {def.sources && ( +
+ Sources: +
+ {def.sources.map((s: any, i: number) => ( +
+
{s.event_def_hash}
+
+ bindings:{' '} + {JSON.stringify(s.bindings)} +
+
+ expression:{' '} + {s.expression} +
+
+ ))} +
+
+ )} + {def.params && ( +
+ Params: +
+                        {JSON.stringify(def.params, null, 2)
+                          .split('\n')
+                          .map((line, i) => {
+                            if (line.includes(':')) {
+                              const [key, ...rest] = line.split(':')
+                              return (
+                                
+ {key}: + {rest.join(':')} +
+ ) + } + return ( +
+ {line} +
+ ) + })} +
+
+ )} + {def.value_schema && ( +
+ Value Schema: +
+                        {JSON.stringify(def.value_schema, null, 2)}
+                      
+
+ )} + {def.initial_value !== undefined && ( +
+ Initial Value: +
+                        {JSON.stringify(def.initial_value, null, 2)}
+                      
+
+ )} +
+ )} +
+ ))} +
+ )} +
+ ) +} diff --git a/packages/engine/ui/src/components/Projections.tsx b/packages/engine/ui/src/components/Projections.tsx new file mode 100644 index 0000000..c63d264 --- /dev/null +++ b/packages/engine/ui/src/components/Projections.tsx @@ -0,0 +1,315 @@ +import { useState, useEffect, useMemo } from 'react' +import { Combobox, Listbox } from '@headlessui/react' +import { api, getProjectionDefs, getObjects } from '../api' +import { Spinner, HashBadge } from './Common' + +interface ProjectionDef { + name: string + hash: string + params: Record + value_schema: { type: string } + initial_value: any + sources: Array<{ event_def_hash: string; bindings: Record; expression: string }> +} + +export default function Projections() { + const [defs, setDefs] = useState([]) + const [selectedDef, setSelectedDef] = useState(null) + const [params, setParams] = useState>({}) + const [objects, setObjects] = useState>([]) + const [result, setResult] = useState(null) + const [error, setError] = useState('') + const [loading, setLoading] = useState(false) + const [initialLoading, setInitialLoading] = useState(true) + + useEffect(() => { + Promise.all([getProjectionDefs(), getObjects()]) + .then(([defsRes, objsRes]) => { + setDefs(defsRes.projection_defs) + setObjects(objsRes.objects.map((o: any) => ({ ...o, id: String(o.id) }))) + }) + .catch(() => {}) + .finally(() => setInitialLoading(false)) + }, []) + + const handleSelectDef = (def: ProjectionDef | null) => { + setSelectedDef(def) + setResult(null) + setError('') + if (def) { + const initial: Record = {} + for (const key of Object.keys(def.params)) { + initial[key] = '' + } + setParams(initial) + } else { + setParams({}) + } + } + + const handleQuery = async () => { + if (!selectedDef) return + setLoading(true) + setError('') + setResult(null) + + const queryParams = new URLSearchParams() + for (const [k, v] of Object.entries(params)) { + if (v.trim()) queryParams.set(k, v.trim()) + } + + try { + const res = await api<{ value: any }>(`/projections/${selectedDef.name}?${queryParams.toString()}`) + setResult(res.value) + } catch (e: any) { + setError(e.message) + } finally { + setLoading(false) + } + } + + const objectsByType = useMemo(() => { + const map: Record = {} + for (const obj of objects) { + if (!map[obj.type]) map[obj.type] = [] + map[obj.type].push(String(obj.id)) + } + return map + }, [objects]) + + if (initialLoading) return + + return ( +
+

Query Projections

+
+ {/* Projection selector with Listbox */} +
+ + +
+ + + {selectedDef?.name || 'Select a projection...'} + + + + + + + + + {defs.map((d) => ( + + `cursor-pointer select-none px-4 py-2.5 transition-colors ${ + active ? 'bg-blue-600 text-white' : 'text-gray-100' + }` + } + > + {({ selected }) => {d.name}} + + ))} + +
+
+
+ + {/* Auto-generated params form */} + {selectedDef && ( +
+
+ + + → {selectedDef.value_schema?.type || 'any'} + {selectedDef.initial_value !== undefined && ( + (initial: {JSON.stringify(selectedDef.initial_value)}) + )} + +
+
+ {Object.entries(selectedDef.params).map(([key, schema]) => ( +
+ + {schema.type === 'ref' ? ( + setParams({ ...params, [key]: v })} + objects={objects} + objectsByType={objectsByType} + objectType={schema.object_type} + /> + ) : ( + setParams({ ...params, [key]: e.target.value })} + /> + )} +
+ ))} +
+
+ )} + + {/* Projection info */} + {selectedDef && ( +
+
+ sources: +
+ {selectedDef.sources?.map((s, i) => ( +
+
+ +
+
+ bindings:{' '} + {Object.keys(s.bindings).length === 0 ? ( + none + ) : ( + + {Object.entries(s.bindings) + .map(([k, v]) => `${k}=${v}`) + .join(', ')} + + )} +
+
+ expression:{' '} + {s.expression} +
+
+ ))} +
+
+
+ )} + + + + {error && ( +
{error}
+ )} + + {result !== null && ( +
+

Result

+
+              {JSON.stringify(result, null, 2)}
+            
+
+ )} +
+
+ ) +} + +// Headless UI Combobox for object ref params +function RefCombobox({ + value, + onChange, + objects, + objectsByType, + objectType, +}: { + value: string + onChange: (v: string) => void + objects: Array<{ id: string; type: string }> + objectsByType: Record + objectType?: string +}) { + const [query, setQuery] = useState('') + + // Filter objects by object_type if specified + const relevantObjects = useMemo(() => { + if (!objectType) return objects + return objects.filter((o) => o.type === objectType) + }, [objects, objectType]) + + const relevantByType = useMemo(() => { + if (!objectType) return objectsByType + const filtered: Record = {} + if (objectsByType[objectType]) { + filtered[objectType] = objectsByType[objectType] + } + return filtered + }, [objectsByType, objectType]) + + const filtered = useMemo(() => { + if (!query) return relevantObjects + const q = query.toLowerCase() + return relevantObjects.filter((o) => String(o.id).toLowerCase().includes(q) || o.type.toLowerCase().includes(q)) + }, [relevantObjects, query]) + + return ( + onChange(v || '')}> +
+
+ setQuery(e.target.value)} + displayValue={(val: string) => val} + /> + + + + + +
+ + {Object.entries(relevantByType).map(([type, ids]) => { + const filteredIds = ids.filter((id) => !query || id.toLowerCase().includes(query.toLowerCase())) + if (filteredIds.length === 0) return null + return ( +
+
+ {type} +
+ {filteredIds.map((id) => ( + + `cursor-pointer select-none px-3 py-2 text-sm transition-colors ${ + active ? 'bg-blue-600 text-white' : 'text-gray-100' + }` + } + > + {({ selected }) => {id}} + + ))} +
+ ) + })} + {filtered.length === 0 &&
No objects found
} +
+
+
+ ) +} diff --git a/packages/engine/ui/src/components/ReactionLogs.tsx b/packages/engine/ui/src/components/ReactionLogs.tsx new file mode 100644 index 0000000..22c1c78 --- /dev/null +++ b/packages/engine/ui/src/components/ReactionLogs.tsx @@ -0,0 +1,212 @@ +import { useState, useEffect } from 'react' +import { getReactionLogs } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, Pagination } from './Common' + +function StatusBadge({ status }: { status: string }) { + const colors: Record = { + success: 'bg-green-500/20 text-green-300 border-green-500/30', + failed: 'bg-red-500/20 text-red-300 border-red-500/30', + skipped: 'bg-gray-500/20 text-gray-400 border-gray-500/30', + } + return ( + + {status} + + ) +} + +function truncate(value: any, maxLen = 60): string { + if (value === null || value === undefined) return '—' + const str = typeof value === 'string' ? value : JSON.stringify(value) + return str.length > maxLen ? str.slice(0, maxLen) + '...' : str +} + +export default function ReactionLogs() { + const [data, setData] = useState([]) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + const [filterReactionId, setFilterReactionId] = useState('') + const [expandedRows, setExpandedRows] = useState>(new Set()) + + const load = () => { + setLoading(true) + const rid = filterReactionId.trim() ? parseInt(filterReactionId, 10) : undefined + getReactionLogs(limit, offset, rid) + .then((res) => { + setData(res.reaction_logs) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + load() + }, [limit, offset]) + + const toggleExpand = (id: number) => { + setExpandedRows((prev) => { + const next = new Set(prev) + if (next.has(id)) next.delete(id) + else next.add(id) + return next + }) + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Reaction Logs

+ + {/* Filter */} +
+
+
+ + setFilterReactionId(e.target.value)} + placeholder="Reaction ID" + className="px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40" + /> +
+ + {filterReactionId && ( + + )} +
+
+ +
+ {data.length === 0 ? ( + + ) : ( +
+ + + + + + + + + + + + + + + + + + {data.map((log, i) => ( + + + + + + + + + + + + + + ))} + +
+ ID + + Reaction + + Trigger Event + + Projection + + Old Value + + New Value + + Action + + Status + + Output + + Duration + + Created +
{log.id}{log.reaction_id}{log.trigger_event_id} + {truncate(log.projection_def, 30)} + + {truncate(log.old_value)} + + {truncate(log.new_value)} + + + {log.action} + + + + + {log.handler_output ? ( +
+ + {expandedRows.has(log.id) && ( +
+                              {typeof log.handler_output === 'string'
+                                ? log.handler_output
+                                : JSON.stringify(log.handler_output, null, 2)}
+                            
+ )} +
+ ) : ( + + )} +
+ {log.duration_ms != null ? `${log.duration_ms}ms` : '—'} + {formatRelativeTime(log.created_at)}
+
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/Reactions.tsx b/packages/engine/ui/src/components/Reactions.tsx new file mode 100644 index 0000000..70d3870 --- /dev/null +++ b/packages/engine/ui/src/components/Reactions.tsx @@ -0,0 +1,129 @@ +import { useState, useEffect } from 'react' +import { getReactions, deleteReaction } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, HashBadge, Pagination } from './Common' + +export default function Reactions() { + const [data, setData] = useState([]) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + + const load = () => { + setLoading(true) + getReactions(limit, offset) + .then((res) => { + setData(res.reactions) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + load() + }, [limit, offset]) + + const handleDelete = async (id: string) => { + if (!confirm('Delete this reaction?')) return + try { + await deleteReaction(id) + load() + } catch (e: any) { + setError(e.message) + } + } + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Reactions

+
+ {data.length === 0 ? ( + + ) : ( + + + + + + + + + + + + + + {data.map((reaction, i) => ( + + + + + + + + + + ))} + +
ID + Projection Def + + Params Hash + + Action + + Target + + Created +
{reaction.id} + + + + + + {reaction.action || 'webhook'} + + + {reaction.action === 'emit_event' ? ( +
+ → {reaction.emit_event_type} + {reaction.emit_payload_template && ( +
+ template: {reaction.emit_payload_template} +
+ )} +
+ ) : ( + {reaction.webhook_url} + )} +
{formatRelativeTime(reaction.created_at)} + +
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/components/RequestLogs.tsx b/packages/engine/ui/src/components/RequestLogs.tsx new file mode 100644 index 0000000..e8eba47 --- /dev/null +++ b/packages/engine/ui/src/components/RequestLogs.tsx @@ -0,0 +1,168 @@ +import { useState, useEffect } from 'react' +import { getRequestLogs } from '../api' +import { formatRelativeTime } from '../utils' +import { Spinner, EmptyState, Pagination } from './Common' + +function MethodBadge({ method }: { method: string }) { + const colors: Record = { + GET: 'bg-blue-500/20 text-blue-300 border-blue-500/30', + POST: 'bg-green-500/20 text-green-300 border-green-500/30', + PUT: 'bg-yellow-500/20 text-yellow-300 border-yellow-500/30', + PATCH: 'bg-orange-500/20 text-orange-300 border-orange-500/30', + DELETE: 'bg-red-500/20 text-red-300 border-red-500/30', + } + return ( + + {method} + + ) +} + +function StatusCodeBadge({ code }: { code: number }) { + let color = 'bg-gray-500/20 text-gray-300 border-gray-500/30' + if (code >= 200 && code < 300) color = 'bg-green-500/20 text-green-300 border-green-500/30' + else if (code >= 400 && code < 500) color = 'bg-yellow-500/20 text-yellow-300 border-yellow-500/30' + else if (code >= 500) color = 'bg-red-500/20 text-red-300 border-red-500/30' + return ( + {code} + ) +} + +export default function RequestLogs() { + const [data, setData] = useState([]) + const [error, setError] = useState('') + const [loading, setLoading] = useState(true) + const [total, setTotal] = useState(0) + const [limit, setLimit] = useState(50) + const [offset, setOffset] = useState(0) + const [filterApiKeyId, setFilterApiKeyId] = useState('') + + const load = () => { + setLoading(true) + const kid = filterApiKeyId.trim() ? parseInt(filterApiKeyId, 10) : undefined + getRequestLogs(limit, offset, kid) + .then((res) => { + setData(res.request_logs) + setTotal(res.total) + }) + .catch((e) => setError(e.message)) + .finally(() => setLoading(false)) + } + + useEffect(() => { + load() + }, [limit, offset]) + + if (loading) return + if (error) return
Error: {error}
+ + return ( +
+

Request Logs

+ + {/* Filter */} +
+
+
+ + setFilterApiKeyId(e.target.value)} + placeholder="API Key ID" + className="px-3 py-2 bg-gray-800 border border-gray-700 rounded-lg text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 w-40" + /> +
+ + {filterApiKeyId && ( + + )} +
+
+ +
+ {data.length === 0 ? ( + + ) : ( +
+ + + + + + + + + + + + + + + {data.map((log, i) => ( + + + + + + + + + + + ))} + +
+ ID + + Method + + Path + + API Key + + Status + + Error + + Duration + + Created +
{log.id} + + {log.path}{log.api_key_name || '—'} + + {log.error || '—'} + {log.duration_ms != null ? `${log.duration_ms}ms` : '—'} + {formatRelativeTime(log.created_at)}
+
+ )} + +
+
+ ) +} diff --git a/packages/engine/ui/src/index.css b/packages/engine/ui/src/index.css new file mode 100644 index 0000000..5db23c3 --- /dev/null +++ b/packages/engine/ui/src/index.css @@ -0,0 +1,60 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +body { + margin: 0; + padding: 0; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif; + background: linear-gradient(to bottom, #050505, #0a0a0f); + color: #f3f4f6; +} + +#root { + width: 100vw; + height: 100vh; + overflow: hidden; +} + +/* Custom scrollbar for dark theme */ +::-webkit-scrollbar { + width: 8px; + height: 8px; +} + +::-webkit-scrollbar-track { + background: #1a1a1f; +} + +::-webkit-scrollbar-thumb { + background: #374151; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #4b5563; +} + +/* Smooth transitions for interactive elements */ +button, +a, +input, +select { + transition: all 0.2s ease; +} + +/* Custom animations */ +@keyframes fadeIn { + from { + opacity: 0; + transform: translateY(10px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +.animate-fadeIn { + animation: fadeIn 0.3s ease-out; +} diff --git a/packages/engine/ui/src/main.tsx b/packages/engine/ui/src/main.tsx new file mode 100644 index 0000000..db032b7 --- /dev/null +++ b/packages/engine/ui/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/packages/engine/ui/src/utils.ts b/packages/engine/ui/src/utils.ts new file mode 100644 index 0000000..22cabf6 --- /dev/null +++ b/packages/engine/ui/src/utils.ts @@ -0,0 +1,18 @@ +import { formatDistanceToNow } from 'date-fns' + +export function formatRelativeTime(isoString: string): string { + try { + return formatDistanceToNow(new Date(isoString), { addSuffix: true }) + } catch { + return isoString + } +} + +export function highlightJSON(obj: any): string { + const json = JSON.stringify(obj, null, 2) + return json + .replace(/"([^"]+)":/g, '"$1":') + .replace(/: "([^"]+)"/g, ': "$1"') + .replace(/: (\d+)/g, ': $1') + .replace(/: (true|false|null)/g, ': $1') +} diff --git a/packages/engine/ui/src/vite-env.d.ts b/packages/engine/ui/src/vite-env.d.ts new file mode 100644 index 0000000..5894ae0 --- /dev/null +++ b/packages/engine/ui/src/vite-env.d.ts @@ -0,0 +1 @@ +declare module '*.css' diff --git a/packages/engine/ui/tailwind.config.ts b/packages/engine/ui/tailwind.config.ts new file mode 100644 index 0000000..7141e45 --- /dev/null +++ b/packages/engine/ui/tailwind.config.ts @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], +} diff --git a/packages/engine/ui/tsconfig.json b/packages/engine/ui/tsconfig.json new file mode 100644 index 0000000..854fd44 --- /dev/null +++ b/packages/engine/ui/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src", "src/vite-env.d.ts"] +} diff --git a/packages/engine/ui/vite.config.ts b/packages/engine/ui/vite.config.ts new file mode 100644 index 0000000..4a83771 --- /dev/null +++ b/packages/engine/ui/vite.config.ts @@ -0,0 +1,19 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import { viteSingleFile } from 'vite-plugin-singlefile' + +export default defineConfig({ + plugins: [react(), viteSingleFile()], + build: { + target: 'esnext', + assetsInlineLimit: 100000000, + chunkSizeWarningLimit: 100000000, + cssCodeSplit: false, + brotliSize: false, + rollupOptions: { + output: { + inlineDynamicImports: true, + }, + }, + }, +})