tmux-agent-monitor 0.0.13 → 0.0.15
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/index.js
CHANGED
|
@@ -1262,12 +1262,21 @@ const createApp = ({ config, monitor, tmuxActions }) => {
|
|
|
1262
1262
|
return token === config.token;
|
|
1263
1263
|
};
|
|
1264
1264
|
const isOriginAllowed = (origin, host) => {
|
|
1265
|
-
if (
|
|
1265
|
+
if (config.allowedOrigins.length === 0) return true;
|
|
1266
|
+
if (!origin) return false;
|
|
1266
1267
|
return config.allowedOrigins.includes(origin) || (host ? config.allowedOrigins.includes(host) : false);
|
|
1267
1268
|
};
|
|
1268
1269
|
const sendWs = (ws, message) => {
|
|
1269
1270
|
ws.send(JSON.stringify(message));
|
|
1270
1271
|
};
|
|
1272
|
+
const closeAllWsClients = (code, reason) => {
|
|
1273
|
+
wsClients.forEach((ws) => {
|
|
1274
|
+
try {
|
|
1275
|
+
ws.close(code, reason);
|
|
1276
|
+
} catch {}
|
|
1277
|
+
});
|
|
1278
|
+
wsClients.clear();
|
|
1279
|
+
};
|
|
1271
1280
|
const broadcast = (message) => {
|
|
1272
1281
|
const payload = JSON.stringify(message);
|
|
1273
1282
|
wsClients.forEach((ws) => ws.send(payload));
|
|
@@ -1374,6 +1383,7 @@ const createApp = ({ config, monitor, tmuxActions }) => {
|
|
|
1374
1383
|
app.post("/api/admin/token/rotate", (c) => {
|
|
1375
1384
|
const next = rotateToken();
|
|
1376
1385
|
config.token = next.token;
|
|
1386
|
+
closeAllWsClients(1008, "token rotated");
|
|
1377
1387
|
return c.json({ token: next.token });
|
|
1378
1388
|
});
|
|
1379
1389
|
const wsHandler = upgradeWebSocket(() => ({
|
|
@@ -2345,6 +2355,8 @@ const buildError = (code, message) => ({
|
|
|
2345
2355
|
});
|
|
2346
2356
|
const createTmuxActions = (adapter, config) => {
|
|
2347
2357
|
const dangerPatterns = compileDangerPatterns(config.dangerCommandPatterns);
|
|
2358
|
+
const dangerKeys = new Set(config.dangerKeys);
|
|
2359
|
+
const pendingCommands = /* @__PURE__ */ new Map();
|
|
2348
2360
|
const enterKey = config.input.enterKey || "C-m";
|
|
2349
2361
|
const enterDelayMs = config.input.enterDelayMs ?? 0;
|
|
2350
2362
|
const bracketedPaste = (value) => `\u001b[200~${value}\u001b[201~`;
|
|
@@ -2357,10 +2369,22 @@ const createTmuxActions = (adapter, config) => {
|
|
|
2357
2369
|
ok: false,
|
|
2358
2370
|
error: buildError("INVALID_PAYLOAD", "text too long")
|
|
2359
2371
|
};
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2372
|
+
const normalized = text.replace(/\r\n/g, "\n");
|
|
2373
|
+
const combined = `${pendingCommands.get(paneId) ?? ""}${normalized}`;
|
|
2374
|
+
if (combined.length > config.input.maxTextLength) {
|
|
2375
|
+
pendingCommands.delete(paneId);
|
|
2376
|
+
return {
|
|
2377
|
+
ok: false,
|
|
2378
|
+
error: buildError("INVALID_PAYLOAD", "text too long")
|
|
2379
|
+
};
|
|
2380
|
+
}
|
|
2381
|
+
if (isDangerousCommand(combined, dangerPatterns)) {
|
|
2382
|
+
pendingCommands.delete(paneId);
|
|
2383
|
+
return {
|
|
2384
|
+
ok: false,
|
|
2385
|
+
error: buildError("DANGEROUS_COMMAND", "dangerous command blocked")
|
|
2386
|
+
};
|
|
2387
|
+
}
|
|
2364
2388
|
await adapter.run([
|
|
2365
2389
|
"if-shell",
|
|
2366
2390
|
"-t",
|
|
@@ -2368,7 +2392,6 @@ const createTmuxActions = (adapter, config) => {
|
|
|
2368
2392
|
"[ \"#{pane_in_mode}\" = \"1\" ]",
|
|
2369
2393
|
`copy-mode -q -t ${paneId}`
|
|
2370
2394
|
]);
|
|
2371
|
-
const normalized = text.replace(/\r\n/g, "\n");
|
|
2372
2395
|
if (normalized.includes("\n")) {
|
|
2373
2396
|
const result = await adapter.run([
|
|
2374
2397
|
"send-keys",
|
|
@@ -2394,6 +2417,7 @@ const createTmuxActions = (adapter, config) => {
|
|
|
2394
2417
|
error: buildError("INTERNAL", enterResult.stderr || "send-keys Enter failed")
|
|
2395
2418
|
};
|
|
2396
2419
|
}
|
|
2420
|
+
pendingCommands.delete(paneId);
|
|
2397
2421
|
return { ok: true };
|
|
2398
2422
|
}
|
|
2399
2423
|
const result = await adapter.run([
|
|
@@ -2419,7 +2443,10 @@ const createTmuxActions = (adapter, config) => {
|
|
|
2419
2443
|
ok: false,
|
|
2420
2444
|
error: buildError("INTERNAL", enterResult.stderr || "send-keys Enter failed")
|
|
2421
2445
|
};
|
|
2446
|
+
pendingCommands.delete(paneId);
|
|
2447
|
+
return { ok: true };
|
|
2422
2448
|
}
|
|
2449
|
+
pendingCommands.set(paneId, combined);
|
|
2423
2450
|
return { ok: true };
|
|
2424
2451
|
};
|
|
2425
2452
|
const sendKeys = async (paneId, keys) => {
|
|
@@ -2428,6 +2455,10 @@ const createTmuxActions = (adapter, config) => {
|
|
|
2428
2455
|
ok: false,
|
|
2429
2456
|
error: buildError("INVALID_PAYLOAD", "invalid keys")
|
|
2430
2457
|
};
|
|
2458
|
+
if (keys.some((key) => dangerKeys.has(key))) return {
|
|
2459
|
+
ok: false,
|
|
2460
|
+
error: buildError("DANGEROUS_COMMAND", "dangerous key blocked")
|
|
2461
|
+
};
|
|
2431
2462
|
for (const key of keys) {
|
|
2432
2463
|
const result = await adapter.run([
|
|
2433
2464
|
"send-keys",
|
|
@@ -52,4 +52,4 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho
|
|
|
52
52
|
`).split(`
|
|
53
53
|
`).some(l=>o.some(i=>i.test(l.toLowerCase().replace(/\s+/g," ").trim())))},Gle=n=>n.startsWith("+++ ")||n.startsWith("--- ")?"text-latte-subtext0":n.startsWith("@@")?"text-latte-lavender":n.startsWith("+")?"text-latte-green":n.startsWith("-")?"text-latte-red":"text-latte-text",Pg=n=>{switch(n){case"A":return"text-latte-green";case"M":return"text-latte-yellow";case"D":return"text-latte-red";case"R":case"C":return"text-latte-lavender";case"U":return"text-latte-peach";default:return"text-latte-subtext0"}},$le=n=>{if(!n)return"—";const o=new Date(n);return Number.isNaN(o.getTime())?n:o.toLocaleString()},ev=n=>{const o=n.files.map(c=>({path:c.path,status:c.status,staged:c.staged,renamedFrom:c.renamedFrom??null,additions:c.additions??null,deletions:c.deletions??null})).sort((c,l)=>{const i=c.path.localeCompare(l.path);if(i!==0)return i;const f=c.status.localeCompare(l.status);return f!==0?f:c.staged!==l.staged?c.staged?1:-1:(c.renamedFrom??"").localeCompare(l.renamedFrom??"")});return JSON.stringify({repoRoot:n.repoRoot??null,rev:n.rev??null,truncated:n.truncated??!1,reason:n.reason??null,files:o})},tv=n=>JSON.stringify({repoRoot:n.repoRoot??null,rev:n.rev??null,reason:n.reason??null,commits:n.commits.map(o=>o.hash)}),nv=({label:n,onClick:o,danger:c,disabled:l,ariaLabel:i})=>E.jsx(nn,{variant:c?"danger":"ghost",size:"sm",onClick:o,className:"min-w-[70px]",disabled:l,"aria-label":i,children:n}),Vle=()=>{const{paneId:n}=PS(),o=n??"",{connected:c,getSessionDetail:l,requestCommitDetail:i,requestCommitFile:f,requestCommitLog:d,requestDiffFile:p,requestDiffSummary:g,requestScreen:m,sendText:y,sendKeys:v,readOnly:_}=Ky(),{resolvedTheme:x}=Gy(),T=l(o),[A,C]=S.useState("text"),[z,D]=S.useState(""),[L,Y]=S.useState(null),[I,te]=S.useState(null),[K,P]=S.useState(null),ye=S.useRef(null),[ke,De]=S.useState(!0),[j,V]=S.useState(!1),[W,ce]=S.useState(!1),[w,k]=S.useReducer(wle,Nf),[G,oe]=S.useState({text:!1,image:!1}),[re,N]=S.useState(!1),[B,ee]=S.useState(null),[ne,me]=S.useState(null),[Se,de]=S.useState(!1),[$e,Ne]=S.useState({}),[_t,Lt]=S.useState({}),[Ut,xt]=S.useState({}),[Me,gn]=S.useState(null),[Un,wn]=S.useState(null),[fa,Xa]=S.useState(!1),[Eo,Ia]=S.useState(!1),[zs,Hc]=S.useState(!0),[zt,Tr]=S.useState({}),[Nr,wo]=S.useState({}),[To,Ar]=S.useState({}),[No,Ao]=S.useState({}),[Cs,qn]=S.useState({}),[Et,an]=S.useState({}),[Rt,Or]=S.useState(null),Bc=S.useRef({}),zr=S.useRef(null),da=S.useRef(null),ma=S.useRef(null),Xt=S.useRef(null),Tn=S.useRef(G),Nn=S.useRef(null),vn=S.useRef(null),Rs=S.useRef(0),Oo=S.useMemo(()=>Ele(z||"No screen data",x),[z,x]),An=10,{scrollRef:Hn,contentRef:Ds,scrollToBottom:ha}=h2({initial:"instant",resize:"instant"}),Cr=S.useRef(A),zo=S.useRef(!1),Rr=w.loading&&w.mode===A;S.useEffect(()=>{Cr.current==="image"&&A==="text"&&(zo.current=!0),Cr.current=A},[A]),S.useLayoutEffect(()=>{!zo.current||A!=="text"||(ha({animation:"instant",ignoreEscapes:!0}),zo.current=!1)},[A,z,Oo,ha]),S.useLayoutEffect(()=>{if(A!=="text")return;const Z=Hn.current;if(!Z)return;Z.scrollHeight-Z.scrollTop-Z.clientHeight<=8&&ha({animation:"instant"})},[A,Oo,Hn,ha]);const Bn=S.useCallback(async()=>{if(!o||!c)return;const Z=Rs.current+=1,ae=vn.current,le=ae&&ae.mode!==A;if(ae&&!le)return;const ve=Nn.current===A,xe=ve||!Tn.current[A];P(null),xe&&k({type:"start",mode:A}),vn.current={id:Z,mode:A};try{const he=await m(o,{mode:A});if(vn.current?.id!==Z)return;if(!he.ok){P(he.error?.message??"Failed to capture screen");return}te(he.fallbackReason??null),he.mode==="image"?(Y(he.imageBase64??null),D("")):(D(he.screen??""),Y(null)),oe(He=>({...He,[A]:!0}))}catch(he){P(he instanceof Error?he.message:"Screen request failed")}finally{vn.current?.id===Z&&(vn.current=null,xe&&k({type:"finish",mode:A}),ve&&Nn.current===A&&(Nn.current=null))}},[c,A,o,m]);S.useEffect(()=>{Bn()},[Bn]),S.useEffect(()=>{if(!o||!c)return;const Z=A==="image"?2e3:1e3,ae=window.setInterval(()=>{document.hidden||Bn()},Z);return()=>{window.clearInterval(ae)}},[c,A,o,Bn]);const Qa=S.useCallback(async(Z,ae)=>{ee(Z),Ne({});const le=new Set(Z.files.map(xe=>xe.path));Lt(xe=>{if(!Z.files.length)return{};const he={};return Object.entries(xe).forEach(([He,gt])=>{le.has(He)&&(he[He]=gt)}),he});const ve=Object.entries(Bc.current).filter(([xe,he])=>he&&le.has(xe));ve.length>0&&ae&&await Promise.all(ve.map(async([xe])=>{try{const he=await p(o,xe,Z.rev,{force:!0});Ne(He=>({...He,[xe]:he}))}catch(he){me(he instanceof Error?he.message:"Failed to load diff file")}}))},[o,p]),Co=S.useCallback(async()=>{if(o){de(!0),me(null);try{const Z=await g(o,{force:!0});await Qa(Z,!0)}catch(Z){me(Z instanceof Error?Z.message:"Failed to load diff summary")}finally{de(!1)}}},[Qa,o,g]),yn=S.useCallback(async()=>{if(o)try{const Z=await g(o,{force:!0});if(ev(Z)===zr.current)return;me(null),await Qa(Z,!0)}catch{return}},[Qa,o,g]),ht=S.useCallback(async Z=>{if(!(!o||!B?.rev)&&!Ut[Z]){xt(ae=>({...ae,[Z]:!0}));try{const ae=await p(o,Z,B.rev,{force:!0});Ne(le=>({...le,[Z]:ae}))}catch(ae){me(ae instanceof Error?ae.message:"Failed to load diff file")}finally{xt(ae=>({...ae,[Z]:!1}))}}},[Ut,B?.rev,o,p]),pt=S.useCallback((Z,ae)=>{if(gn(le=>{const ve=ae.append&&le?le.commits:[],xe=ae.append?[...ve,...Z.commits]:Z.commits,he=new Map;return xe.forEach(He=>{he.has(He.hash)||he.set(He.hash,He)}),{...Z,commits:Array.from(he.values())}}),!ae.append){const le=new Set(Z.commits.map(ve=>ve.hash));Tr(ve=>{const xe={};return Object.entries(ve).forEach(([he,He])=>{le.has(he)&&(xe[he]=He)}),xe}),wo(ve=>{const xe={};return Object.entries(ve).forEach(([he,He])=>{const[gt]=he.split(":");gt&&le.has(gt)&&(xe[he]=He)}),xe}),Ar(ve=>{const xe={};return Object.entries(ve).forEach(([he,He])=>{const[gt]=he.split(":");gt&&le.has(gt)&&(xe[he]=He)}),xe}),Ao(ve=>{const xe={};return Object.entries(ve).forEach(([he,He])=>{const[gt]=he.split(":");gt&&le.has(gt)&&(xe[he]=He)}),xe}),qn(ve=>{if(!Z.commits.length)return{};const xe={};return Object.entries(ve).forEach(([he,He])=>{le.has(he)&&(xe[he]=He)}),xe})}Hc(Z.commits.length===An),ae.updateSignature&&(ma.current=tv(Z))},[An]),bn=S.useCallback(async Z=>{if(!o)return;const ae=Z?.append??!1;ae?Ia(!0):Xa(!0),wn(null);try{const le=ae?da.current?.commits.length??0:0,ve=await d(o,{limit:An,skip:le,force:Z?.force});pt(ve,{append:ae,updateSignature:!ae})}catch(le){ae||wn(le instanceof Error?le.message:"Failed to load commit log")}finally{ae?Ia(!1):Xa(!1)}},[pt,An,o,d]),Dr=S.useCallback(async Z=>{if(!(!o||Et[Z])){an(ae=>({...ae,[Z]:!0}));try{const ae=await i(o,Z,{force:!0});Tr(le=>({...le,[Z]:ae}))}catch(ae){wn(ae instanceof Error?ae.message:"Failed to load commit detail")}finally{an(ae=>({...ae,[Z]:!1}))}}},[Et,o,i]),Ms=S.useCallback(async(Z,ae)=>{if(!o)return;const le=`${Z}:${ae}`;if(!No[le]){Ao(ve=>({...ve,[le]:!0}));try{const ve=await f(o,Z,ae,{force:!0});wo(xe=>({...xe,[le]:ve}))}catch(ve){wn(ve instanceof Error?ve.message:"Failed to load commit file")}finally{Ao(ve=>({...ve,[le]:!1}))}}},[No,o,f]),Zc=S.useCallback(async()=>{if(o)try{const Z=await d(o,{limit:An,skip:0,force:!0});if(tv(Z)===ma.current)return;wn(null),pt(Z,{append:!1,updateSignature:!0})}catch{return}},[pt,An,o,d]);S.useEffect(()=>{Co()},[Co]),S.useEffect(()=>{if(!o||!c)return;const Z=window.setInterval(()=>{document.hidden||yn()},Kg);return()=>{window.clearInterval(Z)}},[c,o,yn]),S.useEffect(()=>{ee(null),Ne({}),Lt({}),me(null),zr.current=null},[o]),S.useEffect(()=>{Bc.current=_t},[_t]),S.useEffect(()=>{zr.current=B?ev(B):null},[B]),S.useEffect(()=>{da.current=Me},[Me]),S.useEffect(()=>{gn(null),Tr({}),wo({}),Ar({}),Ao({}),qn({}),wn(null),Hc(!0),Xa(!1),Ia(!1),an({}),Or(null),ma.current=null,da.current=null,Xt.current&&(window.clearTimeout(Xt.current),Xt.current=null)},[o]),S.useEffect(()=>{bn({force:!0})},[bn]),S.useEffect(()=>{if(!o||!c)return;const Z=window.setInterval(()=>{document.hidden||Zc()},Kg);return()=>{window.clearInterval(Z)}},[c,o,Zc]),S.useEffect(()=>()=>{Xt.current&&window.clearTimeout(Xt.current)},[]),S.useEffect(()=>{Tn.current=G},[G]),S.useEffect(()=>{oe({text:!1,image:!1}),k({type:"reset"}),Nn.current=null},[o]);const Gc=S.useCallback(Z=>{if(j&&Z==="Tab")return"BTab";if(W){const ae={Left:"C-Left",Right:"C-Right",Up:"C-Up",Down:"C-Down",Tab:"C-Tab",Enter:"C-Enter",Escape:"C-Escape",BTab:"C-BTab"};if(ae[Z])return ae[Z]}return Z},[W,j]),pa=async Z=>{if(_)return;const ae=Gc(Z);if(J1.includes(ae)&&!window.confirm("Dangerous key detected. Send anyway?"))return;const ve=await v(o,[ae]);ve.ok||P(ve.error?.message??"Failed to send keys")},Mr=async()=>{if(_)return;const Z=ye.current?.value??"";if(!Z.trim()||Zle(Z)&&!window.confirm("Dangerous command detected. Send anyway?"))return;const ae=await y(o,Z,ke);if(!ae.ok){P(ae.error?.message??"Failed to send text");return}ye.current&&(ye.current.value=""),A==="text"&&ha({animation:"instant",ignoreEscapes:!0})},ga=Z=>{Lt(ae=>{const le=!ae[Z];return le&&ht(Z),{...ae,[Z]:le}})},va=Z=>{qn(ae=>{const le=!ae[Z];return le&&!zt[Z]&&Dr(Z),{...ae,[Z]:le}})},Ja=(Z,ae)=>{const le=`${Z}:${ae}`;Ar(ve=>{const xe=!ve[le];return xe&&!Nr[le]&&Ms(Z,ae),{...ve,[le]:xe}})},ya=S.useCallback(async Z=>{let ae=!1;try{await navigator.clipboard.writeText(Z),ae=!0}catch{const le=document.createElement("textarea");le.value=Z,le.style.position="fixed",le.style.left="-9999px",document.body.appendChild(le),le.focus(),le.select();try{ae=document.execCommand("copy")}catch{ae=!1}finally{document.body.removeChild(le)}}ae&&(Or(Z),Xt.current&&window.clearTimeout(Xt.current),Xt.current=window.setTimeout(()=>{Or(le=>le===Z?null:le)},1200))},[]),ct=Z=>Z.split(`
|
|
54
54
|
`).map((ae,le)=>E.jsxs("span",{className:Gle(ae),children:[ae,`
|
|
55
|
-
`]},`${le}-${ae.slice(0,12)}`)),$c=j?"Shift+Tab":"Tab",Vc=T?.agent==="codex"?"CODEX":T?.agent==="claude"?"CLAUDE":T?.agent?.toUpperCase?.()??"UNKNOWN";return T?E.jsxs("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10",children:[E.jsxs("div",{className:"flex items-center justify-between gap-3",children:[E.jsxs(Rc,{to:"/",className:Wg,children:[E.jsx(Wu,{className:"h-4 w-4"}),"Back to list"]}),E.jsx($y,{})]}),E.jsxs("header",{className:"shadow-glass border-latte-surface1/60 bg-latte-base/80 flex flex-col gap-3 rounded-[32px] border p-4 backdrop-blur",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[E.jsxs("div",{children:[E.jsx("h1",{className:"font-display text-latte-text text-xl",children:T.title??T.sessionName}),E.jsx("p",{className:"text-latte-subtext0 text-sm",children:hf(T.currentPath)})]}),E.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-3",children:[E.jsxs("div",{className:"text-latte-subtext1 flex items-center gap-2 text-[10px] uppercase tracking-[0.3em]",children:["Agent",E.jsx("span",{className:"border-latte-lavender/35 bg-latte-lavender/10 text-latte-lavender inline-flex items-center rounded-full border px-3 py-1 text-[11px] font-semibold tracking-[0.2em]",children:Vc})]}),E.jsx(Vy,{tone:Hle(T.state),children:T.state})]})]}),T.pipeConflict&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-sm",children:"Another pipe-pane is attached. Screen is capture-only."}),_&&E.jsx("div",{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-sm",children:"Read-only mode is active. Actions are disabled."})]}),E.jsxs("div",{className:"grid min-w-0 gap-6 lg:grid-cols-[1.3fr_1fr]",children:[E.jsxs(yo,{className:"flex min-w-0 flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsx("div",{className:"flex items-center gap-2",children:E.jsx(qy,{value:A,onValueChange:Z=>{if((Z==="text"||Z==="image")&&Z!==A){const ae=Z;Nn.current=ae,k({type:"start",mode:ae}),C(ae)}},children:E.jsxs(Gf,{"aria-label":"Screen mode",children:[E.jsx(pr,{value:"text",children:"Text"}),E.jsx(pr,{value:"image",children:"Image"})]})})}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:Bn,"aria-label":"Refresh screen",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),I&&E.jsxs("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:["Image fallback: ",I]}),K&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:K}),E.jsxs("div",{className:"border-latte-surface1 bg-latte-mantle/40 relative flex min-h-[320px] w-full min-w-0 max-w-full flex-1 overflow-hidden rounded-2xl border p-4",children:[Rr&&E.jsx("div",{className:"bg-latte-base/60 absolute inset-0 z-10 flex items-center justify-center backdrop-blur-sm",children:E.jsx("div",{className:"border-latte-lavender/40 border-t-latte-lavender h-8 w-8 animate-spin rounded-full border-2"})}),A==="image"&&L?E.jsx("div",{className:"flex w-full items-center justify-center",children:E.jsx("img",{src:`data:image/png;base64,${L}`,alt:"screen",className:"border-latte-surface2 max-h-[480px] w-full rounded-xl border object-contain"})}):E.jsx("div",{ref:Hn,className:"w-full min-w-0 max-w-full overflow-x-auto overflow-y-auto",style:{maxHeight:"60vh"},children:E.jsx("div",{ref:Ds,children:E.jsx("pre",{className:"text-latte-text w-max whitespace-pre font-mono text-xs",dangerouslySetInnerHTML:{__html:Oo}})})})]})]}),E.jsx("div",{className:"flex flex-col gap-6",children:_?E.jsx(yo,{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach border text-sm",children:"Read-only mode is active. Interactive controls are hidden."}):E.jsxs(yo,{className:"space-y-3",children:[E.jsxs("div",{className:"flex items-start gap-3",children:[E.jsx("textarea",{placeholder:"Type a command…",ref:ye,rows:2,className:"border-latte-surface2 text-latte-text focus:border-latte-lavender focus:ring-latte-lavender/30 bg-latte-base/70 min-h-[64px] min-w-0 flex-1 resize-y rounded-2xl border px-4 py-2 text-base shadow-sm outline-none transition focus:ring-2 md:text-sm"}),E.jsx("div",{className:"flex shrink-0 items-center self-center",children:E.jsxs(nn,{onClick:Mr,"aria-label":"Send",className:"h-11 w-11 p-0",children:[E.jsx(l2,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Send"})]})})]}),E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>N(Z=>!Z),"aria-expanded":re,"aria-controls":"session-controls",className:"text-latte-subtext0 flex items-center gap-2 text-[11px] uppercase tracking-[0.32em]",children:[re?E.jsx(ef,{className:"h-4 w-4"}):E.jsx(Pu,{className:"h-4 w-4"}),"Keys"]}),E.jsxs("button",{type:"button",onClick:()=>De(Z=>!Z),"aria-pressed":ke,title:"Auto-enter after send",className:`group inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.24em] transition ${ke?"border-latte-lavender/60 bg-latte-lavender/10 text-latte-lavender shadow-[inset_0_0_0_1px_rgba(114,135,253,0.12)]":"border-latte-surface2/70 text-latte-subtext0 hover:border-latte-overlay1 hover:text-latte-text"}`,children:[E.jsx("span",{className:"text-[9px] font-semibold tracking-[0.3em]",children:"Auto"}),E.jsx(e2,{className:"h-3.5 w-3.5"}),E.jsx("span",{className:"sr-only",children:"Auto-enter"})]})]}),re&&E.jsxs("div",{id:"session-controls",className:"space-y-3",children:[E.jsx("div",{className:"flex flex-wrap items-center justify-between gap-2",children:E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx(nn,{variant:j?"primary":"ghost",size:"sm",onClick:()=>V(Z=>!Z),"aria-pressed":j,className:"font-mono text-[11px] uppercase tracking-[0.3em]",children:"Shift"}),E.jsx(nn,{variant:W?"primary":"ghost",size:"sm",onClick:()=>ce(Z=>!Z),"aria-pressed":W,className:"font-mono text-[11px] uppercase tracking-[0.3em]",children:"Ctrl"})]})}),E.jsx("div",{className:"flex flex-wrap gap-2",children:[{label:"Esc",key:"Escape"},{label:$c,key:"Tab"},{label:"Enter",key:"Enter"}].map(Z=>E.jsx(nv,{label:Z.label,onClick:()=>pa(Z.key)},Z.key))}),E.jsx("div",{className:"flex items-center gap-2",children:[{label:E.jsxs(E.Fragment,{children:[E.jsx(Wu,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Left"})]}),key:"Left",ariaLabel:"Left"},{label:E.jsxs(E.Fragment,{children:[E.jsx(XT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Up"})]}),key:"Up",ariaLabel:"Up"},{label:E.jsxs(E.Fragment,{children:[E.jsx(ZT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Down"})]}),key:"Down",ariaLabel:"Down"},{label:E.jsxs(E.Fragment,{children:[E.jsx(VT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Right"})]}),key:"Right",ariaLabel:"Right"}].map(Z=>E.jsx(nv,{label:Z.label,ariaLabel:Z.ariaLabel,onClick:()=>pa(Z.key)},Z.key))})]})]})})]}),E.jsxs(yo,{className:"flex flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.3em]",children:"Changes"}),E.jsxs("p",{className:"text-latte-text text-sm",children:[B?.files.length??0," file",(B?.files.length??0)===1?"":"s"]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:Co,disabled:Se,"aria-label":"Refresh changes",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),B?.repoRoot&&E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:["Repo: ",hf(B.repoRoot)]}),Se&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Loading diff…"}),B?.reason==="cwd_unknown"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Working directory is unknown for this session."}),B?.reason==="not_git"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Current directory is not a git repository."}),B?.reason==="error"&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:"Failed to load git status."}),ne&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:ne}),!Se&&B&&B.files.length===0&&!B.reason&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"No changes detected."}),E.jsx("div",{className:"flex flex-col gap-2",children:B?.files.map(Z=>{const ae=!!_t[Z.path],le=!!Ut[Z.path],ve=$e[Z.path],xe=Z.status==="?"?"U":Z.status,he=Z.additions===null||typeof Z.additions>"u"?"—":String(Z.additions),He=Z.deletions===null||typeof Z.deletions>"u"?"—":String(Z.deletions);return E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/70 rounded-2xl border",children:[E.jsxs("button",{type:"button",onClick:()=>ga(Z.path),className:"flex w-full items-center justify-between gap-3 px-4 py-3 text-left",children:[E.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[E.jsx("span",{className:`${Pg(xe)} text-[10px] font-semibold uppercase tracking-[0.25em]`,children:xe}),E.jsx("span",{className:"text-latte-text truncate text-sm",children:Z.path})]}),E.jsxs("div",{className:"flex items-center gap-3 text-xs",children:[E.jsxs("span",{className:"text-latte-green",children:["+",he]}),E.jsxs("span",{className:"text-latte-red",children:["-",He]}),E.jsx("span",{className:"text-latte-subtext0",children:ae?"Hide":"Show"})]})]}),ae&&E.jsxs("div",{className:"border-latte-surface2/70 border-t px-4 py-3",children:[le&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading diff…"}),!le&&ve?.binary&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Binary file (no diff)."}),!le&&!ve?.binary&&ve?.patch&&E.jsxs("div",{className:"max-h-[360px] overflow-auto",children:[E.jsx("pre",{className:"whitespace-pre font-mono text-xs",children:ct(ve.patch)}),ve.truncated&&E.jsx("p",{className:"text-latte-subtext0 mt-2 text-xs",children:"Diff truncated."})]}),!le&&!ve?.binary&&!ve?.patch&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No diff available."})]})]},`${Z.path}-${Z.status}`)})})]}),E.jsxs(yo,{className:"flex flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.3em]",children:"Commit Log"}),E.jsxs("p",{className:"text-latte-text text-sm",children:[Me?.commits.length??0," commit",(Me?.commits.length??0)===1?"":"s"]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>bn({force:!0}),disabled:fa,"aria-label":"Refresh commit log",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),Me?.repoRoot&&E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:["Repo: ",hf(Me.repoRoot)]}),fa&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Loading commits…"}),Me?.reason==="cwd_unknown"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Working directory is unknown for this session."}),Me?.reason==="not_git"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Current directory is not a git repository."}),Me?.reason==="error"&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:"Failed to load commit log."}),Un&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:Un}),!fa&&Me&&Me.commits.length===0&&!Me.reason&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"No commits found."}),E.jsx("div",{className:"flex flex-col gap-2",children:Me?.commits.map(Z=>{const ae=!!Cs[Z.hash],le=zt[Z.hash],ve=!!Et[Z.hash],xe=le?.body??Z.body;return E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/70 rounded-2xl border",children:[E.jsxs("div",{className:"flex w-full flex-wrap items-start justify-between gap-3 px-4 py-3",children:[E.jsxs("div",{className:"flex min-w-0 items-start gap-3",children:[E.jsxs("button",{type:"button",onClick:()=>ya(Z.hash),className:"border-latte-surface2/70 text-latte-subtext0 hover:text-latte-text flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-semibold tracking-[0.2em] transition","aria-label":`Copy commit hash ${Z.shortHash}`,children:[E.jsx("span",{className:"font-mono",children:Z.shortHash}),Rt===Z.hash?E.jsx(QT,{className:"text-latte-green h-3.5 w-3.5"}):E.jsx(WT,{className:"h-3.5 w-3.5"})]}),E.jsxs("div",{className:"min-w-0",children:[E.jsx("p",{className:"text-latte-text text-sm",children:Z.subject}),E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:[Z.authorName," · ",$le(Z.authoredAt)]})]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>va(Z.hash),className:"flex items-center gap-1 text-xs",children:[ae?E.jsx(ef,{className:"h-4 w-4"}):E.jsx(Pu,{className:"h-4 w-4"}),ae?"Hide":"Show"]})]}),ae&&E.jsxs("div",{className:"border-latte-surface2/70 border-t px-4 py-3",children:[ve&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading commit…"}),!ve&&xe&&E.jsx("pre",{className:"text-latte-subtext0 mb-3 whitespace-pre-wrap text-xs",children:xe}),!ve&&le?.files&&le.files.length>0&&E.jsx("div",{className:"flex flex-col gap-2 text-xs",children:le.files.map(he=>{const He=he.status==="?"?"U":he.status,gt=`${Z.hash}:${he.path}`,It=!!To[gt],it=Nr[gt],Fa=!!No[gt],js=he.additions===null||typeof he.additions>"u"?"—":String(he.additions),jr=he.deletions===null||typeof he.deletions>"u"?"—":String(he.deletions),Yc=he.renamedFrom?`${he.renamedFrom} → ${he.path}`:he.path;return E.jsxs("div",{className:"flex flex-col gap-2",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[E.jsx("span",{className:`${Pg(He)} text-[10px] font-semibold uppercase tracking-[0.25em]`,children:He}),E.jsx("span",{className:"text-latte-text break-all",children:Yc})]}),E.jsxs("div",{className:"flex items-center gap-3 text-xs",children:[E.jsxs("span",{className:"text-latte-green",children:["+",js]}),E.jsxs("span",{className:"text-latte-red",children:["-",jr]}),E.jsxs("button",{type:"button",onClick:()=>Ja(Z.hash,he.path),className:"text-latte-subtext0 hover:text-latte-text inline-flex items-center gap-1",children:[It?E.jsx(ef,{className:"h-3.5 w-3.5"}):E.jsx(Pu,{className:"h-3.5 w-3.5"}),It?"Hide":"Show"]})]})]}),It&&E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/60 rounded-xl border px-3 py-2",children:[Fa&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading diff…"}),!Fa&&it?.binary&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Binary file (no diff)."}),!Fa&&!it?.binary&&it?.patch&&E.jsxs("div",{className:"max-h-[240px] overflow-auto",children:[E.jsx("pre",{className:"whitespace-pre font-mono text-xs",children:ct(it.patch)}),it.truncated&&E.jsx("p",{className:"text-latte-subtext0 mt-2 text-xs",children:"Diff truncated."})]}),!Fa&&!it?.binary&&!it?.patch&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No diff available."})]})]},`${he.path}-${he.status}`)})}),!ve&&le?.files&&le.files.length===0&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No files changed."}),!ve&&!le&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No commit details."})]})]},Z.hash)})}),Me&&zs&&!Me.reason&&E.jsx(nn,{variant:"ghost",size:"sm",onClick:()=>bn({append:!0,force:!0}),disabled:Eo,children:Eo?"Loading…":"Load more"})]})]}):E.jsx("div",{className:"mx-auto flex max-w-2xl flex-col gap-4 px-4 py-10",children:E.jsxs(yo,{children:[E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Session not found."}),E.jsxs(Rc,{to:"/",className:`${Wg} mt-4`,children:[E.jsx(Wu,{className:"h-4 w-4"}),"Back to list"]})]})})},Wy=S.forwardRef(({className:n,...o},c)=>E.jsx("input",{ref:c,className:wr("border-latte-surface2 text-latte-text focus:border-latte-lavender focus:ring-latte-lavender/30 bg-latte-base/70 w-full rounded-2xl border px-4 py-2 text-base shadow-sm outline-none transition focus:ring-2 md:text-sm",n),...o}));Wy.displayName="Input";const Yle=n=>{switch(n){case"RUNNING":return"running";case"WAITING_INPUT":return"waiting";case"WAITING_PERMISSION":return"permission";default:return"unknown"}},Xle=n=>{if(!n)return"—";const o=n.match(/^\/(Users|home)\/[^/]+(\/.*)?$/);return o?`~${o[2]??""}`:n},Ile=()=>{const{sessions:n,connected:o,readOnly:c,refreshSessions:l}=Ky(),[i,f]=S.useState(""),[d,p]=S.useState("ALL"),g=S.useMemo(()=>{const m=i.trim().toLowerCase();return n.filter(y=>d==="ALL"||y.state===d?m?`${y.sessionName} ${y.currentCommand??""} ${y.currentPath??""} ${y.title??""}`.toLowerCase().includes(m):!0:!1)},[d,i,n]);return E.jsxs("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10",children:[E.jsx("div",{className:"flex justify-end",children:E.jsx($y,{})}),E.jsxs("header",{className:"shadow-glass border-latte-surface1/60 bg-latte-base/80 flex flex-col gap-4 rounded-[32px] border p-6 backdrop-blur",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.5em]",children:"tmux-agent-monitor"}),E.jsx("h1",{className:"font-display text-latte-text text-3xl",children:"Live Sessions"})]}),E.jsx("div",{className:"flex flex-col items-end gap-3",children:E.jsxs("div",{className:"flex items-center gap-3",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("span",{className:`h-2 w-2 rounded-full ${o?"bg-latte-green":"bg-latte-red"}`}),E.jsx("span",{className:"text-latte-subtext0 text-xs",children:o?"Connected":"Reconnecting"})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>l(),"aria-label":"Refresh",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]})})]}),E.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[E.jsx("div",{className:"min-w-[200px] flex-1",children:E.jsx(Wy,{placeholder:"Search by command, path, session...",value:i,onChange:m=>f(m.target.value)})}),E.jsx("div",{className:"flex flex-wrap gap-2",children:["ALL","RUNNING","WAITING_INPUT","WAITING_PERMISSION","UNKNOWN"].map(m=>E.jsx(nn,{variant:d===m?"primary":"ghost",size:"sm",onClick:()=>p(m),children:m.replace("_"," ")},m))})]}),c&&E.jsx("div",{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-sm",children:"Read-only mode is active. Actions are disabled."})]}),E.jsx("div",{className:"grid gap-4 md:grid-cols-2",children:g.map(m=>E.jsx(Rc,{to:`/sessions/${encodeURIComponent(m.paneId)}`,className:"group",children:E.jsxs(yo,{className:"hover:shadow-glow transition hover:-translate-y-1",children:[E.jsxs("div",{className:"flex items-center justify-between",children:[E.jsx(Vy,{tone:Yle(m.state),children:m.state}),m.pipeConflict&&E.jsx("span",{className:"bg-latte-red/15 text-latte-red rounded-full px-3 py-1 text-[10px] font-semibold uppercase tracking-[0.3em]",children:"Pipe conflict"})]}),E.jsxs("div",{className:"mt-4 space-y-2",children:[E.jsx("h3",{className:"font-display text-latte-text text-lg",children:m.title??m.sessionName}),E.jsxs("p",{className:"text-latte-subtext0 text-sm",children:[m.currentCommand??"unknown"," · ",Xle(m.currentPath)]}),m.lastMessage&&E.jsx("p",{className:"text-latte-overlay1 text-xs",children:m.lastMessage})]}),E.jsxs("div",{className:"text-latte-overlay1 mt-4 flex items-center justify-between text-xs",children:[E.jsxs("span",{children:["Pane ",m.paneId]}),E.jsx("span",{children:m.agent})]})]})},m.paneId))})]})},Qle=()=>E.jsx(ZN,{children:E.jsx(qle,{children:E.jsxs(h1,{children:[E.jsx(gf,{path:"/",element:E.jsx(Ile,{})}),E.jsx(gf,{path:"/sessions/:paneId",element:E.jsx(Vle,{})})]})})});pS.createRoot(document.getElementById("root")).render(E.jsx(S.StrictMode,{children:E.jsx(q1,{children:E.jsx(Qle,{})})}));
|
|
55
|
+
`]},`${le}-${ae.slice(0,12)}`)),$c=j?"Shift+Tab":"Tab",Vc=T?.agent==="codex"?"CODEX":T?.agent==="claude"?"CLAUDE":T?.agent?.toUpperCase?.()??"UNKNOWN";return T?E.jsxs("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10",children:[E.jsxs("div",{className:"flex items-center justify-between gap-3",children:[E.jsxs(Rc,{to:"/",className:Wg,children:[E.jsx(Wu,{className:"h-4 w-4"}),"Back to list"]}),E.jsx($y,{})]}),E.jsxs("header",{className:"shadow-glass border-latte-surface1/60 bg-latte-base/80 flex flex-col gap-3 rounded-[32px] border p-4 backdrop-blur",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-4",children:[E.jsxs("div",{children:[E.jsx("h1",{className:"font-display text-latte-text text-xl",children:T.title??T.sessionName}),E.jsx("p",{className:"text-latte-subtext0 text-sm",children:hf(T.currentPath)})]}),E.jsxs("div",{className:"flex flex-wrap items-center justify-end gap-3",children:[E.jsxs("div",{className:"text-latte-subtext1 flex items-center gap-2 text-[10px] uppercase tracking-[0.3em]",children:["Agent",E.jsx("span",{className:"border-latte-lavender/35 bg-latte-lavender/10 text-latte-lavender inline-flex items-center rounded-full border px-3 py-1 text-[11px] font-semibold tracking-[0.2em]",children:Vc})]}),E.jsx(Vy,{tone:Hle(T.state),children:T.state})]})]}),T.pipeConflict&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-sm",children:"Another pipe-pane is attached. Screen is capture-only."}),_&&E.jsx("div",{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-sm",children:"Read-only mode is active. Actions are disabled."})]}),E.jsxs("div",{className:"grid min-w-0 gap-6 lg:grid-cols-[1.3fr_1fr]",children:[E.jsxs(yo,{className:"flex min-w-0 flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsx("div",{className:"flex items-center gap-2",children:E.jsx(qy,{value:A,onValueChange:Z=>{if((Z==="text"||Z==="image")&&Z!==A){const ae=Z;Nn.current=ae,k({type:"start",mode:ae}),C(ae)}},children:E.jsxs(Gf,{"aria-label":"Screen mode",children:[E.jsx(pr,{value:"text",children:"Text"}),E.jsx(pr,{value:"image",children:"Image"})]})})}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:Bn,"aria-label":"Refresh screen",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),I&&E.jsxs("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:["Image fallback: ",I]}),K&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:K}),E.jsxs("div",{className:"border-latte-surface1 bg-latte-mantle/40 relative flex min-h-[320px] w-full min-w-0 max-w-full flex-1 overflow-hidden rounded-2xl border p-4",children:[Rr&&E.jsx("div",{className:"bg-latte-base/60 absolute inset-0 z-10 flex items-center justify-center backdrop-blur-sm",children:E.jsx("div",{className:"border-latte-lavender/40 border-t-latte-lavender h-8 w-8 animate-spin rounded-full border-2"})}),A==="image"&&L?E.jsx("div",{className:"flex w-full items-center justify-center",children:E.jsx("img",{src:`data:image/png;base64,${L}`,alt:"screen",className:"border-latte-surface2 max-h-[480px] w-full rounded-xl border object-contain"})}):E.jsx("div",{ref:Hn,className:"w-full min-w-0 max-w-full overflow-x-auto overflow-y-auto",style:{maxHeight:"60vh"},children:E.jsx("div",{ref:Ds,children:E.jsx("pre",{className:"text-latte-text w-max whitespace-pre font-mono text-xs",dangerouslySetInnerHTML:{__html:Oo}})})})]})]}),E.jsx("div",{className:"flex flex-col gap-6",children:_?E.jsx(yo,{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach border text-sm",children:"Read-only mode is active. Interactive controls are hidden."}):E.jsxs(yo,{className:"space-y-3",children:[E.jsxs("div",{className:"flex items-start gap-3",children:[E.jsx("textarea",{placeholder:"Type a command…",ref:ye,rows:2,disabled:!c,className:"border-latte-surface2 text-latte-text focus:border-latte-lavender focus:ring-latte-lavender/30 bg-latte-base/70 min-h-[64px] min-w-0 flex-1 resize-y rounded-2xl border px-4 py-2 text-base shadow-sm outline-none transition focus:ring-2 disabled:cursor-not-allowed disabled:opacity-60 md:text-sm"}),E.jsx("div",{className:"flex shrink-0 items-center self-center",children:E.jsxs(nn,{onClick:Mr,"aria-label":"Send",className:"h-11 w-11 p-0",children:[E.jsx(l2,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Send"})]})})]}),E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>N(Z=>!Z),"aria-expanded":re,"aria-controls":"session-controls",className:"text-latte-subtext0 flex items-center gap-2 text-[11px] uppercase tracking-[0.32em]",children:[re?E.jsx(ef,{className:"h-4 w-4"}):E.jsx(Pu,{className:"h-4 w-4"}),"Keys"]}),E.jsxs("button",{type:"button",onClick:()=>De(Z=>!Z),"aria-pressed":ke,title:"Auto-enter after send",className:`group inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[10px] font-semibold uppercase tracking-[0.24em] transition ${ke?"border-latte-lavender/60 bg-latte-lavender/10 text-latte-lavender shadow-[inset_0_0_0_1px_rgba(114,135,253,0.12)]":"border-latte-surface2/70 text-latte-subtext0 hover:border-latte-overlay1 hover:text-latte-text"}`,children:[E.jsx("span",{className:"text-[9px] font-semibold tracking-[0.3em]",children:"Auto"}),E.jsx(e2,{className:"h-3.5 w-3.5"}),E.jsx("span",{className:"sr-only",children:"Auto-enter"})]})]}),re&&E.jsxs("div",{id:"session-controls",className:"space-y-3",children:[E.jsx("div",{className:"flex flex-wrap items-center justify-between gap-2",children:E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx(nn,{variant:j?"primary":"ghost",size:"sm",onClick:()=>V(Z=>!Z),"aria-pressed":j,className:"font-mono text-[11px] uppercase tracking-[0.3em]",children:"Shift"}),E.jsx(nn,{variant:W?"primary":"ghost",size:"sm",onClick:()=>ce(Z=>!Z),"aria-pressed":W,className:"font-mono text-[11px] uppercase tracking-[0.3em]",children:"Ctrl"})]})}),E.jsx("div",{className:"flex flex-wrap gap-2",children:[{label:"Esc",key:"Escape"},{label:$c,key:"Tab"},{label:"Enter",key:"Enter"}].map(Z=>E.jsx(nv,{label:Z.label,onClick:()=>pa(Z.key)},Z.key))}),E.jsx("div",{className:"flex items-center gap-2",children:[{label:E.jsxs(E.Fragment,{children:[E.jsx(Wu,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Left"})]}),key:"Left",ariaLabel:"Left"},{label:E.jsxs(E.Fragment,{children:[E.jsx(XT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Up"})]}),key:"Up",ariaLabel:"Up"},{label:E.jsxs(E.Fragment,{children:[E.jsx(ZT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Down"})]}),key:"Down",ariaLabel:"Down"},{label:E.jsxs(E.Fragment,{children:[E.jsx(VT,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Right"})]}),key:"Right",ariaLabel:"Right"}].map(Z=>E.jsx(nv,{label:Z.label,ariaLabel:Z.ariaLabel,onClick:()=>pa(Z.key)},Z.key))})]})]})})]}),E.jsxs(yo,{className:"flex flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.3em]",children:"Changes"}),E.jsxs("p",{className:"text-latte-text text-sm",children:[B?.files.length??0," file",(B?.files.length??0)===1?"":"s"]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:Co,disabled:Se,"aria-label":"Refresh changes",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),B?.repoRoot&&E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:["Repo: ",hf(B.repoRoot)]}),Se&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Loading diff…"}),B?.reason==="cwd_unknown"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Working directory is unknown for this session."}),B?.reason==="not_git"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Current directory is not a git repository."}),B?.reason==="error"&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:"Failed to load git status."}),ne&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:ne}),!Se&&B&&B.files.length===0&&!B.reason&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"No changes detected."}),E.jsx("div",{className:"flex flex-col gap-2",children:B?.files.map(Z=>{const ae=!!_t[Z.path],le=!!Ut[Z.path],ve=$e[Z.path],xe=Z.status==="?"?"U":Z.status,he=Z.additions===null||typeof Z.additions>"u"?"—":String(Z.additions),He=Z.deletions===null||typeof Z.deletions>"u"?"—":String(Z.deletions);return E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/70 rounded-2xl border",children:[E.jsxs("button",{type:"button",onClick:()=>ga(Z.path),className:"flex w-full items-center justify-between gap-3 px-4 py-3 text-left",children:[E.jsxs("div",{className:"flex min-w-0 items-center gap-3",children:[E.jsx("span",{className:`${Pg(xe)} text-[10px] font-semibold uppercase tracking-[0.25em]`,children:xe}),E.jsx("span",{className:"text-latte-text truncate text-sm",children:Z.path})]}),E.jsxs("div",{className:"flex items-center gap-3 text-xs",children:[E.jsxs("span",{className:"text-latte-green",children:["+",he]}),E.jsxs("span",{className:"text-latte-red",children:["-",He]}),E.jsx("span",{className:"text-latte-subtext0 min-w-[3.25rem] text-right",children:ae?"Hide":"Show"})]})]}),ae&&E.jsxs("div",{className:"border-latte-surface2/70 border-t px-4 py-3",children:[le&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading diff…"}),!le&&ve?.binary&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Binary file (no diff)."}),!le&&!ve?.binary&&ve?.patch&&E.jsxs("div",{className:"max-h-[360px] overflow-auto",children:[E.jsx("pre",{className:"whitespace-pre font-mono text-xs",children:ct(ve.patch)}),ve.truncated&&E.jsx("p",{className:"text-latte-subtext0 mt-2 text-xs",children:"Diff truncated."})]}),!le&&!ve?.binary&&!ve?.patch&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No diff available."})]})]},`${Z.path}-${Z.status}`)})})]}),E.jsxs(yo,{className:"flex flex-col gap-4",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.3em]",children:"Commit Log"}),E.jsxs("p",{className:"text-latte-text text-sm",children:[Me?.commits.length??0," commit",(Me?.commits.length??0)===1?"":"s"]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>bn({force:!0}),disabled:fa,"aria-label":"Refresh commit log",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]}),Me?.repoRoot&&E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:["Repo: ",hf(Me.repoRoot)]}),fa&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Loading commits…"}),Me?.reason==="cwd_unknown"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Working directory is unknown for this session."}),Me?.reason==="not_git"&&E.jsx("div",{className:"border-latte-peach/40 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-xs",children:"Current directory is not a git repository."}),Me?.reason==="error"&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:"Failed to load commit log."}),Un&&E.jsx("div",{className:"border-latte-red/40 bg-latte-red/10 text-latte-red rounded-2xl border px-4 py-2 text-xs",children:Un}),!fa&&Me&&Me.commits.length===0&&!Me.reason&&E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"No commits found."}),E.jsx("div",{className:"flex flex-col gap-2",children:Me?.commits.map(Z=>{const ae=!!Cs[Z.hash],le=zt[Z.hash],ve=!!Et[Z.hash],xe=le?.body??Z.body;return E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/70 rounded-2xl border",children:[E.jsxs("div",{className:"flex w-full flex-wrap items-start justify-between gap-3 px-4 py-3",children:[E.jsxs("div",{className:"flex min-w-0 items-start gap-3",children:[E.jsxs("button",{type:"button",onClick:()=>ya(Z.hash),className:"border-latte-surface2/70 text-latte-subtext0 hover:text-latte-text flex items-center gap-2 rounded-full border px-3 py-1 text-xs font-semibold tracking-[0.2em] transition","aria-label":`Copy commit hash ${Z.shortHash}`,children:[E.jsx("span",{className:"font-mono",children:Z.shortHash}),Rt===Z.hash?E.jsx(QT,{className:"text-latte-green h-3.5 w-3.5"}):E.jsx(WT,{className:"h-3.5 w-3.5"})]}),E.jsxs("div",{className:"min-w-0",children:[E.jsx("p",{className:"text-latte-text text-sm",children:Z.subject}),E.jsxs("p",{className:"text-latte-subtext0 text-xs",children:[Z.authorName," · ",$le(Z.authoredAt)]})]})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>va(Z.hash),className:"flex items-center gap-1 text-xs",children:[ae?E.jsx(ef,{className:"h-4 w-4"}):E.jsx(Pu,{className:"h-4 w-4"}),ae?"Hide":"Show"]})]}),ae&&E.jsxs("div",{className:"border-latte-surface2/70 border-t px-4 py-3",children:[ve&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading commit…"}),!ve&&xe&&E.jsx("pre",{className:"text-latte-subtext0 mb-3 whitespace-pre-wrap text-xs",children:xe}),!ve&&le?.files&&le.files.length>0&&E.jsx("div",{className:"flex flex-col gap-2 text-xs",children:le.files.map(he=>{const He=he.status==="?"?"U":he.status,gt=`${Z.hash}:${he.path}`,It=!!To[gt],it=Nr[gt],Fa=!!No[gt],js=he.additions===null||typeof he.additions>"u"?"—":String(he.additions),jr=he.deletions===null||typeof he.deletions>"u"?"—":String(he.deletions),Yc=he.renamedFrom?`${he.renamedFrom} → ${he.path}`:he.path;return E.jsxs("div",{className:"flex flex-col gap-2",children:[E.jsxs("div",{className:"flex items-center gap-3",children:[E.jsxs("div",{className:"flex min-w-0 items-center gap-2",children:[E.jsx("span",{className:`${Pg(He)} text-[10px] font-semibold uppercase tracking-[0.25em]`,children:He}),E.jsx("span",{className:"text-latte-text truncate",children:Yc})]}),E.jsxs("div",{className:"ml-auto flex shrink-0 items-center gap-3 text-xs",children:[E.jsxs("span",{className:"text-latte-green",children:["+",js]}),E.jsxs("span",{className:"text-latte-red",children:["-",jr]}),E.jsxs("button",{type:"button",onClick:()=>Ja(Z.hash,he.path),className:"text-latte-subtext0 hover:text-latte-text inline-flex items-center gap-1",children:[It?E.jsx(ef,{className:"h-3.5 w-3.5"}):E.jsx(Pu,{className:"h-3.5 w-3.5"}),E.jsx("span",{className:"min-w-[3.25rem] text-right",children:It?"Hide":"Show"})]})]})]}),It&&E.jsxs("div",{className:"border-latte-surface2/70 bg-latte-base/60 rounded-xl border px-3 py-2",children:[Fa&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Loading diff…"}),!Fa&&it?.binary&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"Binary file (no diff)."}),!Fa&&!it?.binary&&it?.patch&&E.jsxs("div",{className:"max-h-[240px] overflow-auto",children:[E.jsx("pre",{className:"whitespace-pre font-mono text-xs",children:ct(it.patch)}),it.truncated&&E.jsx("p",{className:"text-latte-subtext0 mt-2 text-xs",children:"Diff truncated."})]}),!Fa&&!it?.binary&&!it?.patch&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No diff available."})]})]},`${he.path}-${he.status}`)})}),!ve&&le?.files&&le.files.length===0&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No files changed."}),!ve&&!le&&E.jsx("p",{className:"text-latte-subtext0 text-xs",children:"No commit details."})]})]},Z.hash)})}),Me&&zs&&!Me.reason&&E.jsx(nn,{variant:"ghost",size:"sm",onClick:()=>bn({append:!0,force:!0}),disabled:Eo,children:Eo?"Loading…":"Load more"})]})]}):E.jsx("div",{className:"mx-auto flex max-w-2xl flex-col gap-4 px-4 py-10",children:E.jsxs(yo,{children:[E.jsx("p",{className:"text-latte-subtext0 text-sm",children:"Session not found."}),E.jsxs(Rc,{to:"/",className:`${Wg} mt-4`,children:[E.jsx(Wu,{className:"h-4 w-4"}),"Back to list"]})]})})},Wy=S.forwardRef(({className:n,...o},c)=>E.jsx("input",{ref:c,className:wr("border-latte-surface2 text-latte-text focus:border-latte-lavender focus:ring-latte-lavender/30 bg-latte-base/70 w-full rounded-2xl border px-4 py-2 text-base shadow-sm outline-none transition focus:ring-2 md:text-sm",n),...o}));Wy.displayName="Input";const Yle=n=>{switch(n){case"RUNNING":return"running";case"WAITING_INPUT":return"waiting";case"WAITING_PERMISSION":return"permission";default:return"unknown"}},Xle=n=>{if(!n)return"—";const o=n.match(/^\/(Users|home)\/[^/]+(\/.*)?$/);return o?`~${o[2]??""}`:n},Ile=()=>{const{sessions:n,connected:o,readOnly:c,refreshSessions:l}=Ky(),[i,f]=S.useState(""),[d,p]=S.useState("ALL"),g=S.useMemo(()=>{const m=i.trim().toLowerCase();return n.filter(y=>d==="ALL"||y.state===d?m?`${y.sessionName} ${y.currentCommand??""} ${y.currentPath??""} ${y.title??""}`.toLowerCase().includes(m):!0:!1)},[d,i,n]);return E.jsxs("div",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-4 py-10",children:[E.jsx("div",{className:"flex justify-end",children:E.jsx($y,{})}),E.jsxs("header",{className:"shadow-glass border-latte-surface1/60 bg-latte-base/80 flex flex-col gap-4 rounded-[32px] border p-6 backdrop-blur",children:[E.jsxs("div",{className:"flex flex-wrap items-center justify-between gap-3",children:[E.jsxs("div",{children:[E.jsx("p",{className:"text-latte-subtext0 text-xs uppercase tracking-[0.5em]",children:"tmux-agent-monitor"}),E.jsx("h1",{className:"font-display text-latte-text text-3xl",children:"Live Sessions"})]}),E.jsx("div",{className:"flex flex-col items-end gap-3",children:E.jsxs("div",{className:"flex items-center gap-3",children:[E.jsxs("div",{className:"flex items-center gap-2",children:[E.jsx("span",{className:`h-2 w-2 rounded-full ${o?"bg-latte-green":"bg-latte-red"}`}),E.jsx("span",{className:"text-latte-subtext0 text-xs",children:o?"Connected":"Reconnecting"})]}),E.jsxs(nn,{variant:"ghost",size:"sm",onClick:()=>l(),"aria-label":"Refresh",children:[E.jsx(ds,{className:"h-4 w-4"}),E.jsx("span",{className:"sr-only",children:"Refresh"})]})]})})]}),E.jsxs("div",{className:"flex flex-wrap items-center gap-3",children:[E.jsx("div",{className:"min-w-[200px] flex-1",children:E.jsx(Wy,{placeholder:"Search by command, path, session...",value:i,onChange:m=>f(m.target.value)})}),E.jsx("div",{className:"flex flex-wrap gap-2",children:["ALL","RUNNING","WAITING_INPUT","WAITING_PERMISSION","UNKNOWN"].map(m=>E.jsx(nn,{variant:d===m?"primary":"ghost",size:"sm",onClick:()=>p(m),children:m.replace("_"," ")},m))})]}),c&&E.jsx("div",{className:"border-latte-peach/50 bg-latte-peach/10 text-latte-peach rounded-2xl border px-4 py-2 text-sm",children:"Read-only mode is active. Actions are disabled."})]}),E.jsx("div",{className:"grid gap-4 md:grid-cols-2",children:g.map(m=>E.jsx(Rc,{to:`/sessions/${encodeURIComponent(m.paneId)}`,className:"group",children:E.jsxs(yo,{className:"hover:shadow-glow transition hover:-translate-y-1",children:[E.jsxs("div",{className:"flex items-center justify-between",children:[E.jsx(Vy,{tone:Yle(m.state),children:m.state}),m.pipeConflict&&E.jsx("span",{className:"bg-latte-red/15 text-latte-red rounded-full px-3 py-1 text-[10px] font-semibold uppercase tracking-[0.3em]",children:"Pipe conflict"})]}),E.jsxs("div",{className:"mt-4 space-y-2",children:[E.jsx("h3",{className:"font-display text-latte-text text-lg",children:m.title??m.sessionName}),E.jsxs("p",{className:"text-latte-subtext0 text-sm",children:[m.currentCommand??"unknown"," · ",Xle(m.currentPath)]}),m.lastMessage&&E.jsx("p",{className:"text-latte-overlay1 text-xs",children:m.lastMessage})]}),E.jsxs("div",{className:"text-latte-overlay1 mt-4 flex items-center justify-between text-xs",children:[E.jsxs("span",{children:["Pane ",m.paneId]}),E.jsx("span",{children:m.agent})]})]})},m.paneId))})]})},Qle=()=>E.jsx(ZN,{children:E.jsx(qle,{children:E.jsxs(h1,{children:[E.jsx(gf,{path:"/",element:E.jsx(Ile,{})}),E.jsx(gf,{path:"/sessions/:paneId",element:E.jsx(Vle,{})})]})})});pS.createRoot(document.getElementById("root")).render(E.jsx(S.StrictMode,{children:E.jsx(q1,{children:E.jsx(Qle,{})})}));
|
|
@@ -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:IBM Plex Mono,M PLUS 1 Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,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}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.mb-3{margin-bottom:.75rem}.ml-auto{margin-left:auto}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-11{height:2.75rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-8{height:2rem}.max-h-\[240px\]{max-height:240px}.max-h-\[360px\]{max-height:360px}.max-h-\[480px\]{max-height:480px}.min-h-\[320px\]{min-height:320px}.min-h-\[64px\]{min-height:64px}.w-11{width:2.75rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-8{width:2rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[3\.25rem\]{min-width:3.25rem}.min-w-\[70px\]{min-width:70px}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize-y{resize:vertical}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.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))}.self-center{align-self:center}.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-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-latte-blue\/40{border-color:rgb(var(--ctp-blue) / .4)}.border-latte-green\/40{border-color:rgb(var(--ctp-green) / .4)}.border-latte-lavender\/35{border-color:rgb(var(--ctp-lavender) / .35)}.border-latte-lavender\/40{border-color:rgb(var(--ctp-lavender) / .4)}.border-latte-lavender\/60{border-color:rgb(var(--ctp-lavender) / .6)}.border-latte-overlay0\/60{border-color:rgb(var(--ctp-overlay0) / .6)}.border-latte-peach\/40{border-color:rgb(var(--ctp-peach) / .4)}.border-latte-peach\/50{border-color:rgb(var(--ctp-peach) / .5)}.border-latte-red\/40{border-color:rgb(var(--ctp-red) / .4)}.border-latte-surface1{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface1) / var(--tw-border-opacity, 1))}.border-latte-surface1\/60{border-color:rgb(var(--ctp-surface1) / .6)}.border-latte-surface2{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface2) / var(--tw-border-opacity, 1))}.border-latte-surface2\/70{border-color:rgb(var(--ctp-surface2) / .7)}.border-t-latte-lavender{--tw-border-opacity: 1;border-top-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.bg-latte-base\/60{background-color:rgb(var(--ctp-base) / .6)}.bg-latte-base\/70{background-color:rgb(var(--ctp-base) / .7)}.bg-latte-base\/80{background-color:rgb(var(--ctp-base) / .8)}.bg-latte-blue\/15{background-color:rgb(var(--ctp-blue) / .15)}.bg-latte-green{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-green) / var(--tw-bg-opacity, 1))}.bg-latte-green\/20{background-color:rgb(var(--ctp-green) / .2)}.bg-latte-lavender{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-lavender) / var(--tw-bg-opacity, 1))}.bg-latte-lavender\/10{background-color:rgb(var(--ctp-lavender) / .1)}.bg-latte-mantle\/40{background-color:rgb(var(--ctp-mantle) / .4)}.bg-latte-peach\/10{background-color:rgb(var(--ctp-peach) / .1)}.bg-latte-peach\/20{background-color:rgb(var(--ctp-peach) / .2)}.bg-latte-red{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-red) / var(--tw-bg-opacity, 1))}.bg-latte-red\/10{background-color:rgb(var(--ctp-red) / .1)}.bg-latte-red\/15{background-color:rgb(var(--ctp-red) / .15)}.bg-latte-red\/20{background-color:rgb(var(--ctp-red) / .2)}.bg-latte-surface0\/60{background-color:rgb(var(--ctp-surface0) / .6)}.bg-latte-surface1{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-surface1) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-left{text-align:left}.text-right{text-align:right}.font-display{font-family:Fraunces,serif}.font-mono{font-family:IBM Plex Mono,M PLUS 1 Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.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-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-\[0\.24em\]{letter-spacing:.24em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.32em\]{letter-spacing:.32em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.5em\]{letter-spacing:.5em}.text-latte-base{--tw-text-opacity: 1;color:rgb(var(--ctp-base) / var(--tw-text-opacity, 1))}.text-latte-blue{--tw-text-opacity: 1;color:rgb(var(--ctp-blue) / var(--tw-text-opacity, 1))}.text-latte-green{--tw-text-opacity: 1;color:rgb(var(--ctp-green) / var(--tw-text-opacity, 1))}.text-latte-lavender{--tw-text-opacity: 1;color:rgb(var(--ctp-lavender) / var(--tw-text-opacity, 1))}.text-latte-overlay1{--tw-text-opacity: 1;color:rgb(var(--ctp-overlay1) / var(--tw-text-opacity, 1))}.text-latte-peach{--tw-text-opacity: 1;color:rgb(var(--ctp-peach) / var(--tw-text-opacity, 1))}.text-latte-red{--tw-text-opacity: 1;color:rgb(var(--ctp-red) / var(--tw-text-opacity, 1))}.text-latte-subtext0{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext0) / var(--tw-text-opacity, 1))}.text-latte-subtext1{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext1) / var(--tw-text-opacity, 1))}.text-latte-text{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.text-latte-yellow{--tw-text-opacity: 1;color:rgb(var(--ctp-yellow) / var(--tw-text-opacity, 1))}.shadow-\[inset_0_0_0_1px_rgba\(114\,135\,253\,0\.12\)\]{--tw-shadow: inset 0 0 0 1px rgba(114,135,253,.12);--tw-shadow-colored: inset 0 0 0 1px 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-glass{--tw-shadow: 0 20px 60px -30px rgb(var(--ctp-shadow) / .35);--tw-shadow-colored: 0 20px 60px -30px 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-glow{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px 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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{color-scheme:light;--ctp-base: 239 241 245;--ctp-mantle: 230 233 239;--ctp-crust: 220 224 232;--ctp-text: 76 79 105;--ctp-subtext1: 92 95 119;--ctp-subtext0: 108 111 133;--ctp-surface0: 204 208 218;--ctp-surface1: 188 192 204;--ctp-surface2: 172 176 190;--ctp-overlay0: 156 160 176;--ctp-overlay1: 140 143 161;--ctp-overlay2: 124 127 147;--ctp-blue: 30 102 245;--ctp-lavender: 114 135 253;--ctp-peach: 254 100 11;--ctp-red: 210 15 57;--ctp-green: 64 160 43;--ctp-yellow: 223 142 29;--ctp-mauve: 136 57 239;--ctp-maroon: 230 69 83;--ctp-shadow: 31 30 58;--grid-dot-alpha: .15;--grid-opacity: .08;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .18), transparent 55% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .12), transparent 60% )}:root[data-theme=mocha]{color-scheme:dark;--ctp-base: 30 30 46;--ctp-mantle: 24 24 37;--ctp-crust: 17 17 27;--ctp-text: 205 214 244;--ctp-subtext1: 186 194 222;--ctp-subtext0: 166 173 200;--ctp-surface0: 49 50 68;--ctp-surface1: 69 71 90;--ctp-surface2: 88 91 112;--ctp-overlay0: 108 112 134;--ctp-overlay1: 127 132 156;--ctp-overlay2: 147 153 178;--ctp-blue: 137 180 250;--ctp-lavender: 180 190 254;--ctp-peach: 250 179 135;--ctp-red: 243 139 168;--ctp-green: 166 227 161;--ctp-yellow: 249 226 175;--ctp-mauve: 203 166 247;--ctp-maroon: 235 160 172;--ctp-shadow: 8 10 22;--grid-dot-alpha: .12;--grid-opacity: .12;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .12), transparent 60% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .08), transparent 65% )}body{font-family:IBM Plex Sans,sans-serif;background:var(--bg-gradient-1),var(--bg-gradient-2),rgb(var(--ctp-base));color:rgb(var(--ctp-text));min-height:100vh}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:var(--grid-opacity);background-image:radial-gradient(rgb(var(--ctp-text) / var(--grid-dot-alpha)) 1px,transparent 1px);background-size:24px 24px;mix-blend-mode:multiply}*{box-sizing:border-box}.font-mono{font-synthesis:none}.hover\:-translate-y-1:hover{--tw-translate-y: -.25rem;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))}.hover\:translate-y-\[-1px\]:hover{--tw-translate-y: -1px;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))}.hover\:border-latte-overlay1:hover{--tw-border-opacity: 1;border-color:rgb(var(--ctp-overlay1) / var(--tw-border-opacity, 1))}.hover\:bg-latte-crust:hover{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-crust) / var(--tw-bg-opacity, 1))}.hover\:bg-latte-surface1\/70:hover{background-color:rgb(var(--ctp-surface1) / .7)}.hover\:text-latte-text:hover{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.hover\:shadow-glow:hover{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-latte-lavender:focus{--tw-border-opacity: 1;border-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-latte-lavender\/30:focus{--tw-ring-color: rgb(var(--ctp-lavender) / .3)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-latte-lavender:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--ctp-lavender) / var(--tw-ring-opacity, 1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.data-\[state\=active\]\:bg-latte-base\/90[data-state=active]{background-color:rgb(var(--ctp-base) / .9)}.data-\[state\=active\]\:text-latte-text[data-state=active]{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media(min-width:1024px){.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}}
|
package/dist/web/index.html
CHANGED
|
@@ -10,8 +10,8 @@
|
|
|
10
10
|
href="https://fonts.googleapis.com/css2?family=Fraunces:opsz,wght@9..144,400;9..144,600;9..144,700&family=IBM+Plex+Mono:wght@400;600&family=IBM+Plex+Sans:wght@400;500;600;700&family=M+PLUS+1+Code:wght@400;600&display=swap"
|
|
11
11
|
rel="stylesheet"
|
|
12
12
|
/>
|
|
13
|
-
<script type="module" crossorigin src="/assets/index-
|
|
14
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
13
|
+
<script type="module" crossorigin src="/assets/index-DOYPj0MF.js"></script>
|
|
14
|
+
<link rel="stylesheet" crossorigin href="/assets/index-DwGS83bj.css">
|
|
15
15
|
</head>
|
|
16
16
|
<body>
|
|
17
17
|
<div id="root"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
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:IBM Plex Mono,M PLUS 1 Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,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}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.mb-3{margin-bottom:.75rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-11{height:2.75rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-8{height:2rem}.max-h-\[240px\]{max-height:240px}.max-h-\[360px\]{max-height:360px}.max-h-\[480px\]{max-height:480px}.min-h-\[320px\]{min-height:320px}.min-h-\[64px\]{min-height:64px}.w-11{width:2.75rem}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-8{width:2rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[70px\]{min-width:70px}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize-y{resize:vertical}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.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))}.self-center{align-self:center}.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-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-latte-blue\/40{border-color:rgb(var(--ctp-blue) / .4)}.border-latte-green\/40{border-color:rgb(var(--ctp-green) / .4)}.border-latte-lavender\/35{border-color:rgb(var(--ctp-lavender) / .35)}.border-latte-lavender\/40{border-color:rgb(var(--ctp-lavender) / .4)}.border-latte-lavender\/60{border-color:rgb(var(--ctp-lavender) / .6)}.border-latte-overlay0\/60{border-color:rgb(var(--ctp-overlay0) / .6)}.border-latte-peach\/40{border-color:rgb(var(--ctp-peach) / .4)}.border-latte-peach\/50{border-color:rgb(var(--ctp-peach) / .5)}.border-latte-red\/40{border-color:rgb(var(--ctp-red) / .4)}.border-latte-surface1{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface1) / var(--tw-border-opacity, 1))}.border-latte-surface1\/60{border-color:rgb(var(--ctp-surface1) / .6)}.border-latte-surface2{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface2) / var(--tw-border-opacity, 1))}.border-latte-surface2\/70{border-color:rgb(var(--ctp-surface2) / .7)}.border-t-latte-lavender{--tw-border-opacity: 1;border-top-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.bg-latte-base\/60{background-color:rgb(var(--ctp-base) / .6)}.bg-latte-base\/70{background-color:rgb(var(--ctp-base) / .7)}.bg-latte-base\/80{background-color:rgb(var(--ctp-base) / .8)}.bg-latte-blue\/15{background-color:rgb(var(--ctp-blue) / .15)}.bg-latte-green{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-green) / var(--tw-bg-opacity, 1))}.bg-latte-green\/20{background-color:rgb(var(--ctp-green) / .2)}.bg-latte-lavender{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-lavender) / var(--tw-bg-opacity, 1))}.bg-latte-lavender\/10{background-color:rgb(var(--ctp-lavender) / .1)}.bg-latte-mantle\/40{background-color:rgb(var(--ctp-mantle) / .4)}.bg-latte-peach\/10{background-color:rgb(var(--ctp-peach) / .1)}.bg-latte-peach\/20{background-color:rgb(var(--ctp-peach) / .2)}.bg-latte-red{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-red) / var(--tw-bg-opacity, 1))}.bg-latte-red\/10{background-color:rgb(var(--ctp-red) / .1)}.bg-latte-red\/15{background-color:rgb(var(--ctp-red) / .15)}.bg-latte-red\/20{background-color:rgb(var(--ctp-red) / .2)}.bg-latte-surface0\/60{background-color:rgb(var(--ctp-surface0) / .6)}.bg-latte-surface1{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-surface1) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-left{text-align:left}.font-display{font-family:Fraunces,serif}.font-mono{font-family:IBM Plex Mono,M PLUS 1 Code,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.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-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-\[0\.24em\]{letter-spacing:.24em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.32em\]{letter-spacing:.32em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.5em\]{letter-spacing:.5em}.text-latte-base{--tw-text-opacity: 1;color:rgb(var(--ctp-base) / var(--tw-text-opacity, 1))}.text-latte-blue{--tw-text-opacity: 1;color:rgb(var(--ctp-blue) / var(--tw-text-opacity, 1))}.text-latte-green{--tw-text-opacity: 1;color:rgb(var(--ctp-green) / var(--tw-text-opacity, 1))}.text-latte-lavender{--tw-text-opacity: 1;color:rgb(var(--ctp-lavender) / var(--tw-text-opacity, 1))}.text-latte-overlay1{--tw-text-opacity: 1;color:rgb(var(--ctp-overlay1) / var(--tw-text-opacity, 1))}.text-latte-peach{--tw-text-opacity: 1;color:rgb(var(--ctp-peach) / var(--tw-text-opacity, 1))}.text-latte-red{--tw-text-opacity: 1;color:rgb(var(--ctp-red) / var(--tw-text-opacity, 1))}.text-latte-subtext0{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext0) / var(--tw-text-opacity, 1))}.text-latte-subtext1{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext1) / var(--tw-text-opacity, 1))}.text-latte-text{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.text-latte-yellow{--tw-text-opacity: 1;color:rgb(var(--ctp-yellow) / var(--tw-text-opacity, 1))}.shadow-\[inset_0_0_0_1px_rgba\(114\,135\,253\,0\.12\)\]{--tw-shadow: inset 0 0 0 1px rgba(114,135,253,.12);--tw-shadow-colored: inset 0 0 0 1px 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-glass{--tw-shadow: 0 20px 60px -30px rgb(var(--ctp-shadow) / .35);--tw-shadow-colored: 0 20px 60px -30px 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-glow{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px 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)}.outline-none{outline:2px solid transparent;outline-offset:2px}.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)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{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-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{color-scheme:light;--ctp-base: 239 241 245;--ctp-mantle: 230 233 239;--ctp-crust: 220 224 232;--ctp-text: 76 79 105;--ctp-subtext1: 92 95 119;--ctp-subtext0: 108 111 133;--ctp-surface0: 204 208 218;--ctp-surface1: 188 192 204;--ctp-surface2: 172 176 190;--ctp-overlay0: 156 160 176;--ctp-overlay1: 140 143 161;--ctp-overlay2: 124 127 147;--ctp-blue: 30 102 245;--ctp-lavender: 114 135 253;--ctp-peach: 254 100 11;--ctp-red: 210 15 57;--ctp-green: 64 160 43;--ctp-yellow: 223 142 29;--ctp-mauve: 136 57 239;--ctp-maroon: 230 69 83;--ctp-shadow: 31 30 58;--grid-dot-alpha: .15;--grid-opacity: .08;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .18), transparent 55% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .12), transparent 60% )}:root[data-theme=mocha]{color-scheme:dark;--ctp-base: 30 30 46;--ctp-mantle: 24 24 37;--ctp-crust: 17 17 27;--ctp-text: 205 214 244;--ctp-subtext1: 186 194 222;--ctp-subtext0: 166 173 200;--ctp-surface0: 49 50 68;--ctp-surface1: 69 71 90;--ctp-surface2: 88 91 112;--ctp-overlay0: 108 112 134;--ctp-overlay1: 127 132 156;--ctp-overlay2: 147 153 178;--ctp-blue: 137 180 250;--ctp-lavender: 180 190 254;--ctp-peach: 250 179 135;--ctp-red: 243 139 168;--ctp-green: 166 227 161;--ctp-yellow: 249 226 175;--ctp-mauve: 203 166 247;--ctp-maroon: 235 160 172;--ctp-shadow: 8 10 22;--grid-dot-alpha: .12;--grid-opacity: .12;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .12), transparent 60% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .08), transparent 65% )}body{font-family:IBM Plex Sans,sans-serif;background:var(--bg-gradient-1),var(--bg-gradient-2),rgb(var(--ctp-base));color:rgb(var(--ctp-text));min-height:100vh}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:var(--grid-opacity);background-image:radial-gradient(rgb(var(--ctp-text) / var(--grid-dot-alpha)) 1px,transparent 1px);background-size:24px 24px;mix-blend-mode:multiply}*{box-sizing:border-box}.font-mono{font-synthesis:none}.hover\:-translate-y-1:hover{--tw-translate-y: -.25rem;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))}.hover\:translate-y-\[-1px\]:hover{--tw-translate-y: -1px;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))}.hover\:border-latte-overlay1:hover{--tw-border-opacity: 1;border-color:rgb(var(--ctp-overlay1) / var(--tw-border-opacity, 1))}.hover\:bg-latte-crust:hover{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-crust) / var(--tw-bg-opacity, 1))}.hover\:bg-latte-surface1\/70:hover{background-color:rgb(var(--ctp-surface1) / .7)}.hover\:text-latte-text:hover{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.hover\:shadow-glow:hover{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-latte-lavender:focus{--tw-border-opacity: 1;border-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-latte-lavender\/30:focus{--tw-ring-color: rgb(var(--ctp-lavender) / .3)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-latte-lavender:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--ctp-lavender) / var(--tw-ring-opacity, 1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.data-\[state\=active\]\:bg-latte-base\/90[data-state=active]{background-color:rgb(var(--ctp-base) / .9)}.data-\[state\=active\]\:text-latte-text[data-state=active]{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--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)}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media(min-width:1024px){.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}}
|