ncc-client-poc 0.2.3 → 0.2.4
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.
- package/dist/assets/index-CE9FA4Ft.js +13 -0
- package/dist/assets/index-ucbw7S_h.css +1 -0
- package/dist/assets/{vendor-ncc-CFk2iOfs.js → vendor-ncc-D-DciiNq.js} +1 -1
- package/dist/assets/{vendor-utils-D1mPQilD.js → vendor-utils-CRRb5Bby.js} +32 -37
- package/dist/index.html +4 -4
- package/package.json +3 -2
- package/dist/assets/index-CeygT8uu.js +0 -13
- package/dist/assets/index-giy-CrS7.css +0 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/pure-ei6B17Q0.js","assets/vendor-nostr-tools-gLyVtdq-.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{r,a as bt,R as ht}from"./vendor-react-KfUPlHYY.js";import{S as Ge,n as ee,f as Le,g as fe,a as de,b as gt}from"./vendor-nostr-tools-gLyVtdq-.js";import{N as ft,a as yt,b as vt,p as Xe,c as Nt,i as jt,d as wt,e as kt}from"./vendor-ncc-D-DciiNq.js";import{W as St,C as Be,K as Ct,E as _t,Q as Et,R as ye,N as Pt,A as Ye,S as Pe,c as Y,B as Rt,L as Ze,a as et,b as It,d as Tt,e as Lt,f as Ot,U as At,g as tt,X as Dt,h as $t,P as He,i as Kt,j as st,k as Mt,T as nt,l as Wt,m as Ft,n as Ut,G as Jt,o as qt}from"./vendor-utils-CRRb5Bby.js";(function(){const s=document.createElement("link").relList;if(s&&s.supports&&s.supports("modulepreload"))return;for(const p of document.querySelectorAll('link[rel="modulepreload"]'))y(p);new MutationObserver(p=>{for(const h of p)if(h.type==="childList")for(const i of h.addedNodes)i.tagName==="LINK"&&i.rel==="modulepreload"&&y(i)}).observe(document,{childList:!0,subtree:!0});function E(p){const h={};return p.integrity&&(h.integrity=p.integrity),p.referrerPolicy&&(h.referrerPolicy=p.referrerPolicy),p.crossOrigin==="use-credentials"?h.credentials="include":p.crossOrigin==="anonymous"?h.credentials="omit":h.credentials="same-origin",h}function y(p){if(p.ep)return;p.ep=!0;const h=E(p);fetch(p.href,h)}})();var at={exports:{}},Oe={};/**
|
|
3
|
+
* @license React
|
|
4
|
+
* react-jsx-runtime.production.min.js
|
|
5
|
+
*
|
|
6
|
+
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
7
|
+
*
|
|
8
|
+
* This source code is licensed under the MIT license found in the
|
|
9
|
+
* LICENSE file in the root directory of this source tree.
|
|
10
|
+
*/var Bt=r,Ht=Symbol.for("react.element"),zt=Symbol.for("react.fragment"),Vt=Object.prototype.hasOwnProperty,Qt=Bt.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,Gt={key:!0,ref:!0,__self:!0,__source:!0};function rt(a,s,E){var y,p={},h=null,i=null;E!==void 0&&(h=""+E),s.key!==void 0&&(h=""+s.key),s.ref!==void 0&&(i=s.ref);for(y in s)Vt.call(s,y)&&!Gt.hasOwnProperty(y)&&(p[y]=s[y]);if(a&&a.defaultProps)for(y in s=a.defaultProps,s)p[y]===void 0&&(p[y]=s[y]);return{$$typeof:Ht,type:a,key:h,ref:i,props:p,_owner:Qt.current}}Oe.Fragment=zt;Oe.jsx=rt;Oe.jsxs=rt;at.exports=Oe;var e=at.exports,Me={},ze=bt;Me.createRoot=ze.createRoot,Me.hydrateRoot=ze.hydrateRoot;const xe=new Ge,ct=r.createContext(void 0);function Xt({children:a}){const[s,E]=r.useState({pubkey:localStorage.getItem("ncc_pubkey"),privkey:sessionStorage.getItem("ncc_privkey"),method:localStorage.getItem("ncc_method")||null,isLoading:!1,bunkerPubkey:localStorage.getItem("ncc_bunker_pubkey"),bunkerRelay:localStorage.getItem("ncc_bunker_relay"),clientSecretKey:sessionStorage.getItem("ncc_client_secret")}),y=c=>{var u;return Uint8Array.from(((u=c.match(/.{1,2}/g))==null?void 0:u.map(g=>parseInt(g,16)))||[])},p=async()=>{E(c=>({...c,isLoading:!0}));try{let c=0;for(;typeof window.nostr>"u"&&c<10;)await new Promise(g=>setTimeout(g,100)),c++;if(typeof window.nostr>"u"){alert("Nostr extension not found!"),E(g=>({...g,isLoading:!1}));return}const u=await window.nostr.getPublicKey();E({pubkey:u,privkey:null,method:"nip07",isLoading:!1}),x("nip07",u,null)}catch(c){console.error("NIP-07 Login Error:",c),alert("Login failed: "+(c.message||"Unknown error")),E(u=>({...u,isLoading:!1}))}},h=c=>{try{let u=c,g;if(c.startsWith("nsec")){const{data:T}=de.decode(c);g=T,u=Array.from(g).map(P=>P.toString(16).padStart(2,"0")).join("")}else u=c,g=y(u);const l=fe(g);E({pubkey:l,privkey:u,method:"nsec",isLoading:!1}),x("nsec",l,u)}catch{alert("Invalid Private Key")}},i=c=>{try{let u=c;if(c.startsWith("npub")){const{data:g}=de.decode(c);u=g}E({pubkey:u,privkey:null,method:"readonly",isLoading:!1}),x("readonly",u,null)}catch{alert("Invalid Public Key")}},C=(c,u,g)=>{E(l=>({...l,pubkey:c,method:"nip46",bunkerPubkey:c,bunkerRelay:u,clientSecretKey:g,isLoading:!1})),x("nip46",c,null,{bunkerPubkey:c,bunkerRelay:u,clientSecret:g})},v=async c=>{if(s.method==="nsec"&&s.privkey)return Le(c,y(s.privkey));if(s.method==="nip07"&&window.nostr)return window.nostr.signEvent(c);if(s.method==="nip46"&&s.bunkerPubkey&&s.bunkerRelay&&s.clientSecretKey){const u=y(s.clientSecretKey),g=Math.random().toString(36).substring(7),l={id:g,method:"sign_event",params:[JSON.stringify(c)]},T=ee.getConversationKey(u,s.bunkerPubkey),P=ee.encrypt(JSON.stringify(l),T),O=Le({kind:24133,created_at:Math.floor(Date.now()/1e3),tags:[["p",s.bunkerPubkey]],content:P},u);return await xe.publish([s.bunkerRelay],O),new Promise((_,D)=>{const n=xe.subscribeMany([s.bunkerRelay],[{kinds:[24133],"#p":[fe(u)],authors:[s.bunkerPubkey]}],{onevent(S){try{const I=ee.decrypt(S.content,T),L=JSON.parse(I);L.id===g&&(n.close(),L.result?_(JSON.parse(L.result)):D(new Error(L.error||"Remote signing failed")))}catch{}}});setTimeout(()=>{n.close(),D(new Error("Remote signing timed out"))},3e4)})}throw new Error("No signing method available")},N=async(c,u)=>{var g;if(s.method==="nsec"&&s.privkey){const l=ee.getConversationKey(y(s.privkey),c);return ee.encrypt(u,l)}if(s.method==="nip07"&&((g=window.nostr)!=null&&g.nip44))return window.nostr.nip44.encrypt(c,u);if(s.method==="nip46"&&s.bunkerPubkey&&s.bunkerRelay&&s.clientSecretKey){const l=y(s.clientSecretKey),T=Math.random().toString(36).substring(7),P={id:T,method:"nip44_encrypt",params:[c,u]},O=ee.getConversationKey(l,s.bunkerPubkey),_=ee.encrypt(JSON.stringify(P),O),D=Le({kind:24133,created_at:Math.floor(Date.now()/1e3),tags:[["p",s.bunkerPubkey]],content:_},l);return await xe.publish([s.bunkerRelay],D),new Promise((n,S)=>{const I=xe.subscribeMany([s.bunkerRelay],[{kinds:[24133],"#p":[fe(l)],authors:[s.bunkerPubkey]}],{onevent(L){try{const o=ee.decrypt(L.content,O),d=JSON.parse(o);d.id===T&&(I.close(),d.result?n(d.result):S(new Error(d.error||"Remote encryption failed")))}catch{}}});setTimeout(()=>{I.close(),S(new Error("Remote encryption timed out"))},3e4)})}throw new Error("No encryption method available")},k=async(c,u)=>{var g;if(s.method==="nsec"&&s.privkey){const l=ee.getConversationKey(y(s.privkey),c);return ee.decrypt(u,l)}if(s.method==="nip07"&&((g=window.nostr)!=null&&g.nip44))return window.nostr.nip44.decrypt(c,u);if(s.method==="nip46"&&s.bunkerPubkey&&s.bunkerRelay&&s.clientSecretKey){const l=y(s.clientSecretKey),T=Math.random().toString(36).substring(7),P={id:T,method:"nip44_decrypt",params:[c,u]},O=ee.getConversationKey(l,s.bunkerPubkey),_=ee.encrypt(JSON.stringify(P),O),D=Le({kind:24133,created_at:Math.floor(Date.now()/1e3),tags:[["p",s.bunkerPubkey]],content:_},l);return await xe.publish([s.bunkerRelay],D),new Promise((n,S)=>{const I=xe.subscribeMany([s.bunkerRelay],[{kinds:[24133],"#p":[fe(l)],authors:[s.bunkerPubkey]}],{onevent(L){try{const o=ee.decrypt(L.content,O),d=JSON.parse(o);d.id===T&&(I.close(),d.result?n(d.result):S(new Error(d.error||"Remote decryption failed")))}catch{}}});setTimeout(()=>{I.close(),S(new Error("Remote decryption timed out"))},3e4)})}throw new Error("No decryption method available")},w=()=>{E({pubkey:null,privkey:null,method:null,isLoading:!1,bunkerPubkey:null,bunkerRelay:null,clientSecretKey:null}),localStorage.removeItem("ncc_pubkey"),localStorage.removeItem("ncc_method"),localStorage.removeItem("ncc_privkey"),localStorage.removeItem("ncc_bunker_pubkey"),localStorage.removeItem("ncc_bunker_relay"),sessionStorage.removeItem("ncc_privkey"),sessionStorage.removeItem("ncc_client_secret")},x=(c,u,g,l)=>{localStorage.setItem("ncc_method",c),localStorage.setItem("ncc_pubkey",u),g?sessionStorage.setItem("ncc_privkey",g):sessionStorage.removeItem("ncc_privkey"),c==="nip46"&&l&&(localStorage.setItem("ncc_bunker_pubkey",l.bunkerPubkey),localStorage.setItem("ncc_bunker_relay",l.bunkerRelay),sessionStorage.setItem("ncc_client_secret",l.clientSecret))};return e.jsx(ct.Provider,{value:{...s,loginWithNip07:p,loginWithNsec:h,loginReadOnly:i,loginWithNip46:C,signEvent:v,encryptNip44:N,decryptNip44:k,logout:w},children:a})}function ve(){const a=r.useContext(ct);if(!a)throw new Error("useAuth must be used within AuthProvider");return a}const Ee=["wss://relay.damus.io","wss://nos.lol","wss://relay.primal.net"],V={load(){const a=localStorage.getItem("ncc_bootstrap_relays");if(a===null)return Ee;try{const s=JSON.parse(a);return Array.isArray(s)?s:Ee}catch{return Ee}},save(a){localStorage.setItem("ncc_bootstrap_relays",JSON.stringify(a))},add(a){const s=this.load();s.includes(a)||this.save([...s,a])},remove(a){const E=this.load().filter(y=>y!==a);this.save(E.length>0?E:Ee)},restoreDefaults(){this.save(Ee)}},ot=r.createContext(void 0);function Yt({children:a}){const s=r.useMemo(()=>{const E=V.load(),y=C=>{if(C.url.includes(".onion")&&!C.url.includes("/bridge?target=")){const v=C.url;C.url=`ws://${window.location.host}/bridge?target=${encodeURIComponent(v)}`,console.log(`[NCC-SDK] 🧅 Auto-Bridged Onion: ${v}`)}return C},p=new ft({pool:xe,bootstrapRelays:E,urlTransformer:y}),h=new yt({pool:xe,timeout:5e3}),i=new vt(E,{pool:xe});return{ncc05Resolver:p,ncc05Publisher:h,ncc02Resolver:i,pool:xe}},[]);return e.jsx(ot.Provider,{value:s,children:a})}function Ne(){const a=r.useContext(ot);if(!a)throw new Error("useNCC must be used within NCCProvider");return a}function Zt(){const{loginWithNip07:a,loginWithNsec:s,loginReadOnly:E,loginWithNip46:y,isLoading:p}=ve(),{pool:h}=Ne(),[i,C]=r.useState(""),[v,N]=r.useState("options"),[k,w]=r.useState(""),[x,c]=r.useState("generate"),u=r.useRef(null),g=P=>Array.from(P).map(O=>O.toString(16).padStart(2,"0")).join(""),l=()=>{const P=gt(),O=fe(P),_=V.load()[0]||"wss://relay.damus.io",D=encodeURIComponent(JSON.stringify({name:"NCC Client PoC"})),n=`nostrconnect://${O}?relay=${encodeURIComponent(_)}&metadata=${D}`;w(n),c("wait"),T(O,_,P)},T=(P,O,_)=>{u.current&&u.current.close(),console.log("[NIP-46] Listening for responses on",O),u.current=h.subscribeMany([O],[{kinds:[24133],"#p":[P]}],{onevent(D){try{const n=ee.getConversationKey(_,D.pubkey),S=ee.decrypt(D.content,n),I=JSON.parse(S);(I.result==="ack"||I.method==="connect")&&(console.log("[NIP-46] Connection Established with",D.pubkey),y(D.pubkey,O,g(_)))}catch(n){console.error("[NIP-46] Decryption failed (might be NIP-04, not supported yet in this PoC)",n)}}})};return r.useEffect(()=>()=>{u.current&&u.current.close()},[]),p?e.jsx("div",{className:"loading loading-spinner loading-lg"}):e.jsx("div",{className:"card w-96 bg-base-100 shadow-xl border border-base-300",children:e.jsxs("div",{className:"card-body p-6",children:[e.jsx("h2",{className:"card-title justify-center mb-6 font-bold text-xl",children:"NCC Login"}),v==="options"&&e.jsxs("div",{className:"flex flex-col gap-3",children:[e.jsxs("button",{className:"btn btn-primary w-full shadow-md",onClick:()=>a(),children:[e.jsx(St,{className:"w-4 h-4 mr-2"}),"Extension (NIP-07)"]}),e.jsxs("button",{className:"btn btn-secondary w-full shadow-md",onClick:()=>N("nip46"),children:[e.jsx(Be,{className:"w-4 h-4 mr-2"}),"Nostr Connect (NIP-46)"]}),e.jsx("div",{className:"divider text-[10px] opacity-30 uppercase tracking-widest",children:"Legacy / Read Only"}),e.jsxs("button",{className:"btn btn-neutral btn-sm w-full",onClick:()=>N("nsec"),children:[e.jsx(Ct,{className:"w-4 h-4 mr-2"}),"Private Key (nsec)"]}),e.jsxs("button",{className:"btn btn-ghost btn-sm w-full opacity-60",onClick:()=>N("readonly"),children:[e.jsx(_t,{className:"w-4 h-4 mr-2"}),"Read Only (Watch)"]})]}),v==="nip46"&&e.jsxs("div",{className:"flex flex-col items-center gap-4 fade-in text-center",children:[x==="generate"?e.jsxs(e.Fragment,{children:[e.jsx(Be,{className:"w-12 h-12 text-secondary mb-2"}),e.jsx("h3",{className:"font-bold",children:"Connect Remotely"}),e.jsx("p",{className:"text-xs opacity-60 px-4",children:"Sign events using a mobile app (Amber, etc.) or a dedicated Bunker."}),e.jsx("button",{className:"btn btn-secondary w-full mt-4",onClick:l,children:"Generate Connection QR"})]}):e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"bg-white p-4 rounded-xl shadow-inner border-4 border-base-200 inline-block",children:e.jsx(Et,{value:k,size:200})}),e.jsxs("div",{className:"flex flex-col gap-1 items-center",children:[e.jsxs("div",{className:"flex items-center gap-2 text-primary font-bold animate-pulse",children:[e.jsx(ye,{className:"w-3 h-3 animate-spin"}),e.jsx("span",{className:"text-xs",children:"Waiting for signer..."})]}),e.jsx("p",{className:"text-[10px] opacity-50 px-6",children:"Scan this QR with your Nostr signing app. Once scanned, the connection will be established automatically."})]}),e.jsx("button",{className:"btn btn-ghost btn-xs opacity-50",onClick:()=>{var P;c("generate"),(P=u.current)==null||P.close()},children:"Reset Connection"})]}),e.jsx("button",{className:"btn btn-ghost btn-sm w-full mt-2",onClick:()=>N("options"),children:"Back to Login Options"})]}),(v==="nsec"||v==="readonly")&&e.jsxs("div",{className:"flex flex-col gap-3 fade-in",children:[e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-xs uppercase opacity-50 font-bold",children:e.jsx("span",{className:"label-text",children:v==="nsec"?"Enter nsec / hex private key":"Enter npub / hex public key"})}),e.jsx("input",{type:"password",placeholder:v==="nsec"?"nsec1...":"npub1...",className:"input input-bordered w-full font-mono text-xs",value:i,onChange:P=>C(P.target.value)})]}),e.jsxs("div",{className:"flex gap-2 mt-4",children:[e.jsx("button",{className:"btn btn-ghost flex-1 btn-sm",onClick:()=>N("options"),children:"Back"}),e.jsx("button",{className:"btn btn-success flex-1 btn-sm",onClick:()=>v==="nsec"?s(i):E(i),children:"Login"})]})]})]})})}const it=r.createContext(void 0);function es({children:a}){const{pool:s}=Ne(),{privkey:E}=ve(),[y,p]=r.useState(()=>{const k=localStorage.getItem("ncc_tracked_services");return k?JSON.parse(k):[]});r.useEffect(()=>{localStorage.setItem("ncc_tracked_services",JSON.stringify(y))},[y]),r.useEffect(()=>{if(y.length===0)return;const k=[...new Set(y.map(x=>x.pubkey))],w=s.subscribeMany(V.load(),[{kinds:[30053,30058,30059],authors:k}],{onevent(x){h(x)}});return()=>{w.close()}},[y.length]);const h=async k=>{var c;const w=(c=k.tags.find(u=>u[0]==="d"))==null?void 0:c[1];if(!w)return;const x=w.replace(/-locator$/,"").replace(/-loc$/,"");p(u=>{const g=u.findIndex(_=>_.pubkey===k.pubkey&&_.serviceId===x);if(g===-1)return u;const l=u[g];let T=!1;const P={...l};if(k.kind===30059)(!l.serviceDef||k.created_at>l.serviceDef.created_at)&&(P.serviceDef=k,T=!0);else if(k.kind===30058&&(!l.latestEvent||k.created_at>l.latestEvent.created_at)&&(P.latestEvent=k,P.lastChecked=Math.floor(Date.now()/1e3),P.decryptedPayload=null,T=!0,E&&!k.content.trim().startsWith("{")))try{const _=S=>{var I;return Uint8Array.from(((I=S.match(/.{1,2}/g))==null?void 0:I.map(L=>parseInt(L,16)))||[])},D=ee.getConversationKey(_(E),k.pubkey),n=ee.decrypt(k.content,D);P.decryptedPayload=JSON.parse(n)}catch(_){console.error("Auto-decrypt failed",_)}if(!T)return u;const O=[...u];return O[g]=P,O})},i=(k,w)=>{p(x=>x.some(c=>c.pubkey===k&&c.serviceId===w)?x:[...x,{pubkey:k,serviceId:w,latestEvent:null,serviceDef:null,decryptedPayload:null,lastChecked:Math.floor(Date.now()/1e3)}])},C=(k,w)=>{p(x=>x.filter(c=>!(c.pubkey===k&&c.serviceId===w)))},v=(k,w)=>y.some(x=>x.pubkey===k&&x.serviceId===w),N=(k,w)=>y.find(x=>x.pubkey===k&&x.serviceId===w);return e.jsx(it.Provider,{value:{tracked:y,trackService:i,untrackService:C,isTracked:v,findTracked:N},children:a})}function lt(){const a=r.useContext(it);if(!a)throw new Error("useTracking must be used within TrackingProvider");return a}const dt=r.createContext(void 0);function ts({children:a}){const[s,E]=r.useState(""),[y,p]=r.useState(""),[h,i]=r.useState("idle"),[C,v]=r.useState([]),[N,k]=r.useState(null),[w,x]=r.useState(null),[c,u]=r.useState([]),[g,l]=r.useState({}),[T,P]=r.useState({}),[O,_]=r.useState(!1),[D,n]=r.useState([]),L={pubkeyInput:s,setPubkeyInput:E,serviceId:y,setServiceId:p,step:h,setStep:i,logs:C,addLog:o=>v(d=>[...d,o]),clearLogs:()=>v([]),error:N,setError:k,resolvedEndpoint:w,setResolvedEndpoint:x,rawEvents:c,setRawEvents:u,profiles:g,setProfiles:l,decryptedPayloads:T,setDecryptedPayloads:P,showExpired:O,setShowExpired:_,attestedIds:D,setAttestedIds:n};return e.jsx(dt.Provider,{value:L,children:a})}function ss(){const a=r.useContext(dt);if(!a)throw new Error("useDiscovery must be used within DiscoveryProvider");return a}const ut=r.createContext(void 0);function ns({children:a}){const{pubkey:s}=ve(),{pool:E}=Ne(),[y,p]=r.useState(()=>{const N=localStorage.getItem("ncc_wot_follows");return N?JSON.parse(N):[]}),[h,i]=r.useState(!1),C=async()=>{if(s){i(!0);try{const N=await E.get(V.load(),{kinds:[3],authors:[s]});if(N){const k=[s,...N.tags.filter(w=>w[0]==="p").map(w=>w[1])];p(k),localStorage.setItem("ncc_wot_follows",JSON.stringify(k))}else p([s]),localStorage.setItem("ncc_wot_follows",JSON.stringify([s]))}catch(N){console.error("Failed to fetch WoT",N)}finally{i(!1)}}};r.useEffect(()=>{s?(p(N=>N.includes(s)?N:[s,...N]),C()):(p([]),localStorage.removeItem("ncc_wot_follows"))},[s]);const v=N=>y.includes(N);return e.jsx(ut.Provider,{value:{follows:y,isFollowing:v,refreshFollows:C,loading:h},children:a})}function mt(){const a=r.useContext(ut);if(!a)throw new Error("useWoT must be used within WoTProvider");return a}const ge=a=>a.replace(/[&<"']/g,s=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[s]);function as({onConnect:a}){const{ncc02Resolver:s,ncc05Resolver:E,pool:y}=Ne(),{pubkey:p,privkey:h,signEvent:i,decryptNip44:C}=ve(),{trackService:v,isTracked:N,untrackService:k}=lt(),{isFollowing:w}=mt(),{pubkeyInput:x,setPubkeyInput:c,serviceId:u,setServiceId:g,step:l,setStep:T,logs:P,addLog:O,clearLogs:_,error:D,setError:n,resolvedEndpoint:S,setResolvedEndpoint:I,rawEvents:L,setRawEvents:o,profiles:d,setProfiles:J,decryptedPayloads:H,setDecryptedPayloads:se,showExpired:ne,setShowExpired:te,attestedIds:z,setAttestedIds:ue}=ss(),[Q,q]=r.useState({}),[ie,be]=r.useState(!1),[je,Ae]=r.useState(!1),[we,t]=r.useState({});r.useEffect(()=>{const b=async()=>{const f={};for(const m of L)(m.kind===30058||m.kind===30059)&&(f[m.id]=await G(m));t(f)};L.length>0&&p&&b()},[L,p,H]),r.useEffect(()=>{if(L.length>0&&p){const b=L.filter(f=>f.kind===30060&&f.pubkey===p).map(f=>{var m;return(m=f.tags.find(R=>R[0]==="e"))==null?void 0:m[1]}).filter(f=>f);b.length>0&&ue(f=>{const m=[...new Set([...f,...b])];return m.length===f.length?f:m})}},[L,p]);const j=async b=>{q(R=>({...R,[b]:"loading"}));const f=Date.now();let m=b;b.includes(".onion")&&(m=`ws://${window.location.host}/bridge?target=${encodeURIComponent(b)}`);try{const R=new WebSocket(m),M=setTimeout(()=>R.close(),1e4);await new Promise((X,U)=>{R.onopen=()=>{clearTimeout(M),R.close(),X(!0)},R.onerror=pe=>{clearTimeout(M),U(pe)}});const ae=Date.now()-f;q(X=>({...X,[b]:ae}))}catch{q(M=>({...M,[b]:"error"}))}},A=b=>{const f=Math.floor(Date.now()/1e3);if(b.kind===30059){const m=b.tags.find(R=>R[0]==="exp");if(m&&parseInt(m[1])<f)return!0}if(b.kind===30058)try{if(b.content.trim().startsWith("{")){const m=JSON.parse(b.content);if(m.updated_at&&m.ttl&&m.updated_at+m.ttl<f)return!0}else{const m=H[b.id];if(m&&m.updated_at&&m.ttl&&m.updated_at+m.ttl<f)return!0}}catch{}return!1},B=async b=>{const f=[...new Set(b.map(m=>m.pubkey))];if(f.length!==0)try{const m=await y.querySync(V.load(),{kinds:[0],authors:f}),R={};m.forEach(M=>{try{const ae=JSON.parse(M.content);R[M.pubkey]={...ae,_tags:M.tags}}catch{}}),J(M=>({...M,...R}))}catch(m){console.error("Failed to fetch profiles",m)}},$=b=>{const f=d[b];if(f&&(f.display_name||f.name))return f.display_name||f.name;try{const m=de.npubEncode(b);return`${m.slice(0,10)}...${m.slice(-4)}`}catch{return b.slice(0,8)}},G=async b=>{var f,m;if(!p)return!1;if(b.kind===30058){const R=H[b.id];if(R&&((f=R.privaterecipients)!=null&&f.includes(p)))return!0;if(b.content.startsWith("{"))try{if((m=JSON.parse(b.content).privaterecipients)!=null&&m.includes(p))return!0}catch{}}if(b.kind===30059){const R=Nt(b.tags);if(R.length>0){const M={nip44Decrypt:(ae,X)=>C(ae,X),getPublicKey:()=>Promise.resolve(p)};try{return await jt(R,b.pubkey,M)}catch{return!1}}}return b.tags.some(R=>R[0]==="p"&&R[1]===p)},he=async b=>{try{const f=await C(b.pubkey,b.content);se(m=>({...m,[b.id]:JSON.parse(f)}))}catch(f){alert("Decryption failed: "+f.message)}},ce=async()=>{var f;T("verifying"),_(),n(null),I(null),o([]),J({}),se({});const b=(m,R,M)=>Promise.race([m,new Promise((ae,X)=>setTimeout(()=>X(new Error(M)),R))]);try{let m=x;if(x.startsWith("npub")&&(m=de.decode(x).data),!m){O("🌐 Global Search: Querying bootstrap relays...");const U={kinds:[30053,30058,30059,30060,30061],limit:50};u&&(U["#d"]=[u]);const pe=await b(y.querySync(V.load(),U),1e4,"Global search timed out after 10s");o(pe),B(pe),O(`✅ Found ${pe.length} records globally.`),T("complete");return}O("🔍 NCC Discovery: Querying service events...");const R={getPublicKey:async()=>p||"",signEvent:async U=>i(U),getConversationKey:async U=>{if(h){const pe=F=>{var W;return Uint8Array.from(((W=F.match(/.{1,2}/g))==null?void 0:W.map(re=>parseInt(re,16)))||[])};return ee.getConversationKey(pe(h),U)}throw new Error("Local decryption key not available. Ensure you are logged in with NSEC.")}};O("📍 NCC-05: Resolving latest locator...");const M=await b(E.resolveLatest(m,R),1e4,"Locator resolution timed out");O("🛡️ NCC-02: Verifying service trust...");const X=[(await b(s.resolve(m,u||"relay",{requireAttestation:!1,minLevel:"self"}),5e3,"Trust verification timed out")).serviceEvent,...M?[]:[]].filter(U=>U);o(X),B(X),M&&((f=M.endpoints)==null?void 0:f.length)>0&&(I(M.endpoints[0]),O(`📍 Found ${M.endpoints.length} endpoints.`)),T("complete")}catch(m){n(m.message||"Discovery failed"),O(`❌ Error: ${m.message}`),T("idle")}},oe=(b,f)=>{let m=f;if(!m&&S&&x)try{let M=x;x.startsWith("npub")&&(M=de.decode(x).data),m={pubkey:M,id:u||"addr"}}catch{}m&&(N(m.pubkey,m.id)||v(m.pubkey,m.id));let R=b||(S?S.url||S.uri:null);if(R){if(R.includes("://")||(R=R.includes(".onion")?`ws://${R}`:`wss://${R}`),R.startsWith("http")&&(R=R.replace("http","ws")),R.includes(".onion"))if(window.confirm(`🧅 Tor Onion Address Detected
|
|
11
|
+
|
|
12
|
+
1. OK: Use Bridge (requires npm run bridge)
|
|
13
|
+
2. Cancel: Direct (Tor Browser/Orbot)`)){const ae=`ws://${window.location.host}/bridge?target=${encodeURIComponent(R)}`;a(ae,m);return}else{if(window.confirm("Attempt direct connection?")){a(R,m);return}navigator.clipboard.writeText(R);return}a(R,m)}},Ce=async b=>{var ae;if(!p)return alert("Please login first.");const f=(ae=b.tags.find(X=>X[0]==="d"))==null?void 0:ae[1];if(!f)return;const m=Math.floor(Date.now()/1e3),R=m+30*24*60*60,M={kind:30060,created_at:m,tags:[["subj",b.pubkey],["srv",f],["e",b.id],["std","nostr-service-trust-v0.1"],["lvl","verified"],["nbf",m.toString()],["exp",R.toString()]],content:"NCC-02 Attestation",pubkey:p};try{const X=await i(M);X&&(O(`✍️ Publishing Attestation for ${f}...`),await y.publish(V.load(),X),ue(U=>[...U,b.id]),alert("Attestation Published Successfully!"))}catch(X){console.error(X),alert("Attestation failed: "+X.message)}};return e.jsx("div",{className:"card bg-base-100 shadow-lg border border-base-200",children:e.jsxs("div",{className:"card-body p-4 sm:p-8",children:[e.jsxs("h3",{className:"card-title text-xl mb-4 flex items-center",children:[e.jsx(Pt,{className:"w-6 h-6 mr-2 text-primary"}),"Discovery"]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-sm",children:"Target Pubkey"}),e.jsx("input",{className:"input input-bordered w-full",placeholder:"npub1...",value:x,onChange:b=>c(b.target.value)})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-xs",children:"Service ID (Optional)"}),e.jsx("input",{className:"input input-bordered w-full",placeholder:"e.g. relay",value:u,onChange:b=>g(b.target.value)})]}),e.jsx("div",{className:"form-control",children:e.jsxs("label",{className:"cursor-pointer label justify-start gap-4",children:[e.jsx("span",{className:"label-text text-sm",children:"Show Expired"}),e.jsx("input",{type:"checkbox",className:"toggle toggle-sm toggle-warning",checked:ne,onChange:b=>te(b.target.checked)})]})}),e.jsx("div",{className:"form-control",children:e.jsxs("label",{className:"cursor-pointer label justify-start gap-4",children:[e.jsx("span",{className:"label-text text-sm font-bold text-secondary",children:"Network Only (WoT)"}),e.jsx("input",{type:"checkbox",className:"toggle toggle-sm toggle-secondary",checked:ie,onChange:b=>be(b.target.checked)})]})}),e.jsx("div",{className:"form-control",children:e.jsxs("label",{className:"cursor-pointer label justify-start gap-4",children:[e.jsx("span",{className:"label-text text-sm font-bold text-success",children:"Targeted to Me"}),e.jsx("input",{type:"checkbox",className:"toggle toggle-sm toggle-success",checked:je,onChange:b=>Ae(b.target.checked)})]})}),e.jsxs("button",{className:"btn btn-primary w-full",onClick:()=>ce(),disabled:l==="verifying"||l==="resolving",children:[l!=="idle"&&l!=="complete"&&e.jsx("span",{className:"loading loading-spinner"}),"Run Discovery"]})]}),D&&e.jsxs("div",{className:"alert alert-error mt-4 text-xs",children:[e.jsx(Ye,{className:"w-4 h-4 flex-shrink-0"}),e.jsx("span",{children:D})]}),e.jsxs("div",{className:"mt-4 bg-base-300 p-3 rounded-box font-mono text-[10px] max-h-32 overflow-y-auto",children:[P.length===0&&e.jsx("span",{className:"opacity-50",children:"Idle..."}),P.map((b,f)=>e.jsx("div",{className:"mb-1",dangerouslySetInnerHTML:{__html:ge(b)}},f))]}),L.length>0&&e.jsx("div",{className:"mt-6 space-y-6",children:(()=>{const b={};return L.forEach(f=>{(b[f.pubkey]=b[f.pubkey]||[]).push(f)}),Object.entries(b).map(([f,m])=>{const R=$(f),M=de.npubEncode(f),ae=Math.max(...m.map(F=>F.created_at)),X=new Date(ae*1e3).toLocaleString(),U={};m.forEach(F=>{var me;const re=(((me=F.tags.find(ke=>ke[0]==="d"))==null?void 0:me[1])||"unknown").replace(/-locator$/,"").replace(/-loc$/,"");U[re]||(U[re]={locators:[],attestations:[],revocations:[]}),F.kind===30059?(!U[re].service||F.created_at>U[re].service.created_at)&&(U[re].service=F):F.kind===30058?(U[re].locators.length===0||F.created_at>U[re].locators[0].created_at)&&(U[re].locators=[F]):F.kind===30060?U[re].attestations.push(F):F.kind===30061&&U[re].revocations.push(F)});const pe=Object.keys(U).sort().filter(F=>{const W=U[F];if(!(ne||W.service&&!A(W.service)||W.locators.some(me=>!A(me))))return!1;if(je){const me=W.service&&we[W.service.id],ke=W.locators.some(Re=>we[Re.id]);if(!me&&!ke)return!1}return ie?!!(w(f)||W.attestations.some(me=>w(me.pubkey))):!0});return pe.length===0?null:e.jsx("div",{className:"card bg-base-100 border border-base-300 w-full overflow-hidden shadow-sm",children:e.jsxs("div",{className:"card-body p-3",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between gap-2 mb-3 pb-2 border-b border-base-200",children:[e.jsxs("div",{className:"flex items-center gap-3 min-w-0",children:[e.jsx("div",{className:"avatar placeholder",children:e.jsx("div",{className:"bg-neutral text-neutral-content rounded-full w-8",children:e.jsx("span",{dangerouslySetInnerHTML:{__html:ge(R.slice(0,2).toUpperCase())}})})}),e.jsxs("div",{className:"min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"font-bold text-sm truncate",dangerouslySetInnerHTML:{__html:ge(R)}}),(w(f)||m.some(F=>F.kind===30060&&w(F.pubkey)))&&e.jsxs("div",{className:"badge badge-secondary badge-xs gap-1",children:[e.jsx(Pe,{className:"w-2 h-2"})," Network Trusted"]})]}),e.jsx("div",{className:"text-[9px] opacity-50 truncate",dangerouslySetInnerHTML:{__html:ge(M)}})]})]}),e.jsxs("div",{className:"text-[9px] opacity-40 font-mono text-right sm:text-left",children:["Last Update: ",X]})]}),e.jsx("div",{className:"space-y-4",children:pe.map(F=>{var Fe,Ue;const W=U[F],re=W.service&&(Xe(W.service.tags)??!W.service.tags.find(K=>K[0]==="u")),me=W.service&&we[W.service.id],ke=W.service&&A(W.service),Re=W.revocations.length>0,pt=N(f,F),We=W.attestations.filter(K=>w(K.pubkey)),_e=z.includes((Fe=W.service)==null?void 0:Fe.id)||W.attestations.some(K=>K.pubkey===p);return e.jsxs("div",{className:"space-y-2",children:[e.jsxs("div",{className:"flex items-center justify-between px-1",children:[e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsxs("span",{className:Y("font-black text-[10px] uppercase truncate",Re?"text-error line-through":"opacity-70"),children:["Service: ",e.jsx("span",{dangerouslySetInnerHTML:{__html:ge(F)}})]}),Re&&e.jsx("div",{className:"badge badge-error badge-xs scale-75 font-bold",children:"REVOKED"}),ke&&e.jsx("div",{className:"badge badge-error badge-xs scale-75",children:"EXPIRED"}),W.service&&(()=>{try{const K=JSON.parse(W.service.content);if(K.v>1)return e.jsxs("div",{className:"badge badge-warning badge-xs scale-75",title:"Newer protocol version detected",children:["v",K.v," !"]})}catch{}return null})()]}),We.length>0&&e.jsxs("span",{className:"text-[8px] text-secondary font-bold",children:["✓ Trusted by ",We.length," in your network"]})]}),e.jsxs("div",{className:"flex items-center gap-3",children:[W.service&&e.jsxs("button",{className:Y("btn btn-xs gap-1 p-0 h-auto min-h-0",_e?"text-success":"btn-ghost text-secondary"),title:_e?"You have attested to this":"Attest to this service",onClick:()=>!_e&&Ce(W.service),disabled:_e,children:[e.jsx(Rt,{className:"w-3 h-3"}),e.jsx("span",{className:"text-[9px]",children:_e?"Attested":"Attest"})]}),e.jsxs("label",{className:"flex items-center gap-1 cursor-pointer",children:[e.jsx("span",{className:"text-[9px] opacity-50",children:"Track"}),e.jsx("input",{type:"checkbox",className:"checkbox checkbox-xs",checked:pt,onChange:K=>K.target.checked?v(f,F):k(f,F)})]})]})]}),e.jsxs("div",{className:`border ${ke?"border-error bg-error/5":"border-base-200"} rounded-box overflow-hidden`,children:[e.jsx("div",{className:"p-2 bg-base-200/30",children:W.service?e.jsxs("div",{className:"collapse collapse-arrow bg-base-100 border border-base-200 rounded-box shadow-xs",children:[e.jsx("input",{type:"checkbox"}),e.jsxs("div",{className:"collapse-title text-[10px] font-bold py-1 min-h-0 flex items-center gap-2",children:["NCC-02 Record",re&&e.jsx(Ze,{className:Y("w-3 h-3",me?"text-success":"text-warning")}),re&&me&&e.jsx("span",{className:"text-[8px] text-success uppercase",children:"Authorized"})]}),e.jsx("div",{className:"collapse-content",children:e.jsx("pre",{className:"text-[9px] bg-black text-green-500 p-2 rounded mt-1 overflow-x-auto",children:JSON.stringify(W.service,null,2)})})]}):e.jsx("div",{className:"text-[9px] opacity-50 px-2 italic",children:"No NCC-02"})}),e.jsxs("div",{className:"p-2 space-y-2",children:[(Ue=W.service)==null?void 0:Ue.tags.filter(K=>K[0]==="u").map((K,Ie)=>e.jsxs("div",{className:"flex items-center justify-between gap-2 p-2 bg-base-200/50 rounded-lg",children:[e.jsxs("div",{className:"flex flex-col min-w-0 flex-1",children:[e.jsx("span",{className:"text-[9px] font-mono truncate",dangerouslySetInnerHTML:{__html:ge(K[1])}}),Q[K[1]]&&e.jsx("span",{className:Y("text-[8px] font-bold",Q[K[1]]==="error"?"text-error":Q[K[1]]==="loading"?"animate-pulse":"text-success"),children:Q[K[1]]==="loading"?"Probing...":Q[K[1]]==="error"?"Offline":`${Q[K[1]]}ms`})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx("button",{className:"btn btn-xs btn-ghost",onClick:()=>j(K[1]),children:"Probe"}),e.jsx("button",{className:"btn btn-xs btn-secondary flex-shrink-0",onClick:()=>oe(K[1],{pubkey:f,id:F}),children:"Connect"})]})]},Ie)),W.locators.map(K=>{const Ie=we[K.id],De=!K.content.trim().startsWith("{"),Te=H[K.id],$e=A(K);if(!ne&&$e)return null;let Je=[];try{const le=Te||(De?null:JSON.parse(K.content));le!=null&&le.endpoints&&(Je=le.endpoints)}catch{}return e.jsx("div",{className:`border-l-2 ${Ie?"border-success":$e?"border-error":"border-primary"} pl-2 ml-1`,children:e.jsxs("div",{className:"collapse collapse-arrow bg-base-100 border border-base-200 rounded-box",children:[e.jsx("input",{type:"checkbox"}),e.jsxs("div",{className:"collapse-title text-[10px] py-1 min-h-0 flex flex-wrap items-center gap-1",children:[e.jsx("span",{children:"📍 NCC-05"}),Ie&&e.jsx("div",{className:"badge badge-success badge-xs scale-75",children:"FOR YOU"}),$e&&e.jsx("div",{className:"badge badge-error badge-xs scale-75",children:"EXPIRED"}),De&&!Te&&e.jsx("div",{className:"badge badge-warning badge-xs scale-75",children:"LOCKED"})]}),e.jsx("div",{className:"collapse-content",children:De&&!Te?e.jsx("button",{className:"btn btn-xs btn-neutral w-full mt-1",onClick:le=>{le.stopPropagation(),he(K)},children:"Decrypt"}):e.jsxs("div",{className:"space-y-2 mt-1",children:[Je.map((le,xt)=>{let Z=le.url||le.uri;Z&&!Z.includes("://")&&(Z=Z.includes(".onion")?`ws://${Z}`:`wss://${Z}`);const qe=Z&&(Z.startsWith("ws")||Z.startsWith("wss"));return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsxs("button",{className:"btn btn-xs btn-primary w-full flex flex-col items-start h-auto py-2 gap-1",onClick:()=>qe?oe(Z,{pubkey:f,id:F}):window.open(Z,"_blank"),children:[e.jsxs("div",{className:"flex items-center gap-1 font-bold",children:[" ",le.family==="onion"&&"🧅"," Connect ",e.jsx("span",{dangerouslySetInnerHTML:{__html:ge(le.type||(qe?"Relay":"Web"))}})]}),e.jsx("div",{className:"text-[8px] opacity-70 truncate w-full",dangerouslySetInnerHTML:{__html:ge(Z)}})]}),e.jsxs("div",{className:"flex items-center justify-between px-1",children:[e.jsx("button",{className:"text-[8px] link opacity-50",onClick:()=>j(Z),children:"Probe Health"}),Q[Z]&&e.jsx("span",{className:Y("text-[8px] font-bold",Q[Z]==="error"?"text-error":Q[Z]==="loading"?"animate-pulse":"text-success"),children:Q[Z]==="loading"?"Probing...":Q[Z]==="error"?"Offline":`${Q[Z]}ms`})]})]},xt)}),e.jsx("pre",{className:"text-[8px] bg-black text-green-500 p-2 rounded overflow-x-auto",children:JSON.stringify(Te||K,null,2)})]})})]})},K.id)})]})]})]},F)})})]})},f)})})()}),S&&l==="complete"&&e.jsxs("div",{className:"mt-6 p-4 bg-base-200 rounded-box border border-success flex flex-col gap-3",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Pe,{className:"text-success w-6 h-6 flex-shrink-0"}),e.jsxs("div",{className:"min-w-0",children:[e.jsx("h4",{className:"font-bold text-xs",children:"Target Resolved"}),e.jsx("p",{className:"text-[10px] opacity-70 truncate font-mono",dangerouslySetInnerHTML:{__html:ge(S.url||S.uri)}})]})]}),e.jsx("button",{className:"btn btn-success btn-sm w-full",onClick:()=>oe(),children:"Connect to Relay"})]})]})})}const Se=a=>a.replace(/[&<>"']/g,s=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[s]);function rs({relayUrl:a}){const[s,E]=r.useState([]),[y,p]=r.useState({}),[h,i]=r.useState("disconnected"),[C,v]=r.useState(null),[N,k]=r.useState("desc"),[w,x]=r.useState(!1),{isFollowing:c}=mt(),u=r.useRef(new Ge),g=r.useRef([]),l=r.useRef(null),[T,P]=r.useState(0),O=n=>{g.current.push(n),!l.current&&(l.current=setTimeout(()=>{const S=[...g.current];g.current=[],l.current=null,E(I=>{let L=[...I],o=!1;return S.forEach(d=>{var J;if(d.kind>=3e4&&d.kind<4e4){const H=((J=d.tags.find(ne=>ne[0]==="d"))==null?void 0:J[1])||"",se=L.findIndex(ne=>{var te;return ne.pubkey===d.pubkey&&ne.kind===d.kind&&(((te=ne.tags.find(z=>z[0]==="d"))==null?void 0:te[1])||"")===H});se!==-1?d.created_at>L[se].created_at&&(L[se]=d,o=!0):(L.push(d),o=!0)}else L.find(H=>H.id===d.id)||(L.push(d),o=!0)}),o?_([...L],N):I})},100))},_=(n,S)=>[...n].sort((I,L)=>S==="asc"?I.created_at-L.created_at:L.created_at-I.created_at),D=()=>{const n=N==="asc"?"desc":"asc";k(n),E(S=>_(S,n))};return r.useEffect(()=>{E([]),p({}),i("disconnected"),v(null),g.current=[],l.current&&(clearTimeout(l.current),l.current=null)},[a]),r.useEffect(()=>{if(!a)return;let n,S,I=!1;return(async()=>{i("connecting"),v(null),a.includes(".onion")&&console.warn("[Feed] Tor connection requested. Handshake may take up to 45 seconds."),console.log(`[Feed] Subscribing to ${a}...`),n=u.current.subscribeMany([a],[{kinds:[1,30051,30053,30058,30059,30060,30061],limit:50}],{onevent(o){I=!0,O(o),i("connected")},oneose(){I=!0,console.log(`[Feed] EOSE received from ${a}.`),i("connected")},onclose(o){console.error("[Feed] Subscription closed:",o),I||(i("error"),v("Connection closed by relay or bridge."))}}),S=setTimeout(()=>{I||(console.error("[Feed] Connection watchdog triggered after 30s"),i("error"),v("Relay did not respond. Tor might be slow or the relay is empty."),n&&n.close())},3e4)})(),()=>{S&&clearTimeout(S),n&&n.close()}},[a,T]),r.useEffect(()=>{if(!a||s.length===0)return;const n=[...new Set(s.map(I=>I.pubkey))].filter(I=>!y[I]);if(n.length===0)return;const S=u.current.subscribeMany([a],[{kinds:[0],authors:n}],{onevent(I){try{const L=JSON.parse(I.content);p(o=>({...o,[I.pubkey]:L}))}catch{}},oneose(){}});return()=>{S.close()}},[s.length,a]),a?e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-col bg-base-100 p-4 rounded-box shadow-sm border border-base-200 gap-3",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("div",{className:`badge ${h==="connected"?"badge-success":h==="connecting"?"badge-warning":"badge-error"} badge-xs animate-pulse`}),e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"font-mono text-sm font-bold truncate max-w-[200px] sm:max-w-md",children:a}),e.jsxs("span",{className:"text-xs opacity-50 capitalize",children:[h," ",h==="connected"&&`(${s.length} events)`]})]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"form-control mr-2 hidden sm:flex",children:e.jsxs("label",{className:"cursor-pointer label justify-start gap-2",children:[e.jsx("span",{className:"label-text text-[10px] font-bold opacity-50 uppercase",children:"Network Only"}),e.jsx("input",{type:"checkbox",className:"toggle toggle-xs toggle-secondary",checked:w,onChange:n=>x(n.target.checked)})]})}),e.jsxs("button",{className:"btn btn-sm btn-ghost gap-2",onClick:D,title:N==="desc"?"Showing Newest First":"Showing Oldest First",children:[e.jsx(It,{className:Y("w-4 h-4",N==="asc"&&"rotate-180 transition-transform")}),N==="desc"?e.jsx(Tt,{className:"w-3 h-3"}):e.jsx(Lt,{className:"w-3 h-3"})]}),h==="error"?e.jsxs("button",{className:"btn btn-sm btn-error",onClick:()=>P(n=>n+1),children:[e.jsx(ye,{className:"w-4 h-4 mr-2"}),"Retry"]}):e.jsxs("button",{className:`btn btn-sm btn-ghost ${h==="connecting"?"loading":""}`,onClick:()=>P(n=>n+1),disabled:h==="connecting",children:[e.jsx(ye,{className:"w-4 h-4"}),e.jsx("span",{className:"hidden sm:inline ml-2",children:"Refresh"})]})]})]}),h==="connected"&&s.length>0&&e.jsxs("div",{className:"flex flex-wrap gap-2 pt-2 border-t border-base-200",children:[e.jsx("div",{className:"text-[10px] uppercase font-bold opacity-30 w-full mb-1",children:"Content Summary"}),[1,30051,30053,30058,30059,30060,30061].map(n=>{const S=s.filter(I=>I.kind===n).length;return S===0?null:e.jsxs("div",{className:"badge badge-ghost badge-sm text-[10px] gap-1",children:["Kind ",n,": ",e.jsx("span",{className:"font-bold",children:S})]},n)})]})]}),h==="error"&&e.jsxs("div",{className:"alert alert-error text-sm",children:[e.jsx(Ot,{className:"w-4 h-4 flex-shrink-0"}),e.jsxs("span",{children:["Failed to connect: ",C]})]}),e.jsx("div",{className:"space-y-4",children:s.filter(n=>!w||c(n.pubkey)).map(n=>{var Q;const S=y[n.pubkey],I=(S==null?void 0:S.display_name)||(S==null?void 0:S.name)||n.pubkey.slice(0,8),L=c(n.pubkey),o=n.tags.some(q=>q[0]==="ttl"),d=n.tags.some(q=>q[0]==="private"&&q[1]==="true"),J=n.tags.some(q=>q[0]==="exp"),H=n.kind===30058&&(o||d),se=n.kind===30059&&J,ne=n.kind===30060,te=n.kind===30061,z=n.kind===30053,ue=n.kind===30051;return e.jsx("div",{className:"card bg-base-100 shadow-sm border border-base-200 overflow-hidden",children:e.jsx("div",{className:"card-body p-3 sm:p-4",children:e.jsxs("div",{className:"flex items-start gap-3",children:[e.jsx("div",{className:"avatar flex-shrink-0",children:e.jsx("div",{className:"w-10 h-10 rounded-full bg-base-300",children:S!=null&&S.picture?e.jsx("img",{src:S.picture,alt:I,onError:q=>q.currentTarget.src=`https://api.dicebear.com/7.x/identicon/svg?seed=${n.pubkey}`}):e.jsx("div",{className:"flex items-center justify-center w-full h-full text-base-content/30 bg-base-200",children:e.jsx(At,{className:"w-5 h-5"})})})}),e.jsxs("div",{className:"flex-1 min-w-0",children:[e.jsxs("div",{className:"flex flex-col sm:flex-row sm:items-center justify-between mb-1 gap-1",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"font-bold text-sm truncate text-primary",dangerouslySetInnerHTML:{__html:Se(I)}}),L&&e.jsx("div",{className:"badge badge-secondary badge-xs gap-1",title:"You follow this author",children:e.jsx(Pe,{className:"w-2 h-2"})})]}),e.jsxs("div",{className:"flex flex-wrap items-center gap-1",children:[H&&e.jsx("div",{className:"badge badge-primary badge-xs scale-90 sm:scale-100",children:"NCC-05 LOCATOR"}),se&&e.jsx("div",{className:"badge badge-secondary badge-xs scale-90 sm:scale-100",children:"NCC-02 SERVICE"}),ne&&e.jsx("div",{className:"badge badge-accent badge-xs scale-90 sm:scale-100",children:"NCC-02 ATTEST"}),te&&e.jsx("div",{className:"badge badge-error badge-xs scale-90 sm:scale-100",children:"NCC-02 REVOKE"}),z&&e.jsx("div",{className:"badge badge-info badge-xs scale-90 sm:scale-100",children:"NCC-01 DETAIL"}),ue&&e.jsx("div",{className:"badge badge-neutral badge-xs scale-90 sm:scale-100",children:"NCC-00 REPT"}),n.kind===1&&e.jsx("div",{className:"badge badge-ghost badge-xs opacity-50 text-[8px]",children:"NOTE"}),!H&&!se&&!ne&&!te&&!z&&!ue&&n.kind>1&&e.jsxs("div",{className:"badge badge-ghost badge-xs opacity-50 text-[8px]",children:["KIND ",n.kind]}),e.jsx("div",{className:"text-[9px] opacity-40 whitespace-nowrap font-mono ml-auto sm:ml-0",children:new Date(n.created_at*1e3).toLocaleTimeString()})]})]}),e.jsx("div",{className:"text-sm leading-relaxed mt-1",children:n.kind===1?e.jsx("p",{className:"whitespace-pre-wrap break-words",dangerouslySetInnerHTML:{__html:Se(n.content)}}):e.jsxs("div",{className:"bg-base-200/50 p-2 rounded border border-base-300 text-xs font-mono overflow-x-auto",children:[e.jsx("div",{className:"font-bold mb-1 opacity-50 italic text-[10px]",children:H?"Service Locator (NCC-05)":se?"Service Record (NCC-02)":ne?"Service Attestation (NCC-02)":te?"Service Revocation (NCC-02)":z?"Service Detail (NCC-01)":ue?"Succession Report (NCC-00)":`Event Kind ${n.kind}`}),e.jsxs("div",{className:"flex gap-2 mb-1",children:[e.jsx("span",{className:"opacity-50",children:"d-tag:"}),e.jsx("span",{className:"font-bold",dangerouslySetInnerHTML:{__html:Se(((Q=n.tags.find(q=>q[0]==="d"))==null?void 0:Q[1])||"none")}})]}),H&&n.content.startsWith("{")&&e.jsx("div",{className:"mt-1 space-y-1",children:(()=>{var q;try{return(q=JSON.parse(n.content).endpoints)==null?void 0:q.map((be,je)=>e.jsxs("div",{className:"text-[10px] bg-base-300/50 p-1 rounded border border-base-400/30 flex items-center justify-between",children:[e.jsx("span",{className:"truncate flex-1",dangerouslySetInnerHTML:{__html:Se(be.url||be.uri)}}),e.jsx("span",{className:"badge badge-outline badge-xs opacity-50 ml-1",dangerouslySetInnerHTML:{__html:Se(be.type)}})]},je))}catch{return null}})()}),e.jsxs("div",{className:"opacity-70 mt-1 truncate max-w-full",children:[e.jsx("span",{className:"opacity-50 mr-1",children:"Content:"}),e.jsx("span",{dangerouslySetInnerHTML:{__html:Se(n.content.slice(0,80))}}),n.content.length>80&&"..."]})]})})]})]})})},n.id)})})]}):e.jsxs("div",{className:"flex flex-col items-center justify-center h-64 text-base-content/50 border-2 border-dashed border-base-300 rounded-box",children:[e.jsx(et,{className:"w-12 h-12 mb-4"}),e.jsx("h3",{className:"font-bold text-lg",children:"No Relay Connected"}),e.jsx("p",{children:"Use the Service Discovery tab to find and connect to a relay."})]})}function cs(){const{ncc02Resolver:a}=Ne(),[s,E]=r.useState(""),[y,p]=r.useState("media"),[h,i]=r.useState(null),[C,v]=r.useState(!1),[N,k]=r.useState(null),w=async()=>{v(!0),k(null),i(null);try{let x=s;if(s.startsWith("npub")){const{data:u}=de.decode(s);x=u}const c=await a.resolve(x,y,{requireAttestation:!1,minLevel:"self"});i(c)}catch(x){console.error(x),k(x.message||"Verification failed")}finally{v(!1)}};return e.jsx("div",{className:"card bg-base-100 shadow-lg border border-base-200",children:e.jsxs("div",{className:"card-body",children:[e.jsxs("h3",{className:"card-title text-xl mb-4 flex items-center",children:[e.jsx(tt,{className:"w-6 h-6 mr-2 text-accent"}),"Trust Explorer (NCC-02)"]}),e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label",children:"Target Pubkey"}),e.jsx("input",{className:"input input-bordered",placeholder:"npub1...",value:s,onChange:x=>E(x.target.value)})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label",children:"Service ID"}),e.jsx("input",{className:"input input-bordered",placeholder:"media",value:y,onChange:x=>p(x.target.value)})]}),e.jsx("button",{className:"btn btn-accent",onClick:w,disabled:C,children:C?e.jsx("span",{className:"loading loading-spinner"}):"Verify Service"})]}),N&&e.jsxs("div",{className:"alert alert-error mt-4",children:[e.jsx(Dt,{className:"w-6 h-6"}),e.jsx("span",{children:N})]}),h&&e.jsxs("div",{className:"mt-6 p-4 bg-base-200 rounded-box",children:[e.jsxs("div",{className:"flex items-center gap-2 mb-2",children:[e.jsx($t,{className:"text-success w-5 h-5"}),e.jsx("span",{className:"font-bold",children:"Service Verified"})]}),e.jsx("pre",{className:"text-xs overflow-auto bg-base-300 p-2 rounded",children:JSON.stringify(h,null,2)})]})]})})}const os="modulepreload",is=function(a){return"/"+a},Ve={},Qe=function(s,E,y){let p=Promise.resolve();if(E&&E.length>0){document.getElementsByTagName("link");const i=document.querySelector("meta[property=csp-nonce]"),C=(i==null?void 0:i.nonce)||(i==null?void 0:i.getAttribute("nonce"));p=Promise.allSettled(E.map(v=>{if(v=is(v),v in Ve)return;Ve[v]=!0;const N=v.endsWith(".css"),k=N?'[rel="stylesheet"]':"";if(document.querySelector(`link[href="${v}"]${k}`))return;const w=document.createElement("link");if(w.rel=N?"stylesheet":os,N||(w.as="script"),w.crossOrigin="",w.href=v,C&&w.setAttribute("nonce",C),document.head.appendChild(w),N)return new Promise((x,c)=>{w.addEventListener("load",x),w.addEventListener("error",()=>c(new Error(`Unable to preload CSS for ${v}`)))})}))}function h(i){const C=new Event("vite:preloadError",{cancelable:!0});if(C.payload=i,window.dispatchEvent(C),!C.defaultPrevented)throw i}return p.then(i=>{for(const C of i||[])C.status==="rejected"&&h(C.reason);return s().catch(h)})},Ke=a=>a.replace(/[&<>"']/g,s=>({"&":"&","<":"<",">":">",'"':""","'":"'"})[s]);function ls(){const{pubkey:a,method:s,signEvent:E,encryptNip44:y}=ve(),{pool:p,ncc05Publisher:h}=Ne(),[i,C]=r.useState(()=>{const t=localStorage.getItem("ncc_managed_identities");return t?JSON.parse(t):[]}),[v,N]=r.useState({label:"",key:""}),[k,w]=r.useState(!1),[x,c]=r.useState(!1),[u,g]=r.useState([]),[l,T]=r.useState(null),[P,O]=r.useState(""),[_,D]=r.useState(!1),[n,S]=r.useState({ownerPubkey:"",serviceId:"relay",endpoint:"",isPrivate:!1,recipients:""}),[I,L]=r.useState(!1),[o,d]=r.useState({ownerPubkey:"",identifier:"addr",type:"ws",url:"",family:"onion",isPrivate:!1,recipients:""}),[J,H]=r.useState({loading:!1,services:[]}),se=t=>{var j;return Uint8Array.from(((j=t.match(/.{1,2}/g))==null?void 0:j.map(A=>parseInt(A,16)))||[])},ne=t=>Array.from(t).map(j=>j.toString(16).padStart(2,"0")).join(""),te=[...a?[a]:[],...i.map(t=>t.pubkey)],z=async()=>{if(te.length!==0){c(!0);try{const t=await p.querySync(V.load(),{kinds:[30053,30058,30059,30060,30061],authors:te}),j=new Map;t.forEach(A=>{var G;const B=((G=A.tags.find(he=>he[0]==="d"))==null?void 0:G[1])||"",$=`${A.kind}:${A.pubkey}:${B}`;(!j.has($)||A.created_at>j.get($).created_at)&&j.set($,A)}),g(Array.from(j.values()))}catch(t){console.error("Scan failed",t)}finally{c(!1)}}};r.useEffect(()=>{localStorage.setItem("ncc_managed_identities",JSON.stringify(i))},[i]),r.useEffect(()=>{z()},[i.length,a]);const ue=()=>{try{let t=v.key,j;if(v.key.startsWith("nsec")){const A=de.decode(v.key);t=ne(A.data),j=t,t=fe(A.data)}else if(v.key.startsWith("npub"))t=de.decode(v.key).data;else if(v.key.length===64)try{const A=se(v.key),B=fe(A);j=t,t=B}catch{}if(te.includes(t)){alert("Identity already managed");return}C([...i,{pubkey:t,privkey:j,label:v.label||`Service ${t.slice(0,4)}`}]),N({label:"",key:""}),w(!1)}catch{alert("Invalid Key Format")}},Q=t=>{C(i.filter(j=>j.pubkey!==t))},q=async()=>{const t=i.find(j=>j.pubkey===n.ownerPubkey)||(n.ownerPubkey===a?{pubkey:a,privkey:void 0}:null);if(!t)return alert("Select a managed identity first.");c(!0);try{const j=new wt(t.privkey||{getPublicKey:()=>Promise.resolve(t.pubkey),signEvent:$=>E($)});let A;if(n.isPrivate&&n.recipients){const $=n.recipients.split(",").map(G=>G.trim()).filter(G=>G).map(G=>G.startsWith("npub")?de.decode(G).data:G);if($.length>0){const G=t.privkey||{nip44Encrypt:(he,ce)=>y(he,ce),getPublicKey:()=>Promise.resolve(t.pubkey)};A=await kt(G,$)}}const B=await j.createServiceRecord({serviceId:n.serviceId,endpoint:n.endpoint||void 0,expiryDays:30,isPrivate:n.isPrivate,privateRecipients:A});await p.publish(V.load(),B),alert("NCC-02 Service Record Published!"),D(!1),z()}catch(j){alert("Publish failed: "+j.message)}finally{c(!1)}},ie=async()=>{const t=i.find(j=>j.pubkey===o.ownerPubkey)||(o.ownerPubkey===a?{pubkey:a,privkey:void 0}:null);if(!t)return alert("Select a managed identity first.");c(!0);try{const j=o.recipients.split(",").map($=>$.trim()).filter($=>$).map($=>$.startsWith("npub")?de.decode($).data:$),A={v:1,ttl:3600,updated_at:Math.floor(Date.now()/1e3),endpoints:[{type:o.type,url:o.url,priority:1,family:o.family}],...o.isPrivate&&{privaterecipients:j}},B=t.privkey?void 0:async $=>E($);await h.publish(V.load(),t.privkey||B,A,{public:!o.isPrivate,identifier:o.identifier,recipientPubkey:j[0]}),alert("NCC-05 Locator Published!"),L(!1),z()}catch(j){alert("Publish failed: "+j.message)}finally{c(!1)}},be=async()=>{H(t=>({...t,loading:!0}));try{const j=await(await fetch("http://localhost:3005/inventory")).json();j&&j.services&&H({loading:!1,services:j.services})}catch{H({loading:!1,services:[]}),alert("NCC Sidecar not detected on localhost:3005.")}},je=t=>{d({...o,type:t.type||"ws",url:t.onion_address||"",family:"onion"})},Ae=async t=>{const j=i.find(B=>B.pubkey===t.pubkey),A=j==null?void 0:j.privkey;c(!0);try{const B=Math.floor(Date.now()/1e3),$={kind:t.kind,created_at:B,tags:[...t.tags],content:t.content,pubkey:t.pubkey},G=$.tags.findIndex(oe=>oe[0]==="exp");if(G!==-1){const oe=B+2592e3;$.tags[G]=["exp",oe.toString()]}if($.tags.findIndex(oe=>oe[0]==="private")===-1){const oe=$.tags.some(Ce=>Ce[0]==="u");$.tags.push(["private",oe?"false":"true"])}let ce;if(A){const{finalizeEvent:oe}=await Qe(async()=>{const{finalizeEvent:Ce}=await import("./pure-ei6B17Q0.js");return{finalizeEvent:Ce}},__vite__mapDeps([0,1]));ce=oe($,se(A))}else ce=await E($);await p.publish(V.load(),ce),alert("Record Renewed!"),z()}catch(B){alert("Renew failed: "+B.message)}finally{c(!1)}},we=async()=>{if(!l)return;const t=i.find(A=>A.pubkey===l.pubkey),j=t==null?void 0:t.privkey;c(!0);try{const A={kind:l.kind,content:P,created_at:Math.floor(Date.now()/1e3),tags:[...l.tags],pubkey:l.pubkey};let B;if(j){const{finalizeEvent:$}=await Qe(async()=>{const{finalizeEvent:G}=await import("./pure-ei6B17Q0.js");return{finalizeEvent:G}},__vite__mapDeps([0,1]));B=$(A,se(j))}else B=await E(A);await p.publish(V.load(),B),alert("Record Updated!"),T(null),z()}catch(A){alert("Update failed: "+A.message)}finally{c(!1)}};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(He,{className:"text-primary w-6 h-6"}),e.jsx("h2",{className:"text-xl font-bold",children:"Infrastructure Inventory"})]}),e.jsxs("div",{className:"flex gap-2",children:[e.jsxs("button",{className:Y("btn btn-sm",x&&"loading"),onClick:z,children:[e.jsx(ye,{className:"w-4 h-4"})," Scan Network"]}),e.jsxs("button",{className:"btn btn-sm btn-secondary",onClick:()=>L(!I),children:[e.jsx(Kt,{className:"w-4 h-4"})," Publish NCC-05"]}),e.jsxs("button",{className:"btn btn-sm btn-secondary",onClick:()=>D(!_),children:[e.jsx(Pe,{className:"w-4 h-4"})," Publish NCC-02"]}),e.jsxs("button",{className:"btn btn-sm btn-primary",onClick:()=>w(!k),children:[e.jsx(st,{className:"w-4 h-4"})," Add Identity"]})]})]}),I&&e.jsx("div",{className:"card bg-base-100 shadow-lg border border-secondary/20 mb-6",children:e.jsxs("div",{className:"card-body p-4",children:[e.jsxs("div",{className:"flex items-center justify-between mb-4",children:[e.jsx("h3",{className:"font-bold text-sm",children:"Publish NCC-05 Service Locator"}),e.jsx("button",{className:Y("btn btn-xs btn-outline btn-secondary",J.loading&&"loading"),onClick:be,children:J.loading?"Detecting...":"Sidecar Detect"})]}),J.services.length>0&&e.jsxs("div",{className:"mb-4 space-y-2 bg-base-200 p-2 rounded-lg border border-base-300",children:[e.jsx("p",{className:"text-[9px] uppercase font-bold opacity-50 px-1",children:"Local Sidecar Services"}),J.services.map((t,j)=>e.jsxs("div",{className:"flex items-center justify-between p-2 bg-base-100 rounded border border-base-200",children:[e.jsx("div",{className:"flex flex-col min-w-0",children:e.jsx("span",{className:"text-xs font-bold truncate",children:t.name||t.id})}),e.jsx("button",{className:"btn btn-xs btn-ghost text-secondary",onClick:()=>je(t),children:"Import"})]},j))]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Identity"}),e.jsxs("select",{className:"select select-bordered select-sm",value:o.ownerPubkey,onChange:t=>d({...o,ownerPubkey:t.target.value}),children:[e.jsx("option",{value:"",children:"Select Identity..."}),te.map(t=>{var j;return e.jsx("option",{value:t,children:((j=i.find(A=>A.pubkey===t))==null?void 0:j.label)||(t===a?"Primary Account":t.slice(0,12))},t)})]})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Identifier (d-tag)"}),e.jsx("input",{className:"input input-bordered input-sm",placeholder:"e.g. addr",value:o.identifier,onChange:t=>d({...o,identifier:t.target.value})})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Type"}),e.jsxs("select",{className:"select select-bordered select-sm",value:o.type,onChange:t=>d({...o,type:t.target.value}),children:[e.jsx("option",{value:"ws",children:"WebSocket"}),e.jsx("option",{value:"http",children:"HTTP"}),e.jsx("option",{value:"tcp",children:"TCP"})]})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Family"}),e.jsxs("select",{className:"select select-bordered select-sm",value:o.family,onChange:t=>d({...o,family:t.target.value}),children:[e.jsx("option",{value:"onion",children:"Onion (Tor)"}),e.jsx("option",{value:"ipv4",children:"IPv4"})]})]}),e.jsxs("div",{className:"form-control sm:col-span-2",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"URL"}),e.jsx("input",{className:"input input-bordered input-sm font-mono",placeholder:"xyz...onion",value:o.url,onChange:t=>d({...o,url:t.target.value})})]}),e.jsx("div",{className:"form-control sm:col-span-2",children:e.jsxs("label",{className:"label cursor-pointer justify-start gap-4",children:[e.jsx("input",{type:"checkbox",className:"toggle toggle-secondary toggle-sm",checked:o.isPrivate,onChange:t=>d({...o,isPrivate:t.target.checked})}),e.jsx("span",{className:"label-text font-bold text-xs",children:"Private Discovery (Encrypted)"})]})}),o.isPrivate&&e.jsxs("div",{className:"form-control sm:col-span-2 fade-in",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Authorized Recipients"}),e.jsx("textarea",{className:"textarea textarea-bordered h-20 text-xs font-mono",placeholder:"npub1...",value:o.recipients,onChange:t=>d({...o,recipients:t.target.value})})]})]}),e.jsxs("div",{className:"card-actions justify-end mt-4",children:[e.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>L(!1),children:"Cancel"}),e.jsx("button",{className:Y("btn btn-sm btn-secondary",x&&"loading"),onClick:ie,disabled:!o.ownerPubkey||!o.url,children:"Publish Locator"})]})]})}),_&&e.jsx("div",{className:"card bg-base-100 shadow-lg border border-secondary/20",children:e.jsxs("div",{className:"card-body p-4",children:[e.jsx("h3",{className:"font-bold text-sm mb-3",children:"Publish NCC-02 Service Record"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Identity"}),e.jsxs("select",{className:"select select-bordered select-sm",value:n.ownerPubkey,onChange:t=>S({...n,ownerPubkey:t.target.value}),children:[e.jsx("option",{value:"",children:"Select Managed Identity..."}),te.map(t=>{var j;return e.jsx("option",{value:t,children:((j=i.find(A=>A.pubkey===t))==null?void 0:j.label)||(t===a?"Primary Account":t.slice(0,12))},t)})]})]}),e.jsxs("div",{className:"form-control",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Service ID"}),e.jsx("input",{className:"input input-bordered input-sm",placeholder:"e.g. relay, media, api",value:n.serviceId,onChange:t=>S({...n,serviceId:t.target.value})})]}),e.jsxs("div",{className:"form-control sm:col-span-2",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Endpoint URL (Optional)"}),e.jsx("input",{className:"input input-bordered input-sm font-mono",placeholder:"wss://... or https://...",value:n.endpoint,onChange:t=>S({...n,endpoint:t.target.value})})]}),e.jsx("div",{className:"form-control sm:col-span-2",children:e.jsxs("label",{className:"label cursor-pointer justify-start gap-4",children:[e.jsx("input",{type:"checkbox",className:"toggle toggle-secondary toggle-sm",checked:n.isPrivate,onChange:t=>S({...n,isPrivate:t.target.checked})}),e.jsx("span",{className:"label-text font-bold text-xs",children:"Private Service (Requires 'private' tag)"})]})}),n.isPrivate&&e.jsxs("div",{className:"form-control sm:col-span-2 fade-in",children:[e.jsx("label",{className:"label text-[10px] font-bold uppercase opacity-50",children:"Authorized Recipients (npubs, comma separated)"}),e.jsx("textarea",{className:"textarea textarea-bordered h-20 text-xs font-mono",placeholder:"npub1..., npub1...",value:n.recipients,onChange:t=>S({...n,recipients:t.target.value})})]})]}),e.jsxs("div",{className:"card-actions justify-end mt-4",children:[e.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>D(!1),children:"Cancel"}),e.jsx("button",{className:Y("btn btn-sm btn-secondary",x&&"loading"),onClick:q,disabled:!n.ownerPubkey,children:"Publish Record"})]})]})}),k&&e.jsx("div",{className:"card bg-base-100 shadow-lg border border-primary/20",children:e.jsxs("div",{className:"card-body p-4",children:[e.jsx("h3",{className:"font-bold text-sm mb-3",children:"Add Identity to Manage"}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 gap-3",children:[e.jsx("input",{className:"input input-bordered input-sm",placeholder:"Label (e.g. My Media Node)",value:v.label,onChange:t=>N({...v,label:t.target.value})}),e.jsx("input",{className:"input input-bordered input-sm font-mono",placeholder:"nsec / npub / hex",value:v.key,onChange:t=>N({...v,key:t.target.value})})]}),e.jsxs("div",{className:"card-actions justify-end mt-2",children:[e.jsx("button",{className:"btn btn-sm btn-ghost",onClick:()=>w(!1),children:"Cancel"}),e.jsx("button",{className:"btn btn-sm btn-primary",onClick:ue,disabled:!v.key,children:"Add"})]})]})}),e.jsxs("div",{className:"grid grid-cols-1 md:grid-cols-2 gap-4",children:[e.jsx("div",{className:"card bg-base-300 border border-base-content/10",children:e.jsxs("div",{className:"card-body p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Pe,{className:"text-success w-4 h-4"}),e.jsx("span",{className:"font-bold text-sm",children:"Primary Account (Active Session)"})]}),e.jsx("div",{className:"badge badge-outline badge-xs",children:s})]}),e.jsx("div",{className:"text-[10px] font-mono opacity-50 truncate",children:a})]})}),i.map(t=>e.jsx("div",{className:"card bg-base-100 border border-base-200",children:e.jsxs("div",{className:"card-body p-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2 min-w-0",children:[e.jsx(Mt,{className:Y("w-4 h-4",t.privkey?"text-warning":"opacity-30")}),e.jsx("span",{className:"font-bold text-sm truncate",dangerouslySetInnerHTML:{__html:Ke(t.label)}})]}),e.jsx("button",{className:"btn btn-ghost btn-xs text-error",onClick:()=>Q(t.pubkey),children:e.jsx(nt,{className:"w-3 h-3"})})]}),e.jsx("div",{className:"text-[10px] font-mono opacity-50 truncate",children:t.pubkey})]})},t.pubkey))]}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h3",{className:"text-sm font-bold opacity-50 uppercase tracking-widest px-1",children:"Found Services"}),u.length===0&&!x&&e.jsxs("div",{className:"text-center p-12 bg-base-200 rounded-box border-2 border-dashed border-base-300",children:[e.jsx(He,{className:"w-12 h-12 mx-auto mb-2 opacity-20"}),e.jsx("p",{className:"opacity-50",children:"No NCC records found for these identities."})]}),e.jsx("div",{className:"grid grid-cols-1 gap-3",children:u.map(t=>{var he;const j=i.find(ce=>ce.pubkey===t.pubkey),A=j?j.label:"Primary",B=((he=t.tags.find(ce=>ce[0]==="d"))==null?void 0:he[1])||"none",$=t.kind===30059&&t.tags.find(ce=>ce[0]==="exp"&&parseInt(ce[1])<Date.now()/1e3),G=t.kind===30059&&Xe(t.tags);return e.jsx("div",{className:Y("card bg-base-100 border shadow-sm",$?"border-error/30":"border-base-200"),children:e.jsxs("div",{className:"card-body p-4",children:[e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{className:"flex flex-col gap-1 min-w-0",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:"badge badge-neutral badge-xs font-bold",dangerouslySetInnerHTML:{__html:Ke(A)}}),e.jsxs("span",{className:"text-sm font-black uppercase",children:["Service: ",e.jsx("span",{dangerouslySetInnerHTML:{__html:Ke(B)}})]}),G&&e.jsx(Ze,{className:"w-3 h-3 text-warning"}),$&&e.jsx("div",{className:"badge badge-error badge-xs",children:"EXPIRED"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("span",{className:"text-[10px] opacity-50",children:["Kind ",t.kind]}),e.jsx("span",{className:"text-[10px] opacity-30 font-mono",children:new Date(t.created_at*1e3).toLocaleString()})]})]}),e.jsx("div",{className:"flex gap-2",children:((j==null?void 0:j.privkey)||t.pubkey===a&&s!=="readonly")&&e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"btn btn-xs btn-outline btn-primary",onClick:()=>Ae(t),disabled:x,children:"Renew"}),e.jsx("button",{className:"btn btn-xs btn-outline",onClick:()=>{T(t),O(t.content)},disabled:x,children:"Edit"})]})})]}),e.jsx("pre",{className:"text-[9px] bg-black text-green-500 p-2 rounded mt-2 overflow-x-auto max-h-24",children:JSON.stringify(t,null,2)})]})},t.id)})})]}),l&&e.jsx("div",{className:"modal modal-open",children:e.jsxs("div",{className:"modal-box max-w-2xl",children:[e.jsx("h3",{className:"font-bold text-lg mb-2",children:"Edit Record Content"}),e.jsxs("p",{className:"text-xs opacity-50 mb-4",children:["Editing Kind ",l.kind," for ",l.pubkey.slice(0,12),"..."]}),e.jsx("textarea",{className:"textarea textarea-bordered w-full h-64 font-mono text-xs",value:P,onChange:t=>O(t.target.value)}),e.jsxs("div",{className:"modal-action",children:[e.jsx("button",{className:"btn btn-ghost",onClick:()=>T(null),children:"Cancel"}),e.jsx("button",{className:Y("btn btn-primary",x&&"loading"),onClick:we,children:"Save Changes"})]})]})})]})}function ds(){const{pool:a,ncc05Resolver:s}=Ne(),{pubkey:E,privkey:y,signEvent:p}=ve(),[h,i]=r.useState(()=>V.load()),[C,v]=r.useState({}),[N,k]=r.useState(""),[w,x]=r.useState(!1),[c,u]=r.useState(!1),[g,l]=r.useState(null),[T,P]=r.useState(null),O=o=>{var d;return Uint8Array.from(((d=o.match(/.{1,2}/g))==null?void 0:d.map(J=>parseInt(J,16)))||[])},_=async()=>{x(!0);const o={};for(const d of h)try{const J=await a.querySync([d],{kinds:[30058,30059],limit:1});o[d]={url:d,lastSeen:Date.now(),status:"online",supportsNCC:J.length>0}}catch{o[d]={url:d,lastSeen:Date.now(),status:"offline",supportsNCC:!1}}v(o),x(!1)};r.useEffect(()=>{_()},[]);const D=async()=>{var J;if(console.log("[Settings] handleAdd called with:",N),!N)return;let o=N.trim();if(o.startsWith("npub")){console.log("[Settings] Detected npub input, starting identity-centric resolution..."),u(!0),l("Fetching authored records...");try{const{data:H}=de.decode(o),se=H,ne={getPublicKey:async()=>E||"",signEvent:async z=>p(z),getConversationKey:async z=>{if(!y)throw new Error("Decryption requires NSEC or active remote signer");return ee.getConversationKey(O(y),z)}};l("Resolving latest locator...");const te=await s.resolveLatest(se,y||ne);if(te&&((J=te.endpoints)==null?void 0:J.length)>0){l(null);const z=te.endpoints.map(ue=>ue.url);P(z)}else{l("Checking public service records...");const z=V.load(),Q=(await a.querySync(z,{kinds:[30059],authors:[se],limit:10})).sort((ie,be)=>be.created_at-ie.created_at)[0],q=Q==null?void 0:Q.tags.filter(ie=>ie[0]==="u").map(ie=>ie[1]);if(q&&q.length>0)P(q);else throw new Error("No valid infrastructure endpoints found for this identity.")}}catch(H){console.error("[Settings] Resolution Error:",H),alert("Resolution failed: "+H.message)}finally{u(!1),l(null),_()}return}let d=o;d.startsWith("ws")||(d=`wss://${d}`),V.add(d),i(V.load()),k(""),_()},n=o=>{V.remove(o),i(V.load())},S=()=>{V.restoreDefaults(),i(V.load()),_()},I=o=>{let d=o;if(d.includes("://")||(d=d.includes(".onion")?`ws://${d}`:`wss://${d}`),d.includes(".onion")&&!d.includes("/bridge?target=")){const J=d;d=`ws://${window.location.host}/bridge?target=${encodeURIComponent(J)}`,console.log(`[Settings] 🧅 Bridging: ${J} -> ${d}`)}V.add(d),i(V.load()),P(null),k(""),_()},L=()=>{P(null),k("")};return e.jsxs("div",{className:"space-y-6",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(Wt,{className:"text-primary w-6 h-6"}),e.jsx("h2",{className:"text-xl font-bold",children:"Network Settings"})]}),e.jsxs("button",{className:Y("btn btn-sm btn-ghost",w&&"loading"),onClick:_,disabled:w,children:[e.jsx(ye,{className:"w-4 h-4 mr-2"})," Refresh Health"]})]}),e.jsx("div",{className:"card bg-base-100 shadow-sm border border-base-200",children:e.jsxs("div",{className:"card-body",children:[e.jsxs("h3",{className:"card-title text-sm opacity-70 uppercase mb-4 flex items-center gap-2",children:[e.jsx(Ft,{className:"w-4 h-4"})," Bootstrap Relays"]}),e.jsx("div",{className:"space-y-3",children:h.map(o=>{const d=C[o];return e.jsxs("div",{className:"flex items-center justify-between p-3 bg-base-200/50 rounded-lg border border-base-300",children:[e.jsxs("div",{className:"flex flex-col min-w-0",children:[e.jsx("span",{className:"font-mono text-xs font-bold truncate",children:o}),e.jsxs("div",{className:"flex items-center gap-2 mt-1",children:[(d==null?void 0:d.status)==="online"?e.jsxs("span",{className:"badge badge-success badge-xs gap-1",children:[e.jsx(Ut,{className:"w-2 h-2"})," Online"]}):(d==null?void 0:d.status)==="offline"?e.jsxs("span",{className:"badge badge-error badge-xs gap-1",children:[e.jsx(Ye,{className:"w-2 h-2"})," Offline"]}):e.jsx("span",{className:"badge badge-ghost badge-xs",children:"Checking..."}),(d==null?void 0:d.supportsNCC)&&e.jsx("span",{className:"badge badge-primary badge-xs",children:"NCC-Ready"})]})]}),e.jsx("button",{className:"btn btn-ghost btn-xs text-error",onClick:()=>n(o),title:"Remove Relay",children:e.jsx(nt,{className:"w-4 h-4"})})]},o)})}),T?e.jsxs("div",{className:"mt-4 p-4 bg-base-200 rounded-box border border-primary/20 fade-in",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h4",{className:"text-xs font-bold uppercase opacity-70",children:"Discovered Endpoints"}),e.jsx("button",{className:"btn btn-xs btn-ghost",onClick:L,children:"Cancel"})]}),e.jsx("div",{className:"space-y-2",children:T.map((o,d)=>e.jsxs("div",{className:"flex items-center justify-between p-2 bg-base-100 rounded border border-base-300",children:[e.jsx("span",{className:"text-[10px] font-mono truncate flex-1 pr-2",children:o}),e.jsx("button",{className:"btn btn-xs btn-primary",onClick:()=>I(o),children:"Add This"})]},d))}),e.jsx("p",{className:"text-[9px] opacity-50 mt-3 italic",children:"Select an endpoint above to add it to your bootstrap list. Onion addresses will be automatically bridged."})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex gap-2 mt-4",children:[e.jsx("input",{className:"input input-bordered input-sm flex-1 font-mono text-xs",placeholder:"wss://... or npub1...",value:N,onChange:o=>k(o.target.value),onKeyDown:o=>o.key==="Enter"&&D(),disabled:c}),e.jsx("button",{className:Y("btn btn-sm btn-primary",c&&"loading"),onClick:D,disabled:c||!N,children:c?"Resolving...":e.jsxs(e.Fragment,{children:[e.jsx(st,{className:"w-4 h-4 mr-1"})," Add"]})})]}),g&&e.jsxs("div",{className:"flex items-center gap-2 mt-2 px-1 text-[10px] text-primary animate-pulse font-bold",children:[e.jsx(ye,{className:"w-3 h-3 animate-spin"}),g]})]}),e.jsx("div",{className:"card-actions justify-start mt-2",children:e.jsx("button",{className:"btn btn-link btn-xs opacity-50",onClick:S,children:"Restore Default Relays"})})]})}),e.jsx("div",{className:"card bg-base-100 shadow-sm border border-base-200",children:e.jsxs("div",{className:"card-body",children:[e.jsxs("h3",{className:"card-title text-sm opacity-70 uppercase mb-4 flex items-center gap-2",children:[e.jsx(tt,{className:"w-4 h-4"})," Security & Protocol"]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex items-center justify-between",children:[e.jsxs("div",{children:[e.jsx("p",{className:"text-sm font-bold",children:"NCC Protocol Version"}),e.jsx("p",{className:"text-xs opacity-50",children:"Current supported schema version"})]}),e.jsx("div",{className:"badge badge-neutral",children:"v1.0"})]}),e.jsxs("div",{className:"alert alert-info py-2 text-[10px] leading-tight",children:[e.jsx(ye,{className:"w-3 h-3 flex-shrink-0"}),e.jsxs("span",{children:["Discovery currently prioritizes relays with the ",e.jsx("b",{children:"NCC-Ready"})," badge. These relays have recently returned valid NCC events."]})]})]})]})})]})}function us(){const{pubkey:a,logout:s,method:E}=ve(),{tracked:y,findTracked:p}=lt(),[h,i]=r.useState("discovery"),[C,v]=r.useState(()=>localStorage.getItem("ncc_active_relay")),[N,k]=r.useState(()=>{const g=localStorage.getItem("ncc_active_service");return g?JSON.parse(g):null}),[w,x]=r.useState(null);r.useEffect(()=>{const g=async()=>{try{const T=new WebSocket(`ws://${window.location.host}/bridge?target=internal-ping`),P=setTimeout(()=>T.close(),2e3);T.onopen=()=>{clearTimeout(P),x(!0),T.close()},T.onerror=()=>{clearTimeout(P),x(!1)}}catch{x(!1)}};g();const l=setInterval(g,3e4);return()=>clearInterval(l)},[]);const c=(g,l)=>{if(v(g),localStorage.setItem("ncc_active_relay",g),l){const T={pubkey:l.pubkey,serviceId:l.id};k(T),localStorage.setItem("ncc_active_service",JSON.stringify(T))}i("feed")},u=()=>{s(),v(null),k(null),localStorage.removeItem("ncc_active_relay"),localStorage.removeItem("ncc_active_service")};return r.useEffect(()=>{var T,P;if(!N||!C)return;const g=p(N.pubkey,N.serviceId);if(!g)return;let l=(T=g.decryptedPayload)==null?void 0:T.endpoints;if(!l&&((P=g.latestEvent)!=null&&P.content.startsWith("{")))try{l=JSON.parse(g.latestEvent.content).endpoints}catch(O){console.error("Failed to parse NCC-05 content",O)}if(l&&l.length>0){const O=[...l].sort((D,n)=>D.priority-n.priority)[0];let _=O.url||O.uri;if(_.includes("://")||(_=_.includes(".onion")?`ws://${_}`:`wss://${_}`),_.startsWith("http")&&(_=_.replace("http","ws")),C.includes("/bridge?target=")){const D=decodeURIComponent(new URL(C).searchParams.get("target")||"");if(_!==D){const n=`ws://${window.location.host}/bridge?target=${encodeURIComponent(_)}`;console.log(`🚀 NCC Auto-Update: Relay endpoint changed from ${D} to ${_} (via Bridge)`),v(n),localStorage.setItem("ncc_active_relay",n)}}else _!==C&&(console.log(`🚀 NCC Auto-Update: Relay endpoint changed from ${C} to ${_}`),v(_),localStorage.setItem("ncc_active_relay",_))}},[y,N,C]),a?e.jsxs("div",{className:"min-h-screen bg-base-200",children:[e.jsxs("div",{className:"navbar bg-base-100 shadow-sm px-4",children:[e.jsx("div",{className:"flex-1",children:e.jsxs("a",{className:"btn btn-ghost text-xl gap-2",children:[e.jsx(Jt,{className:"text-primary"}),"NCC Client ",e.jsx("span",{className:"text-xs opacity-50 font-normal",children:"PoC"})]})}),e.jsxs("div",{className:"flex-none gap-4",children:[e.jsxs("div",{className:`badge badge-sm gap-1 hidden sm:flex ${w===!0?"badge-success":w===!1?"badge-error":"badge-ghost"}`,children:[e.jsx("div",{className:`w-1.5 h-1.5 rounded-full ${w===!0?"bg-success-content animate-pulse":"bg-base-content opacity-30"}`}),w===!0?"Bridge":"Bridge Offline"]}),C&&e.jsxs("div",{className:"badge badge-success gap-2 hidden sm:flex",children:[e.jsx(et,{className:"w-3 h-3"}),C.includes("target=")?"Bridged Onion":C]}),e.jsxs("div",{className:"flex flex-col items-end text-xs hidden sm:flex",children:[e.jsx("span",{className:"opacity-70",children:E==="readonly"?"Read Only":"Authenticated"}),e.jsxs("span",{className:"font-mono",children:[a.slice(0,8),"...",a.slice(-4)]})]}),e.jsx("button",{className:"btn btn-ghost btn-circle",onClick:u,title:"Logout",children:e.jsx(qt,{className:"w-5 h-5"})})]})]}),e.jsxs("div",{className:"container mx-auto p-4 max-w-4xl",children:[e.jsxs("div",{role:"tablist",className:"tabs tabs-boxed mb-6 bg-base-100 p-2 overflow-x-auto flex-nowrap",children:[e.jsx("a",{role:"tab",className:Y("tab",h==="discovery"&&"tab-active"),onClick:()=>i("discovery"),children:"Discovery (02+05)"}),e.jsxs("a",{role:"tab",className:Y("tab",h==="feed"&&"tab-active"),onClick:()=>i("feed"),children:["Feed ",C&&"🟢"]}),e.jsx("a",{role:"tab",className:Y("tab",h==="trust"&&"tab-active"),onClick:()=>i("trust"),children:"Trust Explorer"}),e.jsx("a",{role:"tab",className:Y("tab",h==="inventory"&&"tab-active"),onClick:()=>i("inventory"),children:"My Inventory"}),e.jsx("a",{role:"tab",className:Y("tab",h==="settings"&&"tab-active"),onClick:()=>i("settings"),children:"Settings"})]}),e.jsxs("div",{className:"fade-in",children:[h==="discovery"&&e.jsx(as,{onConnect:c}),h==="feed"&&e.jsx(rs,{relayUrl:C}),h==="trust"&&e.jsx(cs,{}),h==="inventory"&&e.jsx(ls,{}),h==="settings"&&e.jsx(ds,{})]})]})]}):e.jsx("div",{className:"min-h-screen bg-base-200 flex items-center justify-center p-4",children:e.jsx(Zt,{})})}function ms(){return e.jsx(Xt,{children:e.jsx(Yt,{children:e.jsx(ns,{children:e.jsx(es,{children:e.jsx(ts,{children:e.jsx(us,{})})})})})})}Me.createRoot(document.getElementById("root")).render(e.jsx(ht.StrictMode,{children:e.jsx(ms,{})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}:root,[data-theme]{background-color:var(--fallback-b1,oklch(var(--b1)/1));color:var(--fallback-bc,oklch(var(--bc)/1))}@supports not (color: oklch(0% 0 0)){:root{color-scheme:light;--fallback-p: #491eff;--fallback-pc: #d4dbff;--fallback-s: #ff41c7;--fallback-sc: #fff9fc;--fallback-a: #00cfbd;--fallback-ac: #00100d;--fallback-n: #2b3440;--fallback-nc: #d7dde4;--fallback-b1: #ffffff;--fallback-b2: #e5e6e6;--fallback-b3: #e5e6e6;--fallback-bc: #1f2937;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--fallback-p: #7582ff;--fallback-pc: #050617;--fallback-s: #ff71cf;--fallback-sc: #190211;--fallback-a: #00c7b5;--fallback-ac: #000e0c;--fallback-n: #2a323c;--fallback-nc: #a6adbb;--fallback-b1: #1d232a;--fallback-b2: #191e24;--fallback-b3: #15191e;--fallback-bc: #a6adbb;--fallback-in: #00b3f0;--fallback-inc: #000000;--fallback-su: #00ca92;--fallback-suc: #000000;--fallback-wa: #ffc22d;--fallback-wac: #000000;--fallback-er: #ff6f70;--fallback-erc: #000000}}}html{-webkit-tap-highlight-color:transparent}*{scrollbar-color:color-mix(in oklch,currentColor 35%,transparent) transparent}*:hover{scrollbar-color:color-mix(in oklch,currentColor 60%,transparent) transparent}:root{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}@media (prefers-color-scheme: dark){:root{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}}[data-theme=light]{color-scheme:light;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 89.824% .06192 275.75;--ac: 15.352% .0368 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 49.12% .3096 275.75;--s: 69.71% .329 342.55;--sc: 98.71% .0106 342.55;--a: 76.76% .184 183.61;--n: 32.1785% .02476 255.701624;--nc: 89.4994% .011585 252.096176;--b1: 100% 0 0;--b2: 96.1151% 0 0;--b3: 92.4169% .00108 197.137559;--bc: 27.8078% .029596 256.847952}[data-theme=dark]{color-scheme:dark;--in: 72.06% .191 231.6;--su: 64.8% .15 160;--wa: 84.71% .199 83.87;--er: 71.76% .221 22.18;--pc: 13.138% .0392 275.75;--sc: 14.96% .052 342.55;--ac: 14.902% .0334 183.61;--inc: 0% 0 0;--suc: 0% 0 0;--wac: 0% 0 0;--erc: 0% 0 0;--rounded-box: 1rem;--rounded-btn: .5rem;--rounded-badge: 1.9rem;--animation-btn: .25s;--animation-input: .2s;--btn-focus-scale: .95;--border-btn: 1px;--tab-border: 1px;--tab-radius: .5rem;--p: 65.69% .196 275.75;--s: 74.8% .26 342.55;--a: 74.51% .167 183.61;--n: 31.3815% .021108 254.139175;--nc: 74.6477% .0216 264.435964;--b1: 25.3267% .015896 252.417568;--b2: 23.2607% .013807 253.100675;--b3: 21.1484% .01165 254.087939;--bc: 74.6477% .0216 264.435964}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.alert{display:grid;width:100%;grid-auto-flow:row;align-content:flex-start;align-items:center;justify-items:center;gap:1rem;text-align:center;border-radius:var(--rounded-box, 1rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));padding:1rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-b2,oklch(var(--b2)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1));background-color:var(--alert-bg)}@media (min-width: 640px){.alert{grid-auto-flow:column;grid-template-columns:auto minmax(auto,1fr);justify-items:start;text-align:start}}.avatar{position:relative;display:inline-flex}.avatar>div{display:block;aspect-ratio:1 / 1;overflow:hidden}.avatar img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.avatar.placeholder>div{display:flex;align-items:center;justify-content:center}.badge{display:inline-flex;align-items:center;justify-content:center;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;height:1.25rem;font-size:.875rem;line-height:1.25rem;width:-moz-fit-content;width:fit-content;padding-left:.563rem;padding-right:.563rem;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}@media (hover:hover){.label a:hover{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.tab:hover{--tw-text-opacity: 1}.tabs-boxed :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):hover,.tabs-boxed :is(input:checked):hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}}.btn{display:inline-flex;height:3rem;min-height:3rem;flex-shrink:0;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-wrap:wrap;align-items:center;justify-content:center;border-radius:var(--rounded-btn, .5rem);border-color:transparent;border-color:oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity));padding-left:1rem;padding-right:1rem;text-align:center;font-size:.875rem;line-height:1em;gap:.5rem;font-weight:600;text-decoration-line:none;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);border-width:var(--border-btn, 1px);transition-property:color,background-color,border-color,opacity,box-shadow,transform;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:var(--fallback-bc,oklch(var(--bc)/1));background-color:oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity));--tw-bg-opacity: 1;--tw-border-opacity: 1}.btn-disabled,.btn[disabled],.btn:disabled{pointer-events:none}.btn-circle{height:3rem;width:3rem;border-radius:9999px;padding:0}:where(.btn:is(input[type=checkbox])),:where(.btn:is(input[type=radio])){width:auto;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn:is(input[type=checkbox]):after,.btn:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.card{position:relative;display:flex;flex-direction:column;border-radius:var(--rounded-box, 1rem)}.card:focus{outline:2px solid transparent;outline-offset:2px}.card-body{display:flex;flex:1 1 auto;flex-direction:column;padding:var(--padding-card, 2rem);gap:.5rem}.card-body :where(p){flex-grow:1}.card-actions{display:flex;flex-wrap:wrap;align-items:flex-start;gap:.5rem}.card figure{display:flex;align-items:center;justify-content:center}.card.image-full{display:grid}.card.image-full:before{position:relative;content:"";z-index:10;border-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));opacity:.75}.card.image-full:before,.card.image-full>*{grid-column-start:1;grid-row-start:1}.card.image-full>figure img{height:100%;-o-object-fit:cover;object-fit:cover}.card.image-full>.card-body{position:relative;z-index:20;--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.checkbox{flex-shrink:0;--chkbg: var(--fallback-bc,oklch(var(--bc)/1));--chkfg: var(--fallback-b1,oklch(var(--b1)/1));height:1.5rem;width:1.5rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2}.collapse:not(td):not(tr):not(colgroup){visibility:visible}.collapse{position:relative;display:grid;overflow:hidden;grid-template-rows:max-content 0fr;transition:grid-template-rows .2s;width:100%;border-radius:var(--rounded-box, 1rem)}.collapse-title,.collapse>input[type=checkbox],.collapse>input[type=radio],.collapse-content{grid-column-start:1;grid-row-start:1}.collapse>input[type=checkbox],.collapse>input[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0}:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){height:100%;width:100%;z-index:1}.collapse-content{visibility:hidden;grid-column-start:1;grid-row-start:2;min-height:0px;transition:visibility .2s;transition:padding .2s ease-out,background-color .2s ease-out;padding-left:1rem;padding-right:1rem;cursor:unset}.collapse[open],.collapse-open,.collapse:focus:not(.collapse-close){grid-template-rows:max-content 1fr}.collapse:not(.collapse-close):has(>input[type=checkbox]:checked),.collapse:not(.collapse-close):has(>input[type=radio]:checked){grid-template-rows:max-content 1fr}.collapse[open]>.collapse-content,.collapse-open>.collapse-content,.collapse:focus:not(.collapse-close)>.collapse-content,.collapse:not(.collapse-close)>input[type=checkbox]:checked~.collapse-content,.collapse:not(.collapse-close)>input[type=radio]:checked~.collapse-content{visibility:visible;min-height:-moz-fit-content;min-height:fit-content}.divider{display:flex;flex-direction:row;align-items:center;align-self:stretch;margin-top:1rem;margin-bottom:1rem;height:1rem;white-space:nowrap}.divider:before,.divider:after{height:.125rem;width:100%;flex-grow:1;--tw-content: "";content:var(--tw-content);background-color:var(--fallback-bc,oklch(var(--bc)/.1))}@media (hover: hover){.btm-nav>*.disabled:hover,.btm-nav>*[disabled]:hover{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:hover{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn:hover{background-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-bg-opacity, 1)) 90%,black);border-color:color-mix(in oklab,oklch(var(--btn-color, var(--b2)) / var(--tw-border-opacity, 1)) 90%,black)}}@supports not (color: oklch(0% 0 0)){.btn:hover{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}}.btn.glass:hover{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost:hover{border-color:transparent}@supports (color: oklch(0% 0 0)){.btn-ghost:hover{background-color:var(--fallback-bc,oklch(var(--bc)/.2))}}.btn-link:hover{border-color:transparent;background-color:transparent;text-decoration-line:underline}.btn-outline:hover{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary:hover{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary:hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.btn-outline.btn-secondary:hover{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-secondary:hover{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}}.btn-outline.btn-accent:hover{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-accent:hover{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}}.btn-outline.btn-success:hover{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-success:hover{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}}.btn-outline.btn-info:hover{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-info:hover{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}}.btn-outline.btn-warning:hover{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-warning:hover{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}}.btn-outline.btn-error:hover{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-error:hover{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn-disabled:hover,.btn[disabled]:hover,.btn:disabled:hover{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}@supports (color: color-mix(in oklab,black,black)){.btn:is(input[type=checkbox]:checked):hover,.btn:is(input[type=radio]:checked):hover{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}}.tab[disabled],.tab[disabled]:hover{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}}.form-control{display:flex;flex-direction:column}.label{display:flex;-webkit-user-select:none;-moz-user-select:none;user-select:none;align-items:center;justify-content:space-between;padding:.5rem .25rem}.input{flex-shrink:1;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;padding-left:1rem;padding-right:1rem;font-size:1rem;line-height:2;line-height:1.5rem;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.input[type=number]::-webkit-inner-spin-button,.input-md[type=number]::-webkit-inner-spin-button{margin-top:-1rem;margin-bottom:-1rem;margin-inline-end:-1rem}.input-sm[type=number]::-webkit-inner-spin-button{margin-top:0;margin-bottom:0;margin-inline-end:-0px}.join{display:inline-flex;align-items:stretch;border-radius:var(--rounded-btn, .5rem)}.join :where(.join-item){border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:not(:first-child):not(:last-child),.join *:not(:first-child):not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0;border-end-start-radius:0;border-start-start-radius:0}.join .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .join-item{border-start-end-radius:0;border-end-end-radius:0}.join .dropdown .join-item:first-child:not(:last-child),.join *:first-child:not(:last-child) .dropdown .join-item{border-start-end-radius:inherit;border-end-end-radius:inherit}.join :where(.join-item:first-child:not(:last-child)),.join :where(*:first-child:not(:last-child) .join-item){border-end-start-radius:inherit;border-start-start-radius:inherit}.join .join-item:last-child:not(:first-child),.join *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0}.join :where(.join-item:last-child:not(:first-child)),.join :where(*:last-child:not(:first-child) .join-item){border-start-end-radius:inherit;border-end-end-radius:inherit}@supports not selector(:has(*)){:where(.join *){border-radius:inherit}}@supports selector(:has(*)){:where(.join *:has(.join-item)){border-radius:inherit}}.link{cursor:pointer;text-decoration-line:underline}.menu li.disabled{cursor:not-allowed;-webkit-user-select:none;-moz-user-select:none;user-select:none;color:var(--fallback-bc,oklch(var(--bc)/.3))}:where(.menu li) .badge{justify-self:end}.modal{pointer-events:none;position:fixed;top:0;right:0;bottom:0;left:0;margin:0;display:grid;height:100%;max-height:none;width:100%;max-width:none;justify-items:center;padding:0;opacity:0;overscroll-behavior:contain;z-index:999;background-color:transparent;color:inherit;transition-duration:.2s;transition-timing-function:cubic-bezier(0,0,.2,1);transition-property:transform,opacity,visibility;overflow-y:hidden}:where(.modal){align-items:center}.modal-box{max-height:calc(100vh - 5em);grid-column-start:1;grid-row-start:1;width:91.666667%;max-width:32rem;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));padding:1.5rem;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.2s;box-shadow:#00000040 0 25px 50px -12px;overflow-y:auto;overscroll-behavior:contain}.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open]{pointer-events:auto;visibility:visible;opacity:1}.modal-action{display:flex;margin-top:1.5rem;justify-content:flex-end}:root:has(:is(.modal-open,.modal:target,.modal-toggle:checked+.modal,.modal[open])){overflow:hidden;scrollbar-gutter:stable}.navbar{display:flex;align-items:center;padding:var(--navbar-padding, .5rem);min-height:4rem;width:100%}:where(.navbar>*:not(script,style)){display:inline-flex;align-items:center}.select{display:inline-flex;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;height:3rem;min-height:3rem;padding-inline-start:1rem;padding-inline-end:2.5rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)));background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 20px) calc(1px + 50%),calc(100% - 16.1px) calc(1px + 50%);background-size:4px 4px,4px 4px;background-repeat:no-repeat}.select[multiple]{height:auto}.steps .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-columns:auto;grid-template-rows:repeat(2,minmax(0,1fr));grid-template-rows:40px 1fr;place-items:center;text-align:center;min-width:4rem}.tabs{display:grid;align-items:flex-end}.tabs-lifted:has(.tab-content[class^=rounded-]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])),.tabs-lifted:has(.tab-content[class*=" rounded-"]) .tab:first-child:not(:is(.tab-active,[aria-selected=true])){border-bottom-color:transparent}.tab{position:relative;grid-row-start:1;display:inline-flex;height:2rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-appearance:none;-moz-appearance:none;appearance:none;flex-wrap:wrap;align-items:center;justify-content:center;text-align:center;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem;--tw-text-opacity: .5;--tab-color: var(--fallback-bc,oklch(var(--bc)/1));--tab-bg: var(--fallback-b1,oklch(var(--b1)/1));--tab-border-color: var(--fallback-b3,oklch(var(--b3)/1));color:var(--tab-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem)}.tab:is(input[type=radio]){width:auto;border-bottom-right-radius:0;border-bottom-left-radius:0}.tab:is(input[type=radio]):after{--tw-content: attr(aria-label);content:var(--tw-content)}.tab:not(input):empty{cursor:default;grid-column-start:span 9999}:checked+.tab-content:nth-child(2),:is(.tab-active,[aria-selected=true])+.tab-content:nth-child(2){border-start-start-radius:0px}input.tab:checked+.tab-content,:is(.tab-active,[aria-selected=true])+.tab-content{display:block}.textarea{min-height:3rem;flex-shrink:1;padding:.5rem 1rem;font-size:.875rem;line-height:1.25rem;line-height:2;border-radius:var(--rounded-btn, .5rem);border-width:1px;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.toggle{flex-shrink:0;--tglbg: var(--fallback-b1,oklch(var(--b1)/1));--handleoffset: 1.5rem;--handleoffsetcalculator: calc(var(--handleoffset) * -1);--togglehandleborder: 0 0;height:1.5rem;width:3rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:var(--rounded-badge, 1.9rem);border-width:1px;border-color:currentColor;background-color:currentColor;color:var(--fallback-bc,oklch(var(--bc)/.5));transition:background,box-shadow var(--animation-input, .2s) ease-out;box-shadow:var(--handleoffsetcalculator) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset,var(--togglehandleborder)}.alert-info{border-color:var(--fallback-in,oklch(var(--in)/.2));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-in,oklch(var(--in)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.alert-error{border-color:var(--fallback-er,oklch(var(--er)/.2));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));--alert-bg: var(--fallback-er,oklch(var(--er)/1));--alert-bg-mix: var(--fallback-b1,oklch(var(--b1)/1))}.avatar-group :where(.avatar){overflow:hidden;border-radius:9999px;border-width:4px;--tw-border-opacity: 1;border-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-border-opacity)))}.badge-neutral{--tw-border-opacity: 1;border-color:var(--fallback-n,oklch(var(--n)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.badge-primary{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.badge-secondary{--tw-border-opacity: 1;border-color:var(--fallback-s,oklch(var(--s)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.badge-accent{--tw-border-opacity: 1;border-color:var(--fallback-a,oklch(var(--a)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-a,oklch(var(--a)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.badge-info{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-in,oklch(var(--in)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.badge-success{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.badge-warning{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.badge-error{border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-er,oklch(var(--er)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.badge-ghost{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.badge-outline{border-color:currentColor;--tw-border-opacity: .5;background-color:transparent;color:currentColor}.badge-outline.badge-neutral{--tw-text-opacity: 1;color:var(--fallback-n,oklch(var(--n)/var(--tw-text-opacity)))}.badge-outline.badge-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.badge-outline.badge-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.badge-outline.badge-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.badge-outline.badge-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.badge-outline.badge-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.badge-outline.badge-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.badge-outline.badge-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btm-nav>*:where(.active){border-top-width:2px;--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity)))}.btm-nav>*.disabled,.btm-nav>*[disabled]{pointer-events:none;--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btm-nav>* .label{font-size:1rem;line-height:1.5rem}@media (prefers-reduced-motion: no-preference){.btn{animation:button-pop var(--animation-btn, .25s) ease-out}}.btn:active:hover,.btn:active:focus{animation:button-pop 0s ease-out;transform:scale(var(--btn-focus-scale, .97))}@supports not (color: oklch(0% 0 0)){.btn{background-color:var(--btn-color, var(--fallback-b2));border-color:var(--btn-color, var(--fallback-b2))}.btn-primary{--btn-color: var(--fallback-p)}.btn-secondary{--btn-color: var(--fallback-s)}.btn-accent{--btn-color: var(--fallback-a)}.btn-neutral{--btn-color: var(--fallback-n)}.btn-success{--btn-color: var(--fallback-su)}.btn-error{--btn-color: var(--fallback-er)}}@supports (color: color-mix(in oklab,black,black)){.btn-outline.btn-primary.btn-active{background-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-p,oklch(var(--p)/1)) 90%,black)}.btn-outline.btn-secondary.btn-active{background-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-s,oklch(var(--s)/1)) 90%,black)}.btn-outline.btn-accent.btn-active{background-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-a,oklch(var(--a)/1)) 90%,black)}.btn-outline.btn-success.btn-active{background-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-su,oklch(var(--su)/1)) 90%,black)}.btn-outline.btn-info.btn-active{background-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-in,oklch(var(--in)/1)) 90%,black)}.btn-outline.btn-warning.btn-active{background-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-wa,oklch(var(--wa)/1)) 90%,black)}.btn-outline.btn-error.btn-active{background-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black);border-color:color-mix(in oklab,var(--fallback-er,oklch(var(--er)/1)) 90%,black)}}.btn:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px}.btn-primary{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)));outline-color:var(--fallback-p,oklch(var(--p)/1))}@supports (color: oklch(0% 0 0)){.btn-primary{--btn-color: var(--p)}.btn-secondary{--btn-color: var(--s)}.btn-accent{--btn-color: var(--a)}.btn-neutral{--btn-color: var(--n)}.btn-success{--btn-color: var(--su)}.btn-error{--btn-color: var(--er)}}.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)));outline-color:var(--fallback-s,oklch(var(--s)/1))}.btn-accent{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)));outline-color:var(--fallback-a,oklch(var(--a)/1))}.btn-neutral{--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)));outline-color:var(--fallback-n,oklch(var(--n)/1))}.btn-success{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)));outline-color:var(--fallback-su,oklch(var(--su)/1))}.btn-error{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)));outline-color:var(--fallback-er,oklch(var(--er)/1))}.btn.glass{--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn.glass.btn-active{--glass-opacity: 25%;--glass-border-opacity: 15%}.btn-ghost{border-width:1px;border-color:transparent;background-color:transparent;color:currentColor;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-ghost.btn-active{border-color:transparent;background-color:var(--fallback-bc,oklch(var(--bc)/.2))}.btn-link{border-color:transparent;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)));text-decoration-line:underline;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow);outline-color:currentColor}.btn-link.btn-active{border-color:transparent;background-color:transparent;text-decoration-line:underline}.btn-outline{border-color:currentColor;background-color:transparent;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.btn-outline.btn-active{--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-b1,oklch(var(--b1)/var(--tw-text-opacity)))}.btn-outline.btn-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity)))}.btn-outline.btn-primary.btn-active{--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn-outline.btn-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity)))}.btn-outline.btn-secondary.btn-active{--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.btn-outline.btn-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity)))}.btn-outline.btn-accent.btn-active{--tw-text-opacity: 1;color:var(--fallback-ac,oklch(var(--ac)/var(--tw-text-opacity)))}.btn-outline.btn-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity)))}.btn-outline.btn-success.btn-active{--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.btn-outline.btn-info{--tw-text-opacity: 1;color:var(--fallback-in,oklch(var(--in)/var(--tw-text-opacity)))}.btn-outline.btn-info.btn-active{--tw-text-opacity: 1;color:var(--fallback-inc,oklch(var(--inc)/var(--tw-text-opacity)))}.btn-outline.btn-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity)))}.btn-outline.btn-warning.btn-active{--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.btn-outline.btn-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity)))}.btn-outline.btn-error.btn-active{--tw-text-opacity: 1;color:var(--fallback-erc,oklch(var(--erc)/var(--tw-text-opacity)))}.btn.btn-disabled,.btn[disabled],.btn:disabled{--tw-border-opacity: 0;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-bg-opacity: .2;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.btn:is(input[type=checkbox]:checked),.btn:is(input[type=radio]:checked){--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.btn:is(input[type=checkbox]:checked):focus-visible,.btn:is(input[type=radio]:checked):focus-visible{outline-color:var(--fallback-p,oklch(var(--p)/1))}@keyframes button-pop{0%{transform:scale(var(--btn-focus-scale, .98))}40%{transform:scale(1.02)}to{transform:scale(1)}}.card :where(figure:first-child){overflow:hidden;border-start-start-radius:inherit;border-start-end-radius:inherit;border-end-start-radius:unset;border-end-end-radius:unset}.card :where(figure:last-child){overflow:hidden;border-start-start-radius:unset;border-start-end-radius:unset;border-end-start-radius:inherit;border-end-end-radius:inherit}.card:focus-visible{outline:2px solid currentColor;outline-offset:2px}.card.bordered{border-width:1px;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)))}.card.compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-title{display:flex;align-items:center;gap:.5rem;font-size:1.25rem;line-height:1.75rem;font-weight:600}.card.image-full :where(figure){overflow:hidden;border-radius:inherit}.checkbox:focus{box-shadow:none}.checkbox:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.checkbox:disabled{border-width:0px;cursor:not-allowed;border-color:transparent;--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));opacity:.2}.checkbox:checked,.checkbox[aria-checked=true]{background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-color:var(--chkbg);background-image:linear-gradient(-45deg,transparent 65%,var(--chkbg) 65.99%),linear-gradient(45deg,transparent 75%,var(--chkbg) 75.99%),linear-gradient(-45deg,var(--chkbg) 40%,transparent 40.99%),linear-gradient(45deg,var(--chkbg) 30%,var(--chkfg) 30.99%,var(--chkfg) 40%,transparent 40.99%),linear-gradient(-45deg,var(--chkfg) 50%,var(--chkbg) 50.99%)}.checkbox:indeterminate{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity)));background-repeat:no-repeat;animation:checkmark var(--animation-input, .2s) ease-out;background-image:linear-gradient(90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(-90deg,transparent 80%,var(--chkbg) 80%),linear-gradient(0deg,var(--chkbg) 43%,var(--chkfg) 43%,var(--chkfg) 57%,var(--chkbg) 57%)}@keyframes checkmark{0%{background-position-y:5px}50%{background-position-y:-2px}to{background-position-y:0}}details.collapse{width:100%}details.collapse summary{position:relative;display:block;outline:2px solid transparent;outline-offset:2px}details.collapse summary::-webkit-details-marker{display:none}.collapse:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse:has(.collapse-title:focus-visible),.collapse:has(>input[type=checkbox]:focus-visible),.collapse:has(>input[type=radio]:focus-visible){outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/1))}.collapse-arrow>.collapse-title:after{position:absolute;display:block;height:.5rem;width:.5rem;--tw-translate-y: -100%;--tw-rotate: 45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.15s;transition-duration:.2s;top:1.9rem;inset-inline-end:1.4rem;content:"";transform-origin:75% 75%;box-shadow:2px 2px;pointer-events:none}.collapse-plus>.collapse-title:after{position:absolute;display:block;height:.5rem;width:.5rem;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1);transition-duration:.3s;top:.9rem;inset-inline-end:1.4rem;content:"+";pointer-events:none}.collapse:not(.collapse-open):not(.collapse-close)>input[type=checkbox],.collapse:not(.collapse-open):not(.collapse-close)>input[type=radio]:not(:checked),.collapse:not(.collapse-open):not(.collapse-close)>.collapse-title{cursor:pointer}.collapse:focus:not(.collapse-open):not(.collapse-close):not(.collapse[open])>.collapse-title{cursor:unset}.collapse-title{position:relative}.collapse-title,:where(.collapse>input[type=checkbox]),:where(.collapse>input[type=radio]){padding:1rem;padding-inline-end:3rem;min-height:3.75rem;transition:background-color .2s ease-out}.collapse[open]>:where(.collapse-content),.collapse-open>:where(.collapse-content),.collapse:focus:not(.collapse-close)>:where(.collapse-content),.collapse:not(.collapse-close)>:where(input[type=checkbox]:checked~.collapse-content),.collapse:not(.collapse-close)>:where(input[type=radio]:checked~.collapse-content){padding-bottom:1rem;transition:padding .2s ease-out,background-color .2s ease-out}.collapse[open].collapse-arrow>.collapse-title:after,.collapse-open.collapse-arrow>.collapse-title:after,.collapse-arrow:focus:not(.collapse-close)>.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-arrow:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{--tw-translate-y: -50%;--tw-rotate: 225deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse[open].collapse-plus>.collapse-title:after,.collapse-open.collapse-plus>.collapse-title:after,.collapse-plus:focus:not(.collapse-close)>.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=checkbox]:checked~.collapse-title:after,.collapse-plus:not(.collapse-close)>input[type=radio]:checked~.collapse-title:after{content:"−"}.divider:not(:empty){gap:1rem}.label-text{font-size:.875rem;line-height:1.25rem;--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.input input{--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));background-color:transparent}.input input:focus{outline:2px solid transparent;outline-offset:2px}.input[list]::-webkit-calendar-picker-indicator{line-height:1em}.input-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:focus,.input:focus-within{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.input:has(>input[disabled]),.input-disabled,.input:disabled,.input[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.input:has(>input[disabled])::-moz-placeholder,.input-disabled::-moz-placeholder,.input:disabled::-moz-placeholder,.input[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])::placeholder,.input-disabled::placeholder,.input:disabled::placeholder,.input[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.input:has(>input[disabled])>input[disabled]{cursor:not-allowed}.input::-webkit-date-and-time-value{text-align:inherit}.join>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1)}.link:focus{outline:2px solid transparent;outline-offset:2px}.link:focus-visible{outline:2px solid currentColor;outline-offset:2px}.\!loading{pointer-events:none!important;display:inline-block!important;aspect-ratio:1 / 1!important;width:1.5rem!important;background-color:currentColor!important;-webkit-mask-size:100%!important;mask-size:100%!important;-webkit-mask-repeat:no-repeat!important;mask-repeat:no-repeat!important;-webkit-mask-position:center!important;mask-position:center!important;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important;mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")!important}.loading{pointer-events:none;display:inline-block;aspect-ratio:1 / 1;width:1.5rem;background-color:currentColor;-webkit-mask-size:100%;mask-size:100%;-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-spinner{-webkit-mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E");mask-image:url("data:image/svg+xml,%3Csvg width='24' height='24' stroke='black' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cg transform-origin='center'%3E%3Ccircle cx='12' cy='12' r='9.5' fill='none' stroke-width='3' stroke-linecap='round'%3E%3CanimateTransform attributeName='transform' type='rotate' from='0 12 12' to='360 12 12' dur='2s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dasharray' values='0,150;42,150;42,150' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3Canimate attributeName='stroke-dashoffset' values='0;-16;-59' keyTimes='0;0.475;1' dur='1.5s' repeatCount='indefinite'/%3E%3C/circle%3E%3C/g%3E%3C/svg%3E")}.loading-lg{width:2.5rem}.menu li>*:not(ul,.menu-title,details,.btn):active,.menu li>*:not(ul,.menu-title,details,.btn).active,.menu li>details>summary:active{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity)))}.mockup-browser .mockup-browser-toolbar .input{position:relative;margin-left:auto;margin-right:auto;display:block;height:1.75rem;width:24rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding-left:2rem;direction:ltr}.mockup-browser .mockup-browser-toolbar .input:before{content:"";position:absolute;left:.5rem;top:50%;aspect-ratio:1 / 1;height:.75rem;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:2px;border-color:currentColor;opacity:.6}.mockup-browser .mockup-browser-toolbar .input:after{content:"";position:absolute;left:1.25rem;top:50%;height:.5rem;--tw-translate-y: 25%;--tw-rotate: -45deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-radius:9999px;border-width:1px;border-color:currentColor;opacity:.6}.modal:not(dialog:not(.modal-open)),.modal::backdrop{background-color:#0006;animation:modal-pop .2s ease-out}.modal-open .modal-box,.modal-toggle:checked+.modal .modal-box,.modal:target .modal-box,.modal[open] .modal-box{--tw-translate-y: 0px;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.modal-action>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.modal-action:where([dir=rtl],[dir=rtl] *)>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 1}@keyframes modal-pop{0%{opacity:0}}@keyframes progress-loading{50%{background-position-x:-115%}}@keyframes radiomark{0%{box-shadow:0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 12px var(--fallback-b1,oklch(var(--b1)/1)) inset}50%{box-shadow:0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 3px var(--fallback-b1,oklch(var(--b1)/1)) inset}to{box-shadow:0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset,0 0 0 4px var(--fallback-b1,oklch(var(--b1)/1)) inset}}@keyframes rating-pop{0%{transform:translateY(-.125em)}40%{transform:translateY(-.125em)}to{transform:translateY(0)}}.select-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.select-disabled,.select:disabled,.select[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.select-disabled::-moz-placeholder,.select:disabled::-moz-placeholder,.select[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-disabled::placeholder,.select:disabled::placeholder,.select[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.select-multiple,.select[multiple],.select[size].select:not([size="1"]){background-image:none;padding-right:1rem}[dir=rtl] .select{background-position:calc(0% + 12px) calc(1px + 50%),calc(0% + 16px) calc(1px + 50%)}@keyframes skeleton{0%{background-position:150%}to{background-position:-50%}}.steps .step:before{top:0;grid-column-start:1;grid-row-start:1;height:.5rem;width:100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));content:"";margin-inline-start:-100%}.steps .step:after{content:counter(step);counter-increment:step;z-index:1;position:relative;grid-column-start:1;grid-row-start:1;display:grid;height:2rem;width:2rem;place-items:center;place-self:center;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}.steps .step:first-child:before{content:none}.steps .step[data-content]:after{content:attr(data-content)}.tabs-lifted>.tab:focus-visible{border-end-end-radius:0;border-end-start-radius:0}.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tab:is(input:checked){border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: 1;--tw-text-opacity: 1}.tab:focus{outline:2px solid transparent;outline-offset:2px}.tab:focus-visible{outline:2px solid currentColor;outline-offset:-5px}.tab-disabled,.tab[disabled]{cursor:not-allowed;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));--tw-text-opacity: .2}.tabs-bordered>.tab{border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));--tw-border-opacity: .2;border-style:solid;border-bottom-width:calc(var(--tab-border, 1px) + 1px)}.tabs-lifted>.tab{border:var(--tab-border, 1px) solid transparent;border-width:0 0 var(--tab-border, 1px) 0;border-start-start-radius:var(--tab-radius, .5rem);border-start-end-radius:var(--tab-radius, .5rem);border-bottom-color:var(--tab-border-color);padding-inline-start:var(--tab-padding, 1rem);padding-inline-end:var(--tab-padding, 1rem);padding-top:var(--tab-border, 1px)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-lifted>.tab:is(input:checked){background-color:var(--tab-bg);border-width:var(--tab-border, 1px) var(--tab-border, 1px) 0 var(--tab-border, 1px);border-inline-start-color:var(--tab-border-color);border-inline-end-color:var(--tab-border-color);border-top-color:var(--tab-border-color);padding-inline-start:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-inline-end:calc(var(--tab-padding, 1rem) - var(--tab-border, 1px));padding-bottom:var(--tab-border, 1px);padding-top:0}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked):before{z-index:1;content:"";display:block;position:absolute;width:calc(100% + var(--tab-radius, .5rem) * 2);height:var(--tab-radius, .5rem);bottom:0;background-size:var(--tab-radius, .5rem);background-position:top left,top right;background-repeat:no-repeat;--tab-grad: calc(69% - var(--tab-border, 1px));--radius-start: radial-gradient( circle at top left, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );--radius-end: radial-gradient( circle at top right, transparent var(--tab-grad), var(--tab-border-color) calc(var(--tab-grad) + .25px), var(--tab-border-color) calc(var(--tab-grad) + var(--tab-border, 1px)), var(--tab-bg) calc(var(--tab-grad) + var(--tab-border, 1px) + .25px) );background-image:var(--radius-start),var(--radius-end)}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,.tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-end);background-position:top right}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):first-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):first-child:before{background-image:var(--radius-start);background-position:top left}.tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,.tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-start);background-position:top left}[dir=rtl] .tabs-lifted>.tab:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):last-child:before,[dir=rtl] .tabs-lifted>.tab:is(input:checked):last-child:before{background-image:var(--radius-end);background-position:top right}.tabs-lifted>:is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled])+.tabs-lifted :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]):before,.tabs-lifted>.tab:is(input:checked)+.tabs-lifted .tab:is(input:checked):before{background-image:var(--radius-end);background-position:top right}.tabs-boxed{border-radius:var(--rounded-btn, .5rem);--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));padding:.25rem}.tabs-boxed .tab{border-radius:var(--rounded-btn, .5rem)}.tabs-boxed :is(.tab-active,[aria-selected=true]):not(.tab-disabled):not([disabled]),.tabs-boxed :is(input:checked){--tw-bg-opacity: 1;background-color:var(--fallback-p,oklch(var(--p)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-pc,oklch(var(--pc)/var(--tw-text-opacity)))}.table tr.active,.table tr.active:nth-child(2n),.table-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)))}.table-zebra tr.active,.table-zebra tr.active:nth-child(2n),.table-zebra-zebra tbody tr:nth-child(2n){--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)))}.textarea-bordered{border-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea:focus{box-shadow:none;border-color:var(--fallback-bc,oklch(var(--bc)/.2));outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.textarea-disabled,.textarea:disabled,.textarea[disabled]{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity)));--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity)));color:var(--fallback-bc,oklch(var(--bc)/.4))}.textarea-disabled::-moz-placeholder,.textarea:disabled::-moz-placeholder,.textarea[disabled]::-moz-placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}.textarea-disabled::placeholder,.textarea:disabled::placeholder,.textarea[disabled]::placeholder{color:var(--fallback-bc,oklch(var(--bc)/var(--tw-placeholder-opacity)));--tw-placeholder-opacity: .2}@keyframes toast-pop{0%{transform:scale(.9);opacity:0}to{transform:scale(1);opacity:1}}[dir=rtl] .toggle{--handleoffsetcalculator: calc(var(--handleoffset) * 1)}.toggle:focus-visible{outline-style:solid;outline-width:2px;outline-offset:2px;outline-color:var(--fallback-bc,oklch(var(--bc)/.2))}.toggle:hover{background-color:currentColor}.toggle:checked,.toggle[aria-checked=true]{background-image:none;--handleoffsetcalculator: var(--handleoffset);--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)))}[dir=rtl] .toggle:checked,[dir=rtl] .toggle[aria-checked=true]{--handleoffsetcalculator: calc(var(--handleoffset) * -1)}.toggle:indeterminate{--tw-text-opacity: 1;color:var(--fallback-bc,oklch(var(--bc)/var(--tw-text-opacity)));box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}[dir=rtl] .toggle:indeterminate{box-shadow:calc(var(--handleoffset) / 2) 0 0 2px var(--tglbg) inset,calc(var(--handleoffset) / -2) 0 0 2px var(--tglbg) inset,0 0 0 2px var(--tglbg) inset}.toggle-secondary:focus-visible{outline-color:var(--fallback-s,oklch(var(--s)/1))}.toggle-secondary:checked,.toggle-secondary[aria-checked=true]{border-color:var(--fallback-s,oklch(var(--s)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-s,oklch(var(--s)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-sc,oklch(var(--sc)/var(--tw-text-opacity)))}.toggle-success:focus-visible{outline-color:var(--fallback-su,oklch(var(--su)/1))}.toggle-success:checked,.toggle-success[aria-checked=true]{border-color:var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-suc,oklch(var(--suc)/var(--tw-text-opacity)))}.toggle-warning:focus-visible{outline-color:var(--fallback-wa,oklch(var(--wa)/1))}.toggle-warning:checked,.toggle-warning[aria-checked=true]{border-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-border-opacity)));--tw-border-opacity: .1;--tw-bg-opacity: 1;background-color:var(--fallback-wa,oklch(var(--wa)/var(--tw-bg-opacity)));--tw-text-opacity: 1;color:var(--fallback-wac,oklch(var(--wac)/var(--tw-text-opacity)))}.toggle:disabled{cursor:not-allowed;--tw-border-opacity: 1;border-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-border-opacity)));background-color:transparent;opacity:.3;--togglehandleborder: 0 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset, var(--handleoffsetcalculator) 0 0 3px var(--fallback-bc,oklch(var(--bc)/1)) inset}.badge-xs{height:.75rem;font-size:.75rem;line-height:.75rem;padding-left:.313rem;padding-right:.313rem}.badge-sm{height:1rem;font-size:.75rem;line-height:1rem;padding-left:.438rem;padding-right:.438rem}.btm-nav-xs>*:where(.active){border-top-width:1px}.btm-nav-sm>*:where(.active){border-top-width:2px}.btm-nav-md>*:where(.active){border-top-width:2px}.btm-nav-lg>*:where(.active){border-top-width:4px}.btn-xs{height:1.5rem;min-height:1.5rem;padding-left:.5rem;padding-right:.5rem;font-size:.75rem}.btn-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem}.btn-square:where(.btn-xs){height:1.5rem;width:1.5rem;padding:0}.btn-square:where(.btn-sm){height:2rem;width:2rem;padding:0}.btn-circle:where(.btn-xs){height:1.5rem;width:1.5rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-sm){height:2rem;width:2rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-md){height:3rem;width:3rem;border-radius:9999px;padding:0}.btn-circle:where(.btn-lg){height:4rem;width:4rem;border-radius:9999px;padding:0}[type=checkbox].checkbox-xs{height:1rem;width:1rem}.input-sm{height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;line-height:2rem}.join.join-vertical{flex-direction:column}.join.join-vertical .join-item:first-child:not(:last-child),.join.join-vertical *:first-child:not(:last-child) .join-item{border-end-start-radius:0;border-end-end-radius:0;border-start-start-radius:inherit;border-start-end-radius:inherit}.join.join-vertical .join-item:last-child:not(:first-child),.join.join-vertical *:last-child:not(:first-child) .join-item{border-start-start-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-end-end-radius:inherit}.join.join-horizontal{flex-direction:row}.join.join-horizontal .join-item:first-child:not(:last-child),.join.join-horizontal *:first-child:not(:last-child) .join-item{border-end-end-radius:0;border-start-end-radius:0;border-end-start-radius:inherit;border-start-start-radius:inherit}.join.join-horizontal .join-item:last-child:not(:first-child),.join.join-horizontal *:last-child:not(:first-child) .join-item{border-end-start-radius:0;border-start-start-radius:0;border-end-end-radius:inherit;border-start-end-radius:inherit}.select-sm{height:2rem;min-height:2rem;padding-left:.75rem;padding-right:2rem;font-size:.875rem;line-height:2rem}[dir=rtl] .select-sm{padding-left:2rem;padding-right:.75rem}.steps-horizontal .step{display:grid;grid-template-columns:repeat(1,minmax(0,1fr));grid-template-rows:repeat(2,minmax(0,1fr));place-items:center;text-align:center}.steps-vertical .step{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-template-rows:repeat(1,minmax(0,1fr))}.tabs-md :where(.tab){height:2rem;font-size:.875rem;line-height:1.25rem;line-height:2;--tab-padding: 1rem}.tabs-lg :where(.tab){height:3rem;font-size:1.125rem;line-height:1.75rem;line-height:2;--tab-padding: 1.25rem}.tabs-sm :where(.tab){height:1.5rem;font-size:.875rem;line-height:.75rem;--tab-padding: .75rem}.tabs-xs :where(.tab){height:1.25rem;font-size:.75rem;line-height:.75rem;--tab-padding: .5rem}[type=checkbox].toggle-xs{--handleoffset: .5rem;height:1rem;width:1.5rem}[type=checkbox].toggle-sm{--handleoffset: .75rem;height:1.25rem;width:2rem}.avatar.online:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-su,oklch(var(--su)/var(--tw-bg-opacity)));outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.avatar.offline:before{content:"";position:absolute;z-index:10;display:block;border-radius:9999px;--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity)));outline-style:solid;outline-width:2px;outline-color:var(--fallback-b1,oklch(var(--b1)/1));width:15%;height:15%;top:7%;right:7%}.card-compact .card-body{padding:1rem;font-size:.875rem;line-height:1.25rem}.card-compact .card-title{margin-bottom:.25rem}.card-normal .card-body{padding:var(--padding-card, 2rem);font-size:1rem;line-height:1.5rem}.card-normal .card-title{margin-bottom:.75rem}.join.join-vertical>:where(*:not(:first-child)){margin-left:0;margin-right:0;margin-top:-1px}.join.join-vertical>:where(*:not(:first-child)):is(.btn){margin-top:calc(var(--border-btn) * -1)}.join.join-horizontal>:where(*:not(:first-child)){margin-top:0;margin-bottom:0;margin-inline-start:-1px}.join.join-horizontal>:where(*:not(:first-child)):is(.btn){margin-inline-start:calc(var(--border-btn) * -1);margin-top:0}.modal-top :where(.modal-box){width:100%;max-width:none;--tw-translate-y: -2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem);border-top-left-radius:0;border-top-right-radius:0}.modal-middle :where(.modal-box){width:91.666667%;max-width:32rem;--tw-translate-y: 0px;--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:var(--rounded-box, 1rem);border-bottom-left-radius:var(--rounded-box, 1rem)}.modal-bottom :where(.modal-box){width:100%;max-width:none;--tw-translate-y: 2.5rem;--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));border-top-left-radius:var(--rounded-box, 1rem);border-top-right-radius:var(--rounded-box, 1rem);border-bottom-right-radius:0;border-bottom-left-radius:0}.steps-horizontal .step{grid-template-rows:40px 1fr;grid-template-columns:auto;min-width:4rem}.steps-horizontal .step:before{height:.5rem;width:100%;--tw-translate-x: 0px;--tw-translate-y: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));content:"";margin-inline-start:-100%}.steps-horizontal .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.steps-vertical .step{gap:.5rem;grid-template-columns:40px 1fr;grid-template-rows:auto;min-height:4rem;justify-items:start}.steps-vertical .step:before{height:100%;width:.5rem;--tw-translate-x: -50%;--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));margin-inline-start:50%}.steps-vertical .step:where([dir=rtl],[dir=rtl] *):before{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.collapse{visibility:collapse}.mx-auto{margin-left:auto;margin-right:auto}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.inline-block{display:inline-block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-2{height:.5rem}.h-20{height:5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-64{height:16rem}.h-auto{height:auto}.h-full{height:100%}.max-h-24{max-height:6rem}.max-h-32{max-height:8rem}.min-h-0{min-height:0px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-8{width:2rem}.w-96{width:24rem}.w-full{width:100%}.min-w-0{min-width:0px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[200px\]{max-width:200px}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-75{--tw-scale-x: .75;--tw-scale-y: .75;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-90{--tw-scale-x: .9;--tw-scale-y: .9;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-box{border-radius:var(--rounded-box, 1rem)}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-base-200{--tw-border-opacity: 1;border-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-border-opacity, 1)))}.border-base-300{--tw-border-opacity: 1;border-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-border-opacity, 1)))}.border-base-content\/10{border-color:var(--fallback-bc,oklch(var(--bc)/.1))}.border-error{--tw-border-opacity: 1;border-color:var(--fallback-er,oklch(var(--er)/var(--tw-border-opacity, 1)))}.border-error\/30{border-color:var(--fallback-er,oklch(var(--er)/.3))}.border-primary{--tw-border-opacity: 1;border-color:var(--fallback-p,oklch(var(--p)/var(--tw-border-opacity, 1)))}.border-primary\/20{border-color:var(--fallback-p,oklch(var(--p)/.2))}.border-secondary\/20{border-color:var(--fallback-s,oklch(var(--s)/.2))}.border-success{--tw-border-opacity: 1;border-color:var(--fallback-su,oklch(var(--su)/var(--tw-border-opacity, 1)))}.bg-base-100{--tw-bg-opacity: 1;background-color:var(--fallback-b1,oklch(var(--b1)/var(--tw-bg-opacity, 1)))}.bg-base-200{--tw-bg-opacity: 1;background-color:var(--fallback-b2,oklch(var(--b2)/var(--tw-bg-opacity, 1)))}.bg-base-200\/30{background-color:var(--fallback-b2,oklch(var(--b2)/.3))}.bg-base-200\/50{background-color:var(--fallback-b2,oklch(var(--b2)/.5))}.bg-base-300{--tw-bg-opacity: 1;background-color:var(--fallback-b3,oklch(var(--b3)/var(--tw-bg-opacity, 1)))}.bg-base-300\/50{background-color:var(--fallback-b3,oklch(var(--b3)/.5))}.bg-base-content{--tw-bg-opacity: 1;background-color:var(--fallback-bc,oklch(var(--bc)/var(--tw-bg-opacity, 1)))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-error\/5{background-color:var(--fallback-er,oklch(var(--er)/.05))}.bg-neutral{--tw-bg-opacity: 1;background-color:var(--fallback-n,oklch(var(--n)/var(--tw-bg-opacity, 1)))}.bg-success-content{--tw-bg-opacity: 1;background-color:var(--fallback-suc,oklch(var(--suc)/var(--tw-bg-opacity, 1)))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.p-0{padding:0}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pr-2{padding-right:.5rem}.pt-2{padding-top:.5rem}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-\[10px\]{font-size:10px}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-normal{font-weight:400}.uppercase{text-transform:uppercase}.capitalize{text-transform:capitalize}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-widest{letter-spacing:.1em}.text-accent{--tw-text-opacity: 1;color:var(--fallback-a,oklch(var(--a)/var(--tw-text-opacity, 1)))}.text-base-content\/30{color:var(--fallback-bc,oklch(var(--bc)/.3))}.text-base-content\/50{color:var(--fallback-bc,oklch(var(--bc)/.5))}.text-error{--tw-text-opacity: 1;color:var(--fallback-er,oklch(var(--er)/var(--tw-text-opacity, 1)))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-neutral-content{--tw-text-opacity: 1;color:var(--fallback-nc,oklch(var(--nc)/var(--tw-text-opacity, 1)))}.text-primary{--tw-text-opacity: 1;color:var(--fallback-p,oklch(var(--p)/var(--tw-text-opacity, 1)))}.text-secondary{--tw-text-opacity: 1;color:var(--fallback-s,oklch(var(--s)/var(--tw-text-opacity, 1)))}.text-success{--tw-text-opacity: 1;color:var(--fallback-su,oklch(var(--su)/var(--tw-text-opacity, 1)))}.text-warning{--tw-text-opacity: 1;color:var(--fallback-wa,oklch(var(--wa)/var(--tw-text-opacity, 1)))}.line-through{text-decoration-line:line-through}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.shadow-inner{--tw-shadow: inset 0 2px 4px 0 rgb(0 0 0 / .05);--tw-shadow-colored: inset 0 2px 4px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}@media (min-width: 640px){.sm\:col-span-2{grid-column:span 2 / span 2}.sm\:ml-0{margin-left:0}.sm\:inline{display:inline}.sm\:flex{display:flex}.sm\:max-w-md{max-width:28rem}.sm\:scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:p-4{padding:1rem}.sm\:p-8{padding:2rem}.sm\:text-left{text-align:left}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}
|