@auersperg/flare 0.3.2 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +10 -4
  2. package/dist/cli/{chunk-x14smx1y.js → chunk-5s6zv1h9.js} +1 -1
  3. package/dist/cli/{chunk-5cq8wgte.js → chunk-5yg1zj5n.js} +48 -29
  4. package/dist/cli/{chunk-786w6vrj.js → chunk-fv98dfg5.js} +21 -1
  5. package/dist/cli/chunk-r3ceakrn.js +1366 -0
  6. package/dist/cli/flare.js +122 -4
  7. package/dist/platform/admin.js +790 -0
  8. package/dist/platform/dashboard/_astro/auth-view.UTGGCEHc.js +1 -0
  9. package/dist/platform/dashboard/_astro/cli-approval.BZAWmpiR.js +1 -0
  10. package/dist/platform/dashboard/_astro/client.BUUZgEFj.js +1 -0
  11. package/dist/platform/dashboard/_astro/client.Bcl1NrNO.js +1 -0
  12. package/dist/platform/dashboard/_astro/client.BeKNsjPN.js +9 -0
  13. package/dist/platform/dashboard/_astro/common.DPoFQu44.js +1 -0
  14. package/dist/platform/dashboard/_astro/data-view.BgYyTCMN.js +1 -0
  15. package/dist/platform/dashboard/_astro/functions-view.PUkng3T1.js +1 -0
  16. package/dist/platform/dashboard/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2 +0 -0
  17. package/dist/platform/dashboard/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2 +0 -0
  18. package/dist/platform/dashboard/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2 +0 -0
  19. package/dist/platform/dashboard/_astro/geist-latin-wght-normal.BgDaEnEv.woff2 +0 -0
  20. package/dist/platform/dashboard/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2 +0 -0
  21. package/dist/platform/dashboard/_astro/index.astro_astro_type_script_index_0_lang.BEuO3H0E.js +4 -0
  22. package/dist/platform/dashboard/_astro/index.lobU7uK5.css +2 -0
  23. package/dist/platform/dashboard/_astro/input-group.CJxPRHej.js +1 -0
  24. package/dist/platform/dashboard/_astro/sdk-view.COmbEZrF.js +1 -0
  25. package/dist/platform/dashboard/_astro/services-view.C34dy0dk.js +1 -0
  26. package/dist/platform/dashboard/_astro/settings-view.IuD2r5JW.js +3 -0
  27. package/dist/platform/dashboard/_headers +3 -0
  28. package/dist/platform/dashboard/bootstrap/action.js +263 -0
  29. package/dist/platform/dashboard/bootstrap/api.ts +5 -0
  30. package/dist/platform/dashboard/bootstrap/facet.js +914 -0
  31. package/dist/platform/dashboard/bootstrap/manifest.json +5 -0
  32. package/dist/platform/dashboard/bootstrap/openapi.json +18 -0
  33. package/dist/platform/dashboard/bootstrap/release.json +11 -0
  34. package/dist/platform/dashboard/bootstrap/schema.json +1 -0
  35. package/dist/platform/dashboard/index.html +1 -0
  36. package/dist/platform/manifest.json +195 -0
  37. package/dist/platform/migrations/0001.sql +8 -0
  38. package/dist/platform/migrations/0002_project_aliases.sql +6 -0
  39. package/dist/platform/migrations/0003_cli_login.sql +9 -0
  40. package/dist/platform/migrations/0004_retention.sql +4 -0
  41. package/dist/platform/migrations/0005_project_deletion.sql +11 -0
  42. package/dist/platform/migrations/0006_platform_installation.sql +8 -0
  43. package/dist/platform/runtime.js +9392 -0
  44. package/dist/sdk/client.js +10 -2
  45. package/package.json +1 -1
@@ -0,0 +1,4 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["_astro/services-view.C34dy0dk.js","_astro/client.BeKNsjPN.js","_astro/common.DPoFQu44.js","_astro/client.BUUZgEFj.js","_astro/data-view.BgYyTCMN.js","_astro/input-group.CJxPRHej.js","_astro/functions-view.PUkng3T1.js","_astro/auth-view.UTGGCEHc.js","_astro/settings-view.IuD2r5JW.js","_astro/sdk-view.COmbEZrF.js","_astro/cli-approval.BZAWmpiR.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,r as t,t as n}from"./client.BeKNsjPN.js";import{$ as r,A as i,At as a,C as o,Ct as s,D as c,Dt as l,E as u,Et as d,F as f,G as p,H as m,I as h,J as g,K as _,L as v,M as y,N as b,O as x,Ot as S,P as C,Q as w,R as T,S as E,St as D,T as O,Tt as k,U as A,V as j,W as M,X as ee,Y as N,Z as te,_ as P,_t as F,a as ne,at as re,b as I,bt as L,ct as ie,dt as ae,et as oe,ft as se,g as R,gt as ce,h as le,ht as z,it as ue,j as de,jt as B,k as V,kt as H,m as fe,mt as pe,n as me,nt as he,o as ge,ot as _e,p as U,pt as ve,q as ye,r as be,rt as xe,s as W,st as Se,t as Ce,tt as we,u as G,v as Te,vt as Ee,w as De,wt as Oe,x as ke,xt as Ae,y as K,yt as je,z as Me}from"./common.DPoFQu44.js";var Ne={name:`activity`,size:24,node:[[`path`,{d:`M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2`,key:`169zse`}]]};Ne.node;var Pe=B(Ne),Fe={name:`box`,size:24,node:[[`path`,{d:`M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z`,key:`hh9hay`}],[`path`,{d:`m3.3 7 8.7 5 8.7-5`,key:`g66t2b`}],[`path`,{d:`M12 22V12`,key:`d0xqtd`}]]};Fe.node;var Ie=B(Fe),Le={name:`code`,size:24,node:[[`path`,{d:`m16 18 6-6-6-6`,key:`eg8j8`}],[`path`,{d:`m8 6-6 6 6 6`,key:`ppft3o`}]]};Le.node;var Re=B(Le),ze={name:`columns-3`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]],aliases:[`panels-left-right`]};ze.node;var Be=B(ze),Ve={name:`database`,size:24,node:[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`,key:`msslwz`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`,key:`1wlel7`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`,key:`mv7ke4`}]]};Ve.node;var He=B(Ve),Ue={name:`download`,size:24,node:[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]};Ue.node;var We=B(Ue),Ge={name:`file`,size:24,node:[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}]]};Ge.node;var Ke=B(Ge),qe={name:`logs`,size:24,node:[[`path`,{d:`M3 5h1`,key:`1mv5vm`}],[`path`,{d:`M3 12h1`,key:`lp3yf2`}],[`path`,{d:`M3 19h1`,key:`w6f3n9`}],[`path`,{d:`M8 5h1`,key:`1nxr5w`}],[`path`,{d:`M8 12h1`,key:`1con00`}],[`path`,{d:`M8 19h1`,key:`k7p10e`}],[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}]]};qe.node;var Je=B(qe),Ye={name:`panel-left-close`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`m16 15-3-3 3-3`,key:`14y99z`}]],aliases:[`sidebar-close`]};Ye.node;var Xe=B(Ye),Ze={name:`panel-left-open`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`m14 9 3 3-3 3`,key:`8010ee`}]],aliases:[`sidebar-open`]};Ze.node;var Qe=B(Ze),$e={name:`plus`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`M12 5v14`,key:`s699le`}]]};$e.node;var et=B($e),tt={name:`refresh-cw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]};tt.node;var nt=B(tt),rt={name:`settings`,size:24,node:[[`path`,{d:`M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915`,key:`1i5ecw`}],[`circle`,{cx:`12`,cy:`12`,r:`3`,key:`1v7zrd`}]]};rt.node;var it=B(rt),at={name:`shield`,size:24,node:[[`path`,{d:`M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z`,key:`oel41y`}]]};at.node;var ot=B(at),st={name:`timer`,size:24,node:[[`line`,{x1:`10`,x2:`14`,y1:`2`,y2:`2`,key:`14vaq8`}],[`line`,{x1:`12`,x2:`15`,y1:`14`,y2:`11`,key:`17fdiu`}],[`circle`,{cx:`12`,cy:`14`,r:`8`,key:`1e1u0o`}]]};st.node;var ct=B(st),q=e(t(),1),lt=q.createContext(void 0);function ut(){let e=q.useContext(lt);if(e===void 0)throw Error(l(64));return e}var dt=`data-activation-direction`,ft={tabActivationDirection:e=>({[dt]:e})},J=ce(),pt=q.forwardRef(function(e,t){let{className:n,defaultValue:r=0,onValueChange:i,orientation:o=`horizontal`,render:s,value:c,style:l,...u}=e,d=e.defaultValue!==void 0,f=q.useRef([]),[p,m]=q.useState(()=>new Map),[h,_]=g({controlled:c,default:r,name:`Tabs`,state:`value`}),v=c!==void 0,[y,b]=q.useState(()=>new Map),x=q.useRef(void 0),S=q.useCallback(e=>mt(y,e),[y]),[C,T]=q.useState(()=>({previousValue:h,tabActivationDirection:`none`})),{previousValue:E,tabActivationDirection:D}=C,O=D,k=!1;E!==h&&(O=ht(E,h,o,y),k=E!=null&&h!=null&&S(h)==null);let A=k?E:h,j=E!==A||D!==O;H(()=>{j&&T({previousValue:A,tabActivationDirection:O})},[A,j,O]);let M=a((e,t)=>{t.activationDirection=ht(h,e,o,y),i?.(e,t),!t.isCanceled&&_(()=>e)}),N=a((e,t)=>{i?.(e,oe(t,void 0,void 0,{activationDirection:`none`}))}),P=a((e,t)=>(m(n=>{let r=new Map(n);return r.set(e,t),r}),()=>{m(n=>{if(n.get(e)!==t)return n;let r=new Map(n);return r.delete(e),r})})),F=q.useCallback(e=>p.get(e),[p]),ne=q.useCallback(e=>{for(let t of y.values())if(e===t.value)return t.id},[y]),re=q.useMemo(()=>({getTabElementBySelectedValue:S,getTabIdByPanelValue:ne,getTabPanelIdByValue:F,onValueChange:M,orientation:o,registerMountedTabPanel:P,setTabMap:b,tabActivationDirection:O,value:h}),[S,ne,F,M,o,P,b,O,h]),I=q.useMemo(()=>{for(let e of y.values())if(e.value===h)return e},[y,h]),L=q.useMemo(()=>{for(let e of y.values())if(!e.disabled)return e.value},[y]),ie=q.useRef(!d),ae=q.useRef(r),se=q.useRef(d),R=q.useRef(!1);H(()=>{if(v)return;function e(e,t){_(()=>e),T({previousValue:e,tabActivationDirection:`none`}),N(e,t),ie.current=!1}if(y.size===0){R.current&&h!==null&&!x.current?.isConnected&&e(null,w);return}R.current=!0,x.current=y.keys().next().value;let t=I?.disabled,n=I==null&&h!==null;if(!t&&h===ae.current&&(se.current=!1),se.current&&t&&h===ae.current)return;let r=ie.current;if(t||n){let n=L??null;if(h===n){ie.current=!1;return}let i=w;r?i=te:t&&(i=ee),e(n,i)}else r&&I!=null&&(N(h,te),ie.current=!1)},[L,v,N,I,_,y,h]);let ce=je(`div`,e,{state:{orientation:o,tabActivationDirection:O},ref:t,props:u,stateAttributesMapping:ft});return(0,J.jsx)(lt.Provider,{value:re,children:(0,J.jsx)(ye,{elementsRef:f,children:ce})})});function mt(e,t){for(let[n,r]of e.entries())if(t===r.value)return n;return null}function ht(e,t,n,r){if(e==null||t==null)return`none`;let[i,a,o]=n===`horizontal`?[`left`,`left`,`right`]:[`top`,`up`,`down`],s=mt(r,e),c=mt(r,t);if(s==null||c==null)return s!==c&&(typeof e==`number`||typeof e==`string`)&&typeof e==typeof t?t>e?o:a:`none`;let l=s.getBoundingClientRect()[i],u=c.getBoundingClientRect()[i];return u<l?a:u>l?o:`none`}var gt=`data-composite-item-active`;function _t(e={}){let{highlightItemOnHover:t,highlightedIndex:n,onHighlightedIndexChange:r}=d(),{ref:i,index:a}=_(e),o=n===a,s=q.useRef(null),c=D(i,s);return{compositeProps:{tabIndex:o?0:-1,onFocus(){r(a)},onMouseMove(){let e=s.current;if(!t||!e)return;let n=e.hasAttribute(`disabled`)||e.ariaDisabled===`true`;!o&&!n&&e.focus()}},compositeRef:c,index:a}}var vt=q.createContext(void 0);function yt(){let e=q.useContext(vt);if(e===void 0)throw Error(l(65));return e}var bt=q.forwardRef(function(e,t){let{className:n,disabled:i=!1,render:o,value:c,id:l,nativeButton:u=!0,style:f,...p}=e,{value:m,getTabPanelIdByValue:h,onValueChange:g,orientation:_,tabActivationDirection:v}=ut(),{activateOnFocus:y,registerTabResizeObserverElement:b,tabsListElement:x}=yt(),{highlightedIndex:S,onHighlightedIndexChange:C}=d(),w=pe(l),{compositeProps:T,compositeRef:E,index:D}=_t({metadata:q.useMemo(()=>({disabled:i,id:w,value:c}),[i,w,c])}),O=c===m,k=q.useRef(!1),A=q.useRef(null),j=a(e=>{A.current?.(),A.current=e?b(e):null});H(()=>{if(k.current){k.current=!1;return}if(!(O&&D>-1&&S!==D))return;let e=x;if(e!=null){let t=ae(Oe(e));if(t&&se(e,t))return}i||C(D)},[O,D,S,C,i,x]);let{getButtonProps:M,buttonRef:ee}=s({disabled:i,native:u,focusableWhenDisabled:!0}),N=h(c),te=q.useRef(!1),P=q.useRef(!1);function F(e){g(c,oe(r,e.nativeEvent,void 0,{activationDirection:`none`}))}function ne(e){O||i||F(e)}function re(e){O||i||y&&(!te.current||P.current)&&F(e)}function I(e){if(O||i)return;te.current=!0,P.current=e.button===0;let t=Oe(e.currentTarget);function n(){te.current=!1,P.current=!1,t.removeEventListener(`pointerup`,n),t.removeEventListener(`pointercancel`,n)}t.addEventListener(`pointerup`,n),t.addEventListener(`pointercancel`,n)}return je(`button`,e,{state:{disabled:i,active:O,orientation:_,tabActivationDirection:v},ref:[t,ee,E,j],props:[T,{role:`tab`,"aria-controls":N,"aria-selected":O,id:w,onClick:ne,onFocus:re,onPointerDown:I,[gt]:O?``:void 0,onKeyDownCapture(){k.current=!0}},p,M],stateAttributesMapping:ft})}),xt=`data-index`,St={...ft,...ie},Ct=q.forwardRef(function(e,t){let{className:n,value:r,render:i,keepMounted:a=!1,style:o,...s}=e,{value:c,getTabIdByPanelValue:l,orientation:u,tabActivationDirection:d,registerMountedTabPanel:f}=ut(),m=pe(),{ref:h,index:g}=_(),v=r===c,{mounted:y,transitionStatus:b,setMounted:x}=we(v),S=!y,C=l(r),w={hidden:S,orientation:u,tabActivationDirection:d,transitionStatus:b},T=q.useRef(null),E=je(`div`,e,{state:w,ref:[t,h,T],props:[{"aria-labelledby":C,hidden:S,id:m,role:`tabpanel`,tabIndex:v?0:-1,inert:p(!v),[xt]:g},s],stateAttributesMapping:St});return he({open:v,ref:T,onComplete(){v||x(!1)}}),H(()=>{if(!(m==null||S&&!a))return f(r,m)},[S,a,r,m,f]),a||y?E:null});function wt(e){let{loopFocus:t=!0,orientation:n=`both`,grid:r,onLoop:i,direction:o,highlightedIndex:s,onHighlightedIndexChange:c,rootRef:l,enableHomeAndEndKeys:u=!1,stopEventPropagation:d,disabledIndices:p,modifierKeys:g=L}=e,[_,y]=q.useState(0),b=r!=null,x=q.useRef(null),S=D(x,l),C=q.useRef([]),w=q.useRef(!1),E=q.useRef(null),O=s??_,k=a((e,t=!1)=>{if(E.current=C.current[e]??null,(c??y)(e),t){let t=C.current[e];A(x.current,t,o,n)}}),j=a(e=>{if(e.size===0)return;if(w.current){let e=C.current,t=e.indexOf(E.current);if(t===-1){let t=e[O];!t||Se(e,O,p)?k(Tt(e,p)):E.current=t}else t!==O&&k(t);return}w.current=!0;let t=Array.from(e.keys()),r=t.find(e=>e?.hasAttribute(`data-composite-item-active`))??null,i=r?e.get(r)?.index??-1:-1;if(i!==-1)k(i);else if(Se(t,O,p)){let e=xe(t,{disabledIndices:p});_e(t,e)||k(e)}A(x.current,r,o,n)});H(()=>{if(p==null||s!=null||!w.current)return;let e=C.current;if(Se(e,O,p)){let t=xe(e,{disabledIndices:p});_e(e,t)||k(t)}},[p,s,O,C,k]);let ee=a((e,t,n)=>i?i(e,t,n,C):n),N=a(e=>{let a=e.key===`Home`||e.key===`End`;if(!Me.has(e.key)||!u&&a||Et(e,g)||!x.current)return;let s=o===`rtl`,c=s?h:v,l=s?v:h,_=n===`vertical`?f:c,y=n===`vertical`?T:l,S=ve(e.nativeEvent);if(S!=null&&m(S)&&!M(S)){let t=S.selectionStart,n=S.selectionEnd,r=S.value;if(t==null||e.shiftKey||t!==n||e.key!==y&&t<r.length||e.key!==_&&t>0)return}let w=O,E=re(C,p),D=ue(C,p);r!=null&&(w=r({disabledIndices:p,elementsRef:C,event:e,highlightedIndex:O,loopFocus:t,maxIndex:D,minIndex:E,onLoop:ee,orientation:n,rtl:s}));let A=n!==`vertical`&&e.key===c||n!==`horizontal`&&e.key===`ArrowDown`,j=n!==`vertical`&&e.key===l||n!==`horizontal`&&e.key===`ArrowUp`;u&&(e.key===`Home`?w=E:e.key===`End`&&(w=D)),w===O&&(A||j)&&(t&&w===D&&A?(w=E,i&&(w=i(e,O,w,C))):t&&w===E&&j?(w=D,i&&(w=i(e,O,w,C))):w=xe(C.current,{startingIndex:w,decrement:j,disabledIndices:p})),w!==O&&!_e(C.current,w)&&(d&&e.stopPropagation(),(b||a||A||j)&&e.preventDefault(),k(w,!0),queueMicrotask(()=>{C.current[w]?.focus()}))});return{props:{ref:S,onFocus(e){let t=x.current,n=ve(e.nativeEvent);t&&n!=null&&m(n)&&n.setSelectionRange(0,n.value.length)},onKeyDown:N},highlightedIndex:O,onHighlightedIndexChange:k,elementsRef:C,onMapChange:j,relayKeyboardEvent:N}}function Tt(e,t){let n=-1;for(let r=0;r<e.length;r+=1){let i=e[r];if(i&&!Se(e,r,t)){if(i.hasAttribute(`data-composite-item-active`))return r;n===-1&&(n=r)}}return Math.max(n,0)}function Et(e,t){for(let n of j)if(!t.includes(n)&&e.getModifierState(n))return!0;return!1}function Dt(e){let{render:t,className:n,style:r,refs:i=L,props:a=L,state:o=Ae,stateAttributesMapping:s,highlightedIndex:c,onHighlightedIndexChange:l,orientation:u,grid:d,loopFocus:f,onLoop:p,enableHomeAndEndKeys:m,onMapChange:h,stopEventPropagation:g=!0,rootRef:_,disabledIndices:v,modifierKeys:y,highlightItemOnHover:b=!1,tag:x=`div`,...S}=e,{props:w,highlightedIndex:T,onHighlightedIndexChange:E,elementsRef:D,onMapChange:O,relayKeyboardEvent:A}=wt({grid:d,loopFocus:f,onLoop:p,orientation:u,highlightedIndex:c,onHighlightedIndexChange:l,rootRef:_,stopEventPropagation:g,enableHomeAndEndKeys:m,direction:C(),disabledIndices:v,modifierKeys:y}),j=je(x,e,{state:o,ref:i,props:[w,...a,S],stateAttributesMapping:s}),M=q.useMemo(()=>({highlightedIndex:T,onHighlightedIndexChange:E,highlightItemOnHover:b,relayKeyboardEvent:A}),[T,E,b,A]);return(0,J.jsx)(k.Provider,{value:M,children:(0,J.jsx)(ye,{elementsRef:D,onMapChange:e=>{h?.(e),O(e)},children:j})})}var Ot=q.forwardRef(function(e,t){let{activateOnFocus:n=!1,className:r,loopFocus:i=!0,render:o,style:s,...c}=e,{orientation:l,setTabMap:u,tabActivationDirection:d}=ut(),[f,p]=q.useState(0),[m,h]=q.useState(null),g=q.useRef(new Set),_=q.useRef(new Set),v=q.useRef(null);H(()=>{if(typeof ResizeObserver>`u`)return;let e=new ResizeObserver(()=>{g.current.forEach(e=>{e()})});return v.current=e,m&&e.observe(m),_.current.forEach(t=>{e.observe(t)}),()=>{e.disconnect(),v.current=null}},[m]);let y=a(e=>(g.current.add(e),()=>{g.current.delete(e)})),b=a(e=>(_.current.add(e),v.current?.observe(e),()=>{_.current.delete(e),v.current?.unobserve(e)})),x={orientation:l,tabActivationDirection:d},S={"aria-orientation":l===`vertical`?`vertical`:void 0,role:`tablist`},C=q.useMemo(()=>({activateOnFocus:n,registerIndicatorUpdateListener:y,registerTabResizeObserverElement:b,tabsListElement:m}),[n,y,b,m]);return(0,J.jsx)(vt.Provider,{value:C,children:(0,J.jsx)(Dt,{render:o,className:r,style:s,state:x,refs:[t,h],props:[S,c],stateAttributesMapping:ft,highlightedIndex:f,enableHomeAndEndKeys:!0,loopFocus:i,orientation:l,onHighlightedIndexChange:p,onMapChange:u,disabledIndices:L})})}),kt=n();function At({className:e,orientation:t=`horizontal`,...n}){return(0,J.jsx)(pt,{"data-slot":`tabs`,"data-orientation":t,className:F(`group/tabs flex gap-2 data-horizontal:flex-col`,e),...n})}var jt=Ee(`group/tabs-list inline-flex w-fit items-center justify-center rounded-none p-[3px] text-muted-foreground group-data-horizontal/tabs:h-8 group-data-vertical/tabs:h-fit group-data-vertical/tabs:flex-col data-[variant=line]:rounded-none`,{variants:{variant:{default:`bg-muted`,line:`gap-1 bg-transparent`}},defaultVariants:{variant:`default`}});function Mt({className:e,variant:t=`default`,...n}){return(0,J.jsx)(Ot,{"data-slot":`tabs-list`,"data-variant":t,className:F(jt({variant:t}),e),...n})}function Y({className:e,...t}){return(0,J.jsx)(bt,{"data-slot":`tabs-trigger`,className:F(`relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center gap-1.5 rounded-none border border-transparent px-1.5 py-0.5 text-xs font-medium whitespace-nowrap text-foreground/60 transition-all group-data-vertical/tabs:w-full group-data-vertical/tabs:justify-start group-data-vertical/tabs:py-[calc(--spacing(1.25))] hover:text-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 focus-visible:outline-1 focus-visible:outline-ring disabled:pointer-events-none disabled:opacity-50 has-data-[icon=inline-end]:pr-1 has-data-[icon=inline-start]:pl-1 aria-disabled:pointer-events-none aria-disabled:opacity-50 dark:text-muted-foreground dark:hover:text-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4`,`group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-active:bg-transparent dark:group-data-[variant=line]/tabs-list:data-active:border-transparent dark:group-data-[variant=line]/tabs-list:data-active:bg-transparent`,`data-active:bg-background data-active:text-foreground dark:data-active:border-input dark:data-active:bg-input/30 dark:data-active:text-foreground`,`after:absolute after:bg-foreground after:opacity-0 after:transition-opacity group-data-horizontal/tabs:after:inset-x-0 group-data-horizontal/tabs:after:bottom-[-5px] group-data-horizontal/tabs:after:h-0.5 group-data-vertical/tabs:after:inset-y-0 group-data-vertical/tabs:after:-right-1 group-data-vertical/tabs:after:w-0.5 group-data-[variant=line]/tabs-list:data-active:after:opacity-100`,e),...t})}function Nt({className:e,...t}){return(0,J.jsx)(Ct,{"data-slot":`tabs-content`,className:F(`flex-1 text-xs/relaxed outline-none`,e),...t})}function Pt(e){return je(e.defaultTagName??`div`,e,e)}var Ft=Ee(`group/badge inline-flex h-5 w-fit shrink-0 items-center justify-center gap-1 overflow-hidden rounded-none border border-transparent px-2 py-0.5 text-xs font-medium whitespace-nowrap transition-all focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 aria-invalid:border-destructive aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 [&>svg]:pointer-events-none [&>svg]:size-3!`,{variants:{variant:{default:`bg-primary text-primary-foreground [a]:hover:bg-primary/80`,secondary:`bg-secondary text-secondary-foreground [a]:hover:bg-secondary/80`,success:`border-emerald-600/20 bg-emerald-100/50 text-emerald-700 dark:border-emerald-400/20 dark:bg-emerald-900/50 dark:text-emerald-200`,warning:`border-amber-600/20 bg-amber-100/50 text-amber-700 dark:border-amber-400/20 dark:bg-amber-900/50 dark:text-amber-200`,info:`border-blue-600/20 bg-blue-100/50 text-blue-700 dark:border-blue-400/20 dark:bg-blue-900/50 dark:text-blue-200`,destructive:`bg-destructive/10 text-destructive focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:focus-visible:ring-destructive/40 [a]:hover:bg-destructive/20`,outline:`border-border text-foreground [a]:hover:bg-muted [a]:hover:text-muted-foreground`,ghost:`hover:bg-muted hover:text-muted-foreground dark:hover:bg-muted/50`,link:`text-primary underline-offset-4 hover:underline`}},defaultVariants:{variant:`default`}});function It({className:e,variant:t=`default`,render:n,...r}){return Pt({defaultTagName:`span`,props:S({className:F(Ft({variant:t}),e)},r),render:n,state:{slot:`badge`,variant:t}})}var Lt=new Map([...[`ready`,`active`,`enabled`,`ok`,`completed`,`development`].map(e=>[e,`success`]),...[`pending`,`paused`,`activating`,`restoring`,`incomplete`,`required`].map(e=>[e,`warning`]),...[`uploading`,`running`,`queued`,`enqueued`,`production`,`public registration`,`public`].map(e=>[e,`info`]),...[`error`,`failed`,`blocked`,`unavailable`].map(e=>[e,`destructive`])]);function X({status:e,children:t}){return(0,J.jsx)(It,{variant:Lt.get(e.toLowerCase())??`secondary`,children:t??e})}function Z({className:e,size:t=`default`,...n}){return(0,J.jsx)(`div`,{"data-slot":`card`,"data-size":t,className:F(`group/card flex flex-col gap-(--card-spacing) overflow-hidden rounded-none bg-card py-(--card-spacing) text-xs/relaxed text-card-foreground ring-1 ring-foreground/10 [--card-spacing:--spacing(4)] has-data-[slot=card-footer]:pb-0 has-[>img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-none *:[img:last-child]:rounded-none`,e),...n})}function Rt({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`card-header`,className:F(`group/card-header @container/card-header grid auto-rows-min items-start gap-1 rounded-none px-(--card-spacing) has-data-[slot=card-action]:grid-cols-[1fr_auto] has-data-[slot=card-description]:grid-rows-[auto_auto] [.border-b]:pb-(--card-spacing)`,e),...t})}function zt({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`card-title`,className:F(`font-heading text-sm font-medium group-data-[size=sm]/card:text-sm`,e),...t})}function Q({className:e,...t}){return(0,J.jsx)(`div`,{"data-slot":`card-content`,className:F(`px-(--card-spacing)`,e),...t})}var Bt={query:`bg-yellow-100/50 text-yellow-700 dark:bg-yellow-900/50 dark:text-yellow-200`,mutation:`bg-blue-100/50 text-blue-700 dark:bg-blue-900/50 dark:text-blue-200`,action:`bg-purple-100/50 text-purple-700 dark:bg-purple-900/50 dark:text-purple-200`};function Vt({kind:e}){return(0,J.jsx)(It,{variant:`secondary`,className:Bt[e],children:e})}function Ht(e){return(0,J.jsxs)(Z,{children:[(0,J.jsx)(Rt,{children:(0,J.jsx)(zt,{children:e.env===`dev`?`Development releases`:`Production releases`})}),(0,J.jsx)(Q,{children:(0,J.jsx)(Ut,{...e})})]})}function Ut(e){let[t,n]=(0,q.useState)(),[r,i]=(0,q.useState)(),a=R(e.project,e.env),o=R(e.project,e.env),s=G(a+`/history`),c=G(a+`/health`),l=e.session.role!==`viewer`,u=async(t,n)=>{let r=n?R(e.project,`prod`):o,a=await U(r+`/health`);i({title:n?`Promote backend to production`:`Rollback backend`,description:`Activate this exact backend hash after native schema/job validation. Data, files and settings stay unchanged. Frontend is not published by this button; use the CLI release flow for that.`,productionId:n||e.env===`prod`?e.project.id:void 0,submit:async()=>{await U(r+(n?`/release-promote`:`/release-rollback`),{hash:t,expected:a.active,confirm:e.project.id}),s.refresh(),c.refresh(),e.refresh()}})},[d,f]=(0,q.useState)();return(0,J.jsxs)(`div`,{className:`space-y-3`,children:[(0,J.jsx)(W,{loading:s.loading||c.loading,error:d||s.error||c.error}),(0,J.jsxs)(P,{children:[(0,J.jsx)(ke,{children:(0,J.jsxs)(E,{children:[(0,J.jsx)(I,{children:`First published`}),(0,J.jsx)(I,{children:`Backend hash`}),(0,J.jsx)(I,{children:`Actions`})]})}),(0,J.jsx)(Te,{children:s.data?.map(t=>(0,J.jsxs)(E,{children:[(0,J.jsx)(K,{children:new Date(t.at).toLocaleString()}),(0,J.jsxs)(K,{children:[(0,J.jsx)(`code`,{className:`text-xs`,children:t.hash.slice(0,12)}),c.data?.active===t.hash&&(0,J.jsx)(X,{status:`Active`})]}),(0,J.jsx)(K,{children:(0,J.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,J.jsx)(z,{variant:`outline`,size:`sm`,onClick:()=>n(t.hash),children:`View contracts`}),l&&c.data?.active!==t.hash&&(0,J.jsx)(z,{variant:`outline`,size:`sm`,onClick:()=>void u(t.hash,!1).catch(e=>f(e.message)),children:`Rollback backend`}),l&&e.env===`dev`&&(0,J.jsx)(z,{variant:`outline`,size:`sm`,onClick:()=>void u(t.hash,!0).catch(e=>f(e.message)),children:`Promote backend`})]})})]},t.hash))})]}),t&&(0,J.jsx)(Wt,{path:a,hash:t,close:()=>n(void 0)}),r&&(0,J.jsx)(ne,{modal:r,onClose:()=>i(void 0)})]})}function Wt({path:e,hash:t,close:n}){let r=G(e+`/release?hash=`+t);return(0,J.jsx)(o,{open:!0,onOpenChange:e=>{e||n()},children:(0,J.jsxs)(De,{className:`max-h-[80vh] overflow-auto`,children:[(0,J.jsxs)(u,{children:[(0,J.jsx)(c,{children:`Backend release`}),(0,J.jsx)(O,{className:`break-all`,children:t})]}),(0,J.jsx)(W,{...r}),r.data&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`h3`,{className:`font-medium`,children:`Tables`}),(0,J.jsxs)(P,{children:[(0,J.jsx)(ke,{children:(0,J.jsxs)(E,{children:[(0,J.jsx)(I,{children:`Table`}),(0,J.jsx)(I,{children:`Fields`})]})}),(0,J.jsx)(Te,{children:Object.entries(r.data.schema).map(([e,t])=>(0,J.jsxs)(E,{children:[(0,J.jsx)(K,{children:e}),(0,J.jsx)(K,{children:Object.keys(t.document.properties??{}).join(`, `)||`No declared fields`})]},e))})]}),(0,J.jsx)(`h3`,{className:`font-medium`,children:`Functions`}),(0,J.jsxs)(P,{children:[(0,J.jsx)(ke,{children:(0,J.jsxs)(E,{children:[(0,J.jsx)(I,{children:`Function`}),(0,J.jsx)(I,{children:`Kind`}),(0,J.jsx)(I,{children:`Access`})]})}),(0,J.jsx)(Te,{children:Object.entries(r.data.manifest.functions).map(([e,t])=>(0,J.jsxs)(E,{children:[(0,J.jsx)(K,{children:e}),(0,J.jsx)(K,{children:(0,J.jsx)(Vt,{kind:t.kind})}),(0,J.jsx)(K,{children:(0,J.jsx)(X,{status:t.auth})})]},e))})]})]})]})})}function Gt(e,t,n,r){if(!/^[a-z][a-z0-9_]{0,47}$/.test(t)||t.startsWith(`sqlite_`))throw Error(`Use 1–48 lowercase letters, digits or underscores; start with a letter. sqlite_ is reserved.`);if(e===`create`){if(n.some(e=>e.name.toLowerCase()===t))throw Error(`This table already exists.`);return{definition:`import {defineSchema,defineTable,z} from "@auersperg/flare/server";\n\nexport default defineSchema({\n ${t}: defineTable(z.object({title:z.string()})),\n});`,notes:`No SQL migration needed. Edit flare/schema.ts and run bunx --bun --package @auersperg/flare flare dev.`}}let i=n.find(e=>e.name===r);if(!i)throw Error(`Select an existing table.`);if(i.columns.some(e=>e.name.toLowerCase()===t))throw Error(`This field already exists.`);return{definition:`// Add to ${i.name}'s document validator in flare/schema.ts:\n${t}: z.string().optional(),\n\n// Existing documents remain valid. Use defaults or review existing data for required fields.`,notes:`No ALTER TABLE or SQL journal. Deploy the validated document schema with the application.`}}function Kt({tables:e,env:t,role:n,table:r}){let[i,a]=(0,q.useState)(!1);return(0,J.jsxs)(o,{open:i,onOpenChange:a,children:[(0,J.jsxs)(x,{render:(0,J.jsx)(z,{variant:`outline`}),children:[r?(0,J.jsx)(Be,{}):(0,J.jsx)(et,{}),n===`viewer`?`Table workflow`:r?`Edit table`:`Add table`]}),(0,J.jsxs)(De,{className:`max-h-[85vh] overflow-auto`,children:[(0,J.jsxs)(u,{children:[(0,J.jsx)(c,{children:`Define a table`}),(0,J.jsx)(O,{children:`Schema lives in application code. This prepares a draft, not a database change. Nothing is applied until you review and deploy a release.`})]}),i&&(0,J.jsx)(qt,{tables:e,env:t,initialTable:r})]})]})}function qt({tables:e,env:t,initialTable:n}){let[r,a]=(0,q.useState)(n?`add-column`:`create`),[o,s]=(0,q.useState)(n?`description`:`notes`),[c,l]=(0,q.useState)(n??e[0]?.name??``),u=(0,q.useId)(),d,f;try{d=Gt(r,o,e,c)}catch(e){f=e instanceof Error?e.message:`Invalid schema`}return(0,J.jsxs)(`div`,{className:`min-w-0 space-y-4`,children:[(0,J.jsxs)(At,{value:r,onValueChange:e=>{a(e),s(e===`create`?`notes`:`description`)},children:[(0,J.jsxs)(Mt,{children:[(0,J.jsx)(Y,{value:`create`,children:`New table`}),(0,J.jsx)(Y,{value:`add-column`,disabled:!e.length,children:`Add field`})]}),(0,J.jsx)(Nt,{value:r,children:(0,J.jsxs)(de,{children:[r===`add-column`&&(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:`${u}-table`,children:`Table`}),(0,J.jsx)(Ce,{id:`${u}-table`,label:`Table to change`,value:c,onChange:l,items:e.map(e=>({value:e.name,label:e.name}))})]}),(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:u,children:r===`create`?`Table name`:`Field name`}),(0,J.jsx)(N,{id:u,value:o,onChange:e=>s(e.target.value),maxLength:48}),(0,J.jsx)(i,{children:r===`create`?`Document IDs and creation timestamps are automatic. Define fields before deploying.`:`Adds an optional text field; existing documents remain valid.`})]})]})})]}),f?(0,J.jsx)(be,{children:f}):d&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsxs)(At,{defaultValue:`definition`,children:[(0,J.jsxs)(Mt,{children:[(0,J.jsx)(Y,{value:`notes`,children:`Activation`}),(0,J.jsx)(Y,{value:`definition`,children:`Document schema`})]}),(0,J.jsx)(Nt,{value:`notes`,children:(0,J.jsx)(`pre`,{className:`code-block`,children:d.notes})}),(0,J.jsx)(Nt,{value:`definition`,children:(0,J.jsx)(`pre`,{className:`code-block`,children:d.definition})})]}),(0,J.jsxs)(z,{variant:`outline`,onClick:()=>{if(!d)return;let e=URL.createObjectURL(new Blob([d.definition+`
3
+ `],{type:`text/plain`})),t=document.createElement(`a`);t.href=e,t.download=`${r===`create`?`create`:`alter`}_${r===`create`?o:`table`}.ts`,t.click(),setTimeout(()=>URL.revokeObjectURL(e),0)},children:[(0,J.jsx)(We,{}),`Download schema draft`]})]}),(0,J.jsxs)(`ol`,{className:`list-inside list-decimal space-y-2 text-xs text-muted-foreground`,children:[(0,J.jsx)(`li`,{children:`Update flare/schema.ts with the document validator.`}),(0,J.jsx)(`li`,{children:`Cloudflare validates existing documents and updates declared SQLite indexes atomically.`}),(0,J.jsx)(`li`,{children:`Build a new release so the schema and SDK stay versioned together.`})]}),(0,J.jsx)(`pre`,{className:`code-block`,children:`bunx --bun --package @auersperg/flare flare ${t===`prod`?`deploy`:`dev`}`}),(0,J.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Schema changes are versioned with code. Destructive table removal and arbitrary SQL execution are intentionally unavailable here.`,` `,t===`prod`?`Test the schema in dev first; production deployment requires explicit confirmation.`:`Reopen Data or Schema after the cloud release activates.`]})]})}function Jt({project:e,env:t,session:n,connect:r}){let i=G(R(e,t)+`/health`),a=G(R(e,t)+`/settings`);return(0,J.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,J.jsx)(`h1`,{className:`page-title`,children:`Health`}),(0,J.jsx)(W,{loading:i.loading||a.loading,error:i.error||a.error}),i.data&&a.data&&(0,J.jsxs)(J.Fragment,{children:[(0,J.jsx)(`h2`,{className:`section-title`,children:`Summary`}),(0,J.jsx)(Z,{children:(0,J.jsxs)(Q,{className:`grid gap-4 md:grid-cols-2`,children:[(0,J.jsxs)(`div`,{className:`space-y-3`,children:[(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,J.jsx)(X,{status:t===`dev`?`Development`:`Production`}),(0,J.jsx)(`strong`,{children:e.name})]}),(0,J.jsx)(`p`,{className:`text-muted-foreground`,children:`Cloudflare · Durable Objects · SQLite`}),(0,J.jsxs)(`p`,{className:`font-mono text-xs text-muted-foreground`,children:[`Release `,i.data.active?.slice(0,12)??`not deployed`]})]}),(0,J.jsxs)(`div`,{className:`space-y-2`,children:[(0,J.jsx)(`p`,{className:`text-muted-foreground`,children:`Cloud URL`}),(0,J.jsx)(`code`,{className:`block select-all break-all text-xs`,children:a.data.url}),(0,J.jsxs)(`div`,{className:`flex items-center gap-2 text-muted-foreground`,children:[(0,J.jsx)(X,{status:i.data.status}),i.data.connections,` connections · `,i.data.subscriptions,` `,`subscriptions`]})]})]})}),(0,J.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,J.jsxs)(Z,{children:[(0,J.jsx)(Rt,{children:(0,J.jsx)(zt,{children:`Live connections`})}),(0,J.jsxs)(Q,{className:`space-y-2`,children:[(0,J.jsx)(`strong`,{className:`text-2xl font-semibold tabular-nums`,children:i.data.connections}),(0,J.jsx)(`p`,{className:`text-muted-foreground`,children:`Hibernating WebSocket connections`})]})]}),(0,J.jsxs)(Z,{children:[(0,J.jsx)(Rt,{children:(0,J.jsx)(zt,{children:`Subscriptions`})}),(0,J.jsxs)(Q,{className:`space-y-2`,children:[(0,J.jsx)(`strong`,{className:`text-2xl font-semibold tabular-nums`,children:i.data.subscriptions}),(0,J.jsx)(`p`,{className:`text-muted-foreground`,children:`Active live queries`})]})]})]}),(0,J.jsx)(Ht,{project:e,env:t,session:n,refresh:i.refresh}),(0,J.jsx)(`h2`,{className:`section-title`,children:`Insights`}),(0,J.jsx)(Z,{children:(0,J.jsxs)(Q,{className:`flex flex-col items-start gap-4`,children:[(0,J.jsx)(Pe,{className:i.data.status===`ready`?`size-6 text-emerald-500`:`size-6 text-amber-500`}),(0,J.jsxs)(`h2`,{className:`flex items-center gap-2 text-base font-medium`,children:[`Runtime `,(0,J.jsx)(X,{status:i.data.status})]}),(0,J.jsx)(`p`,{className:`text-muted-foreground`,children:`Historical analytics not configured.`}),(0,J.jsx)(z,{variant:`outline`,onClick:r,children:`Connect SDK`})]})})]})]})}function Yt({project:e,env:t,session:n}){let r=G(R(e,t)+`/schema`);return(0,J.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,J.jsx)(`h1`,{className:`page-title`,children:`Schema`}),(0,J.jsxs)(`div`,{className:`flex gap-2`,children:[(0,J.jsx)(z,{variant:`ghost`,size:`icon-sm`,"aria-label":`Reload snapshot`,title:`Reload snapshot`,onClick:r.refresh,disabled:r.loading,children:(0,J.jsx)(nt,{})}),r.data&&(0,J.jsx)(Kt,{tables:r.data.tables,env:t,role:n.role})]})]}),(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Defined in code; validated documents and indexes activate atomically. System tables are hidden.`}),(0,J.jsx)(W,{...r}),r.data?.tables.map(e=>(0,J.jsxs)(Z,{children:[(0,J.jsx)(Rt,{children:(0,J.jsxs)(`div`,{className:`flex flex-wrap items-center justify-between gap-2`,children:[(0,J.jsx)(zt,{className:`font-mono`,children:e.name}),(0,J.jsx)(Kt,{tables:r.data.tables,env:t,role:n.role,table:e.name})]})}),(0,J.jsxs)(Q,{className:`space-y-4`,children:[(0,J.jsx)(ge,{rows:e.columns.map(e=>({Field:e.name,Type:e.type,Required:!!e.notnull,Primary:!!e.pk,Default:e.dflt_value})),columns:[`Field`,`Type`,`Required`,`Primary`,`Default`]}),(0,J.jsx)(ge,{rows:Object.entries(e.indexes).map(([e,t])=>({Index:e,Fields:t.join(`, `)})),columns:[`Index`,`Fields`]}),(0,J.jsxs)(`details`,{children:[(0,J.jsx)(`summary`,{className:`cursor-pointer text-muted-foreground`,children:`Document contract`}),(0,J.jsx)(`pre`,{className:`code-block mt-3`,children:JSON.stringify(e.document,null,2)})]})]})]},e.name)),r.data&&!r.data.tables.length&&(0,J.jsx)(me,{title:`No application tables`})]})}function Xt({project:e,env:t}){let n=G(R(e,t)+`/logs`);return(0,J.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,J.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,J.jsx)(`h1`,{className:`page-title`,children:`Logs`}),(0,J.jsx)(z,{variant:`ghost`,size:`icon-sm`,"aria-label":`Reload snapshot`,title:`Reload snapshot`,onClick:n.refresh,disabled:n.loading,children:(0,J.jsx)(nt,{})})]}),(0,J.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Last 100 invocation summaries. Successful queries are held in memory and disappear on hibernation/restart; writes and failures are persisted. Not Cloudflare Tail logs or billing analytics.`}),(0,J.jsx)(W,{...n}),n.data&&(n.data.length?(0,J.jsx)(ge,{rows:n.data,renderCell:(e,t)=>e===`kind`&&[`query`,`mutation`,`action`].includes(String(t))?(0,J.jsx)(Vt,{kind:t}):e===`status`?(0,J.jsx)(X,{status:t===`ok`?`ok`:`error`,children:le(t)}):e===`at`&&typeof t==`number`?new Date(t).toLocaleString():le(t),columns:[`at`,`path`,`kind`,`status`,`ms`],labels:{at:`Time`,path:`Function`,kind:`Type`,status:`Status`,ms:`Duration (ms)`}}):(0,J.jsx)(me,{title:`No recent function calls`}))]})}var Zt=(function(){let e=typeof document<`u`&&document.createElement(`link`).relList;return e&&e.supports&&e.supports(`modulepreload`)?`modulepreload`:`preload`})(),Qt=function(e){return`/`+e},$t={},en=function(e){return e.pathname.endsWith(`.css`)},tn=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},$=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=function(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))},i=function(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)},a,o=document.querySelector(`meta[property=csp-nonce]`),s=o?.nonce||o?.getAttribute(`nonce`);r=e(t.map(e=>{e=Qt(e,n);let t=i(e),r=en(t);return tn($t,t.href,()=>{if(a===void 0){a={all:new Set,styles:new Set};let e=document.getElementsByTagName(`link`);for(let t=e.length-1;t>=0;t--){let n=e[t];a.all.add(n.href),n.rel===`stylesheet`&&a.styles.add(n.href)}}if((r?a.styles:a.all).has(t.href))return;let e=document.createElement(`link`);if(e.rel=r?`stylesheet`:Zt,r||(e.as=`script`),e.crossOrigin=``,e.href=t.href,s&&e.setAttribute(`nonce`,s),document.head.appendChild(e),r)return new Promise((n,r)=>{e.addEventListener(`load`,n),e.addEventListener(`error`,()=>r(Error(`Unable to preload CSS for ${t}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},nn=(0,q.lazy)(()=>$(()=>import(`./services-view.C34dy0dk.js`).then(e=>({default:e.FilesView})),__vite__mapDeps([0,1,2,3]))),rn=(0,q.lazy)(()=>$(()=>import(`./services-view.C34dy0dk.js`).then(e=>({default:e.SchedulesView})),__vite__mapDeps([0,1,2,3]))),an=(0,q.lazy)(()=>$(()=>import(`./data-view.BgYyTCMN.js`),__vite__mapDeps([4,1,2,5]))),on=(0,q.lazy)(()=>$(()=>import(`./functions-view.PUkng3T1.js`),__vite__mapDeps([6,1,2,5,3]))),sn=(0,q.lazy)(()=>$(()=>import(`./auth-view.UTGGCEHc.js`),__vite__mapDeps([7,1,2]))),cn=(0,q.lazy)(()=>$(()=>import(`./settings-view.IuD2r5JW.js`),__vite__mapDeps([8,1,2]))),ln=(0,q.lazy)(()=>$(()=>import(`./sdk-view.COmbEZrF.js`),__vite__mapDeps([9,1,2]))),un=[{key:`health`,label:`Health`,icon:Pe},{key:`data`,label:`Data`,icon:He},{key:`schema`,label:`Schema`,icon:Ie},{key:`functions`,label:`Functions`,icon:Re},{key:`files`,label:`Files`,icon:Ke},{key:`schedules`,label:`Schedules`,icon:ct},{key:`auth`,label:`Auth`,icon:ot},{key:`logs`,label:`Logs`,icon:Je}],dn=(0,q.lazy)(()=>$(()=>import(`./cli-approval.BZAWmpiR.js`),__vite__mapDeps([10,1,2])));function fn(){return new URLSearchParams(location.search).has(`cli`)?(0,J.jsx)(q.Suspense,{fallback:(0,J.jsx)(`p`,{children:`Loading…`}),children:(0,J.jsx)(dn,{})}):(0,J.jsx)(pn,{})}function pn(){let[e,t]=(0,q.useState)(),[n,r]=(0,q.useState)([]),[i,a]=(0,q.useState)(),[o,s]=(0,q.useState)(`dev`),[c,l]=(0,q.useState)(`health`),[u,d]=(0,q.useState)(``),[f,p]=(0,q.useState)(!0),[m,h]=(0,q.useState)(),[g,_]=(0,q.useState)(!1);(0,q.useEffect)(()=>{let e=new AbortController;return _(localStorage.getItem(`flare.sidebar`)===`collapsed`),Promise.all([U(`session`,void 0,e.signal),U(`projects`,void 0,e.signal)]).then(([n,i])=>{e.signal.aborted||(t(n),r(i),a(i.find(e=>e.id===localStorage.getItem(`flare.project`))??i[0]),p(!1))}).catch(t=>{e.signal.aborted||(d(fe(t)),p(!1))}),()=>e.abort()},[]);let v=e=>{let t=n.find(t=>t.id===e);t&&(a(t),s(`dev`),l(`health`),h(void 0),localStorage.setItem(`flare.project`,e))},x=()=>h({title:`Create project`,description:`Creates separate development and production environments.`,content:(0,J.jsxs)(de,{children:[(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:`project-customer`,children:`Customer / workspace`}),(0,J.jsx)(N,{id:`project-customer`,name:`customer`,required:!0,maxLength:100,placeholder:`Your team`})]}),(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:`project-name`,children:`Project name`}),(0,J.jsx)(N,{id:`project-name`,name:`name`,required:!0,maxLength:100,placeholder:`CRM`})]}),(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:`project-alias`,children:`Short URL name (optional)`}),(0,J.jsx)(N,{id:`project-alias`,name:`alias`,maxLength:48,pattern:`[a-z][a-z0-9]*(?:-[a-z0-9]+)*`,placeholder:`crm`})]}),(0,J.jsxs)(V,{children:[(0,J.jsx)(y,{htmlFor:`project-origins`,children:`Allowed frontend origins · one per line`}),(0,J.jsx)(b,{id:`project-origins`,name:`origins`,placeholder:`http://127.0.0.1:5173`})]})]}),submit:async e=>{let t=new FormData(e),n=await U(`projects`,{name:t.get(`name`),customer:t.get(`customer`),alias:t.get(`alias`)||void 0,origins:[location.origin,...String(t.get(`origins`)).split(`
4
+ `).map(e=>e.trim()).filter(Boolean)]}),i=await U(`projects`);r(i),a(i.find(e=>e.id===n.id)??i[0]),s(`dev`),l(`health`)}}),S=i&&e?{project:i,env:o,session:e}:null,C=()=>{let e=n.filter(e=>e.id!==i?.id);r(e),a(e[0]),s(`dev`),l(`health`),e[0]?localStorage.setItem(`flare.project`,e[0].id):localStorage.removeItem(`flare.project`)},w=e=>{h(void 0),l(e)};return(0,J.jsxs)(`div`,{className:`flex h-dvh min-h-0 flex-col overflow-hidden text-sm`,children:[(0,J.jsxs)(`header`,{className:`flex h-14 shrink-0 items-center justify-between gap-3 border-b bg-sidebar px-4`,children:[(0,J.jsxs)(`div`,{className:`flex min-w-0 items-center gap-3`,children:[(0,J.jsx)(Ce,{label:`Select project`,value:i?.id??``,onChange:v,items:n.map(e=>({value:e.id,label:e.name})),className:`max-w-48`}),S&&(0,J.jsx)(At,{value:o,onValueChange:e=>{(e===`dev`||e===`prod`)&&(s(e),h(void 0))},"aria-label":`Select environment`,children:(0,J.jsxs)(Mt,{children:[(0,J.jsx)(Y,{value:`dev`,children:`Dev`}),(0,J.jsx)(Y,{value:`prod`,children:`Production`})]})})]}),(0,J.jsxs)(`div`,{className:`flex items-center gap-2`,children:[e?.role!==`viewer`&&e&&(0,J.jsx)(z,{"aria-label":`Create project`,size:`icon-sm`,variant:`ghost`,onClick:x,children:(0,J.jsx)(et,{})}),S&&(0,J.jsx)(z,{"aria-label":`Project settings`,size:`icon-sm`,variant:`ghost`,onClick:()=>w(`settings`),children:(0,J.jsx)(it,{})}),e&&(0,J.jsx)(`span`,{className:`flex size-7 items-center justify-center rounded-full bg-muted text-xs font-medium`,title:e.email,"aria-label":`Signed in as ${e.email}`,children:e.email.slice(0,2).toUpperCase()})]})]}),(0,J.jsxs)(`div`,{className:`flex min-h-0 flex-1`,children:[(0,J.jsxs)(`aside`,{className:`flex shrink-0 flex-col border-r bg-sidebar px-2 py-3 ${g?`w-12`:`w-36`}`,children:[(0,J.jsx)(`nav`,{"aria-label":`Deployment`,className:`flex flex-col gap-1`,children:un.map(({key:e,label:t,icon:n})=>(0,J.jsxs)(z,{variant:`ghost`,disabled:!S,"aria-current":c===e?`page`:void 0,title:g?t:void 0,"aria-label":g?t:void 0,className:`w-full justify-start ${c===e?`bg-sidebar-accent text-sidebar-accent-foreground`:`text-muted-foreground`}`,onClick:()=>w(e),children:[(0,J.jsx)(n,{className:`size-4`}),!g&&t]},e))}),(0,J.jsxs)(z,{"aria-label":g?`Expand sidebar`:`Collapse sidebar`,className:`mt-auto justify-start text-muted-foreground`,variant:`ghost`,onClick:()=>_(e=>(localStorage.setItem(`flare.sidebar`,e?`expanded`:`collapsed`),!e)),children:[g?(0,J.jsx)(Qe,{}):(0,J.jsx)(Xe,{}),!g&&`Collapse`]})]}),(0,J.jsxs)(`main`,{className:`min-h-0 min-w-0 flex-1 ${c===`data`?`overflow-hidden`:`overflow-auto`}`,"aria-label":`Deployment content`,children:[u&&(0,J.jsx)(`div`,{className:`p-4`,children:(0,J.jsx)(be,{children:u})}),f?(0,J.jsx)(W,{loading:!0}):S?(0,J.jsx)(q.Suspense,{fallback:(0,J.jsx)(W,{loading:!0}),children:(0,J.jsx)(`div`,{className:c===`data`?`h-full min-h-0`:`min-h-full`,children:c===`health`?(0,J.jsx)(Jt,{...S,connect:()=>w(`sdk`)}):c===`data`?(0,J.jsx)(an,{...S}):c===`schema`?(0,J.jsx)(Yt,{...S}):c===`functions`?(0,J.jsx)(on,{...S}):c===`files`?(0,J.jsx)(nn,{...S}):c===`schedules`?(0,J.jsx)(rn,{...S}):c===`auth`?(0,J.jsx)(sn,{...S}):c===`logs`?(0,J.jsx)(Xt,{...S}):c===`settings`?(0,J.jsx)(cn,{...S,onDeleted:C}):(0,J.jsx)(ln,{...S})},`${i.id}/${o}/${c}`)}):u?null:(0,J.jsxs)(`div`,{className:`p-4`,children:[(0,J.jsx)(`h1`,{className:`page-title`,children:`Select a project`}),(0,J.jsx)(`p`,{className:`mt-2 text-muted-foreground`,children:`Create a project to get started.`}),e?.role!==`viewer`&&(0,J.jsxs)(z,{className:`mt-4`,onClick:x,children:[(0,J.jsx)(et,{}),`New project`]})]})]})]}),m&&(0,J.jsx)(ne,{modal:m,onClose:()=>h(void 0)})]})}var mn=document.getElementById(`flare-dashboard`);if(!mn)throw Error(`Dashboard mount missing`);(0,kt.createRoot)(mn).render((0,q.createElement)(fn));export{Re as _,Rt as a,It as c,Mt as d,Y as f,He as g,We as h,Q as i,At as l,et as m,Vt as n,zt as o,nt as p,Z as r,X as s,Kt as t,Nt as u};
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){:root,:host{--shimmer-angle:20deg}*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-duration:initial;--tw-content:"";--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-animation-delay:0s;--tw-animation-direction:normal;--tw-animation-duration:initial;--tw-animation-fill-mode:none;--tw-animation-iteration-count:1;--tw-enter-blur:0;--tw-enter-opacity:1;--tw-enter-rotate:0;--tw-enter-scale:1;--tw-enter-translate-x:0;--tw-enter-translate-y:0;--tw-exit-blur:0;--tw-exit-opacity:1;--tw-exit-rotate:0;--tw-exit-scale:1;--tw-exit-translate-x:0;--tw-exit-translate-y:0;--scroll-fade-t:0px;--scroll-fade-b:0px;--scroll-fade-s:0px;--scroll-fade-e:0px;--scroll-fade-mask:initial;--shimmer-image:initial;--shimmer-text-fill:initial;--tw-tracking:initial}}}@layer theme{:root,:host{--font-sans:"Geist Variable", sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-900:oklch(41.4% .112 45.904);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-900:oklch(42.1% .095 57.708);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-900:oklch(37.8% .077 168.94);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-900:oklch(37.9% .146 265.522);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-900:oklch(38.1% .176 304.987);--color-black:#000;--spacing:.25rem;--container-sm:24rem;--container-lg:32rem;--container-xl:36rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--tracking-tight:-.025em;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:"Geist Variable", sans-serif;--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}body{background-color:var(--background);color:var(--foreground)}html{font-family:Geist Variable,sans-serif}body{margin:0}button,summary{cursor:pointer}}@layer components{.page-title{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold);--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.section-title{align-items:center;gap:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);display:flex}.explorer-sidebar{width:calc(var(--spacing) * 40);border-right-style:var(--tw-border-style);background-color:var(--sidebar);border-right-width:1px;flex-shrink:0}@supports (color:color-mix(in lab, red, red)){.explorer-sidebar{background-color:color-mix(in oklab, var(--sidebar) 40%, transparent)}}@media (width>=48rem){.explorer-sidebar{width:calc(var(--spacing) * 60)}}.detail-header{justify-content:space-between;align-items:center;gap:calc(var(--spacing) * 2);border-bottom-style:var(--tw-border-style);padding:calc(var(--spacing) * 4);border-bottom-width:1px;flex-wrap:wrap;display:flex}.code-block{border-style:var(--tw-border-style);background-color:var(--muted);border-width:1px;min-width:0;max-width:100%;overflow:auto}@supports (color:color-mix(in lab, red, red)){.code-block{background-color:color-mix(in oklab, var(--muted) 30%, transparent)}}.code-block{padding:calc(var(--spacing) * 4);font-family:var(--font-mono);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed);white-space:pre}}@layer utilities{.\@container\/card-header{container:card-header/inline-size}.\@container\/field-group{container:field-group/inline-size}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-0{inset:0}.top-0{top:0}.top-1\/2{top:50%}.top-2{top:calc(var(--spacing) * 2)}.top-\[calc\(--spacing\(1\.25\)\)\]{top:calc(calc(var(--spacing) * 1.25))}.right-2{right:calc(var(--spacing) * 2)}.right-\[calc\(--spacing\(1\.25\)\)\]{right:calc(calc(var(--spacing) * 1.25))}.bottom-0{bottom:0}.left-1\/2{left:50%}.isolate{isolation:isolate}.z-10{z-index:10}.z-50{z-index:50}.order-first{order:-9999}.order-last{order:9999}.col-start-2{grid-column-start:2}.row-span-2{grid-row:span 2/span 2}.row-start-1{grid-row-start:1}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.mx-auto{margin-inline:auto}.-my-2{margin-block:calc(var(--spacing) * -2)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-auto{margin-top:auto}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-flex{display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-row{display:table-row}.field-sizing-content{field-sizing:content}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-14{height:calc(var(--spacing) * 14)}.h-\[calc\(100\%-1px\)\]{height:calc(100% - 1px)}.h-auto{height:auto}.h-dvh{height:100dvh}.h-full{height:100%}.h-px{height:1px}.max-h-\(--available-height\){max-height:var(--available-height)}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.min-h-0{min-height:0}.min-h-16{min-height:calc(var(--spacing) * 16)}.min-h-full{min-height:100%}.w-\(--anchor-width\){width:var(--anchor-width)}.w-12{width:calc(var(--spacing) * 12)}.w-32{width:calc(var(--spacing) * 32)}.w-36{width:calc(var(--spacing) * 36)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-lg{max-width:var(--container-lg)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.min-w-0{min-width:0}.min-w-36{min-width:calc(var(--spacing) * 36)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.caption-bottom{caption-side:bottom}.origin-\(--transform-origin\){transform-origin:var(--transform-origin)}.-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-text{cursor:text}.resize-none{resize:none}.scroll-my-1{scroll-margin-block:var(--spacing)}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-\[minmax\(80px\,auto\)_1fr\]{grid-template-columns:minmax(80px,auto) 1fr}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-start{justify-content:flex-start}.gap-\(--card-spacing\){gap:var(--card-spacing)}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.self-start{align-self:flex-start}.justify-self-end{justify-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:2147483647px}.rounded-none{border-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-600\/20{border-color:#dd740033}@supports (color:color-mix(in lab, red, red)){.border-amber-600\/20{border-color:color-mix(in oklab, var(--color-amber-600) 20%, transparent)}}.border-blue-600\/20{border-color:#155dfc33}@supports (color:color-mix(in lab, red, red)){.border-blue-600\/20{border-color:color-mix(in oklab, var(--color-blue-600) 20%, transparent)}}.border-border{border-color:var(--border)}.border-emerald-600\/20{border-color:#00976733}@supports (color:color-mix(in lab, red, red)){.border-emerald-600\/20{border-color:color-mix(in oklab, var(--color-emerald-600) 20%, transparent)}}.border-input{border-color:var(--input)}.border-transparent{border-color:#0000}.bg-accent{background-color:var(--accent)}.bg-amber-100\/50{background-color:#fef3c680}@supports (color:color-mix(in lab, red, red)){.bg-amber-100\/50{background-color:color-mix(in oklab, var(--color-amber-100) 50%, transparent)}}.bg-background{background-color:var(--background)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab, red, red)){.bg-black\/10{background-color:color-mix(in oklab, var(--color-black) 10%, transparent)}}.bg-blue-100\/50{background-color:#dbeafe80}@supports (color:color-mix(in lab, red, red)){.bg-blue-100\/50{background-color:color-mix(in oklab, var(--color-blue-100) 50%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-emerald-100\/50{background-color:#d0fae580}@supports (color:color-mix(in lab, red, red)){.bg-emerald-100\/50{background-color:color-mix(in oklab, var(--color-emerald-100) 50%, transparent)}}.bg-muted,.bg-muted\/50{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/50{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary{background-color:var(--primary)}.bg-purple-100\/50{background-color:#f3e8ff80}@supports (color:color-mix(in lab, red, red)){.bg-purple-100\/50{background-color:color-mix(in oklab, var(--color-purple-100) 50%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-transparent{background-color:#0000}.bg-yellow-100\/50{background-color:#fef9c280}@supports (color:color-mix(in lab, red, red)){.bg-yellow-100\/50{background-color:color-mix(in oklab, var(--color-yellow-100) 50%, transparent)}}.bg-clip-padding{background-clip:padding-box}.p-\(--card-spacing\){padding:var(--card-spacing)}.p-0{padding:0}.p-2{padding:calc(var(--spacing) * 2)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.p-\[3px\]{padding:3px}.px-\(--card-spacing\){padding-inline:var(--card-spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-\(--card-spacing\){padding-block:var(--card-spacing)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.text-center{text-align:center}.text-left{text-align:left}.align-middle{vertical-align:middle}.font-heading{font-family:var(--font-sans)}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-xs\/relaxed{font-size:var(--text-xs);line-height:var(--leading-relaxed)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.text-balance{text-wrap:balance}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-amber-500{color:var(--color-amber-500)}.text-amber-700{color:var(--color-amber-700)}.text-blue-700{color:var(--color-blue-700)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-700{color:var(--color-emerald-700)}.text-foreground,.text-foreground\/60{color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.text-foreground\/60{color:color-mix(in oklab, var(--foreground) 60%, transparent)}}.text-muted-foreground{color:var(--muted-foreground)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-purple-700{color:var(--color-purple-700)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-yellow-700{color:var(--color-yellow-700)}.lowercase{text-transform:lowercase}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-foreground\/10{--tw-ring-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.ring-foreground\/10{--tw-ring-color:color-mix(in oklab, var(--foreground) 10%, transparent)}}.outline-hidden{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.outline-hidden{outline-offset:2px;outline:2px solid #0000}}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-none{-webkit-user-select:none;user-select:none}.\[--card-spacing\:--spacing\(4\)\]{--card-spacing:calc(var(--spacing) * 4)}.paused{animation-play-state:paused}.running{animation-play-state:running}:is(.\*\:w-full>*){width:100%}.group-has-data-horizontal\/field\:text-balance:is(:where(.group\/field):has(:where([data-orientation=horizontal])) *){text-wrap:balance}.group-has-\[\>input\]\/input-group\:pt-2:is(:where(.group\/input-group):has(>input) *){padding-top:calc(var(--spacing) * 2)}.group-has-\[\>input\]\/input-group\:pb-2:is(:where(.group\/input-group):has(>input) *){padding-bottom:calc(var(--spacing) * 2)}.group-has-\[\>svg\]\/alert\:col-start-2:is(:where(.group\/alert):has(>svg) *){grid-column-start:2}.group-data-\[disabled\=true\]\:pointer-events-none:is(:where(.group)[data-disabled=true] *){pointer-events:none}.group-data-\[disabled\=true\]\:opacity-50:is(:where(.group)[data-disabled=true] *),.group-data-\[disabled\=true\]\/field\:opacity-50:is(:where(.group\/field)[data-disabled=true] *),.group-data-\[disabled\=true\]\/input-group\:opacity-50:is(:where(.group\/input-group)[data-disabled=true] *){opacity:.5}.group-data-\[size\=sm\]\/card\:text-sm:is(:where(.group\/card)[data-size=sm] *){font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.group-data-\[variant\=line\]\/tabs-list\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *){background-color:#0000}.group-data-\[variant\=outline\]\/field-group\:-mb-2:is(:where(.group\/field-group)[data-variant=outline] *){margin-bottom:calc(var(--spacing) * -2)}.group-data-horizontal\/tabs\:h-8:is(:where(.group\/tabs):where([data-orientation=horizontal]) *){height:calc(var(--spacing) * 8)}.group-data-vertical\/tabs\:h-fit:is(:where(.group\/tabs):where([data-orientation=vertical]) *){height:fit-content}.group-data-vertical\/tabs\:w-full:is(:where(.group\/tabs):where([data-orientation=vertical]) *){width:100%}.group-data-vertical\/tabs\:flex-col:is(:where(.group\/tabs):where([data-orientation=vertical]) *){flex-direction:column}.group-data-vertical\/tabs\:justify-start:is(:where(.group\/tabs):where([data-orientation=vertical]) *){justify-content:flex-start}.group-data-vertical\/tabs\:py-\[calc\(--spacing\(1\.25\)\)\]:is(:where(.group\/tabs):where([data-orientation=vertical]) *){padding-block:calc(calc(var(--spacing) * 1.25))}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.file\:inline-flex::file-selector-button{display:inline-flex}.file\:h-6::file-selector-button{height:calc(var(--spacing) * 6)}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-transparent::file-selector-button{background-color:#0000}.file\:text-xs::file-selector-button{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.file\:font-medium::file-selector-button{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.file\:text-foreground::file-selector-button{color:var(--foreground)}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:bg-foreground:after{content:var(--tw-content);background-color:var(--foreground)}.after\:opacity-0:after{content:var(--tw-content);opacity:0}.after\:transition-opacity:after{content:var(--tw-content);transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.group-data-horizontal\/tabs\:after\:inset-x-0:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);inset-inline:0}.group-data-horizontal\/tabs\:after\:bottom-\[-5px\]:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);bottom:-5px}.group-data-horizontal\/tabs\:after\:h-0\.5:is(:where(.group\/tabs):where([data-orientation=horizontal]) *):after{content:var(--tw-content);height:calc(var(--spacing) * .5)}.group-data-vertical\/tabs\:after\:inset-y-0:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);inset-block:0}.group-data-vertical\/tabs\:after\:-right-1:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);right:calc(var(--spacing) * -1)}.group-data-vertical\/tabs\:after\:w-0\.5:is(:where(.group\/tabs):where([data-orientation=vertical]) *):after{content:var(--tw-content);width:calc(var(--spacing) * .5)}.last\:mt-0:last-child{margin-top:0}@media (hover:hover){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-\[color-mix\(in_oklch\,var\(--secondary\)\,var\(--foreground\)_5\%\)\]:hover{background-color:color-mix(in oklch,var(--secondary),var(--foreground) 5%)}}.hover\:bg-destructive\/20:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/20:hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.hover\:bg-muted:hover,.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/80:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/80:hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-muted-foreground:hover{color:var(--muted-foreground)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus,:is(.not-data-\[variant\=destructive\]\:focus\:\*\*\:text-accent-foreground:not([data-variant=destructive]):focus *){color:var(--accent-foreground)}.focus-visible\:border-destructive\/40:focus-visible{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:border-destructive\/40:focus-visible{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:outline-1:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-ring:focus-visible{outline-color:var(--ring)}.active\:not-aria-\[haspopup\]\:translate-y-px:active:not([aria-haspopup]){--tw-translate-y:1px;translate:var(--tw-translate-x) var(--tw-translate-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-input\/50:disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.disabled\:bg-input\/50:disabled{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.disabled\:bg-transparent:disabled{background-color:#0000}.disabled\:opacity-50:disabled{opacity:.5}:where([data-slot=combobox-content]) .in-data-\[slot\=combobox-content\]\:focus-within\:border-inherit:focus-within{border-color:inherit}:where([data-slot=combobox-content]) .in-data-\[slot\=combobox-content\]\:focus-within\:ring-0:focus-within{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-disabled\:bg-input\/50:has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.has-disabled\:bg-input\/50:has(:disabled){background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.has-disabled\:opacity-50:has(:disabled){opacity:.5}.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-aria-expanded\:bg-muted\/50:has([aria-expanded=true]){background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.has-data-\[icon\=inline-end\]\:pr-1:has([data-icon=inline-end]){padding-right:var(--spacing)}.has-data-\[icon\=inline-end\]\:pr-1\.5:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-end\]\:pr-2:has([data-icon=inline-end]){padding-right:calc(var(--spacing) * 2)}.has-data-\[icon\=inline-start\]\:pl-1:has([data-icon=inline-start]){padding-left:var(--spacing)}.has-data-\[icon\=inline-start\]\:pl-1\.5:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 1.5)}.has-data-\[icon\=inline-start\]\:pl-2:has([data-icon=inline-start]){padding-left:calc(var(--spacing) * 2)}.has-data-\[slot\=alert-action\]\:relative:has([data-slot=alert-action]){position:relative}.has-data-\[slot\=alert-action\]\:pr-18:has([data-slot=alert-action]){padding-right:calc(var(--spacing) * 18)}.has-data-\[slot\=card-action\]\:grid-cols-\[1fr_auto\]:has([data-slot=card-action]){grid-template-columns:1fr auto}.has-data-\[slot\=card-description\]\:grid-rows-\[auto_auto\]:has([data-slot=card-description]){grid-template-rows:auto auto}.has-data-\[slot\=card-footer\]\:pb-0:has([data-slot=card-footer]){padding-bottom:0}.has-data-checked\:border-primary\/30:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.has-data-checked\:border-primary\/30:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){border-color:color-mix(in oklab, var(--primary) 30%, transparent)}}.has-data-checked\:bg-primary\/5:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.has-data-checked\:bg-primary\/5:has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:color-mix(in oklab, var(--primary) 5%, transparent)}}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-1:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:border-destructive:has([data-slot][aria-invalid=true]){border-color:var(--destructive)}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-1:has([data-slot][aria-invalid=true]){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/20:has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.has-\[\>\[data-align\=block-end\]\]\:h-auto:has(>[data-align=block-end]){height:auto}.has-\[\>\[data-align\=block-end\]\]\:flex-col:has(>[data-align=block-end]){flex-direction:column}.has-\[\>\[data-align\=block-start\]\]\:h-auto:has(>[data-align=block-start]){height:auto}.has-\[\>\[data-align\=block-start\]\]\:flex-col:has(>[data-align=block-start]){flex-direction:column}.has-\[\>\[data-slot\=checkbox-group\]\]\:gap-3:has(>[data-slot=checkbox-group]){gap:calc(var(--spacing) * 3)}.has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}.has-\[\>\[data-slot\=field\]\]\:w-full:has(>[data-slot=field]){width:100%}.has-\[\>\[data-slot\=field\]\]\:flex-col:has(>[data-slot=field]){flex-direction:column}.has-\[\>\[data-slot\=field\]\]\:rounded-none:has(>[data-slot=field]){border-radius:0}.has-\[\>\[data-slot\=field\]\]\:border:has(>[data-slot=field]){border-style:var(--tw-border-style);border-width:1px}@media (hover:hover){.has-\[\>\[data-slot\=field\]\]\:not-has-\[\:disabled\,\[data-disabled\]\]\:hover\:bg-muted\/50:has(>[data-slot=field]):not(:has(:is(:disabled,[data-disabled]))):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.has-\[\>\[data-slot\=field\]\]\:not-has-\[\:disabled\,\[data-disabled\]\]\:hover\:bg-muted\/50:has(>[data-slot=field]):not(:has(:is(:disabled,[data-disabled]))):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:border-ring:has(>[data-slot=field]):has(:focus-visible){border-color:var(--ring)}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-1:has(>[data-slot=field]):has(:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-ring\/50:has(>[data-slot=field]):has(:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\[\>\[data-slot\=field\]\]\:has-\[\:focus-visible\]\:ring-ring\/50:has(>[data-slot=field]):has(:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.has-\[\>\[data-slot\=radio-group\]\]\:gap-3:has(>[data-slot=radio-group]){gap:calc(var(--spacing) * 3)}.has-\[\>button\]\:mr-\[-0\.3rem\]:has(>button){margin-right:-.3rem}.has-\[\>button\]\:ml-\[-0\.3rem\]:has(>button){margin-left:-.3rem}.has-\[\>img\:first-child\]\:pt-0:has(>img:first-child){padding-top:0}.has-\[\>kbd\]\:mr-\[-0\.15rem\]:has(>kbd){margin-right:-.15rem}.has-\[\>kbd\]\:ml-\[-0\.15rem\]:has(>kbd){margin-left:-.15rem}.has-\[\>svg\]\:grid-cols-\[auto_1fr\]:has(>svg){grid-template-columns:auto 1fr}.has-\[\>svg\]\:gap-x-2:has(>svg){column-gap:calc(var(--spacing) * 2)}.has-\[\>svg\]\:p-0:has(>svg){padding:0}.has-\[\>textarea\]\:h-auto:has(>textarea){height:auto}.aria-disabled\:pointer-events-none[aria-disabled=true]{pointer-events:none}.aria-disabled\:opacity-50[aria-disabled=true]{opacity:.5}.aria-expanded\:bg-muted[aria-expanded=true]{background-color:var(--muted)}.aria-expanded\:bg-secondary[aria-expanded=true]{background-color:var(--secondary)}.aria-expanded\:text-foreground[aria-expanded=true]{color:var(--foreground)}.aria-expanded\:text-secondary-foreground[aria-expanded=true]{color:var(--secondary-foreground)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-0[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-1[aria-invalid=true]{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.data-placeholder\:text-muted-foreground[data-placeholder]{color:var(--muted-foreground)}.data-\[align-trigger\=true\]\:animate-none[data-align-trigger=true]{animation:none}.data-\[invalid\=true\]\:text-destructive[data-invalid=true]{color:var(--destructive)}.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom]{--tw-enter-translate-y:calc(2*var(--spacing)*-1)}.data-\[side\=inline-end\]\:slide-in-from-left-2[data-side=inline-end]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=inline-start\]\:slide-in-from-right-2[data-side=inline-start],.data-\[side\=left\]\:slide-in-from-right-2[data-side=left]{--tw-enter-translate-x:calc(2*var(--spacing))}.data-\[side\=right\]\:slide-in-from-left-2[data-side=right]{--tw-enter-translate-x:calc(2*var(--spacing)*-1)}.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top]{--tw-enter-translate-y:calc(2*var(--spacing))}.data-\[size\=default\]\:h-8[data-size=default]{height:calc(var(--spacing) * 8)}.data-\[size\=sm\]\:h-7[data-size=sm]{height:calc(var(--spacing) * 7)}.data-\[size\=sm\]\:rounded-none[data-size=sm]{border-radius:0}.data-\[size\=sm\]\:\[--card-spacing\:--spacing\(3\)\][data-size=sm]{--card-spacing:calc(var(--spacing) * 3)}.data-\[size\=sm\]\:has-data-\[slot\=card-footer\]\:pb-0[data-size=sm]:has([data-slot=card-footer]){padding-bottom:0}:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){:is(.\*\:data-\[slot\=alert-description\]\:text-destructive\/90>*)[data-slot=alert-description]{color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.data-\[slot\=checkbox-group\]\:gap-3[data-slot=checkbox-group]{gap:calc(var(--spacing) * 3)}:is(.\*\:data-\[slot\=field\]\:p-2>*)[data-slot=field]{padding:calc(var(--spacing) * 2)}:is(.\*\:data-\[slot\=field-group\]\:gap-4>*)[data-slot=field-group]{gap:calc(var(--spacing) * 4)}:is(.\*\:data-\[slot\=field-label\]\:flex-auto>*)[data-slot=field-label]{flex:auto}:is(.\*\:data-\[slot\=select-value\]\:line-clamp-1>*)[data-slot=select-value]{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}:is(.\*\:data-\[slot\=select-value\]\:flex>*)[data-slot=select-value]{display:flex}:is(.\*\:data-\[slot\=select-value\]\:items-center>*)[data-slot=select-value]{align-items:center}:is(.\*\:data-\[slot\=select-value\]\:gap-1\.5>*)[data-slot=select-value]{gap:calc(var(--spacing) * 1.5)}.data-\[state\=selected\]\:bg-muted[data-state=selected]{background-color:var(--muted)}.data-\[variant\=label\]\:text-xs[data-variant=label]{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.data-\[variant\=legend\]\:text-sm[data-variant=legend]{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.data-\[variant\=line\]\:rounded-none[data-variant=line]{border-radius:0}.nth-last-2\:-mt-1:nth-last-child(2){margin-top:calc(var(--spacing) * -1)}@supports ((-webkit-backdrop-filter:var(--tw)) or (backdrop-filter:var(--tw))){.supports-backdrop-filter\:backdrop-blur-xs{--tw-backdrop-blur:blur(var(--blur-xs));backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}}@media (width>=40rem){.sm\:max-w-sm{max-width:var(--container-sm)}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.md\:text-pretty{text-wrap:pretty}}@media (width>=64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.lg\:border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}}@container field-group (width>=28rem){.\@md\/field-group\:flex-row{flex-direction:row}.\@md\/field-group\:items-center{align-items:center}:is(.\@md\/field-group\:\*\:w-auto>*){width:auto}.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:items-start:has(>[data-slot=field-content]){align-items:flex-start}:is(.\@md\/field-group\:\*\:data-\[slot\=field-label\]\:flex-auto>*)[data-slot=field-label]{flex:auto}}.dark\:border-amber-400\/20:is(.dark *){border-color:#fcbb0033}@supports (color:color-mix(in lab, red, red)){.dark\:border-amber-400\/20:is(.dark *){border-color:color-mix(in oklab, var(--color-amber-400) 20%, transparent)}}.dark\:border-blue-400\/20:is(.dark *){border-color:#54a2ff33}@supports (color:color-mix(in lab, red, red)){.dark\:border-blue-400\/20:is(.dark *){border-color:color-mix(in oklab, var(--color-blue-400) 20%, transparent)}}.dark\:border-emerald-400\/20:is(.dark *){border-color:#00d29433}@supports (color:color-mix(in lab, red, red)){.dark\:border-emerald-400\/20:is(.dark *){border-color:color-mix(in oklab, var(--color-emerald-400) 20%, transparent)}}.dark\:border-input:is(.dark *){border-color:var(--input)}.dark\:bg-amber-900\/50:is(.dark *){background-color:#7b330680}@supports (color:color-mix(in lab, red, red)){.dark\:bg-amber-900\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-amber-900) 50%, transparent)}}.dark\:bg-blue-900\/50:is(.dark *){background-color:#1c398e80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 50%, transparent)}}.dark\:bg-destructive\/20:is(.dark *){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/20:is(.dark *){background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.dark\:bg-emerald-900\/50:is(.dark *){background-color:#004e3b80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-emerald-900\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-emerald-900) 50%, transparent)}}.dark\:bg-input\/30:is(.dark *){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:is(.dark *){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:bg-purple-900\/50:is(.dark *){background-color:#59168b80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-purple-900\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-purple-900) 50%, transparent)}}.dark\:bg-transparent:is(.dark *){background-color:#0000}.dark\:bg-yellow-900\/50:is(.dark *){background-color:#733e0a80}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-900\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-900) 50%, transparent)}}.dark\:text-amber-200:is(.dark *){color:var(--color-amber-200)}.dark\:text-blue-200:is(.dark *){color:var(--color-blue-200)}.dark\:text-emerald-200:is(.dark *){color:var(--color-emerald-200)}.dark\:text-muted-foreground:is(.dark *){color:var(--muted-foreground)}.dark\:text-purple-200:is(.dark *){color:var(--color-purple-200)}.dark\:text-yellow-200:is(.dark *){color:var(--color-yellow-200)}@media (hover:hover){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/30:is(.dark *):hover{background-color:color-mix(in oklab, var(--destructive) 30%, transparent)}}.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-muted\/50:is(.dark *):hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.dark\:hover\:text-foreground:is(.dark *):hover{color:var(--foreground)}}.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:is(.dark *):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:disabled\:bg-input\/80:is(.dark *):disabled{background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.dark\:disabled\:bg-transparent:is(.dark *):disabled{background-color:#0000}.dark\:has-disabled\:bg-input\/80:is(.dark *):has(:disabled){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:has-disabled\:bg-input\/80:is(.dark *):has(:disabled){background-color:color-mix(in oklab, var(--input) 80%, transparent)}}.dark\:has-data-checked\:border-primary\/20:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:has-data-checked\:border-primary\/20:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){border-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.dark\:has-data-checked\:bg-primary\/10:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:has-data-checked\:bg-primary\/10:is(.dark *):has(:where([data-state=checked]),:where([data-checked]:not([data-checked=false]))){background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:has-\[\[data-slot\]\[aria-invalid\=true\]\]\:ring-destructive\/40:is(.dark *):has([data-slot][aria-invalid=true]){--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:border-destructive\/50:is(.dark *)[aria-invalid=true]{border-color:color-mix(in oklab, var(--destructive) 50%, transparent)}}.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:is(.dark *)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.data-open\:animate-in:where([data-state=open]),.data-open\:animate-in:where([data-open]:not([data-open=false])){animation:enter var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-open\:fade-in-0:where([data-state=open]),.data-open\:fade-in-0:where([data-open]:not([data-open=false])){--tw-enter-opacity:0}.data-open\:zoom-in-95:where([data-state=open]),.data-open\:zoom-in-95:where([data-open]:not([data-open=false])){--tw-enter-scale:.95}.data-closed\:animate-out:where([data-state=closed]),.data-closed\:animate-out:where([data-closed]:not([data-closed=false])){animation:exit var(--tw-animation-duration,var(--tw-duration,.15s))var(--tw-ease,ease)var(--tw-animation-delay,0s)var(--tw-animation-iteration-count,1)var(--tw-animation-direction,normal)var(--tw-animation-fill-mode,none)}.data-closed\:fade-out-0:where([data-state=closed]),.data-closed\:fade-out-0:where([data-closed]:not([data-closed=false])){--tw-exit-opacity:0}.data-closed\:zoom-out-95:where([data-state=closed]),.data-closed\:zoom-out-95:where([data-closed]:not([data-closed=false])){--tw-exit-scale:.95}.data-disabled\:pointer-events-none:where([data-disabled=true]),.data-disabled\:pointer-events-none:where([data-disabled]:not([data-disabled=false])){pointer-events:none}.data-disabled\:opacity-50:where([data-disabled=true]),.data-disabled\:opacity-50:where([data-disabled]:not([data-disabled=false])){opacity:.5}.data-active\:bg-background:where([data-state=active]),.data-active\:bg-background:where([data-active]:not([data-active=false])){background-color:var(--background)}.data-active\:text-foreground:where([data-state=active]),.data-active\:text-foreground:where([data-active]:not([data-active=false])){color:var(--foreground)}.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}:is(.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.group-data-\[variant\=line\]\/tabs-list\:data-active\:after\:opacity-100:is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false]))):after{content:var(--tw-content);opacity:1}.dark\:data-active\:border-input:is(.dark *):where([data-state=active]),.dark\:data-active\:border-input:is(.dark *):where([data-active]:not([data-active=false])){border-color:var(--input)}.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:data-active\:bg-input\/30:is(.dark *):where([data-state=active]),.dark\:data-active\:bg-input\/30:is(.dark *):where([data-active]:not([data-active=false])){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}.dark\:data-active\:text-foreground:is(.dark *):where([data-state=active]),.dark\:data-active\:text-foreground:is(.dark *):where([data-active]:not([data-active=false])){color:var(--foreground)}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:border-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){border-color:#0000}.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-state=active]),.dark\:group-data-\[variant\=line\]\/tabs-list\:data-active\:bg-transparent:is(.dark *):is(:where(.group\/tabs-list)[data-variant=line] *):where([data-active]:not([data-active=false])){background-color:#0000}.data-horizontal\:h-px:where([data-orientation=horizontal]){height:1px}.data-horizontal\:w-full:where([data-orientation=horizontal]){width:100%}.data-horizontal\:flex-col:where([data-orientation=horizontal]){flex-direction:column}.data-vertical\:w-px:where([data-orientation=vertical]){width:1px}.data-vertical\:self-stretch:where([data-orientation=vertical]){align-self:stretch}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-3 a{text-underline-offset:3px}@media (hover:hover){.\[\&_a\]\:hover\:text-foreground a:hover{color:var(--foreground)}}.\[\&_p\:not\(\:last-child\)\]\:mb-2 p:not(:last-child){margin-bottom:calc(var(--spacing) * 2)}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3 svg:not([class*=size-]){width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_tr\]\:border-b tr{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.\[\&_tr\:last-child\]\:border-0 tr:last-child{border-style:var(--tw-border-style);border-width:0}.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]){padding-right:0}.\[\.border-b\]\:pb-\(--card-spacing\).border-b{padding-bottom:var(--card-spacing)}.\[\.border-b\]\:pb-2.border-b{padding-bottom:calc(var(--spacing) * 2)}.\[\.border-t\]\:pt-2.border-t{padding-top:calc(var(--spacing) * 2)}:is(.\*\:\[a\]\:underline>*):is(a){text-decoration-line:underline}:is(.\*\:\[a\]\:underline-offset-3>*):is(a){text-underline-offset:3px}@media (hover:hover){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-destructive\/20:is(a):hover{background-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.\[a\]\:hover\:bg-muted:is(a):hover{background-color:var(--muted)}.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-primary\/80:is(a):hover{background-color:color-mix(in oklab, var(--primary) 80%, transparent)}}.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.\[a\]\:hover\:bg-secondary\/80:is(a):hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.\[a\]\:hover\:text-muted-foreground:is(a):hover{color:var(--muted-foreground)}:is(.\*\:\[a\]\:hover\:text-foreground>*):is(a):hover{color:var(--foreground)}}:is(.\*\:\[img\:first-child\]\:rounded-none>*):is(img:first-child),:is(.\*\:\[img\:last-child\]\:rounded-none>*):is(img:last-child){border-radius:0}:is(.\*\:\[span\]\:last\:flex>*):is(span):last-child{display:flex}:is(.\*\:\[span\]\:last\:items-center>*):is(span):last-child{align-items:center}:is(.\*\:\[span\]\:last\:gap-2>*):is(span):last-child{gap:calc(var(--spacing) * 2)}:is(.\*\:\[svg\]\:row-span-2>*):is(svg){grid-row:span 2/span 2}:is(.\*\:\[svg\]\:translate-y-0>*):is(svg){--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}:is(.\*\:\[svg\]\:text-current>*):is(svg){color:currentColor}:is(.\*\:\[svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>*):is(svg:not([class*=size-])){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>\.sr-only\]\:w-auto>.sr-only{width:auto}.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]{margin-top:1px}@container field-group (width>=28rem){.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content])>[role=checkbox],.\@md\/field-group\:has-\[\>\[data-slot\=field-content\]\]\:\[\&\>\[role\=checkbox\]\,\[role\=radio\]\]\:mt-px:has(>[data-slot=field-content]) [role=radio]{margin-top:1px}}.\[\&\>a\]\:underline>a{text-decoration-line:underline}.\[\&\>a\]\:underline-offset-4>a{text-underline-offset:4px}.\[\&\>a\:hover\]\:text-primary>a:hover{color:var(--primary)}.has-\[\>\[data-align\=block-end\]\]\:\[\&\>input\]\:pt-3:has(>[data-align=block-end])>input{padding-top:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=block-start\]\]\:\[\&\>input\]\:pb-3:has(>[data-align=block-start])>input{padding-bottom:calc(var(--spacing) * 3)}.has-\[\>\[data-align\=inline-end\]\]\:\[\&\>input\]\:pr-1\.5:has(>[data-align=inline-end])>input{padding-right:calc(var(--spacing) * 1.5)}.has-\[\>\[data-align\=inline-start\]\]\:\[\&\>input\]\:pl-1\.5:has(>[data-align=inline-start])>input{padding-left:calc(var(--spacing) * 1.5)}.\[\&\>kbd\]\:rounded-none>kbd{border-radius:0}.\[\&\>svg\]\:pointer-events-none>svg{pointer-events:none}.\[\&\>svg\]\:size-3\!>svg{width:calc(var(--spacing) * 3)!important;height:calc(var(--spacing) * 3)!important}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-3\.5>svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\>tr\]\:last\:border-b-0>tr:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}[data-variant=legend]+.\[\[data-variant\=legend\]\+\&\]\:-mt-1\.5{margin-top:calc(var(--spacing) * -1.5)}}@property --tw-animation-delay{syntax:"*";inherits:false;initial-value:0s}@property --tw-animation-direction{syntax:"*";inherits:false;initial-value:normal}@property --tw-animation-duration{syntax:"*";inherits:false}@property --tw-animation-fill-mode{syntax:"*";inherits:false;initial-value:none}@property --tw-animation-iteration-count{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-enter-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-enter-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-blur{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-opacity{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-rotate{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-scale{syntax:"*";inherits:false;initial-value:1}@property --tw-exit-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-exit-translate-y{syntax:"*";inherits:false;initial-value:0}@property --scroll-fade-t{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-b{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-s{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-e{syntax:"<length-percentage>";inherits:false;initial-value:0}@property --scroll-fade-mask{syntax:"*";inherits:false}@property --shimmer-angle{syntax:"<angle>";inherits:true;initial-value:20deg}@property --shimmer-image{syntax:"*";inherits:false}@property --shimmer-text-fill{syntax:"*";inherits:false}@media (prefers-reduced-motion:reduce){.shimmer{-webkit-text-fill-color:currentColor;background-image:none;animation:none}}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-ext-wght-normal.DjL33-gN.woff2)format("woff2-variations");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-cyrillic-wght-normal.BEAKL7Jp.woff2)format("woff2-variations");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-vietnamese-wght-normal.6IgcOCM7.woff2)format("woff2-variations");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-ext-wght-normal.DC-KSUi6.woff2)format("woff2-variations");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/_astro/geist-latin-wght-normal.BgDaEnEv.woff2)format("woff2-variations");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{--background:oklch(100% 0 0);--foreground:oklch(14.7% .004 49.25);--card:oklch(100% 0 0);--card-foreground:oklch(14.7% .004 49.25);--popover:oklch(100% 0 0);--popover-foreground:oklch(14.7% .004 49.25);--primary:oklch(21.6% .006 56.043);--primary-foreground:oklch(98.5% .001 106.423);--secondary:oklch(97% .001 106.424);--secondary-foreground:oklch(21.6% .006 56.043);--muted:oklch(97% .001 106.424);--muted-foreground:oklch(55.3% .013 58.071);--accent:oklch(97% .001 106.424);--accent-foreground:oklch(21.6% .006 56.043);--destructive:oklch(57.7% .245 27.325);--border:oklch(92.3% .003 48.717);--input:oklch(92.3% .003 48.717);--ring:oklch(70.9% .01 56.259);--chart-1:oklch(86.9% .005 56.366);--chart-2:oklch(55.3% .013 58.071);--chart-3:oklch(44.4% .011 73.639);--chart-4:oklch(37.4% .01 67.558);--chart-5:oklch(26.8% .007 34.298);--radius:.625rem;--sidebar:oklch(98.5% .001 106.423);--sidebar-foreground:oklch(14.7% .004 49.25);--sidebar-primary:oklch(21.6% .006 56.043);--sidebar-primary-foreground:oklch(98.5% .001 106.423);--sidebar-accent:oklch(97% .001 106.424);--sidebar-accent-foreground:oklch(21.6% .006 56.043);--sidebar-border:oklch(92.3% .003 48.717);--sidebar-ring:oklch(70.9% .01 56.259)}.dark{--background:#1d1c1a;--foreground:#f3f1ed;--card:#292825;--card-foreground:#f3f1ed;--popover:#292825;--popover-foreground:#f3f1ed;--primary:#e7e5e4;--primary-foreground:#1d1c1a;--secondary:#393835;--secondary-foreground:#f3f1ed;--muted:#393835;--muted-foreground:#b6b1ab;--accent:#393835;--accent-foreground:#f3f1ed;--destructive:oklch(70.4% .191 22.216);--border:#44423f;--input:#44423f;--ring:#928c84;--chart-1:oklch(86.9% .005 56.366);--chart-2:oklch(55.3% .013 58.071);--chart-3:oklch(44.4% .011 73.639);--chart-4:oklch(37.4% .01 67.558);--chart-5:oklch(26.8% .007 34.298);--sidebar:#292825;--sidebar-foreground:#f3f1ed;--sidebar-primary:#e7e5e4;--sidebar-primary-foreground:#1d1c1a;--sidebar-accent:#393835;--sidebar-accent-foreground:#f3f1ed;--sidebar-border:#44423f;--sidebar-ring:#928c84}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@keyframes enter{0%{opacity:var(--tw-enter-opacity,1);transform:translate3d(var(--tw-enter-translate-x,0),var(--tw-enter-translate-y,0),0)scale3d(var(--tw-enter-scale,1),var(--tw-enter-scale,1),var(--tw-enter-scale,1))rotate(var(--tw-enter-rotate,0));filter:blur(var(--tw-enter-blur,0))}}@keyframes exit{to{opacity:var(--tw-exit-opacity,1);transform:translate3d(var(--tw-exit-translate-x,0),var(--tw-exit-translate-y,0),0)scale3d(var(--tw-exit-scale,1),var(--tw-exit-scale,1),var(--tw-exit-scale,1))rotate(var(--tw-exit-rotate,0));filter:blur(var(--tw-exit-blur,0))}}
@@ -0,0 +1 @@
1
+ import{r as e}from"./client.BeKNsjPN.js";import{Y as t,_t as n,gt as r,jt as i,vt as a}from"./common.DPoFQu44.js";var o={name:`search`,size:24,node:[[`path`,{d:`m21 21-4.34-4.34`,key:`14j7rj`}],[`circle`,{cx:`11`,cy:`11`,r:`8`,key:`4ej97u`}]]};o.node;var s=i(o);e();var c=r();function l({className:e,...t}){return(0,c.jsx)(`div`,{"data-slot":`input-group`,role:`group`,className:n(`group/input-group relative flex h-8 w-full min-w-0 items-center rounded-none border border-input transition-colors outline-none in-data-[slot=combobox-content]:focus-within:border-inherit in-data-[slot=combobox-content]:focus-within:ring-0 has-disabled:bg-input/50 has-disabled:opacity-50 has-[[data-slot=input-group-control]:focus-visible]:border-ring has-[[data-slot=input-group-control]:focus-visible]:ring-1 has-[[data-slot=input-group-control]:focus-visible]:ring-ring/50 has-[[data-slot][aria-invalid=true]]:border-destructive has-[[data-slot][aria-invalid=true]]:ring-1 has-[[data-slot][aria-invalid=true]]:ring-destructive/20 has-[>[data-align=block-end]]:h-auto has-[>[data-align=block-end]]:flex-col has-[>[data-align=block-start]]:h-auto has-[>[data-align=block-start]]:flex-col has-[>textarea]:h-auto dark:bg-input/30 dark:has-disabled:bg-input/80 dark:has-[[data-slot][aria-invalid=true]]:ring-destructive/40 has-[>[data-align=block-end]]:[&>input]:pt-3 has-[>[data-align=block-start]]:[&>input]:pb-3 has-[>[data-align=inline-end]]:[&>input]:pr-1.5 has-[>[data-align=inline-start]]:[&>input]:pl-1.5`,e),...t})}var u=a(`flex h-auto cursor-text items-center justify-center gap-2 py-1.5 text-xs font-medium text-muted-foreground select-none group-data-[disabled=true]/input-group:opacity-50 [&>kbd]:rounded-none [&>svg:not([class*='size-'])]:size-4`,{variants:{align:{"inline-start":`order-first pl-2 has-[>button]:ml-[-0.3rem] has-[>kbd]:ml-[-0.15rem]`,"inline-end":`order-last pr-2 has-[>button]:mr-[-0.3rem] has-[>kbd]:mr-[-0.15rem]`,"block-start":`order-first w-full justify-start px-2.5 pt-2 group-has-[>input]/input-group:pt-2 [.border-b]:pb-2`,"block-end":`order-last w-full justify-start px-2.5 pb-2 group-has-[>input]/input-group:pb-2 [.border-t]:pt-2`}},defaultVariants:{align:`inline-start`}});function d({className:e,align:t=`inline-start`,...r}){return(0,c.jsx)(`div`,{role:`group`,"data-slot":`input-group-addon`,"data-align":t,className:n(u({align:t}),e),onClick:e=>{e.target.closest(`button`)||e.currentTarget.parentElement?.querySelector(`input`)?.focus()},...r})}a(`flex items-center gap-2 text-xs shadow-none`,{variants:{size:{xs:`h-6 gap-1 rounded-none px-1.5 [&>svg:not([class*='size-'])]:size-3.5`,sm:`gap-1`,"icon-xs":`size-6 rounded-none p-0 has-[>svg]:p-0`,"icon-sm":`size-7 p-0 has-[>svg]:p-0`}},defaultVariants:{size:`xs`}});function f({className:e,...r}){return(0,c.jsx)(t,{"data-slot":`input-group-control`,className:n(`flex-1 rounded-none border-0 bg-transparent shadow-none ring-0 focus-visible:ring-0 disabled:bg-transparent aria-invalid:ring-0 dark:bg-transparent dark:disabled:bg-transparent`,e),...r})}export{s as i,d as n,f as r,l as t};
@@ -0,0 +1 @@
1
+ import{a as e,r as t}from"./client.BeKNsjPN.js";import{g as n,gt as r,ht as i,jt as a,m as o,p as s,r as c,s as l,u}from"./common.DPoFQu44.js";import{a as d,i as f,o as p,r as m}from"./index.astro_astro_type_script_index_0_lang.BEuO3H0E.js";var h={name:`key-round`,size:24,node:[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`,key:`1s6t7t`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`,key:`w0ekpg`}]]};h.node;var g=a(h),_=e(t(),1),v=r();function y({project:e,env:t,session:r}){let a=n(e,t),h=u(a+`/settings`),[y,b]=(0,_.useState)(),[x,S]=(0,_.useState)(``),[C,w]=(0,_.useState)(!1),T=(0,_.useRef)(void 0);(0,_.useEffect)(()=>()=>T.current?.abort(),[]);let E=async()=>{if(C||t!==`dev`||r.role===`viewer`)return;let e=new AbortController;T.current=e,w(!0),S(``),b(void 0);try{let t=await s(a+`/dev-token`,{},e.signal);e.signal.aborted||b(t)}catch(t){e.signal.aborted||S(o(t))}finally{e.signal.aborted||w(!1)}};return(0,v.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,v.jsx)(`h1`,{className:`page-title`,children:`SDK · Live`}),(0,v.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`One environment URL for browser, server and mobile clients. Use the generated API references from your application build.`}),(0,v.jsx)(l,{...h}),h.data&&(0,v.jsxs)(m,{children:[(0,v.jsx)(d,{children:(0,v.jsx)(p,{children:`Connect your application`})}),(0,v.jsxs)(f,{className:`space-y-4`,children:[(0,v.jsx)(`pre`,{className:`code-block`,children:`import { createClient } from '@auersperg/flare';\nimport { api } from './flare/_generated/api';\n\nconst client = createClient({\n url: '${h.data.url}',\n getToken: () => yourUserAccessToken,\n});\n\n// Use your generated query / mutation / action references.\n// Example: replace this path with your own query:\nconst stop = client.onUpdate(api.tasks.list, { limit: 50 },\n tasks => console.log(tasks));\n\n// On logout: client.refreshAuth().\n// On teardown: stop(); client.dispose();`}),(0,v.jsx)(`p`,{className:`text-muted-foreground`,children:`The task function is an illustrative name, not a requirement for other projects. Run your app locally to test live updates; this page opens no background subscription and does not write application data.`})]})]}),(0,v.jsxs)(m,{children:[(0,v.jsx)(d,{children:(0,v.jsx)(p,{children:t===`dev`?`Local developer session`:`Production authentication`})}),(0,v.jsxs)(f,{className:`space-y-4`,children:[(0,v.jsx)(`p`,{className:`text-muted-foreground`,children:t===`dev`?`A 15-minute identity for this project's development environment. Keep it in a git-ignored local file, never in a bundle or commit. Request a new token after expiry.`:`Use enabled built-in password authentication or a configured OIDC provider. Developer identities cannot access production; application handlers enforce record permissions.`}),t===`dev`&&r.role!==`viewer`&&(0,v.jsxs)(i,{variant:`outline`,onClick:E,disabled:C,children:[(0,v.jsx)(g,{}),C?`Requesting…`:`Get developer session`]}),x&&(0,v.jsx)(c,{children:x}),y&&(0,v.jsxs)(v.Fragment,{children:[(0,v.jsx)(`pre`,{className:`code-block`,children:JSON.stringify(y,null,2)}),(0,v.jsx)(i,{variant:`ghost`,onClick:()=>b(void 0),children:`Clear from view`})]})]})]})]})}export{y as default};
@@ -0,0 +1 @@
1
+ import{a as e,r as t}from"./client.BeKNsjPN.js";import{S as n,Y as r,_ as i,b as a,g as o,gt as s,h as c,ht as l,jt as u,m as d,n as f,o as p,p as m,s as h,u as g,v as _,x as v,y}from"./common.DPoFQu44.js";import{d as b,f as x,h as S,l as C,p as w,s as T,u as E}from"./index.astro_astro_type_script_index_0_lang.BEuO3H0E.js";import{n as D,r as O}from"./client.BUUZgEFj.js";var k={name:`trash`,size:24,node:[[`path`,{d:`M10 11v6`,key:`nco0om`}],[`path`,{d:`M14 11v6`,key:`outv1u`}],[`path`,{d:`M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6`,key:`miytrc`}],[`path`,{d:`M3 6h18`,key:`d0wm0j`}],[`path`,{d:`M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2`,key:`e791ji`}]],aliases:[`trash-2`]};k.node;var A=u(k),j=e(t(),1),M=s();function N({project:e,env:t,session:s}){let[c,u]=(0,j.useState)([null]),p=c.at(-1),b=o(e,t),x=g(b+`/files`+(p?`?cursor=`+encodeURIComponent(p):``)),C=(0,j.useRef)(null),[E,k]=(0,j.useState)(!1),[N,P]=(0,j.useState)(!1),[F,I]=(0,j.useState)(``),[L,R]=(0,j.useState)(``),z=s.role!==`viewer`;async function B(){let n=C.current?.files?.[0];if(!n)return;k(!0),I(``),R(``);let r=!1;try{let i=D(n);if(t===`prod`&&!confirm(`Upload to production ${e.name}?`))return;R(`Preparing upload…`),r=!0;let a=await m(b+`/file-upload`,{...i,...t===`prod`?{confirm:e.id}:{}});R(`Uploading ${n.name}…`),await O(a,n),C.current&&(C.current.value=``),P(!1),R(`Upload complete`)}catch(e){R(``),I(d(e)+(r?`. Check the refreshed list before retrying. Incomplete uploads expire automatically; they are not queue jobs.`:``))}finally{k(!1),r&&x.refresh()}}async function V(e){I(``);try{let t=await m(b+`/file-download?id=`+encodeURIComponent(e)),n=document.createElement(`a`);n.href=t.url,n.rel=`noreferrer`,n.click()}catch(e){I(d(e))}}async function H(n){if(confirm(`Permanently delete this ${t} file?`)){k(!0),I(``);try{await m(b+`/file-delete`,{id:n,...t===`prod`?{confirm:e.id}:{}}),x.refresh()}catch(e){I(d(e))}finally{k(!1)}}}return(0,M.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,M.jsx)(`h1`,{className:`page-title`,children:`Files`}),(0,M.jsx)(l,{variant:`ghost`,size:`icon-sm`,"aria-label":`Reload snapshot`,title:`Reload snapshot`,onClick:x.refresh,disabled:x.loading,children:(0,M.jsx)(w,{})})]}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Private R2 storage · streaming uploads · maximum 10 MiB · download links expire after 5 minutes. 50 files per page.`}),(0,M.jsx)(h,{loading:x.loading,error:F||x.error}),L&&(0,M.jsx)(`p`,{role:`status`,className:`text-xs text-muted-foreground`,children:L}),z&&(0,M.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,M.jsx)(r,{ref:C,type:`file`,className:`max-w-sm`,disabled:E,"aria-label":`Choose file to upload`,onChange:e=>P(!!e.target.files?.length)}),(0,M.jsx)(l,{onClick:B,disabled:E||!N,children:`Upload file`})]}),x.data?.page.length?(0,M.jsxs)(i,{children:[(0,M.jsx)(v,{children:(0,M.jsx)(n,{children:[`Name`,`Type`,`Size`,`State`,`Created`,`Actions`].map(e=>(0,M.jsx)(a,{children:e},e))})}),(0,M.jsx)(_,{children:x.data.page.map(e=>(0,M.jsxs)(n,{children:[(0,M.jsx)(y,{children:e.name}),(0,M.jsx)(y,{children:e.type}),(0,M.jsx)(y,{children:e.size>=1048576?`${(e.size/1048576).toFixed(1)} MiB`:e.size<1024?`${e.size} B`:`${(e.size/1024).toFixed(1)} KiB`}),(0,M.jsx)(y,{children:(0,M.jsx)(T,{status:e.state,children:e.state===`pending`?`Awaiting upload`:e.state===`uploading`?`Uploading / recovering`:e.state})}),(0,M.jsx)(y,{children:new Date(e.createdAt).toLocaleString()}),(0,M.jsx)(y,{children:(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(l,{size:`icon`,variant:`outline`,"aria-label":`Download ${e.name}`,disabled:e.state!==`ready`||E,onClick:()=>void V(e.id),children:(0,M.jsx)(S,{})}),z&&(0,M.jsx)(l,{size:`icon`,variant:`outline`,"aria-label":`Delete ${e.name}`,disabled:E,onClick:()=>void H(e.id),children:(0,M.jsx)(A,{})})]})})]},e.id))})]}):x.data&&(0,M.jsx)(f,{title:`No stored files`}),x.data&&(0,M.jsxs)(`div`,{className:`flex items-center justify-between gap-2`,children:[(0,M.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[`Page `,c.length,` · `,x.data.page.length,` files`]}),(0,M.jsxs)(`div`,{className:`flex gap-2`,children:[(0,M.jsx)(l,{variant:`outline`,disabled:x.loading||c.length===1,onClick:()=>u(e=>e.slice(0,-1)),children:`Previous`}),(0,M.jsx)(l,{variant:`outline`,disabled:x.loading||x.data.isDone,onClick:()=>{x.data?.continueCursor&&u(e=>[...e,x.data.continueCursor])},children:`Next`})]})]})]})}function P({project:e,env:t,session:r}){let s=o(e,t),u=g(s+`/jobs`),[S,D]=(0,j.useState)(``);async function O(n){if(t!==`prod`||confirm(`Pause production cron ${n}?`))try{await m(s+`/cron-cancel`,{name:n,...t===`prod`?{confirm:e.id}:{}}),u.refresh()}catch(e){D(d(e))}}async function k(n){if(t!==`prod`||confirm(`Cancel this pending production job?`)){D(``);try{(await m(s+`/job-cancel`,{id:n,...t===`prod`?{confirm:e.id}:{}})).cancelled||D(`This job is already enqueued; it cannot be cancelled here.`)}catch(e){D(d(e))}finally{u.refresh()}}}return(0,M.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,M.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,M.jsx)(`h1`,{className:`page-title`,children:`Schedules`}),(0,M.jsx)(l,{variant:`ghost`,size:`icon-sm`,"aria-label":`Reload snapshot`,title:`Reload snapshot`,onClick:u.refresh,disabled:u.loading,children:(0,M.jsx)(w,{})})]}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Durable scheduling → transactional outbox → Cloudflare Queues. At-least-once delivery; handlers must be idempotent. Times use UTC.`}),(0,M.jsx)(h,{loading:u.loading,error:u.error||S}),(0,M.jsxs)(C,{defaultValue:`scheduled`,children:[(0,M.jsxs)(b,{variant:`line`,children:[(0,M.jsx)(x,{value:`scheduled`,children:`Scheduled Functions`}),(0,M.jsx)(x,{value:`cron`,children:`Cron Jobs`})]}),(0,M.jsxs)(E,{value:`scheduled`,className:`space-y-4 pt-4`,children:[(0,M.jsx)(`h2`,{className:`section-title`,children:`Waiting to enqueue`}),u.data&&(u.data.pending.length?(0,M.jsxs)(i,{children:[(0,M.jsx)(v,{children:(0,M.jsx)(n,{children:[`Function`,`Due (UTC)`,`Job ID`,``].map((e,t)=>(0,M.jsx)(a,{children:e},t))})}),(0,M.jsx)(_,{children:u.data.pending.map(e=>(0,M.jsxs)(n,{children:[(0,M.jsx)(y,{className:`font-mono`,children:String(e.path)}),(0,M.jsx)(y,{children:new Date(Number(e.dueAt)).toISOString()}),(0,M.jsx)(y,{className:`font-mono`,children:String(e.id)}),(0,M.jsx)(y,{children:r.role!==`viewer`&&(0,M.jsx)(l,{variant:`outline`,disabled:u.loading,onClick:()=>void k(String(e.id)),children:`Cancel`})})]},String(e.id)))})]}):(0,M.jsx)(f,{title:`No delayed jobs`})),(0,M.jsx)(`h2`,{className:`section-title`,children:`Recent queue deliveries`}),u.data&&(u.data.recent.length?(0,M.jsx)(p,{rows:u.data.recent,columns:[`id`,`path`,`state`,`attempts`,`error`,`at`],renderCell:(e,t)=>e===`state`?(0,M.jsx)(T,{status:String(t)}):e===`at`&&typeof t==`number`?new Date(t).toLocaleString():c(t)}):(0,M.jsx)(f,{title:`No queue deliveries yet`}))]}),(0,M.jsxs)(E,{value:`cron`,className:`space-y-4 pt-4`,children:[u.data?.crons.length?(0,M.jsxs)(i,{children:[(0,M.jsx)(v,{children:(0,M.jsx)(n,{children:[`Name`,`Function`,`Cron (UTC)`,`State`,``].map((e,t)=>(0,M.jsx)(a,{children:e},t))})}),(0,M.jsx)(_,{children:u.data.crons.map(e=>(0,M.jsxs)(n,{children:[(0,M.jsx)(y,{children:e.name}),(0,M.jsx)(y,{className:`font-mono`,children:e.path}),(0,M.jsx)(y,{className:`font-mono`,children:e.cron}),(0,M.jsx)(y,{children:(0,M.jsx)(T,{status:e.enabled?`Enabled`:`Paused`})}),(0,M.jsx)(y,{children:r.role!==`viewer`&&e.enabled&&(0,M.jsx)(l,{variant:`outline`,onClick:()=>void O(e.name),children:`Pause`})})]},e.name))})]}):u.data&&(0,M.jsx)(f,{title:`No cron jobs`}),(0,M.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Define schedules through an application action using ctx.schedules.set(). Five-field cron expressions, minimum one minute, maximum 20 per environment. No permanent frontend timers.`})]})]})]})}export{N as FilesView,P as SchedulesView};
@@ -0,0 +1,3 @@
1
+ import{a as e,r as t}from"./client.BeKNsjPN.js";import{M as n,N as r,S as i,Y as a,_ as o,a as s,b as c,g as l,gt as u,ht as d,j as f,k as p,m,p as h,r as g,s as _,u as v,v as y,x as b,y as x}from"./common.DPoFQu44.js";import{a as S,i as C,o as w,r as T,s as E}from"./index.astro_astro_type_script_index_0_lang.BEuO3H0E.js";var D=e(t(),1),O=u();function k(e){let[t,n]=(0,D.useState)(!1);return(0,O.jsxs)(T,{children:[(0,O.jsx)(S,{children:(0,O.jsx)(w,{children:`Backups`})}),(0,O.jsxs)(C,{className:`space-y-3`,children:[(0,O.jsx)(`p`,{className:`text-muted-foreground`,children:`On-demand data, user accounts, files and backend code snapshots. Restore only into an empty environment. Sessions, secrets and schedules are not copied. No background polling.`}),(0,O.jsx)(d,{variant:`outline`,onClick:()=>n(!t),children:t?`Close backups`:`Manage backups`}),t&&(0,O.jsx)(A,{...e})]})]})}function A(e){let[t,n]=(0,D.useState)(e.env),[r,a]=(0,D.useState)(null),[u,f]=(0,D.useState)(),p=l(e.project,t),m=l(e.project,e.env),g=v(p+`/backups`+(r?`?cursor=${encodeURIComponent(r)}`:``)),S=v(m+`/backup-status`),C=e.session.role===`owner`,w=(t,n,r,i)=>f({title:t,description:n,productionId:e.project.id,submit:async()=>{await h(r,{...i,confirm:e.project.id}),g.refresh(),S.refresh()}});return(0,O.jsxs)(`div`,{className:`space-y-3`,children:[(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Limits: 10,000 documents / 4 MiB data; 100 files / 100 MiB. Pause cron and drain jobs before creating a backup. Partial restores stay closed; retry the same backup ID.`}),S.data?.status===`restoring`&&(0,O.jsxs)(`p`,{role:`alert`,children:[(0,O.jsx)(E,{status:`restoring`,children:`Restore in progress`}),`:`,` `,S.data.id,`. Select its source environment and retry Restore to finish.`]}),(0,O.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[[`dev`,`prod`].map(e=>(0,O.jsxs)(d,{variant:t===e?`secondary`:`outline`,onClick:()=>{n(e),a(null)},children:[e===`dev`?`Development`:`Production`,` backups`]},e)),C&&(0,O.jsxs)(d,{onClick:()=>{let t=crypto.randomUUID();w(`Create backup`,`Snapshot ${e.env}. Backup ID: ${t}. No data will be deleted.`,m+`/backup-create`,{id:t})},children:[`Create `,e.env,` backup`]})]}),(0,O.jsx)(_,{loading:g.loading||S.loading,error:g.error||S.error}),g.data&&(0,O.jsxs)(o,{children:[(0,O.jsx)(b,{children:(0,O.jsxs)(i,{children:[(0,O.jsx)(c,{children:`Created`}),(0,O.jsx)(c,{children:`Backup / release`}),(0,O.jsx)(c,{children:`Documents`}),(0,O.jsx)(c,{children:`Files`}),(0,O.jsx)(c,{children:`Actions`})]})}),(0,O.jsxs)(y,{children:[g.data.page.map(n=>(0,O.jsxs)(i,{children:[(0,O.jsx)(x,{children:n.at?new Date(n.at).toLocaleString():(0,O.jsx)(E,{status:`Incomplete`})}),(0,O.jsxs)(x,{children:[(0,O.jsx)(`code`,{className:`text-xs select-all`,children:n.id}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:n.hash?.slice(0,12)??`Not restorable`})]}),(0,O.jsx)(x,{children:n.rows??`—`}),(0,O.jsx)(x,{children:n.files??`—`}),(0,O.jsx)(x,{children:(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[C&&t!==e.env&&n.hash&&(0,O.jsxs)(d,{variant:`outline`,size:`sm`,onClick:()=>w(`Restore backup`,`Restore ${n.id} from ${t} into empty ${e.env}. Existing data will never be overwritten. Origin/auth settings stay unchanged.`,m+`/backup-restore`,{id:n.id,sourceEnv:t}),children:[`Restore into `,e.env]}),C&&(0,O.jsx)(d,{variant:`outline`,size:`sm`,onClick:()=>w(`Delete backup`,`Permanently delete snapshot ${n.id}. Live application data is not affected. Do not delete a backup needed by an unfinished restore.`,p+`/backup-delete`,{id:n.id}),children:`Delete`})]})})]},n.id)),!g.data.page.length&&(0,O.jsx)(i,{children:(0,O.jsx)(x,{colSpan:5,children:`No backups.`})})]})]}),(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsx)(d,{variant:`outline`,disabled:!r,onClick:()=>a(null),children:`First page`}),(0,O.jsx)(d,{variant:`outline`,disabled:!g.data?.cursor,onClick:()=>a(g.data?.cursor??null),children:`Next page`})]}),u&&(0,O.jsx)(s,{modal:u,onClose:()=>f(void 0)})]})}function j({onDeleted:e,...t}){let n=l(t.project,t.env),r=v(n+`/settings`);return(0,O.jsxs)(`div`,{className:`space-y-4 p-4`,children:[(0,O.jsx)(`h1`,{className:`page-title`,children:`Settings`}),(0,O.jsx)(`p`,{className:`text-xs text-muted-foreground`,children:`Environment identity and frontend permissions.`}),(0,O.jsx)(_,{...r}),r.data&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(N,{...t,settings:r.data,refresh:r.refresh}),(0,O.jsx)(k,{...t})]}),t.session.role===`owner`&&(0,O.jsx)(M,{...t,onDeleted:e})]})}function M({project:e,onDeleted:t}){let[r,i]=(0,D.useState)();return(0,O.jsxs)(O.Fragment,{children:[(0,O.jsxs)(T,{children:[(0,O.jsx)(S,{children:(0,O.jsx)(w,{children:`Delete project`})}),(0,O.jsxs)(C,{className:`space-y-3`,children:[(0,O.jsx)(`p`,{className:`text-muted-foreground`,children:`Permanently delete both development and production: data, users, files, releases, backups and schedules. This cannot be undone.`}),e.deleting?(0,O.jsx)(`p`,{role:`alert`,children:`Deletion was started. Retry to finish cleanup.`}):null,(0,O.jsx)(d,{variant:`destructive`,onClick:()=>i({title:`Delete project`,description:`Delete ${e.name} and both environments permanently? The short URL stays reserved; other projects are not affected.`,destructive:!0,submitLabel:`Delete project`,content:(0,O.jsxs)(p,{children:[(0,O.jsxs)(n,{htmlFor:`delete-project-name`,children:[`Type the project name: `,e.name]}),(0,O.jsx)(a,{id:`delete-project-name`,name:`name`,required:!0,autoComplete:`off`,maxLength:100})]}),submit:async n=>{let r=new FormData(n).get(`name`);if(r!==e.name)throw Error(`Project name does not match`);try{await h(`projects/${e.id}/delete`,{name:r,confirm:e.id})}catch(t){if(m(t)!==`NOT_FOUND`||(await h(`projects`)).some(t=>t.id===e.id))throw t}t()}}),children:`Delete project`})]})]}),r&&(0,O.jsx)(s,{modal:r,onClose:()=>i(void 0)})]})}function N({project:e,env:t,session:i,settings:o,refresh:c}){let u=l(e,t),_=i.role!==`viewer`,[v,y]=(0,D.useState)(),[b,x]=(0,D.useState)(``),[E,k]=(0,D.useState)(``),[A,j]=(0,D.useState)(!1),M=async e=>{if(!A){j(!0),k(``);try{await e()}catch(e){k(m(e))}finally{j(!1)}}},N=(n,r,i)=>y({title:n,description:r,productionId:t===`prod`?e.id:void 0,submit:async e=>i(t===`prod`?String(new FormData(e).get(`confirm`)):void 0)});return(0,O.jsxs)(O.Fragment,{children:[E&&(0,O.jsx)(g,{children:E}),(0,O.jsxs)(T,{children:[(0,O.jsx)(S,{children:(0,O.jsx)(w,{children:`Cloud URL`})}),(0,O.jsxs)(C,{className:`space-y-3`,children:[(0,O.jsx)(`code`,{className:`block select-all break-all`,children:o.url}),(0,O.jsx)(`p`,{className:`text-muted-foreground`,children:`Permanent project name. Existing UUID URLs remain valid.`}),!o.alias&&i.role===`owner`&&(0,O.jsxs)(`form`,{className:`flex gap-2`,onSubmit:t=>{t.preventDefault();let n=new FormData(t.currentTarget).get(`alias`);M(async()=>{await h(`projects/${e.id}/alias`,{alias:n}),c()})},children:[(0,O.jsx)(a,{name:`alias`,"aria-label":`Short URL name`,required:!0,maxLength:48,pattern:`[a-z][a-z0-9]*(?:-[a-z0-9]+)*`,placeholder:`crm`}),(0,O.jsx)(d,{type:`submit`,disabled:A,children:`Set short URL`})]})]})]}),(0,O.jsxs)(T,{children:[(0,O.jsx)(S,{children:(0,O.jsx)(w,{children:`Environment access`})}),(0,O.jsx)(C,{children:(0,O.jsx)(`form`,{className:`max-w-xl`,onSubmit:e=>{if(e.preventDefault(),!_)return;let t=new FormData(e.currentTarget),n={origins:String(t.get(`origins`)).split(`
2
+ `).map(e=>e.trim()).filter(Boolean),oidc:[`issuer`,`audience`,`jwks`].some(e=>String(t.get(e)).trim())?Object.fromEntries([`issuer`,`audience`,`jwks`].map(e=>[e,String(t.get(e)).trim()])):null};N(`Save environment`,`Updates frontend origins and user token verification. Existing applications continue to use this environment.`,async e=>{await h(u+`/settings`,{...n,confirm:e}),c()})},children:(0,O.jsxs)(f,{children:[(0,O.jsxs)(p,{children:[(0,O.jsx)(n,{htmlFor:`settings-origins`,children:`Frontend origins · one per line`}),(0,O.jsx)(r,{id:`settings-origins`,name:`origins`,defaultValue:o.origins.join(`
3
+ `),disabled:!_})]}),(0,O.jsx)(`h3`,{className:`text-sm font-medium`,children:`Authentication · OIDC / RS256`}),(0,O.jsxs)(p,{children:[(0,O.jsx)(n,{htmlFor:`settings-issuer`,children:`Issuer`}),(0,O.jsx)(a,{id:`settings-issuer`,type:`url`,name:`issuer`,defaultValue:o.oidc?.issuer??``,disabled:!_,placeholder:`https://your-provider.example`})]}),(0,O.jsxs)(p,{children:[(0,O.jsx)(n,{htmlFor:`settings-audience`,children:`Audience`}),(0,O.jsx)(a,{id:`settings-audience`,name:`audience`,defaultValue:o.oidc?.audience??``,disabled:!_})]}),(0,O.jsxs)(p,{children:[(0,O.jsx)(n,{htmlFor:`settings-jwks`,children:`JWKS URL`}),(0,O.jsx)(a,{id:`settings-jwks`,type:`url`,name:`jwks`,defaultValue:o.oidc?.jwks??``,disabled:!_,placeholder:`https://your-provider.example/.well-known/jwks.json`})]}),(0,O.jsx)(`p`,{className:`text-muted-foreground`,children:`Leave all three empty to disable OIDC. Protected production functions remain closed.`}),_&&(0,O.jsx)(d,{type:`submit`,children:`Save environment`})]})})})]}),(0,O.jsxs)(T,{children:[(0,O.jsx)(S,{children:(0,O.jsx)(w,{children:`CLI access`})}),(0,O.jsxs)(C,{className:`space-y-4`,children:[(0,O.jsx)(`p`,{children:`Project-scoped deploy credential, valid for 30 days. Never put it in frontend code. Keep it in your shell or CI secret store.`}),i.role===`owner`&&(0,O.jsxs)(`div`,{className:`flex gap-2`,children:[(0,O.jsx)(d,{variant:`outline`,onClick:()=>N(`Issue CLI credential`,`The token is shown once. It grants deployment rights only for this project.`,async t=>{let n=await h(u+`/credential`,{confirm:t});x(`export FLARE_DEPLOY_TOKEN=${n.token}\nflare link --platform ${n.platform} --project ${e.id}\nflare deploy --env dev --release ./release`)}),children:`Issue credential`}),(0,O.jsx)(d,{variant:`destructive`,onClick:()=>N(`Revoke project credentials`,`All existing CLI credentials for this project will stop working.`,async e=>{await h(u+`/revoke-credentials`,{confirm:e}),x(`Credentials revoked.`)}),children:`Revoke credentials`})]}),b&&(0,O.jsxs)(O.Fragment,{children:[(0,O.jsx)(`pre`,{className:`code-block`,children:b}),(0,O.jsx)(d,{variant:`ghost`,onClick:()=>x(``),children:`Clear from view`})]})]})]}),v&&(0,O.jsx)(s,{modal:v,onClose:()=>y(void 0)})]})}export{j as default};
@@ -0,0 +1,3 @@
1
+ /_astro/*
2
+ Cache-Control: public, max-age=31536000, immutable
3
+ X-Content-Type-Options: nosniff
@@ -0,0 +1,263 @@
1
+ // packages/flare/dist/sdk/protocol.js
2
+ var LIMITS = Object.freeze({
3
+ inputBytes: 65536,
4
+ outputBytes: 262144,
5
+ frameBytes: 8192,
6
+ subscriptions: 64,
7
+ fileBytes: 10485760
8
+ });
9
+
10
+ class FlareError extends Error {
11
+ code;
12
+ ambiguous;
13
+ constructor(code, message, ambiguous = false) {
14
+ super(message);
15
+ this.code = code;
16
+ this.ambiguous = ambiguous;
17
+ this.name = "FlareError";
18
+ }
19
+ }
20
+ function errorCode(error) {
21
+ if (error instanceof Error && ["FlareError", "FlaredError"].includes(error.name)) {
22
+ const code = error.code;
23
+ if (typeof code === "string" && /^[A-Z][A-Z0-9_]{0,63}$/.test(code))
24
+ return code;
25
+ }
26
+ return "OPERATION_FAILED";
27
+ }
28
+ function assertPath(path) {
29
+ if (path.length > 256 || !/^[A-Za-z][A-Za-z0-9_]*(\/[A-Za-z][A-Za-z0-9_]*)*$/.test(path) || path.split("/").some((p) => ["__proto__", "prototype", "constructor"].includes(p))) {
30
+ throw new FlareError("INVALID_PATH", "Invalid function path");
31
+ }
32
+ }
33
+ function stableJson(value) {
34
+ const ancestors = new Set;
35
+ function visit(v, depth) {
36
+ if (depth > 40)
37
+ throw new FlareError("INVALID_JSON", "JSON nesting limit exceeded");
38
+ if (v === null || typeof v === "string" || typeof v === "boolean")
39
+ return v;
40
+ if (typeof v === "number" && Number.isFinite(v))
41
+ return v;
42
+ if (typeof v !== "object" || v === null || ancestors.has(v))
43
+ throw new FlareError("INVALID_JSON", "Expected lossless JSON");
44
+ if (!Array.isArray(v) && Object.getPrototypeOf(v) !== Object.prototype && Object.getPrototypeOf(v) !== null) {
45
+ throw new FlareError("INVALID_JSON", "Expected plain JSON object");
46
+ }
47
+ if (Object.getOwnPropertySymbols(v).length)
48
+ throw new FlareError("INVALID_JSON", "Symbol keys are unsupported");
49
+ ancestors.add(v);
50
+ let result;
51
+ if (Array.isArray(v)) {
52
+ result = Array.from(v, (item) => visit(item, depth + 1));
53
+ } else {
54
+ const out = Object.create(null);
55
+ for (const key of Object.keys(v).sort()) {
56
+ const descriptor = Object.getOwnPropertyDescriptor(v, key);
57
+ if (!("value" in descriptor))
58
+ throw new FlareError("INVALID_JSON", "Getters are unsupported");
59
+ out[key] = visit(descriptor.value, depth + 1);
60
+ }
61
+ result = out;
62
+ }
63
+ ancestors.delete(v);
64
+ return result;
65
+ }
66
+ return JSON.stringify(visit(value, 0));
67
+ }
68
+ function boundedJson(value, maxBytes) {
69
+ const json = stableJson(value);
70
+ if (new TextEncoder().encode(json).byteLength > maxBytes)
71
+ throw new FlareError("TOO_LARGE", "JSON payload exceeds limit");
72
+ return json;
73
+ }
74
+
75
+ // packages/flare/dist/sdk/schema.js
76
+ function identifier(name) {
77
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{0,47}$/.test(name) || name.toLowerCase().startsWith("sqlite_"))
78
+ throw new FlareError("INVALID_SCHEMA", "Invalid table, index or field name");
79
+ return name;
80
+ }
81
+ function schemaContract(schema) {
82
+ const out = Object.create(null);
83
+ if (Object.keys(schema).length > 100)
84
+ throw new FlareError("INVALID_SCHEMA", "Maximum 100 tables");
85
+ for (const [name, table] of Object.entries(schema)) {
86
+ identifier(name);
87
+ const document = table.validator["~standard"].jsonSchema.output({
88
+ target: "draft-2020-12"
89
+ });
90
+ out[name] = { document, indexes: table.indexes };
91
+ }
92
+ assertSchemaContract(out);
93
+ return out;
94
+ }
95
+ function assertSchemaContract(contract) {
96
+ boundedJson(contract, 1048576);
97
+ if (!contract || Array.isArray(contract) || typeof contract !== "object" || Object.keys(contract).length > 100)
98
+ throw new FlareError("INVALID_SCHEMA", "Invalid schema");
99
+ const names = new Set;
100
+ for (const [name, table] of Object.entries(contract)) {
101
+ if (names.has(name.toLowerCase()))
102
+ throw new FlareError("INVALID_SCHEMA", "SQLite table names are case-insensitive");
103
+ names.add(name.toLowerCase());
104
+ identifier(name);
105
+ const doc = table?.document;
106
+ if (!doc || doc.type !== "object" || !doc.properties || doc.additionalProperties !== false)
107
+ throw new FlareError("INVALID_SCHEMA", "Tables require a closed object validator");
108
+ for (const field of Object.keys(doc.properties))
109
+ identifier(field);
110
+ if (Object.keys(doc.properties).length > 64 || !table.indexes || Object.keys(table.indexes).length > 20)
111
+ throw new FlareError("INVALID_SCHEMA", "Schema exceeds limits");
112
+ const indexes = new Set;
113
+ for (const [index, fields] of Object.entries(table.indexes)) {
114
+ if (indexes.has(index.toLowerCase()))
115
+ throw new FlareError("INVALID_SCHEMA", "SQLite index names are case-insensitive");
116
+ indexes.add(index.toLowerCase());
117
+ identifier(index);
118
+ if (!Array.isArray(fields) || fields.length < 1 || fields.length > 4 || new Set(fields).size !== fields.length)
119
+ throw new FlareError("INVALID_SCHEMA", "Invalid index fields");
120
+ for (const field of fields) {
121
+ identifier(field);
122
+ const p = doc.properties[field];
123
+ const scalar = (s) => Array.isArray(s?.type) && s.type.every((type) => ["string", "number", "integer", "boolean", "null"].includes(type)) || ["string", "number", "integer", "boolean", "null"].includes(s?.type) || Array.isArray(s?.anyOf) && s.anyOf.every(scalar);
124
+ if (!p || !scalar(p))
125
+ throw new FlareError("INVALID_SCHEMA", "Indexes require declared scalar fields");
126
+ }
127
+ }
128
+ }
129
+ }
130
+ var documents = new WeakMap;
131
+
132
+ // packages/flare/dist/sdk/server.js
133
+ function declare(kind) {
134
+ return (options) => Object.freeze({ ...options, kind, auth: options.auth ?? "required" });
135
+ }
136
+ var query = declare("query");
137
+ var mutation = declare("mutation");
138
+ var action = declare("action");
139
+ function defineApp(options) {
140
+ flatten(options.functions);
141
+ schemaContract(options.schema);
142
+ return Object.freeze(options);
143
+ }
144
+ function flatten(tree) {
145
+ const out = Object.create(null);
146
+ const ancestors = new Set;
147
+ function walk(node, prefix, depth) {
148
+ if (depth > 20 || ancestors.has(node))
149
+ throw new FlareError("INVALID_CONTRACT", "Invalid function tree");
150
+ ancestors.add(node);
151
+ for (const [name, value] of Object.entries(node)) {
152
+ const path = prefix ? `${prefix}/${name}` : name;
153
+ assertPath(path);
154
+ if (value && typeof value === "object" && "handler" in value && typeof value.handler === "function") {
155
+ const definition = value;
156
+ if (!["query", "mutation", "action"].includes(definition.kind))
157
+ throw new FlareError("INVALID_CONTRACT", "Invalid function kind");
158
+ if (out[path])
159
+ throw new FlareError("INVALID_CONTRACT", "Duplicate function path");
160
+ out[path] = definition;
161
+ } else if (value && typeof value === "object")
162
+ walk(value, path, depth + 1);
163
+ else
164
+ throw new FlareError("INVALID_CONTRACT", "Invalid function definition");
165
+ }
166
+ ancestors.delete(node);
167
+ }
168
+ walk(tree, "", 0);
169
+ return out;
170
+ }
171
+ async function validate(validator, value, output = false) {
172
+ boundedJson(value, output ? LIMITS.outputBytes : LIMITS.inputBytes);
173
+ const result = await validator["~standard"].validate(value);
174
+ if (result.issues)
175
+ throw new FlareError(output ? "INVALID_OUTPUT" : "INVALID_INPUT", output ? "Function returned invalid data" : "Arguments failed validation");
176
+ boundedJson(result.value, output ? LIMITS.outputBytes : LIMITS.inputBytes);
177
+ return result.value;
178
+ }
179
+
180
+ // packages/core/bootstrap/app.ts
181
+ var app_default = defineApp({ schema: {}, functions: {} });
182
+
183
+ // packages/flare/dist/sdk/cloudflare.js
184
+ import { DurableObject, WorkerEntrypoint } from "cloudflare:workers";
185
+ function authorize(mode, auth, internal = false) {
186
+ if (mode === "internal" && !internal)
187
+ throw new FlareError("UNAUTHORIZED", "Internal function");
188
+ if (auth && (!auth.subject || !auth.issuer || !Number.isFinite(auth.expiresAt) || auth.expiresAt <= Date.now()))
189
+ throw new FlareError("AUTH_EXPIRED", "Authorization expired");
190
+ if (mode === "required" && !auth)
191
+ throw new FlareError("UNAUTHORIZED", "Authentication required");
192
+ }
193
+ async function rpcData(response) {
194
+ const result = await response;
195
+ try {
196
+ const value = structuredClone(result);
197
+ boundedJson(value, LIMITS.outputBytes);
198
+ return value;
199
+ } finally {
200
+ if (result && typeof result === "object") {
201
+ const dispose = result[Symbol.dispose];
202
+ dispose?.call(result);
203
+ }
204
+ }
205
+ }
206
+ function createAction(app) {
207
+ const functions = flatten(app.functions);
208
+ return class Action extends WorkerEntrypoint {
209
+ async invoke(call) {
210
+ try {
211
+ return { ok: true, value: await this.execute(call) };
212
+ } catch (e) {
213
+ return {
214
+ ok: false,
215
+ code: errorCode(e)
216
+ };
217
+ }
218
+ }
219
+ async execute(call) {
220
+ const fn = functions[call.path];
221
+ if (!fn || fn.kind !== "action" || call.kind !== "action")
222
+ throw new FlareError("FUNCTION_NOT_FOUND", "Action not found");
223
+ authorize(fn.auth, call.auth, call.internal);
224
+ const args = await validate(fn.input, call.args);
225
+ const capability = this.env.CAPABILITY;
226
+ const context = {
227
+ auth: call.auth,
228
+ schedules: {
229
+ set: (input) => rpcData(capability.scheduleCommand("set", input)),
230
+ cancel: (name) => rpcData(capability.scheduleCommand("cancel", { name })),
231
+ list: () => rpcData(capability.scheduleCommand("list", {}))
232
+ },
233
+ runQuery: (ref, input) => {
234
+ if (ref.kind !== "query")
235
+ throw new FlareError("INVALID_KIND", "Expected query");
236
+ return rpcData(capability.runQuery(ref.path, input, call.auth));
237
+ },
238
+ runMutation: (ref, input) => {
239
+ if (ref.kind !== "mutation")
240
+ throw new FlareError("INVALID_KIND", "Expected mutation");
241
+ return rpcData(capability.runMutation(ref.path, input, call.auth));
242
+ },
243
+ secrets: { get: (name) => capability.secret(name) },
244
+ files: {
245
+ upload: (body, type, options) => capability.upload(body, type, options),
246
+ download: (id) => capability.download(id),
247
+ generateUploadUrl: (input) => rpcData(capability.fileCommand("reserve", input)),
248
+ getDownloadUrl: (id) => rpcData(capability.fileCommand("download", { id })),
249
+ delete: (id) => rpcData(capability.fileCommand("delete", { id })),
250
+ list: (input = {}) => rpcData(capability.fileCommand("list", input))
251
+ }
252
+ };
253
+ return validate(fn.output, await fn.handler(context, args), true);
254
+ }
255
+ };
256
+ }
257
+
258
+ // packages/core/bootstrap/action-entry.ts
259
+ class Action extends createAction(app_default) {
260
+ }
261
+ export {
262
+ Action
263
+ };
@@ -0,0 +1,5 @@
1
+ import {reference} from "@auersperg/flare";
2
+
3
+ export const api = {
4
+
5
+ } as const;