@netnodeag/kraftwerk 0.78.1 → 0.80.0
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/README.md +83 -0
- package/dist/cli/daemon.js +10 -9
- package/dist/cli/doctor.js +1 -1
- package/dist/cli/entities.d.ts +8 -0
- package/dist/cli/entities.js +222 -0
- package/dist/cli/init.js +3 -0
- package/dist/cli/kraftwerk.js +7 -0
- package/dist/cli/ui.js +2 -1
- package/dist/client/routes.d.ts +16 -0
- package/dist/client/routes.js +16 -0
- package/dist/config.d.ts +25 -0
- package/dist/config.js +17 -6
- package/dist/core/chat/context.js +5 -2
- package/dist/core/entities.d.ts +171 -0
- package/dist/core/entities.js +441 -0
- package/dist/core/git.js +3 -1
- package/dist/core/journal.d.ts +12 -2
- package/dist/core/journal.js +50 -5
- package/dist/core/log.d.ts +18 -0
- package/dist/core/log.js +23 -0
- package/dist/core/projects.d.ts +22 -33
- package/dist/core/projects.js +40 -134
- package/dist/core/records.d.ts +28 -0
- package/dist/core/records.js +71 -0
- package/dist/core/refs.d.ts +74 -0
- package/dist/core/refs.js +143 -0
- package/dist/core/search.d.ts +10 -0
- package/dist/core/search.js +12 -0
- package/dist/core/settings.d.ts +4 -0
- package/dist/core/settings.js +24 -3
- package/dist/core/slug.d.ts +9 -0
- package/dist/core/slug.js +18 -0
- package/dist/core/trash.d.ts +1 -1
- package/dist/server/api/devices.js +2 -1
- package/dist/server/api/entities.d.ts +74 -0
- package/dist/server/api/entities.js +60 -0
- package/dist/server/api/index.d.ts +66 -4
- package/dist/server/api/index.js +5 -0
- package/dist/server/api/projects.d.ts +3 -0
- package/dist/server/api/projects.js +3 -0
- package/dist/server/api/workspace.d.ts +15 -0
- package/dist/server/api/workspace.js +12 -4
- package/dist/server/cloud.js +3 -2
- package/dist/server/relay.d.ts +3 -2
- package/dist/server/relay.js +7 -7
- package/dist/server/server.js +3 -2
- package/package.json +1 -1
- package/schema/kraftwerk.schema.json +54 -0
- package/web/dist/assets/{dist-Crnb8VVO.js → dist-1PajaYPg.js} +1 -1
- package/web/dist/assets/{dist-B-yVL5lk.js → dist-B4dqwo7_.js} +1 -1
- package/web/dist/assets/dist-Bp1iMuQ7.js +1 -0
- package/web/dist/assets/{dist-C90kUzps.js → dist-CK2u1OXb.js} +1 -1
- package/web/dist/assets/{dist-DQbifCX0.js → dist-D-f0nszo.js} +1 -1
- package/web/dist/assets/{dist-BTc878j7.js → dist-DKduisGW.js} +1 -1
- package/web/dist/assets/{dist-D0rjnN8S.js → dist-DgKgeYFJ.js} +1 -1
- package/web/dist/assets/{dist-D4SDXoGw.js → dist-DlZPeneT.js} +1 -1
- package/web/dist/assets/{dist-DHRhdODt.js → dist-K_3Y5Nbl.js} +1 -1
- package/web/dist/assets/{dist-B9EMB1Ie.js → dist-NX4_yvho.js} +1 -1
- package/web/dist/assets/{dist-CpLdAqFQ.js → dist-u_oAKIhZ.js} +1 -1
- package/web/dist/assets/{editor-DHAdW1g_.js → editor-CE9TlKkJ.js} +3 -3
- package/web/dist/assets/index-Dvt-vE1h.css +2 -0
- package/web/dist/assets/index-IAuwD22j.js +231 -0
- package/web/dist/index.html +2 -2
- package/web/dist-remote/assets/index-D6Wznb5o.js +27 -0
- package/web/dist-remote/index.html +2 -2
- package/web/dist-remote/sw.js +1 -1
- package/web/dist/assets/dist-lSJ-O7kT.js +0 -1
- package/web/dist/assets/index-BKDJocDd.css +0 -2
- package/web/dist/assets/index-D7JVAjll.js +0 -231
- package/web/dist-remote/assets/index-2nAI1HTV.js +0 -13
package/web/dist/index.html
CHANGED
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
} catch (e) {}
|
|
16
16
|
})();
|
|
17
17
|
</script>
|
|
18
|
-
<script type="module" crossorigin src="/assets/index-
|
|
19
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
18
|
+
<script type="module" crossorigin src="/assets/index-IAuwD22j.js"></script>
|
|
19
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Dvt-vE1h.css">
|
|
20
20
|
</head>
|
|
21
21
|
<body>
|
|
22
22
|
<div id="root"></div>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e=`kraftwerk-remote`;function t(){return new Promise((t,n)=>{let r=indexedDB.open(e,2);r.onupgradeneeded=()=>{let e=r.result.objectStoreNames;e.contains(`machines`)||r.result.createObjectStore(`machines`,{keyPath:`key`}),e.contains(`state`)||r.result.createObjectStore(`state`),e.contains(`joined`)||r.result.createObjectStore(`joined`,{keyPath:`workspaceId`})},r.onsuccess=()=>t(r.result),r.onerror=()=>n(r.error)})}async function n(e,n,r){let i=await t();try{return await new Promise((t,a)=>{let o=r(i.transaction(e,n).objectStore(e));o.onsuccess=()=>t(o.result),o.onerror=()=>a(o.error)})}finally{i.close()}}var r=()=>n(`machines`,`readonly`,e=>e.getAll()),i=e=>n(`machines`,`readwrite`,t=>t.delete(e)),a=e=>n(`state`,`readwrite`,t=>t.put(e,`current`)),o=()=>n(`joined`,`readonly`,e=>e.getAll()),s=e=>n(`joined`,`readonly`,t=>t.get(e)),c=e=>n(`joined`,`readwrite`,t=>t.put(e)),l=e=>n(`joined`,`readwrite`,t=>t.delete(e)),u=e=>e.hosts.find(t=>t.publicKey===e.hostKey)??e.hosts.find(e=>e.online)??e.hosts[0];async function d(e){let t=[...new Uint8Array(await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e))).subarray(0,4)].map(e=>e.toString(16).padStart(2,`0`)).join(``);return`${t.slice(0,4)}-${t.slice(4)}`}var f=document.getElementById(`app`),p=e=>e.replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]),m=/^[A-Za-z0-9_-]{43}$/;async function h(){if(!(`serviceWorker`in navigator))throw Error(`this browser has no service workers (a private window?)`);let e=await navigator.serviceWorker.register(`/_kw/sw.js`,{scope:`/`});await navigator.serviceWorker.ready;let t=e.active??e.waiting??e.installing;if(!t)throw Error(`the service worker did not start`);return t}async function g(e,t){let n=await fetch(e,{method:t?`POST`:`GET`,credentials:`same-origin`,headers:t?{"content-type":`application/json`}:{},body:t?JSON.stringify(t):void 0}),r=await n.json().catch(()=>({}));if(!n.ok)throw Object.assign(Error(r.error??`the cloud answered ${n.status}`),{status:n.status});return r}var _=e=>{let t=e.trim(),n=/\/join\/([^/?#\s]+)/.exec(t);return decodeURIComponent(n?n[1]:t)};async function v(e){for(let t of e)await c({...await s(t.id).catch(()=>void 0)??{joinedAt:new Date().toISOString()},workspaceId:t.id,name:t.name,role:t.role,hosts:t.hosts}).catch(()=>{})}async function y(e){let t=await g(`/api/me/workspaces/${encodeURIComponent(e)}/token`,{}),n={...await s(e)??{hosts:[],joinedAt:new Date().toISOString()},workspaceId:e,name:t.workspaceName,role:t.role,token:t.memberToken,error:void 0};return await c(n),n}function b(e,t){return new Promise((n,r)=>{let i=new MessageChannel,a=setTimeout(()=>r(Error(`no answer — is the host awake and remote access on?`)),3e4);i.port1.onmessage=e=>{clearTimeout(a);let t=e.data;t.ok&&t.slug?n(t.slug):r(Error(t.error??`the host did not let this member in`))},e.postMessage({type:`member`,workspaceId:t},[i.port2])})}function x(e,t){return new Promise((n,r)=>{let i=new MessageChannel,a=setTimeout(()=>r(Error(`no answer — is the machine awake and remote access on?`)),3e4);i.port1.onmessage=e=>{clearTimeout(a);let t=e.data;t.ok?n():r(Error(t.error??`pairing failed`))},e.postMessage({type:`pair`,...t},[i.port2])})}async function S(e,t,n){let r=await d(e),i=/iPhone/.test(navigator.userAgent)?`iPhone`:/iPad/.test(navigator.userAgent)?`iPad`:/Android/.test(navigator.userAgent)?`Android phone`:`browser`;f.innerHTML=`
|
|
2
|
+
<h1>Pair with ${p(n)}</h1>
|
|
3
|
+
<p class="dim">This phone reaches ${p(n)} from anywhere, end to end encrypted: the relay in between cannot read along.</p>
|
|
4
|
+
<div class="card">
|
|
5
|
+
<p>Machine key <code>${p(r)}</code><br><span class="dim">The same as <code>kraftwerk remote</code> shows on the machine.</span></p>
|
|
6
|
+
<label for="name">Name this device</label>
|
|
7
|
+
<input id="name" value="${p(i)}" autocomplete="off" />
|
|
8
|
+
<button id="go">Pair</button>
|
|
9
|
+
<p id="msg" class="dim"></p>
|
|
10
|
+
</div>`;let a=document.getElementById(`go`),o=document.getElementById(`msg`);a.onclick=async()=>{a.disabled=!0,o.className=`dim`,o.textContent=`Connecting…`;try{await x(await h(),{key:e,code:t,label:n,name:document.getElementById(`name`).value.trim()}),history.replaceState(null,``,`/_kw/`),location.href=`/`}catch(e){a.disabled=!1,o.className=`err`,o.textContent=e.message}}}async function C(e){let t=await r().catch(()=>[]),n=await Promise.all(t.map(async e=>`<div class="card machine"><a href="/" data-open="${p(e.key)}">${p(e.label)}<br><span class="dim">key <code>${p(await d(e.key))}</code></span></a><button class="quiet" data-forget="${p(e.key)}">Forget</button></div>`));f.innerHTML=`
|
|
11
|
+
<h1>kraftwerk remote</h1>
|
|
12
|
+
${e?`<p class="err">${p(e)}</p>`:``}
|
|
13
|
+
${n.join(``)||`<div class="card"><p>No machine paired on this phone yet.</p><p class="dim">On the Mac: <code>kraftwerk remote on</code>, then <code>kraftwerk remote pair</code> — or scan the QR code under Settings → Devices — and open the link here.</p></div>`}
|
|
14
|
+
<h2>Workspaces you joined</h2>
|
|
15
|
+
<div id="joined"><p class="dim">Loading…</p></div>`,f.querySelectorAll(`[data-open]`).forEach(e=>{e.onclick=async t=>{t.preventDefault(),await h(),await a(e.dataset.open),location.href=`/`}}),f.querySelectorAll(`[data-forget]`).forEach(e=>{e.onclick=async()=>{await i(e.dataset.forget),C()}}),t.length&&h().catch(()=>{}),w()}async function w(e,t=!1){let n=document.getElementById(`joined`);if(!n)return;let r=await g(`/api/auth/me`).catch(()=>({user:null})),i=!!r.user,a=``;i&&await g(`/api/me/workspaces`).then(e=>v(e.workspaces),e=>a=e.message);let d=(await o().catch(()=>[])).sort((e,t)=>e.name.localeCompare(t.name)).map(e=>{let t=u(e),n=t?`${p(t.machineName)} · ${t.online?`online`:`offline`}`:`no host in the cloud`,r=e.error?`<p class="err">${p(e.error)}</p>${i?`<button class="quiet" data-mint="${p(e.workspaceId)}">Get a new token and open</button>`:`<p class="dim">Sign in below for a new token.</p>`}`:``;return`<div class="card"><div class="machine"><a href="/" data-ws="${p(e.workspaceId)}">${p(e.name)}<br><span class="dim">${n} · ${p(e.role)}</span></a><button class="quiet" data-unjoin="${p(e.workspaceId)}">Forget</button></div>${r}</div>`});n.innerHTML=`
|
|
16
|
+
${e?`<p class="${t?`dim`:`err`}">${p(e)}</p>`:``}
|
|
17
|
+
${a?`<p class="err">${p(a)}</p>`:``}
|
|
18
|
+
${d.join(``)||`<div class="card"><p>No workspace joined on this phone yet.</p><p class="dim">A teammate invites you from the workspace's Members settings; accept the invite here.</p></div>`}
|
|
19
|
+
<div class="card">
|
|
20
|
+
${i?`<p>Signed in as <strong>${p(r.user.email)}</strong> <button class="quiet" id="logout">Sign out</button></p>`:`<p class="dim">Sign in to the kraftwerk cloud to join and open workspaces.</p>
|
|
21
|
+
<label for="email">Email</label><input id="email" type="email" autocomplete="username" />
|
|
22
|
+
<label for="password">Password</label><input id="password" type="password" autocomplete="current-password" />`}
|
|
23
|
+
<label for="invite">Invite code or link${i?``:` (optional)`}</label>
|
|
24
|
+
<input id="invite" autocomplete="off" placeholder="XKQ7-2MPD-HH3A" />
|
|
25
|
+
${i?`<button id="join">Join</button>`:`<button id="login">Sign in</button><button class="quiet" id="signup">Create an account instead</button>`}
|
|
26
|
+
<p id="cloudmsg" class="dim"></p>
|
|
27
|
+
</div>`;let f=document.getElementById(`cloudmsg`),m=e=>{f.className=`err`,f.textContent=e.message},x=e=>document.getElementById(e)?.value.trim()??``,S=async()=>{let e=_(x(`invite`));if(!e)return;let t=await g(`/api/invites/accept`,{code:e});return await c({...await s(t.workspaceId)??{hosts:[],joinedAt:new Date().toISOString()},workspaceId:t.workspaceId,name:t.workspaceName,role:t.role,token:t.memberToken,error:void 0}),t},C=e=>async()=>{f.className=`dim`,f.textContent=e===`signup`?`Creating the account…`:`Signing in…`;try{await g(`/api/auth/${e}`,{email:x(`email`),password:document.getElementById(`password`).value});let t;try{t=await S()}catch(e){w(`Signed in, but the invite did not go through: ${e.message}`);return}w(t?`Joined ${t.workspaceName}.`:void 0,!0)}catch(e){m(e)}},T=document.getElementById(`login`);T&&(T.onclick=C(`login`));let E=document.getElementById(`signup`);E&&(E.onclick=C(`signup`));let D=document.getElementById(`logout`);D&&(D.onclick=()=>void g(`/api/auth/logout`,{}).then(()=>w(),m));let O=document.getElementById(`join`);O&&(O.onclick=async()=>{f.className=`dim`,f.textContent=`Joining…`;try{let e=await S();if(!e)throw Error(`paste an invite code or a /join/ link first`);w(`Joined ${e.workspaceName}.`,!0)}catch(e){m(e)}});let k=async(e,t)=>{f.className=`dim`,f.textContent=`Connecting…`;try{let n=await s(e);if(t||!n?.token){if(!i)throw Error(`sign in first — this phone has no member token for that workspace`);n=await y(e)}let r=await b(await h(),e);location.href=`/w/${encodeURIComponent(r)}/`}catch(t){if(t.status===401)return void w(`Your sign-in ran out — sign in again.`);w((await s(e).catch(()=>void 0))?.error===t.message?void 0:t.message)}};n.querySelectorAll(`[data-ws]`).forEach(e=>{e.onclick=t=>{t.preventDefault(),k(e.dataset.ws,!1)}}),n.querySelectorAll(`[data-mint]`).forEach(e=>e.onclick=()=>void k(e.dataset.mint,!0)),n.querySelectorAll(`[data-unjoin]`).forEach(e=>{e.onclick=async()=>{await l(e.dataset.unjoin).catch(()=>{}),w()}})}var T=new URLSearchParams(location.hash.slice(1)),E=T.get(`k`)??``,D=T.get(`c`)??``;m.test(E)&&D?S(E,D,T.get(`n`)||`your machine`):C(m.test(E)?"This link has no pairing code — make a new one with `kraftwerk remote pair`.":void 0);
|
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<meta name="apple-mobile-web-app-capable" content="yes" />
|
|
8
8
|
<meta name="apple-mobile-web-app-title" content="kraftwerk" />
|
|
9
9
|
<title>kraftwerk remote</title>
|
|
10
|
-
<style>:root{--bg:#f6f6f4;--card:#fff;--fg:#1d1d1b;--dim:#6b6b66;--line:#e3e3de;--accent:#2f6fde;--bad:#c0392b}@media (prefers-color-scheme:dark){:root{--bg:#151514;--card:#1e1e1c;--fg:#ececea;--dim:#9a9a94;--line:#30302d;--accent:#6b9cf0;--bad:#ef7a6a}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);margin:0;font:16px/1.45 system-ui,-apple-system,sans-serif}main{max-width:32rem;padding:max(24px, env(safe-area-inset-top)) 16px 32px;margin:0 auto}h1{margin:8px 0 4px;font-size:22px}p{margin:8px 0}.dim{color:var(--dim);font-size:14px}.card{background:var(--card);border:1px solid var(--line);border-radius:14px;margin:16px 0;padding:16px}label{color:var(--dim);margin:12px 0 4px;font-size:14px;display:block}input{width:100%;font:inherit;border:1px solid var(--line);background:var(--bg);color:var(--fg);border-radius:10px;padding:10px 12px}button{font:inherit;background:var(--accent);color:#fff;border:0;border-radius:10px;width:100%;margin-top:14px;padding:10px 16px;font-weight:600}button.quiet{color:var(--dim);background:0 0;width:auto;margin:0;padding:6px 0;font-weight:400}button:disabled{opacity:.6}.machine{align-items:center;gap:12px;display:flex}.machine a{color:var(--fg);flex:1;font-weight:600;text-decoration:none}.err{color:var(--bad)}code{font:13px ui-monospace,monospace}</style>
|
|
11
|
-
<script type="module" crossorigin src="/_kw/assets/index-
|
|
10
|
+
<style>:root{--bg:#f6f6f4;--card:#fff;--fg:#1d1d1b;--dim:#6b6b66;--line:#e3e3de;--accent:#2f6fde;--bad:#c0392b}@media (prefers-color-scheme:dark){:root{--bg:#151514;--card:#1e1e1c;--fg:#ececea;--dim:#9a9a94;--line:#30302d;--accent:#6b9cf0;--bad:#ef7a6a}}*{box-sizing:border-box}body{background:var(--bg);color:var(--fg);margin:0;font:16px/1.45 system-ui,-apple-system,sans-serif}main{max-width:32rem;padding:max(24px, env(safe-area-inset-top)) 16px 32px;margin:0 auto}h1{margin:8px 0 4px;font-size:22px}h2{margin:28px 0 4px;font-size:17px}p{margin:8px 0}.dim{color:var(--dim);font-size:14px}.card{background:var(--card);border:1px solid var(--line);border-radius:14px;margin:16px 0;padding:16px}label{color:var(--dim);margin:12px 0 4px;font-size:14px;display:block}input{width:100%;font:inherit;border:1px solid var(--line);background:var(--bg);color:var(--fg);border-radius:10px;padding:10px 12px}button{font:inherit;background:var(--accent);color:#fff;border:0;border-radius:10px;width:100%;margin-top:14px;padding:10px 16px;font-weight:600}button.quiet{color:var(--dim);background:0 0;width:auto;margin:0;padding:6px 0;font-weight:400}button:disabled{opacity:.6}.machine{align-items:center;gap:12px;display:flex}.machine a{color:var(--fg);flex:1;font-weight:600;text-decoration:none}.err{color:var(--bad)}code{font:13px ui-monospace,monospace}</style>
|
|
11
|
+
<script type="module" crossorigin src="/_kw/assets/index-D6Wznb5o.js"></script>
|
|
12
12
|
</head>
|
|
13
13
|
<body>
|
|
14
14
|
<main id="app"><p class="dim">Loading…</p></main>
|
package/web/dist-remote/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(){var e=()=>globalThis.crypto.subtle,t=new TextEncoder,n=new TextDecoder;function r(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function i(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var a=e=>r(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``),o=e=>i(e.replace(/-/g,`+`).replace(/_/g,`/`)+`===`.slice((e.length+3)%4)),s=(...e)=>{let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t};async function c(){let t=await e().generateKey({name:`X25519`},!0,[`deriveBits`]);return{privateKey:t.privateKey,publicKey:new Uint8Array(await e().exportKey(`raw`,t.publicKey))}}var l=t=>{if(t.length!==32)throw Error(`invalid public key`);return e().importKey(`raw`,t,{name:`X25519`},!1,[])},u=async(t,n)=>new Uint8Array(await e().deriveBits({name:`X25519`,public:await l(n)},t,256));async function d(t){return a(new Uint8Array(await e().digest(`SHA-256`,t)).subarray(0,16))}async function f(n,r){let i=await e().importKey(`raw`,n,`HKDF`,!1,[`deriveKey`]),a=n=>e().deriveKey({name:`HKDF`,hash:`SHA-256`,salt:r,info:t.encode(`kraftwerk-relay-v1 ${n}`)},i,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`]);return{toDaemon:await a(`to-daemon`),toClient:await a(`to-client`)}}var p=e=>{let t=new Uint8Array(12);return new DataView(t.buffer).setBigUint64(4,BigInt(e)),t};function m(a,o){let s=0,c=0,l=Promise.resolve(),u=Promise.resolve();return{seal(n){let i=l.then(async()=>{let i=p(s++);return r(new Uint8Array(await e().encrypt({name:`AES-GCM`,iv:i},a,t.encode(n))))});return l=i.catch(()=>{}),i},open(t){let r=u.then(async()=>{let r=p(c++);try{return n.decode(await e().decrypt({name:`AES-GCM`,iv:r},o,i(t)))}catch{throw Error(`relay message failed to decrypt — tampered, replayed or out of order`)}});return u=r.catch(()=>{}),r}}}async function h(e){let t=await c();return{hello:{t:`hello`,v:1,key:r(t.publicKey)},async finish(n){if(n?.t!==`ready`||typeof n.key!=`string`||typeof n.box!=`string`)throw Error(`not a relay handshake answer`);let r=i(n.key),a=await f(s(await u(t.privateKey,e),await u(t.privateKey,r)),s(t.publicKey,e,r)),o=m(a.toDaemon,a.toClient);if(await o.open(n.box).catch(()=>``)!==`ready`)throw Error(`the machine did not prove its key — wrong pairing link, or not the machine you paired with`);return o}}}var g=1;async function _(e){let t=await d(e.publicKey),a=`${e.relayUrl}${e.relayUrl.includes(`?`)?`&`:`?`}id=${encodeURIComponent(t)}`,o=await h(e.publicKey),s=e.connect?e.connect(a):new WebSocket(a),c=null,l=``,u,f=new Promise(e=>u=e),p=new Map,m=1,_=null,v=e=>{if(!l){l=e||`the connection closed`;for(let e of p.values()){e.reject(Error(l));try{e.stream?.error(Error(l))}catch{}}p.clear(),u(l)}},y=new Promise((t,r)=>{let i=setTimeout(()=>{r(Error(`the machine did not answer through the relay`)),s.close()},e.timeoutMs??15e3);s.addEventListener(`open`,()=>s.send(JSON.stringify(o.hello))),s.addEventListener(`close`,e=>{clearTimeout(i);let t=e.reason||(e.code===4404?`the machine is not connected to the relay`:`the relay closed the connection`);r(Error(t)),v(t)}),s.addEventListener(`error`,()=>{});let a=!0,l=Promise.resolve();s.addEventListener(`message`,e=>{let u=typeof e.data==`string`?e.data:n.decode(e.data);l=l.then(async()=>{if(a){a=!1;try{c=await o.finish(JSON.parse(u)),clearTimeout(i),t(c)}catch(e){clearTimeout(i),r(e),s.close(4400,`handshake failed`)}return}if(!c)return;let e;try{e=JSON.parse(await c.open(u))}catch(e){s.close(4400,`bad message`),v(e.message);return}b(e)})})}),b=e=>{if(e.t===`auth`){_?.(e),_=null;return}let t=p.get(e.id);if(t){if(e.t===`res`){let n=new ReadableStream({start:e=>{t.stream=e},cancel:()=>{p.delete(e.id),x({t:`abort`,id:e.id})}}),r=e.status,i=r===204||r===304||r>=100&&r<200;t.resolve(new Response(i?null:n,{status:r,headers:e.headers}))}else if(e.t===`data`)try{t.stream?.enqueue(i(e.chunk))}catch{}else if(e.t===`end`){p.delete(e.id);try{t.stream?.close()}catch{}}else if(e.t===`fail`){p.delete(e.id);let n=Error(e.error);t.reject(n);try{t.stream?.error(n)}catch{}}}},x=async e=>{c&&s.readyState===g&&s.send(await c.seal(JSON.stringify(e)))};await y;let S;if(e.member){let t=e.member,n=await new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`the machine did not answer the member's hello`)),e.timeoutMs??15e3);_=e=>{clearTimeout(i),n(e)},f.then(e=>{clearTimeout(i),r(Error(e))}),x({t:`auth`,memberToken:t.token,workspaceId:t.workspaceId}).catch(r)});if(!n.ok)throw s.close(1e3,`bye`),v(n.error),Error(n.error);S={member:n.member,workspace:n.workspace}}return{fetch:async(e,t)=>{if(l)throw Error(l);let n=new Request(typeof e==`string`&&e.startsWith(`/`)?`http://relay${e}`:e,t),i=new URL(n.url),a={};n.headers.forEach((e,t)=>a[t]=e);let o=n.method===`GET`||n.method===`HEAD`?void 0:new Uint8Array(await n.arrayBuffer()),s=m++;return new Promise((e,t)=>{p.set(s,{resolve:e,reject:t,signal:n.signal}),n.signal?.addEventListener(`abort`,()=>{let e=p.get(s);if(!e)return;p.delete(s);let t=new DOMException(`aborted`,`AbortError`);e.reject(t);try{e.stream?.error(t)}catch{}x({t:`abort`,id:s})}),x({t:`req`,id:s,method:n.method,url:i.pathname+i.search,headers:a,...o?.length?{body:r(o)}:{}}).catch(e=>{p.delete(s),t(e)})})},close:()=>{s.close(1e3,`bye`),v(`closed`)},closed:f,...S?{member:S}:{}}}var v=`kraftwerk-remote`;function y(){return new Promise((e,t)=>{let n=indexedDB.open(v,1);n.onupgradeneeded=()=>{n.result.createObjectStore(`machines`,{keyPath:`key`}),n.result.createObjectStore(`state`)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function b(e,t,n){let r=await y();try{return await new Promise((i,a)=>{let o=n(r.transaction(e,t).objectStore(e));o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)})}finally{r.close()}}var x=()=>b(`machines`,`readonly`,e=>e.getAll()),S=e=>b(`machines`,`readwrite`,t=>t.put(e)),C=()=>b(`state`,`readonly`,e=>e.get(`current`)),w=e=>b(`state`,`readwrite`,t=>t.put(e,`current`));async function T(){let[e,t]=await Promise.all([C(),x()]);return t.find(t=>t.key===e)??(t.length===1?t[0]:void 0)}var E=e=>`${e.replace(/^http/,`ws`)}/api/relay/client`,D=self;D.addEventListener(`install`,e=>e.waitUntil(D.skipWaiting())),D.addEventListener(`activate`,e=>e.waitUntil(D.clients.claim()));var O=null;function k(e){if(O?.key===e)return O.t;O?.t.then(e=>e.close()).catch(()=>{});let t=_({relayUrl:E(D.location.origin),publicKey:o(e)}),n={key:e,t};return O=n,t.then(e=>void e.closed.then(()=>O===n&&(O=null)),()=>O===n&&(O=null)),t}var A=(e,t,n)=>new Response(`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><body style="font:16px system-ui;padding:24px;max-width:36em;margin:auto"><h1 style="font-size:20px">${t}</h1><p>${n}</p><p><a href="/_kw/">Machines</a> · <a href="" onclick="location.reload();return false">Try again</a></p>`,{status:e,headers:{"content-type":`text/html; charset=utf-8`}});async function j(e,t){let n=new URL(e.url),r=new Headers(e.headers);r.set(`authorization`,`Bearer ${t.token}`),r.set(`host`,n.host);let i=await k(t.key),a=e.method===`GET`||e.method===`HEAD`?void 0:await e.arrayBuffer(),o=await i.fetch(n.pathname+n.search,{method:e.method,headers:r,body:a,signal:e.signal});if(e.method===`POST`&&/^(\/w\/[^/]+)?\/api\/pair$/.test(n.pathname)&&o.ok){let{token:e}=await o.clone().json().catch(()=>({}));e&&await S({...t,token:e,pairedAt:new Date().toISOString()})}return o}D.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);t.origin!==D.location.origin||t.pathname.startsWith(`/_kw/`)||e.respondWith((async()=>{if(e.request.mode===`navigate`&&e.request.method!==`GET`)return A(403,`Refused`,`A form from another page tried to act on your machine.`);let t=await T();if(!t)return e.request.mode===`navigate`?Response.redirect(`/_kw/`,302):new Response(JSON.stringify({error:`no machine paired here`}),{status:503});try{return await j(e.request,t)}catch(n){if(n.name===`AbortError`)throw n;let r=n.message;return e.request.mode===`navigate`?A(502,`${t.label} is not reachable`,`${r}. Is the Mac awake, and is remote access on (<code>kraftwerk remote</code>)?`):new Response(JSON.stringify({error:r}),{status:502,headers:{"content-type":`application/json`}})}})())}),D.addEventListener(`message`,e=>{let t=e.data,n=e.ports[0];if(t?.type!==`pair`||!t.key||!t.code||!n)return;let r=t.key;(async()=>{try{O=null;let e=await(await k(r)).fetch(`/api/pair`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({code:t.code,name:t.name||`phone`})}),i=await e.json().catch(()=>({}));if(!e.ok||!i.token)throw Error(i.error??`pairing failed (${e.status})`);await S({key:r,token:i.token,label:t.label||`your machine`,pairedAt:new Date().toISOString()}),await w(r),n.postMessage({ok:!0})}catch(e){n.postMessage({ok:!1,error:e.message})}})()})})();
|
|
1
|
+
(function(){var e=()=>globalThis.crypto.subtle,t=new TextEncoder,n=new TextDecoder;function r(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function i(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var a=e=>r(e).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``),o=e=>i(e.replace(/-/g,`+`).replace(/_/g,`/`)+`===`.slice((e.length+3)%4)),s=(...e)=>{let t=new Uint8Array(e.reduce((e,t)=>e+t.length,0)),n=0;for(let r of e)t.set(r,n),n+=r.length;return t};async function c(){let t=await e().generateKey({name:`X25519`},!0,[`deriveBits`]);return{privateKey:t.privateKey,publicKey:new Uint8Array(await e().exportKey(`raw`,t.publicKey))}}var l=t=>{if(t.length!==32)throw Error(`invalid public key`);return e().importKey(`raw`,t,{name:`X25519`},!1,[])},u=async(t,n)=>new Uint8Array(await e().deriveBits({name:`X25519`,public:await l(n)},t,256));async function d(t){return a(new Uint8Array(await e().digest(`SHA-256`,t)).subarray(0,16))}async function f(n,r){let i=await e().importKey(`raw`,n,`HKDF`,!1,[`deriveKey`]),a=n=>e().deriveKey({name:`HKDF`,hash:`SHA-256`,salt:r,info:t.encode(`kraftwerk-relay-v1 ${n}`)},i,{name:`AES-GCM`,length:256},!1,[`encrypt`,`decrypt`]);return{toDaemon:await a(`to-daemon`),toClient:await a(`to-client`)}}var p=e=>{let t=new Uint8Array(12);return new DataView(t.buffer).setBigUint64(4,BigInt(e)),t};function m(a,o){let s=0,c=0,l=Promise.resolve(),u=Promise.resolve();return{seal(n){let i=l.then(async()=>{let i=p(s++);return r(new Uint8Array(await e().encrypt({name:`AES-GCM`,iv:i},a,t.encode(n))))});return l=i.catch(()=>{}),i},open(t){let r=u.then(async()=>{let r=p(c++);try{return n.decode(await e().decrypt({name:`AES-GCM`,iv:r},o,i(t)))}catch{throw Error(`relay message failed to decrypt — tampered, replayed or out of order`)}});return u=r.catch(()=>{}),r}}}async function h(e){let t=await c();return{hello:{t:`hello`,v:1,key:r(t.publicKey)},async finish(n){if(n?.t!==`ready`||typeof n.key!=`string`||typeof n.box!=`string`)throw Error(`not a relay handshake answer`);let r=i(n.key),a=await f(s(await u(t.privateKey,e),await u(t.privateKey,r)),s(t.publicKey,e,r)),o=m(a.toDaemon,a.toClient);if(await o.open(n.box).catch(()=>``)!==`ready`)throw Error(`the machine did not prove its key — wrong pairing link, or not the machine you paired with`);return o}}}var g=1;async function _(e){let t=await d(e.publicKey),a=`${e.relayUrl}${e.relayUrl.includes(`?`)?`&`:`?`}id=${encodeURIComponent(t)}`,o=await h(e.publicKey),s=e.connect?e.connect(a):new WebSocket(a),c=null,l=``,u,f=new Promise(e=>u=e),p=new Map,m=1,_=null,v=e=>{if(!l){l=e||`the connection closed`;for(let e of p.values()){e.reject(Error(l));try{e.stream?.error(Error(l))}catch{}}p.clear(),u(l)}},y=new Promise((t,r)=>{let i=setTimeout(()=>{r(Error(`the machine did not answer through the relay`)),s.close()},e.timeoutMs??15e3);s.addEventListener(`open`,()=>s.send(JSON.stringify(o.hello))),s.addEventListener(`close`,e=>{clearTimeout(i);let t=e.reason||(e.code===4404?`the machine is not connected to the relay`:`the relay closed the connection`);r(Error(t)),v(t)}),s.addEventListener(`error`,()=>{});let a=!0,l=Promise.resolve();s.addEventListener(`message`,e=>{let u=typeof e.data==`string`?e.data:n.decode(e.data);l=l.then(async()=>{if(a){a=!1;try{c=await o.finish(JSON.parse(u)),clearTimeout(i),t(c)}catch(e){clearTimeout(i),r(e),s.close(4400,`handshake failed`)}return}if(!c)return;let e;try{e=JSON.parse(await c.open(u))}catch(e){s.close(4400,`bad message`),v(e.message);return}b(e)})})}),b=e=>{if(e.t===`auth`){_?.(e),_=null;return}let t=p.get(e.id);if(t){if(e.t===`res`){let n=new ReadableStream({start:e=>{t.stream=e},cancel:()=>{p.delete(e.id),x({t:`abort`,id:e.id})}}),r=e.status,i=r===204||r===304||r>=100&&r<200;t.resolve(new Response(i?null:n,{status:r,headers:e.headers}))}else if(e.t===`data`)try{t.stream?.enqueue(i(e.chunk))}catch{}else if(e.t===`end`){p.delete(e.id);try{t.stream?.close()}catch{}}else if(e.t===`fail`){p.delete(e.id);let n=Error(e.error);t.reject(n);try{t.stream?.error(n)}catch{}}}},x=async e=>{c&&s.readyState===g&&s.send(await c.seal(JSON.stringify(e)))};await y;let S;if(e.member){let t=e.member,n=await new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`the machine did not answer the member's hello`)),e.timeoutMs??15e3);_=e=>{clearTimeout(i),n(e)},f.then(e=>{clearTimeout(i),r(Error(e))}),x({t:`auth`,memberToken:t.token,workspaceId:t.workspaceId}).catch(r)});if(!n.ok)throw s.close(1e3,`bye`),v(n.error),Error(n.error);S={member:n.member,workspace:n.workspace}}return{fetch:async(e,t)=>{if(l)throw Error(l);let n=new Request(typeof e==`string`&&e.startsWith(`/`)?`http://relay${e}`:e,t),i=new URL(n.url),a={};n.headers.forEach((e,t)=>a[t]=e);let o=n.method===`GET`||n.method===`HEAD`?void 0:new Uint8Array(await n.arrayBuffer()),s=m++;return new Promise((e,t)=>{p.set(s,{resolve:e,reject:t,signal:n.signal}),n.signal?.addEventListener(`abort`,()=>{let e=p.get(s);if(!e)return;p.delete(s);let t=new DOMException(`aborted`,`AbortError`);e.reject(t);try{e.stream?.error(t)}catch{}x({t:`abort`,id:s})}),x({t:`req`,id:s,method:n.method,url:i.pathname+i.search,headers:a,...o?.length?{body:r(o)}:{}}).catch(e=>{p.delete(s),t(e)})})},close:()=>{s.close(1e3,`bye`),v(`closed`)},closed:f,...S?{member:S}:{}}}var v=`kraftwerk-remote`;function y(){return new Promise((e,t)=>{let n=indexedDB.open(v,2);n.onupgradeneeded=()=>{let e=n.result.objectStoreNames;e.contains(`machines`)||n.result.createObjectStore(`machines`,{keyPath:`key`}),e.contains(`state`)||n.result.createObjectStore(`state`),e.contains(`joined`)||n.result.createObjectStore(`joined`,{keyPath:`workspaceId`})},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}async function b(e,t,n){let r=await y();try{return await new Promise((i,a)=>{let o=n(r.transaction(e,t).objectStore(e));o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)})}finally{r.close()}}var x=()=>b(`machines`,`readonly`,e=>e.getAll()),S=e=>b(`machines`,`readwrite`,t=>t.put(e)),C=()=>b(`state`,`readonly`,e=>e.get(`current`)),w=e=>b(`state`,`readwrite`,t=>t.put(e,`current`)),T=e=>b(`joined`,`readonly`,t=>t.get(e)),E=e=>b(`joined`,`readwrite`,t=>t.put(e)),D=`joined:`,O=e=>w(D+e);async function k(){let[e,t]=await Promise.all([C(),x()]);if(!e?.startsWith(D))return t.find(t=>t.key===e)??(t.length===1?t[0]:void 0)}async function A(){let e=await C();if(e?.startsWith(D)){let t=await T(e.slice(7));if(t)return{joined:t};let n=await x();return n.length===1?{machine:n[0]}:void 0}let t=await k();return t?{machine:t}:void 0}var j=e=>e.hosts.find(t=>t.publicKey===e.hostKey)??e.hosts.find(e=>e.online)??e.hosts[0],M=e=>`${e.replace(/^http/,`ws`)}/api/relay/client`,N=self;N.addEventListener(`install`,e=>e.waitUntil(N.skipWaiting())),N.addEventListener(`activate`,e=>e.waitUntil(N.clients.claim()));var P=null;function F(e,t){let n=t?`${e} ${t.workspaceId} ${t.token}`:e;if(P?.key===n)return P.t;P?.t.then(e=>e.close()).catch(()=>{});let r=_({relayUrl:M(N.location.origin),publicKey:o(e),...t?{member:t}:{}}),i={key:n,t:r};return P=i,r.then(e=>void e.closed.then(()=>P===i&&(P=null)),()=>P===i&&(P=null)),r}var I=e=>e.replace(/[&<>"']/g,e=>({"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`})[e]),L=(e,t,n)=>new Response(`<!doctype html><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>${t}</title><body style="font:16px system-ui;padding:24px;max-width:36em;margin:auto"><h1 style="font-size:20px">${t}</h1><p>${n}</p><p><a href="/_kw/">Machines</a> · <a href="" onclick="location.reload();return false">Try again</a></p>`,{status:e,headers:{"content-type":`text/html; charset=utf-8`}});async function R(e,t){let n=new URL(e.url),r=new Headers(e.headers);r.set(`authorization`,`Bearer ${t.token}`),r.set(`host`,n.host);let i=await F(t.key),a=e.method===`GET`||e.method===`HEAD`?void 0:await e.arrayBuffer(),o=await i.fetch(n.pathname+n.search,{method:e.method,headers:r,body:a,signal:e.signal});if(e.method===`POST`&&/^(\/w\/[^/]+)?\/api\/pair$/.test(n.pathname)&&o.ok){let{token:e}=await o.clone().json().catch(()=>({}));e&&await S({...t,token:e,pairedAt:new Date().toISOString()})}return o}async function z(e){let t=j(e);if(!t)throw Error(`no machine hosts ${e.name} in the cloud right now`);if(!e.token)throw Error(`no member token for this workspace on this phone — sign in again`);try{let n=await F(t.publicKey,{token:e.token,workspaceId:e.workspaceId}),r=n.member?.workspace.slug;return(r&&r!==e.slug||e.hostKey!==t.publicKey||e.error)&&await E({...e,slug:r??e.slug,hostKey:t.publicKey,error:void 0}),n}catch(t){throw await E({...e,error:t.message}).catch(()=>{}),t}}async function B(e,t){let n=new URL(e.url),r=await z(t),i=r.member?.workspace.slug??t.slug;if(e.mode===`navigate`&&n.pathname===`/`&&i)return Response.redirect(`/w/${encodeURIComponent(i)}/`,302);let a=i&&!n.pathname.startsWith(`/w/`)&&!n.pathname.startsWith(`/api/`)?`/w/${encodeURIComponent(i)}${n.pathname}`:n.pathname,o=new Headers(e.headers);o.delete(`authorization`),o.set(`host`,n.host);let s=e.method===`GET`||e.method===`HEAD`?void 0:await e.arrayBuffer();return r.fetch(a+n.search,{method:e.method,headers:o,body:s,signal:e.signal})}async function V(e){if(!e.clientId)return!1;let t=await N.clients.get(e.clientId).catch(()=>void 0);return!!t&&new URL(t.url).pathname.startsWith(`/_kw/`)}N.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);t.origin!==N.location.origin||t.pathname.startsWith(`/_kw/`)||e.respondWith((async()=>{if(t.pathname.startsWith(`/api/`)&&await V(e))return fetch(e.request);if(e.request.mode===`navigate`&&e.request.method!==`GET`)return L(403,`Refused`,`A form from another page tried to act on your machine.`);let n=await A();if(!n)return e.request.mode===`navigate`?Response.redirect(`/_kw/`,302):new Response(JSON.stringify({error:`no machine paired here`}),{status:503});try{return`joined`in n?await B(e.request,n.joined):await R(e.request,n.machine)}catch(t){if(t.name===`AbortError`)throw t;let r=t.message;return e.request.mode===`navigate`?`joined`in n?L(502,`${I(n.joined.name)} did not open`,`${I(r)}.`):L(502,`${n.machine.label} is not reachable`,`${r}. Is the Mac awake, and is remote access on (<code>kraftwerk remote</code>)?`):new Response(JSON.stringify({error:r}),{status:502,headers:{"content-type":`application/json`}})}})())});function H(e,t){(async()=>{try{let n=await T(e);if(!n)throw Error(`this workspace is not on this phone`);P=null;let r=await z(n);await O(e),t.postMessage({ok:!0,slug:r.member?.workspace.slug??n.slug})}catch(e){t.postMessage({ok:!1,error:e.message})}})()}N.addEventListener(`message`,e=>{let t=e.data,n=e.ports[0];if(t?.type===`member`&&t.workspaceId&&n)return H(t.workspaceId,n);if(t?.type!==`pair`||!t.key||!t.code||!n)return;let r=t.key;(async()=>{try{P=null;let e=await(await F(r)).fetch(`/api/pair`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({code:t.code,name:t.name||`phone`})}),i=await e.json().catch(()=>({}));if(!e.ok||!i.token)throw Error(i.error??`pairing failed (${e.status})`);await S({key:r,token:i.token,label:t.label||`your machine`,pairedAt:new Date().toISOString()}),await w(r),n.postMessage({ok:!0})}catch(e){n.postMessage({ok:!1,error:e.message})}})()})})();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./editor-DHAdW1g_.js";export{e as markdown};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-content:"";--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:12px;--text-xs--line-height:16px;--text-sm:13px;--text-sm--line-height:18px;--text-base:14px;--text-base--line-height:20px;--text-lg:18px;--text-lg--line-height:24px;--text-xl:22px;--text-xl--line-height:28px;--text-2xl:26px;--text-2xl--line-height:32px;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-normal:0em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--text-2xs:11px;--text-2xs--line-height:14px;--text-md:15px;--text-md--line-height:22px;--animate-rise:kw-rise .18s cubic-bezier(.2, .8, .2, 1) both;--animate-tab-in:kw-tab-in .18s cubic-bezier(.2, .8, .2, 1) both;--animate-slide-left:kw-slide-left .18s cubic-bezier(.2, .8, .2, 1);--animate-fade:kw-fade .18s cubic-bezier(.2, .8, .2, 1);--animate-modal:kw-modal .26s cubic-bezier(.2, .8, .2, 1);--animate-vibe-flash:vibeable-fade 2.5s ease forwards;--animate-breathe:kw-rise .18s cubic-bezier(.2, .8, .2, 1), kw-breathe 1.4s ease-in-out infinite}}@layer base{:root{--font-sans:ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;--font-mono:ui-monospace, SFMono-Regular, Menlo, monospace;--reading:ui-serif, "New York", "Iowan Old Style", Charter, "Bitstream Charter", Georgia, serif;--radius:14px;--radius-s:9px;--topbar-h:64px;--bg:#151514;--surface-1:#1e1e1c;--surface-2:#272725;--surface-3:#2f2f2c;--line:#33322f;--line-strong:#5a5851;--text:#ecebe7;--text-2:#a3a099;--accent:#a996ff;--accent-hover:#bcadff;--on-accent:#151514;--accent-container:#3b2a8a;--on-accent-container:#e6e0ff;--accent-soft:#2b2740;--on-accent-soft:#d9d0ff;--ok:#5fc48f;--ok-soft:#0f3d25;--bad:#f2867e;--on-bad:#151514;--bad-soft:#5c1a15;--on-bad-soft:#ffdad6;--ask:#e5ac52;--ask-soft:#4a3410;--on-ask-soft:#ffe0b0;--live:#86a8f5;--elev-pop:0 12px 32px #00000059;--elev-modal:0 24px 64px #00000073;--divider-shade:#00000014;--ease-out:cubic-bezier(.2, .8, .2, 1);--ease-spring:cubic-bezier(.34, 1.35, .64, 1);--t-fast:.12s;--t-base:.18s;--t-slow:.26s;--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark}:root[data-theme=light]{--bg:#f6f5f2;--surface-1:#fff;--surface-2:#f1efea;--surface-3:#e9e6df;--line:#e3e0d9;--line-strong:#b5b1a8;--text:#1d1c1a;--text-2:#64615a;--accent:#5b3fd6;--accent-hover:#4a30bd;--on-accent:#fff;--accent-container:#e6e0ff;--on-accent-container:#241466;--accent-soft:#ebe6ff;--on-accent-soft:#2c1a7a;--ok:#1f7a4d;--ok-soft:#d5f0e0;--bad:#b3261e;--on-bad:#fff;--bad-soft:#f9dedc;--on-bad-soft:#410e0b;--ask:#9a5b00;--ask-soft:#ffe7c2;--on-ask-soft:#4a2c00;--live:#2457c5;--elev-pop:0 12px 32px #00000024;--elev-modal:0 24px 64px #00000040;--divider-shade:#0000000d;--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-ws-accent]{--accent:var(--wsp-d-primary);--on-accent:var(--wsp-d-on-primary);--accent-hover:var(--wsp-d-primary)}@supports (color:color-mix(in lab, red, red)){:root[data-ws-accent]{--accent-hover:color-mix(in srgb, var(--wsp-d-primary) 85%, white)}}:root[data-ws-accent]{--accent-container:var(--wsp-d-primary-container);--on-accent-container:var(--wsp-d-on-primary-container);--accent-soft:var(--wsp-d-secondary-container);--on-accent-soft:var(--wsp-d-on-secondary-container)}:root[data-ws-accent][data-theme=light]{--accent:var(--wsp-l-primary);--on-accent:var(--wsp-l-on-primary);--accent-hover:var(--wsp-l-primary)}@supports (color:color-mix(in lab, red, red)){:root[data-ws-accent][data-theme=light]{--accent-hover:color-mix(in srgb, var(--wsp-l-primary) 85%, black)}}:root[data-ws-accent][data-theme=light]{--accent-container:var(--wsp-l-primary-container);--on-accent-container:var(--wsp-l-on-primary-container);--accent-soft:var(--wsp-l-secondary-container);--on-accent-soft:var(--wsp-l-on-secondary-container)}*{box-sizing:border-box;margin:0;padding:0}html{height:100%}body{background:var(--bg);min-height:100%;color:var(--text);font-family:var(--font-sans);-webkit-font-smoothing:antialiased;font-size:14px;line-height:1.5}a{color:inherit;text-decoration:none}button{font:inherit;color:inherit;cursor:pointer;background:0 0;border:0}:focus-visible{outline:2px solid var(--live);outline-offset:2px}code,pre{font-family:var(--font-mono)}input,textarea,select{transition:border-color var(--t-fast) ease, box-shadow var(--t-fast) ease, background var(--t-fast) ease}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-thumb{background:var(--line) content-box;border:2px solid #0000;border-radius:999px}::-webkit-scrollbar-track{background:0 0}@media (prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}}@layer vendor{@font-face{font-family:Material Symbols Rounded;font-style:normal;font-weight:400;font-display:block;src:url(/assets/material-symbols-rounded-Dni8jOUD.woff2)format("woff2")}.material-symbols-rounded{letter-spacing:normal;text-transform:none;white-space:nowrap;word-wrap:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;text-rendering:optimizelegibility;font-feature-settings:"liga";direction:ltr;font-family:Material Symbols Rounded;font-size:24px;font-style:normal;font-weight:400;line-height:1;display:inline-block}}@layer components{.shell{max-width:1240px;margin:0 auto;padding:32px 24px 96px}.shell:has(.runs-screen){max-width:none;padding:0}.shell-global>*{animation:var(--animate-rise)}.shell.three{grid-template-columns:250px minmax(0, 1fr) clamp(320px, var(--ctx-w,calc(50% - 125px)), 70%);max-width:none;height:calc(100vh - var(--topbar-h));background:var(--bg);grid-template-rows:auto minmax(0,1fr);row-gap:10px;min-height:0;margin:0;padding:14px 20px 20px;display:grid}.shell.three[hidden]{display:none}.shell.three>*{min-width:0;min-height:0}.rail{flex-direction:column;grid-row:1/-1;min-height:0;margin-right:16px;display:flex}.space-title{grid-area:1/-3/auto/-1}.col-chat,.ctx{grid-row:2}.places{display:none}.col-chat{background:var(--surface-1);border:1px solid var(--line);border-radius:var(--radius) 0 0 var(--radius);border-right:0;flex-direction:column;display:flex;position:relative;overflow:hidden}.shell.three.home .col-chat{overflow-y:auto}.ctx{background:var(--surface-1);flex-direction:column;min-height:0;display:flex;position:relative;overflow:visible}@supports (color:color-mix(in lab, red, red)){.ctx{background:color-mix(in srgb, var(--surface-1) 70%, var(--surface-2))}}.ctx{border:1px solid var(--line);border-radius:0 var(--radius) var(--radius) 0}.ctx:before{content:"";pointer-events:none;background:linear-gradient(to right, var(--divider-shade), transparent);width:10px;position:absolute;inset:0 auto 0 0}.ctx-body{flex:1;min-height:0;padding:8px 12px 24px;overflow-y:auto}.ctx-embed{flex-direction:column;padding:4px 12px 24px;display:flex;container-type:inline-size}.ctx-embed-vibe{flex:1;min-height:0;overflow:hidden}.ctx-embed:not(.ctx-embed-vibe)>*{flex-shrink:0}.ctx-browser{padding:4px 12px 12px}.ctx-body[hidden],.ctx-embed[hidden]{display:none}.ctx-body[role=tabpanel],.ctx-embed:not(.ctx-browser)>*{animation:var(--animate-rise)}.split-handle{z-index:2;cursor:col-resize;touch-action:none;width:8px;position:absolute;top:0;bottom:0;right:0}.split-handle:after{content:"";width:2px;transition:background var(--t-fast) ease;background:0 0;border-radius:2px;position:absolute;top:18%;bottom:18%;left:3px}.split-handle:hover:after,.split-handle.dragging:after{background:var(--accent)}body.kw-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}body.kw-resizing iframe{pointer-events:none}.runs-screen{grid-template-columns:300px minmax(0,1fr);align-items:start;display:grid}.agents-screen{grid-template-columns:240px minmax(0,1fr)}.agents-screen.has-sessions{grid-template-columns:240px 260px minmax(0,1fr)}.agents-screen.has-sessions.has-knowledge{grid-template-columns:240px 260px minmax(0, 1fr) var(--kside-w,460px)}.channels-screen,.vibeables-screen{grid-template-columns:280px minmax(0,1fr)}.runs-side{top:var(--topbar-h);height:calc(100vh - var(--topbar-h));background:var(--surface-1);border-right:1px solid var(--line);flex-direction:column;display:flex;position:sticky}.knowledge-side{border-left:1px solid var(--line);border-right:0}.kside-reopen{z-index:5;border:1px solid var(--line);background:var(--surface-3);color:var(--text-2);border-radius:999px;padding:4px 12px;font-size:11px;position:fixed;top:60px;right:14px}.kside-reopen:hover{color:var(--text)}.runs-main{min-width:0;padding:18px 22px 40px}.runs-main:has(>.chat-main){padding:0}.chat-main{height:calc(100vh - var(--topbar-h));flex-direction:column;padding:16px 20px;display:flex}.new-chat{width:100%;max-width:640px;margin:0 auto}.agent-view{flex-direction:column;gap:16px;display:flex}.ctx-embed .agent-view{gap:10px}.new-chat,.agent-view{animation:var(--animate-rise)}.col-chat>.runs-screen{flex:1;min-height:0;overflow:hidden}.col-chat .runs-screen{grid-template-columns:minmax(0,1fr);align-items:stretch;height:100%}.col-chat .runs-screen.has-tabs{grid-template-rows:auto minmax(0,1fr)}.col-chat .agents-screen.has-sessions{grid-template-columns:240px minmax(0,1fr)}.col-chat .runs-side{background:0 0;align-self:stretch;height:auto;min-height:0;position:static}.col-chat .runs-main{flex-direction:column;min-height:0;display:flex;overflow-y:auto}.col-chat .chat-main{flex:1;height:auto;min-height:0}.shell.three:has(>.ctx[data-full])>.col-chat{display:none}.shell.three>.ctx[data-full]{border-radius:var(--radius);grid-column:-3/-1}.ctx[data-full]:before,.col-chat .agents-screen>aside.runs-side:first-child,.col-chat .channels-screen>aside.runs-side:first-child,.col-chat .knowledge-side,.col-chat .kside-reopen{display:none}@media (width<=1199px){.shell.three{grid-template-columns:minmax(0, 1fr) clamp(300px, var(--ctx-w,48%), 65%)}.rail{display:none}.col-chat .agents-screen>aside.runs-side:first-child,.col-chat .channels-screen>aside.runs-side:first-child{display:flex}.col-chat .runs-screen{grid-template-columns:220px minmax(0,1fr)}.col-chat .agents-screen.has-sessions{grid-template-columns:220px 220px minmax(0,1fr)}}@media (width<=1099px){.knowledge-side,.kside-reopen{display:none}.agents-screen.has-sessions.has-knowledge{grid-template-columns:240px 260px minmax(0,1fr)}}@media (width<=940px){.runs-screen{grid-template-columns:1fr}.runs-side{border-right:0;border-bottom:1px solid var(--line);height:auto;max-height:40vh;position:static}.chat-main{height:auto;min-height:calc(100vh - var(--topbar-h))}}@media (width<=900px){.agents-screen,.agents-screen.has-sessions,.agents-screen.has-sessions.has-knowledge{grid-template-columns:1fr}}@media (width<=800px){.shell.three{height:calc(100vh - var(--topbar-h) - 52px);grid-template-columns:minmax(0,1fr)}.space-title{grid-column:1}.shell.three[data-focus=side]>.col-chat,.shell.three[data-focus=context]>.col-chat,.shell.three[data-focus=chat]>.ctx,.shell.three[data-focus=side]>.ctx{display:none}.shell.three[data-focus=side]>.rail{margin-right:0;display:flex;overflow-y:auto}.shell.three>.ctx[data-full]{display:flex}.col-chat,.ctx{border-right:1px solid var(--line);border-radius:var(--radius)}.ctx:before,.split-handle{display:none}.col-chat .runs-screen{grid-template-columns:minmax(0,1fr)}.col-chat .agents-screen>aside.runs-side:first-child,.col-chat .channels-screen>aside.runs-side:first-child{display:flex}.col-chat .agents-screen.has-sessions{grid-template-columns:minmax(0,1fr)}.col-chat .agents-screen.has-sessions>aside.runs-side:first-child,.col-chat .agents-screen.has-sessions>.runs-side,.col-chat .runs-screen.has-tabs>aside.runs-side:first-child{display:none}.places{z-index:10;height:52px;padding:0 8px env(safe-area-inset-bottom,0px);background:var(--surface-2);border-top:1px solid var(--line);grid-template-columns:1fr 1fr 1fr;display:grid;position:sticky;bottom:0}.places a,.places button{color:var(--text-2);background:0 0;border:0;border-radius:10px;justify-content:center;align-items:center;gap:6px;font-size:13px;font-weight:600;display:flex}.places a.active,.places button.active{color:var(--accent)}}.md-body{height:100%;color:var(--text);padding:16px 22px;font-size:13.5px;line-height:1.6;overflow:auto}.md-body>:first-child{margin-top:0}.md-body :is(h1,h2,h3,h4){margin:1.4em 0 .5em;font-weight:600;line-height:1.25}.md-body h1{font-size:20px}.md-body h2{border-bottom:1px solid var(--line);padding-bottom:4px;font-size:16px}.md-body h3{font-size:14px}.md-body :is(p,ul,ol){margin:.6em 0}.md-body :is(ul,ol){padding-left:1.6em}.md-body ul{list-style:outside}.md-body ol{list-style:decimal}.md-body li+li{margin-top:.2em}.md-body a{color:var(--accent)}.md-body code{background:var(--text);border-radius:4px;padding:1px 5px}@supports (color:color-mix(in lab, red, red)){.md-body code{background:color-mix(in srgb, var(--text) 8%, transparent)}}.md-body code{font-family:var(--font-mono);font-size:12px}.md-body pre{border:1px solid var(--line);background:var(--text);border-radius:8px;margin:.8em 0;padding:10px 14px;overflow-x:auto}@supports (color:color-mix(in lab, red, red)){.md-body pre{background:color-mix(in srgb, var(--text) 6%, transparent)}}.md-body pre code{background:0 0;padding:0}.md-body blockquote{border-left:3px solid var(--line-strong);color:var(--text-2);margin:.8em 0;padding:2px 14px}.md-body table{border-collapse:collapse;margin:.8em 0;font-size:12.5px}.md-body :is(th,td){border:1px solid var(--line);text-align:left;padding:5px 10px}.md-body th{background:var(--text)}@supports (color:color-mix(in lab, red, red)){.md-body th{background:color-mix(in srgb, var(--text) 5%, transparent)}}.md-body hr{border:0;border-top:1px solid var(--line);margin:1.2em 0}.md-body img{max-width:100%}.ms{vertical-align:-4px;font-variation-settings:"FILL" 0, "wght" 400, "GRAD" 0, "opsz" 20;-webkit-user-select:none;user-select:none;flex:none;font-size:18px;line-height:1}.ms.ms-fill{font-variation-settings:"FILL" 1, "wght" 400, "GRAD" 0, "opsz" 20}.ms.ms-sm{vertical-align:-3px;font-size:15px}.ms.ms-spin{animation:1s linear infinite kw-spin}@keyframes kw-spin{to{transform:rotate(360deg)}}}@layer utilities{.\@container{container-type:inline-size}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:0}.inset-x-0{inset-inline:0}.inset-x-2{inset-inline:calc(var(--spacing) * 2)}.inset-y-0{inset-block:0}.-top-px{top:-1px}.top-0{top:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\.5{top:calc(var(--spacing) * 1.5)}.top-1\/2{top:50%}.top-3{top:calc(var(--spacing) * 3)}.top-4{top:calc(var(--spacing) * 4)}.top-\[60px\]{top:60px}.top-\[calc\(100\%\+6px\)\]{top:calc(100% + 6px)}.top-\[calc\(100\%\+8px\)\]{top:calc(100% + 8px)}.top-\[calc\(var\(--topbar-h\)\+18px\)\]{top:calc(var(--topbar-h) + 18px)}.-right-0\.5{right:calc(var(--spacing) * -.5)}.-right-1{right:calc(var(--spacing) * -1)}.-right-\[3px\]{right:-3px}.right-0{right:0}.right-1\.5{right:calc(var(--spacing) * 1.5)}.right-3{right:calc(var(--spacing) * 3)}.right-3\.5{right:calc(var(--spacing) * 3.5)}.-bottom-0\.5{bottom:calc(var(--spacing) * -.5)}.-bottom-1{bottom:calc(var(--spacing) * -1)}.-bottom-\[3px\]{bottom:-3px}.bottom-full{bottom:100%}.-left-\[3px\]{left:-3px}.left-0{left:0}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1{left:var(--spacing)}.left-3{left:calc(var(--spacing) * 3)}.left-\[13px\]{left:13px}.left-\[19px\]{left:19px}.left-\[22px\]{left:22px}.z-1{z-index:1}.z-4{z-index:4}.z-5{z-index:5}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.order-first{order:-9999}.col-span-full{grid-column:1/-1}.col-start-2{grid-column-start:2}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-0{margin:0}.m-2{margin:calc(var(--spacing) * 2)}.m-auto{margin:auto}.-mx-2{margin-inline:calc(var(--spacing) * -2)}.-mx-5{margin-inline:calc(var(--spacing) * -5)}.-mx-\[22px\]{margin-inline:-22px}.mx-0\.5{margin-inline:calc(var(--spacing) * .5)}.mx-1{margin-inline:var(--spacing)}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-2\.5{margin-inline:calc(var(--spacing) * 2.5)}.mx-auto{margin-inline:auto}.my-1\.5{margin-block:calc(var(--spacing) * 1.5)}.-mt-1{margin-top:calc(var(--spacing) * -1)}.-mt-2{margin-top:calc(var(--spacing) * -2)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-2\.5{margin-top:calc(var(--spacing) * 2.5)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-3\.5{margin-top:calc(var(--spacing) * 3.5)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-\[3px\]{margin-top:3px}.mt-\[5px\]{margin-top:5px}.mt-\[18px\]{margin-top:18px}.mt-px{margin-top:1px}.-mr-1{margin-right:calc(var(--spacing) * -1)}.mr-1{margin-right:var(--spacing)}.mr-2\.5{margin-right:calc(var(--spacing) * 2.5)}.-mb-0\.5{margin-bottom:calc(var(--spacing) * -.5)}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:calc(var(--spacing) * .5)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-2\.5{margin-bottom:calc(var(--spacing) * 2.5)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-3\.5{margin-bottom:calc(var(--spacing) * 3.5)}.mb-5{margin-bottom:calc(var(--spacing) * 5)}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.mb-px{margin-bottom:1px}.-ml-1\.5{margin-left:calc(var(--spacing) * -1.5)}.ml-0\.5{margin-left:calc(var(--spacing) * .5)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-5{margin-left:calc(var(--spacing) * 5)}.ml-\[3px\]{margin-left:3px}.ml-\[5px\]{margin-left:5px}.ml-\[9px\]{margin-left:9px}.ml-\[18px\]{margin-left:18px}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.table{display:table}.\[field-sizing\:content\]{field-sizing:content}.size-1\.5{width:calc(var(--spacing) * 1.5);height:calc(var(--spacing) * 1.5)}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-7{width:calc(var(--spacing) * 7);height:calc(var(--spacing) * 7)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-14{width:calc(var(--spacing) * 14);height:calc(var(--spacing) * 14)}.size-\[7px\]{width:7px;height:7px}.size-\[11px\]{width:11px;height:11px}.size-\[15px\]{width:15px;height:15px}.size-\[18px\]{width:18px;height:18px}.size-\[22px\]{width:22px;height:22px}.size-\[26px\]{width:26px;height:26px}.size-\[30px\]{width:30px;height:30px}.size-full{width:100%;height:100%}.h-0{height:0}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1{height:var(--spacing)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-11{height:calc(var(--spacing) * 11)}.h-\[15px\]{height:15px}.h-\[18px\]{height:18px}.h-\[30px\]{height:30px}.h-\[calc\(100vh-172px\)\]{height:calc(100vh - 172px)}.h-\[var\(--topbar-h\)\]{height:var(--topbar-h)}.h-auto{height:auto}.h-full{height:100%}.max-h-60{max-height:calc(var(--spacing) * 60)}.max-h-\[40vh\]{max-height:40vh}.max-h-\[46vh\]{max-height:46vh}.max-h-\[88dvh\]{max-height:88dvh}.max-h-\[180px\]{max-height:180px}.max-h-\[300px\]{max-height:300px}.max-h-\[360px\]{max-height:360px}.max-h-\[420px\]{max-height:420px}.max-h-\[560px\]{max-height:560px}.max-h-\[calc\(100dvh-48px\)\]{max-height:calc(100dvh - 48px)}.max-h-\[calc\(100dvh-120px\)\]{max-height:calc(100dvh - 120px)}.max-h-\[calc\(100vh-var\(--topbar-h\)-36px\)\]{max-height:calc(100vh - var(--topbar-h) - 36px)}.max-h-\[calc\(100vh-var\(--topbar-h\)-160px\)\]{max-height:calc(100vh - var(--topbar-h) - 160px)}.max-h-\[min\(70dvh\,560px\)\]{max-height:min(70dvh,560px)}.max-h-\[min\(80dvh\,640px\)\]{max-height:min(80dvh,640px)}.max-h-full{max-height:100%}.min-h-0{min-height:0}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-12{min-height:calc(var(--spacing) * 12)}.min-h-14{min-height:calc(var(--spacing) * 14)}.min-h-\[60px\]{min-height:60px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[70vh\]{min-height:70vh}.min-h-\[420px\]{min-height:420px}.min-h-\[560px\]{min-height:560px}.min-h-screen{min-height:100vh}.w-6{width:calc(var(--spacing) * 6)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-48{width:calc(var(--spacing) * 48)}.w-\[7px\]{width:7px}.w-\[15px\]{width:15px}.w-\[26px\]{width:26px}.w-\[70px\]{width:70px}.w-\[84px\]{width:84px}.w-\[90px\]{width:90px}.w-\[120px\]{width:120px}.w-\[130px\]{width:130px}.w-\[140px\]{width:140px}.w-\[150px\]{width:150px}.w-\[180px\]{width:180px}.w-\[200px\]{width:200px}.w-\[220px\]{width:220px}.w-\[300px\]{width:300px}.w-\[min\(460px\,92vw\)\]{width:min(460px,92vw)}.w-\[min\(560px\,100\%\)\]{width:min(560px,100%)}.w-\[min\(620px\,100\%\)\]{width:min(620px,100%)}.w-\[min\(960px\,100\%\)\]{width:min(960px,100%)}.w-auto{width:auto}.w-full{width:100%}.max-w-\[22ch\]{max-width:22ch}.max-w-\[28ch\]{max-width:28ch}.max-w-\[34ch\]{max-width:34ch}.max-w-\[36ch\]{max-width:36ch}.max-w-\[40ch\]{max-width:40ch}.max-w-\[42\%\]{max-width:42%}.max-w-\[44ch\]{max-width:44ch}.max-w-\[46ch\]{max-width:46ch}.max-w-\[60\%\]{max-width:60%}.max-w-\[60ch\]{max-width:60ch}.max-w-\[72ch\]{max-width:72ch}.max-w-\[76ch\]{max-width:76ch}.max-w-\[80ch\]{max-width:80ch}.max-w-\[90ch\]{max-width:90ch}.max-w-\[180px\]{max-width:180px}.max-w-\[220px\]{max-width:220px}.max-w-\[420px\]{max-width:420px}.max-w-\[520px\]{max-width:520px}.max-w-\[560px\]{max-width:560px}.max-w-\[640px\]{max-width:640px}.max-w-\[680px\]{max-width:680px}.max-w-\[860px\]{max-width:860px}.max-w-\[960px\]{max-width:960px}.max-w-\[1080px\]{max-width:1080px}.max-w-\[1100px\]{max-width:1100px}.max-w-\[min\(90ch\,100\%\)\]{max-width:min(90ch,100%)}.max-w-\[min\(480px\,92vw\)\]{max-width:min(480px,92vw)}.max-w-full{max-width:100%}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-16{min-width:calc(var(--spacing) * 16)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-40{min-width:calc(var(--spacing) * 40)}.min-w-48{min-width:calc(var(--spacing) * 48)}.min-w-60{min-width:calc(var(--spacing) * 60)}.min-w-\[18px\]{min-width:18px}.min-w-\[140px\]{min-width:140px}.min-w-\[220px\]{min-width:220px}.min-w-\[240px\]{min-width:240px}.min-w-\[260px\]{min-width:260px}.min-w-\[320px\]{min-width:320px}.min-w-\[360px\]{min-width:360px}.flex-1{flex:1}.flex-\[0_0_240px\]{flex:0 0 240px}.flex-\[0_1_auto\]{flex:0 auto}.flex-\[1\.4\]{flex:1.4}.flex-\[1_1_8px\]{flex:8px}.flex-\[2\]{flex:2}.flex-none{flex:none}.shrink-0{flex-shrink:0}.basis-full{flex-basis:100%}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-breathe{animation:var(--animate-breathe)}.animate-fade{animation:var(--animate-fade)}.animate-modal{animation:var(--animate-modal)}.animate-pulse{animation:var(--animate-pulse)}.animate-rise{animation:var(--animate-rise)}.animate-slide-left{animation:var(--animate-slide-left)}.animate-tab-in{animation:var(--animate-tab-in)}.animate-vibe-flash{animation:var(--animate-vibe-flash)}.focus-flash{animation:1.8s ease-out focus-flash}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-help{cursor:help}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.\[scrollbar-width\:none\]{scrollbar-width:none}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[12px_200px_1fr_auto\]{grid-template-columns:12px 200px 1fr auto}.grid-cols-\[40px_minmax\(0\,1fr\)_auto\]{grid-template-columns:40px minmax(0,1fr) auto}.grid-cols-\[74px_minmax\(0\,1fr\)\]{grid-template-columns:74px minmax(0,1fr)}.grid-cols-\[110px_1fr\]{grid-template-columns:110px 1fr}.grid-cols-\[170px_minmax\(0\,1fr\)\]{grid-template-columns:170px minmax(0,1fr)}.grid-cols-\[260px_minmax\(0\,1fr\)\]{grid-template-columns:260px minmax(0,1fr)}.grid-cols-\[280px_minmax\(0\,1fr\)\]{grid-template-columns:280px minmax(0,1fr)}.grid-cols-\[minmax\(0\,1fr\)_320px\]{grid-template-columns:minmax(0,1fr) 320px}.grid-cols-\[minmax\(430px\,5fr\)_minmax\(360px\,4fr\)\]{grid-template-columns:minmax(430px,5fr) minmax(360px,4fr)}.grid-cols-\[repeat\(auto-fit\,minmax\(280px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-content-center{place-content:center}.place-items-center{place-items:center}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-items-center{justify-items:center}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-3\.5{gap:calc(var(--spacing) * 3.5)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-\[3px\]{gap:3px}.gap-\[5px\]{gap:5px}.gap-\[7px\]{gap:7px}.gap-\[18px\]{gap:18px}.gap-\[26px\]{gap:26px}.gap-px{gap:1px}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.gap-x-2\.5{column-gap:calc(var(--spacing) * 2.5)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-x-3\.5{column-gap:calc(var(--spacing) * 3.5)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.gap-x-\[18px\]{column-gap:18px}.gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.gap-y-1{row-gap:var(--spacing)}.gap-y-1\.5{row-gap:calc(var(--spacing) * 1.5)}.gap-y-2{row-gap:calc(var(--spacing) * 2)}.gap-y-2\.5{row-gap:calc(var(--spacing) * 2.5)}.gap-y-px{row-gap:1px}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-line>:not(:last-child)){border-color:var(--line)}.self-center{align-self:center}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overscroll-contain{overscroll-behavior:contain}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[5px\]{border-radius:5px}.rounded-\[24px\]{border-radius:24px}.rounded-card{border-radius:var(--radius)}.rounded-control{border-radius:var(--radius-s)}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-\[1\.5px\]{border-style:var(--tw-border-style);border-width:1.5px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-\[3px\]{border-left-style:var(--tw-border-style);border-left-width:3px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[color-mix\(in_srgb\,var\(--aid\)_55\%\,var\(--line\)\)\]{border-color:var(--aid)}@supports (color:color-mix(in lab, red, red)){.border-\[color-mix\(in_srgb\,var\(--aid\)_55\%\,var\(--line\)\)\]{border-color:color-mix(in srgb,var(--aid) 55%,var(--line))}}.border-accent{border-color:var(--accent)}.border-ask{border-color:var(--ask)}.border-bad,.border-bad\/40{border-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.border-bad\/40{border-color:color-mix(in oklab, var(--bad) 40%, transparent)}}.border-current{border-color:currentColor}.border-line,.border-line\/55{border-color:var(--line)}@supports (color:color-mix(in lab, red, red)){.border-line\/55{border-color:color-mix(in oklab, var(--line) 55%, transparent)}}.border-transparent{border-color:#0000}.bg-\[color-mix\(in_srgb\,var\(--accent\)_14\%\,var\(--surface-1\)\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_srgb\,var\(--accent\)_14\%\,var\(--surface-1\)\)\]{background-color:color-mix(in srgb,var(--accent) 14%,var(--surface-1))}}.bg-\[color-mix\(in_srgb\,var\(--aid\)_18\%\,var\(--surface-1\)\)\]{background-color:var(--aid)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_srgb\,var\(--aid\)_18\%\,var\(--surface-1\)\)\]{background-color:color-mix(in srgb,var(--aid) 18%,var(--surface-1))}}.bg-\[color-mix\(in_srgb\,var\(--text\)_32\%\,transparent\)\]{background-color:var(--text)}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_srgb\,var\(--text\)_32\%\,transparent\)\]{background-color:color-mix(in srgb,var(--text) 32%,transparent)}}.bg-\[color-mix\(in_srgb\,var\(--ws-c\,var\(--text\)\)_22\%\,var\(--surface-2\)\)\]{background-color:var(--ws-c,var(--text))}@supports (color:color-mix(in lab, red, red)){.bg-\[color-mix\(in_srgb\,var\(--ws-c\,var\(--text\)\)_22\%\,var\(--surface-2\)\)\]{background-color:color-mix(in srgb,var(--ws-c,var(--text)) 22%,var(--surface-2))}}.bg-\[var\(--ws-c\,var\(--text\)\)\]{background-color:var(--ws-c,var(--text))}.bg-accent{background-color:var(--accent)}.bg-accent-soft{background-color:var(--accent-soft)}.bg-accent\/5{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/5{background-color:color-mix(in oklab, var(--accent) 5%, transparent)}}.bg-accent\/7{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/7{background-color:color-mix(in oklab, var(--accent) 7%, transparent)}}.bg-accent\/10{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.bg-accent\/10{background-color:color-mix(in oklab, var(--accent) 10%, transparent)}}.bg-ask{background-color:var(--ask)}.bg-ask-soft,.bg-ask-soft\/30{background-color:var(--ask-soft)}@supports (color:color-mix(in lab, red, red)){.bg-ask-soft\/30{background-color:color-mix(in oklab, var(--ask-soft) 30%, transparent)}}.bg-ask-soft\/40{background-color:var(--ask-soft)}@supports (color:color-mix(in lab, red, red)){.bg-ask-soft\/40{background-color:color-mix(in oklab, var(--ask-soft) 40%, transparent)}}.bg-bad{background-color:var(--bad)}.bg-bad-soft{background-color:var(--bad-soft)}.bg-bad\/12{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.bg-bad\/12{background-color:color-mix(in oklab, var(--bad) 12%, transparent)}}.bg-bg{background-color:var(--bg)}.bg-black\/35{background-color:#00000059}@supports (color:color-mix(in lab, red, red)){.bg-black\/35{background-color:color-mix(in oklab, var(--color-black) 35%, transparent)}}.bg-black\/38{background-color:#00000061}@supports (color:color-mix(in lab, red, red)){.bg-black\/38{background-color:color-mix(in oklab, var(--color-black) 38%, transparent)}}.bg-fg-2{background-color:var(--text-2)}.bg-fg\/14{background-color:var(--text)}@supports (color:color-mix(in lab, red, red)){.bg-fg\/14{background-color:color-mix(in oklab, var(--text) 14%, transparent)}}.bg-live{background-color:var(--live)}.bg-ok{background-color:var(--ok)}.bg-ok-soft{background-color:var(--ok-soft)}.bg-on-accent{background-color:var(--on-accent)}.bg-surface{background-color:var(--surface-1)}.bg-surface-2,.bg-surface-2\/60{background-color:var(--surface-2)}@supports (color:color-mix(in lab, red, red)){.bg-surface-2\/60{background-color:color-mix(in oklab, var(--surface-2) 60%, transparent)}}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.object-contain{object-fit:contain}.p-0{padding:0}.p-0\.5{padding:calc(var(--spacing) * .5)}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.p-\[18px\]{padding:18px}.p-px{padding:1px}.px-0{padding-inline:0}.px-0\.5{padding-inline:calc(var(--spacing) * .5)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-3\.5{padding-inline:calc(var(--spacing) * 3.5)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-7{padding-inline:calc(var(--spacing) * 7)}.px-\[5px\]{padding-inline:5px}.px-\[7px\]{padding-inline:7px}.px-\[18px\]{padding-inline:18px}.px-\[22px\]{padding-inline:22px}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-3\.5{padding-block:calc(var(--spacing) * 3.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-6{padding-block:calc(var(--spacing) * 6)}.py-7{padding-block:calc(var(--spacing) * 7)}.py-10{padding-block:calc(var(--spacing) * 10)}.py-16{padding-block:calc(var(--spacing) * 16)}.py-\[3px\]{padding-block:3px}.py-\[5px\]{padding-block:5px}.py-\[7px\]{padding-block:7px}.py-\[9px\]{padding-block:9px}.py-px{padding-block:1px}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-1{padding-top:var(--spacing)}.pt-1\.5{padding-top:calc(var(--spacing) * 1.5)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-2\.5{padding-top:calc(var(--spacing) * 2.5)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-3\.5{padding-top:calc(var(--spacing) * 3.5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pt-\[6vh\]{padding-top:6vh}.pt-\[12vh\]{padding-top:12vh}.pt-\[18px\]{padding-top:18px}.pt-px{padding-top:1px}.pr-1{padding-right:var(--spacing)}.pr-1\.5{padding-right:calc(var(--spacing) * 1.5)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pr-12{padding-right:calc(var(--spacing) * 12)}.pr-\[5px\]{padding-right:5px}.pr-\[18px\]{padding-right:18px}.pb-0\.5{padding-bottom:calc(var(--spacing) * .5)}.pb-1{padding-bottom:var(--spacing)}.pb-1\.5{padding-bottom:calc(var(--spacing) * 1.5)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-2\.5{padding-bottom:calc(var(--spacing) * 2.5)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-3\.5{padding-bottom:calc(var(--spacing) * 3.5)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pb-10{padding-bottom:calc(var(--spacing) * 10)}.pb-\[7px\]{padding-bottom:7px}.pb-\[18px\]{padding-bottom:18px}.pl-0\.5{padding-left:calc(var(--spacing) * .5)}.pl-1{padding-left:var(--spacing)}.pl-1\.5{padding-left:calc(var(--spacing) * 1.5)}.pl-2{padding-left:calc(var(--spacing) * 2)}.pl-2\.5{padding-left:calc(var(--spacing) * 2.5)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-3\.5{padding-left:calc(var(--spacing) * 3.5)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.pl-16{padding-left:calc(var(--spacing) * 16)}.pl-\[3px\]{padding-left:3px}.pl-\[18px\]{padding-left:18px}.pl-\[42px\]{padding-left:42px}.pl-\[46px\]{padding-left:46px}.text-center{text-align:center}.text-left{text-align:left}.align-\[-3px\]{vertical-align:-3px}.font-\[inherit\]{font-family:inherit}.font-mono{font-family:var(--font-mono)}.font-reading{font-family:var(--reading)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-2xs{font-size:var(--text-2xs);line-height:var(--tw-leading,var(--text-2xs--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-md{font-size:var(--text-md);line-height:var(--tw-leading,var(--text-md--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[12\.5px\]{font-size:12.5px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[16px\]{font-size:16px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[20px\]{font-size:20px}.text-\[22px\]{font-size:22px}.text-\[24px\]{font-size:24px}.text-\[26px\]{font-size:26px}.text-\[28px\]{font-size:28px}.text-\[32px\]{font-size:32px}.leading-\[1\.3\]{--tw-leading:1.3;line-height:1.3}.leading-\[1\.5\]{--tw-leading:1.5;line-height:1.5}.leading-\[1\.6\]{--tw-leading:1.6;line-height:1.6}.leading-\[1\.15\]{--tw-leading:1.15;line-height:1.15}.leading-\[1\.35\]{--tw-leading:1.35;line-height:1.35}.leading-\[1\.45\]{--tw-leading:1.45;line-height:1.45}.leading-\[1\.55\]{--tw-leading:1.55;line-height:1.55}.leading-\[1\.62\]{--tw-leading:1.62;line-height:1.62}.leading-\[1\.65\]{--tw-leading:1.65;line-height:1.65}.leading-\[17px\]{--tw-leading:17px;line-height:17px}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-\[750\]{--tw-font-weight:750;font-weight:750}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[-0\.01em\]{--tw-tracking:-.01em;letter-spacing:-.01em}.tracking-\[-0\.015em\]{--tw-tracking:-.015em;letter-spacing:-.015em}.tracking-\[0\.02em\]{--tw-tracking:.02em;letter-spacing:.02em}.tracking-\[0\.2px\]{--tw-tracking:.2px;letter-spacing:.2px}.tracking-\[0\.04em\]{--tw-tracking:.04em;letter-spacing:.04em}.tracking-\[0\.4px\]{--tw-tracking:.4px;letter-spacing:.4px}.tracking-\[0\.05em\]{--tw-tracking:.05em;letter-spacing:.05em}.tracking-\[0\.5px\]{--tw-tracking:.5px;letter-spacing:.5px}.tracking-\[0\.06em\]{--tw-tracking:.06em;letter-spacing:.06em}.tracking-\[0\.08em\]{--tw-tracking:.08em;letter-spacing:.08em}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.15px\]{--tw-tracking:.15px;letter-spacing:.15px}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[var\(--aid\)\]{color:var(--aid)}.text-\[var\(--ws-c\,var\(--text\)\)\]{color:var(--ws-c,var(--text))}.text-accent{color:var(--accent)}.text-ask{color:var(--ask)}.text-bad{color:var(--bad)}.text-black{color:var(--color-black)}.text-fg{color:var(--text)}.text-fg-2{color:var(--text-2)}.text-inherit{color:inherit}.text-ok{color:var(--ok)}.text-on-accent{color:var(--on-accent)}.text-on-accent-soft{color:var(--on-accent-soft)}.text-on-ask-soft{color:var(--on-ask-soft)}.text-on-bad{color:var(--on-bad)}.text-on-bad-soft{color:var(--on-bad-soft)}.text-white{color:var(--color-white)}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline{text-decoration-line:underline}.accent-accent{accent-color:var(--accent)}.opacity-0{opacity:0}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-100{opacity:1}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[0_0_0_2px_var\(--surface-1\)\]{--tw-shadow:0 0 0 2px var(--tw-shadow-color,var(--surface-1));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_-1px_0_var\(--line\)\]{--tw-shadow:inset 0 -1px 0 var(--tw-shadow-color,var(--line));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-\[inset_0_0_0_1px_var\(--line\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,var(--line));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-modal{--tw-shadow:var(--elev-modal);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-pop{--tw-shadow:var(--elev-pop);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-\[1\.5px\]{outline-style:var(--tw-outline-style);outline-width:1.5px}.-outline-offset-2{outline-offset:calc(2px * -1)}.-outline-offset-\[1\.5px\]{outline-offset:calc(1.5px * -1)}.outline-accent{outline-color:var(--accent)}.outline-transparent{outline-color:#0000}.grayscale{--tw-grayscale:grayscale(100%);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,)}.grayscale-50{--tw-grayscale:grayscale(50%);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,)}.grayscale-80{--tw-grayscale:grayscale(80%);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,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[border-color\,box-shadow\]{transition-property:border-color,box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\,opacity\]{transition-property:filter,opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[filter\]{transition-property:filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[left\,background-color\]{transition-property:left,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-dashed{--tw-outline-style:dashed;outline-style:dashed}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.\[direction\:rtl\]{direction:rtl}.\[unicode-bidi\:isolate\]{unicode-bidi:isolate}.group-focus-within\/head\:opacity-100:is(:where(.group\/head):focus-within *),.group-focus-within\/row\:opacity-100:is(:where(.group\/row):focus-within *),.group-focus-within\/sec\:opacity-100:is(:where(.group\/sec):focus-within *){opacity:1}@media (hover:hover){.group-hover\/arch\:text-fg:is(:where(.group\/arch):hover *){color:var(--text)}.group-hover\/file\:underline:is(:where(.group\/file):hover *){text-decoration-line:underline}.group-hover\/grp\:opacity-100:is(:where(.group\/grp):hover *),.group-hover\/head\:opacity-100:is(:where(.group\/head):hover *){opacity:1}.group-hover\/item\:underline:is(:where(.group\/item):hover *){text-decoration-line:underline}.group-hover\/mini\:text-accent:is(:where(.group\/mini):hover *){color:var(--accent)}.group-hover\/row\:opacity-100:is(:where(.group\/row):hover *),.group-hover\/sec\:opacity-100:is(:where(.group\/sec):hover *),.group-hover\/tab\:opacity-100:is(:where(.group\/tab):hover *){opacity:1}}.group-aria-\[current\=true\]\/ws\:text-on-accent-soft:is(:where(.group\/ws)[aria-current=true] *){color:var(--on-accent-soft)}.group-aria-\[current\=true\]\/ws\:opacity-80:is(:where(.group\/ws)[aria-current=true] *){opacity:.8}.group-data-\[missing\]\/ws\:line-through:is(:where(.group\/ws)[data-missing] *){text-decoration-line:line-through}.group-data-\[stopped\]\/ws\:text-fg-2:is(:where(.group\/ws)[data-stopped] *){color:var(--text-2)}.first-letter\:uppercase:first-letter{text-transform:uppercase}.placeholder\:text-fg-2::placeholder{color:var(--text-2)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:top-0:before{content:var(--tw-content);top:0}.before\:bottom-0:before{content:var(--tw-content);bottom:0}.before\:left-\[23px\]:before{content:var(--tw-content);left:23px}.before\:left-\[31px\]:before{content:var(--tw-content);left:31px}.before\:w-px:before{content:var(--tw-content);width:1px}.before\:bg-line:before{content:var(--tw-content);background-color:var(--line)}.first\:mt-0:first-child{margin-top:0}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:0}.first\:pt-1\.5:first-child{padding-top:calc(var(--spacing) * 1.5)}.first\:before\:top-4:first-child:before{content:var(--tw-content);top:calc(var(--spacing) * 4)}.first\:before\:top-\[18px\]:first-child:before{content:var(--tw-content);top:18px}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:before\:bottom-auto:last-child:before{content:var(--tw-content);bottom:auto}.last\:before\:h-4:last-child:before{content:var(--tw-content);height:calc(var(--spacing) * 4)}.last\:before\:h-\[18px\]:last-child:before{content:var(--tw-content);height:18px}.focus-within\:border-accent:focus-within{border-color:var(--accent)}.focus-within\:shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--accent\)_16\%\,transparent\)\]:focus-within{--tw-shadow:0 0 0 3px var(--tw-shadow-color,var(--accent))}@supports (color:color-mix(in lab, red, red)){.focus-within\:shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--accent\)_16\%\,transparent\)\]:focus-within{--tw-shadow:0 0 0 3px var(--tw-shadow-color,color-mix(in srgb,var(--accent) 16%,transparent))}}.focus-within\:shadow-\[0_0_0_3px_color-mix\(in_srgb\,var\(--accent\)_16\%\,transparent\)\]:focus-within{box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}@media (hover:hover){.hover\:border-bad:hover{border-color:var(--bad)}.hover\:bg-accent-hover:hover{background-color:var(--accent-hover)}.hover\:bg-accent\/18:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/18:hover{background-color:color-mix(in oklab, var(--accent) 18%, transparent)}}.hover\:bg-accent\/25:hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-accent\/25:hover{background-color:color-mix(in oklab, var(--accent) 25%, transparent)}}.hover\:bg-bad:hover{background-color:var(--bad)}.hover\:bg-bad-soft:hover{background-color:var(--bad-soft)}.hover\:bg-bad\/18:hover{background-color:var(--bad)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-bad\/18:hover{background-color:color-mix(in oklab, var(--bad) 18%, transparent)}}.hover\:bg-surface:hover{background-color:var(--surface-1)}.hover\:bg-surface-2:hover{background-color:var(--surface-2)}.hover\:bg-transparent:hover{background-color:#0000}.hover\:text-accent:hover{color:var(--accent)}.hover\:text-bad:hover{color:var(--bad)}.hover\:text-fg:hover{color:var(--text)}.hover\:text-inherit:hover{color:inherit}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-100:hover{opacity:1}.hover\:shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--ws-c\,var\(--text\)\)_16\%\,transparent\)\]:hover{--tw-shadow:0 0 0 4px var(--tw-shadow-color,var(--ws-c,var(--text)))}@supports (color:color-mix(in lab, red, red)){.hover\:shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--ws-c\,var\(--text\)\)_16\%\,transparent\)\]:hover{--tw-shadow:0 0 0 4px var(--tw-shadow-color,color-mix(in srgb,var(--ws-c,var(--text)) 16%,transparent))}}.hover\:shadow-\[0_0_0_4px_color-mix\(in_srgb\,var\(--ws-c\,var\(--text\)\)_16\%\,transparent\)\]:hover{box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.hover\:brightness-104:hover{--tw-brightness:brightness(104%);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,)}.hover\:brightness-\[0\.98\]:hover{--tw-brightness:brightness(.98);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,)}}.focus\:border-accent:focus{border-color:var(--accent)}.focus\:border-fg:focus{border-color:var(--text)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus-visible\:opacity-100:focus-visible{opacity:1}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-live:focus-visible{outline-color:var(--live)}.active\:scale-96:active{--tw-scale-x:96%;--tw-scale-y:96%;--tw-scale-z:96%;scale:var(--tw-scale-x) var(--tw-scale-y)}.active\:bg-surface-2:active{background-color:var(--surface-2)}@media (hover:hover){.hover\:enabled\:bg-surface-2:hover:enabled{background-color:var(--surface-2)}.hover\:enabled\:brightness-110:hover:enabled{--tw-brightness:brightness(110%);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,)}.hover\:enabled\:brightness-\[0\.97\]:hover:enabled{--tw-brightness:brightness(.97);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,)}}.active\:enabled\:scale-95:active:enabled{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x) var(--tw-scale-y)}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-default:disabled{cursor:default}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-45:disabled{opacity:.45}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-60:disabled{opacity:.6}.disabled\:opacity-70:disabled{opacity:.7}:where(.ctx-embed) .in-\[\.ctx-embed\]\:mb-3{margin-bottom:calc(var(--spacing) * 3)}:where(.ctx-embed) .in-\[\.ctx-embed\]\:hidden{display:none}:where(.ctx-embed) .in-\[\.ctx-embed\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}:where(.ctx-embed) .in-\[\.ctx-embed\]\:gap-y-2{row-gap:calc(var(--spacing) * 2)}:where(.ctx-embed) .in-\[\.ctx-embed\]\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}@media not all and (width>=1520px){.max-\[1520px\]\:max-w-\[250px\]{max-width:250px}.max-\[1520px\]\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.max-\[1520px\]\:gap-\[5px\]{gap:5px}}@media not all and (width>=1199px){.max-\[1199px\]\:\[mask-image\:linear-gradient\(to_right\,\#000_calc\(100\%-24px\)\,transparent\)\]{-webkit-mask-image:linear-gradient(90deg,#000 calc(100% - 24px),#0000);mask-image:linear-gradient(90deg,#000 calc(100% - 24px),#0000)}}@media not all and (width>=1100px){.max-\[1100px\]\:static{position:static}.max-\[1100px\]\:hidden{display:none}.max-\[1100px\]\:max-h-none{max-height:none}.max-\[1100px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[1100px\]\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.max-\[1100px\]\:pr-0{padding-right:0}}@media not all and (width>=1020px){.max-\[1020px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media not all and (width>=940px){.max-\[940px\]\:h-auto{height:auto}.max-\[940px\]\:max-h-60{max-height:calc(var(--spacing) * 60)}.max-\[940px\]\:w-auto{width:auto}.max-\[940px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}}@media not all and (width>=900px){.max-\[900px\]\:col-span-2{grid-column:span 2/span 2}.max-\[900px\]\:w-auto{width:auto}.max-\[900px\]\:grid-cols-\[12px_1fr\]{grid-template-columns:12px 1fr}.max-\[900px\]\:flex-col{flex-direction:column}.max-\[900px\]\:items-stretch{align-items:stretch}}@media not all and (width>=800px){.max-\[800px\]\:fixed{position:fixed}.max-\[800px\]\:inset-x-2{inset-inline:calc(var(--spacing) * 2)}.max-\[800px\]\:top-\[calc\(var\(--topbar-h\)-4px\)\]{top:calc(var(--topbar-h) - 4px)}.max-\[800px\]\:hidden{display:none}.max-\[800px\]\:max-h-dvh{max-height:100dvh}.max-\[800px\]\:max-w-none{max-width:none}.max-\[800px\]\:min-w-0{min-width:0}.max-\[800px\]\:flex-\[0_1_auto\]{flex:0 auto}.max-\[800px\]\:basis-full{flex-basis:100%}.max-\[800px\]\:\[scrollbar-width\:none\]{scrollbar-width:none}.max-\[800px\]\:flex-nowrap{flex-wrap:nowrap}.max-\[800px\]\:flex-wrap{flex-wrap:wrap}.max-\[800px\]\:justify-start{justify-content:flex-start}.max-\[800px\]\:gap-1{gap:var(--spacing)}.max-\[800px\]\:gap-1\.5{gap:calc(var(--spacing) * 1.5)}.max-\[800px\]\:gap-x-3\.5{column-gap:calc(var(--spacing) * 3.5)}.max-\[800px\]\:gap-y-0\.5{row-gap:calc(var(--spacing) * .5)}.max-\[800px\]\:overflow-x-auto{overflow-x:auto}.max-\[800px\]\:overflow-y-hidden{overflow-y:hidden}.max-\[800px\]\:rounded-none{border-radius:0}.max-\[800px\]\:p-0{padding:0}.max-\[800px\]\:px-3{padding-inline:calc(var(--spacing) * 3)}.max-\[800px\]\:ps-4{padding-inline-start:calc(var(--spacing) * 4)}.max-\[800px\]\:pt-3{padding-top:calc(var(--spacing) * 3)}.max-\[800px\]\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}}@media not all and (width>=700px){.max-\[700px\]\:w-full{width:100%}.max-\[700px\]\:flex-wrap{flex-wrap:wrap}}@media not all and (width>=640px){.max-\[640px\]\:hidden{display:none}}@media (width>=900px){.min-\[900px\]\:grid-cols-\[minmax\(280px\,1fr\)_minmax\(0\,1\.3fr\)\]{grid-template-columns:minmax(280px,1fr) minmax(0,1.3fr)}}@container not (width>=560px){.\@max-\[560px\]\:static{position:static}.\@max-\[560px\]\:max-h-\[200px\]{max-height:200px}.\@max-\[560px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\@max-\[560px\]\:border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.\@max-\[560px\]\:pr-0{padding-right:0}}@media (pointer:coarse){.pointer-coarse\:opacity-100{opacity:1}}.\[\&_\.editor-content\]\:min-h-\[220px\] .editor-content{min-height:220px}.\[\&_\.editor-content\]\:min-h-\[280px\] .editor-content{min-height:280px}.\[\&_\.ms\]\:align-\[0\] .ms{vertical-align:0}.\[\&_\.ms\]\:text-\[13px\] .ms{font-size:13px}.\[\&_\.ms\]\:text-\[14px\] .ms{font-size:14px}.\[\&_\.ms\]\:text-\[18px\] .ms{font-size:18px}.\[\&_\.ms\]\:text-\[20px\] .ms{font-size:20px}@media not all and (width>=1520px){.max-\[1520px\]\:\[\&_\.ms\]\:text-\[17px\] .ms{font-size:17px}}.\[\&_a\]\:text-accent a{color:var(--accent)}.\[\&_a\]\:text-inherit a{color:inherit}.\[\&_a\]\:underline a{text-decoration-line:underline}.\[\&_a\]\:underline-offset-2 a{text-underline-offset:2px}.\[\&_code\]\:text-2xs code{font-size:var(--text-2xs);line-height:var(--tw-leading,var(--text-2xs--line-height))}.\[\&_code\]\:text-\[11\.5px\] code{font-size:11.5px}.\[\&_h1\]\:hidden h1{display:none}.\[\&_h2\]\:mt-3 h2{margin-top:calc(var(--spacing) * 3)}.\[\&_h2\]\:mb-1 h2{margin-bottom:var(--spacing)}.\[\&_h2\]\:text-xs h2{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.\[\&_img\]\:my-1 img{margin-block:var(--spacing)}.\[\&_img\]\:block img{display:block}.\[\&_img\]\:rounded-xl img{border-radius:var(--radius-xl)}.\[\&_pre\]\:max-w-full pre{max-width:100%}.\[\&_ul\]\:m-0 ul{margin:0}.\[\&_ul\]\:pl-\[18px\] ul{padding-left:18px}.\[\&\+\&\]\:border-t+.\[\&\+\&\]\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\+\&\]\:border-line+.\[\&\+\&\]\:border-line,.\[\&\+\&\]\:border-line\/55+.\[\&\+\&\]\:border-line\/55{border-color:var(--line)}@supports (color:color-mix(in lab, red, red)){.\[\&\+\&\]\:border-line\/55+.\[\&\+\&\]\:border-line\/55{border-color:color-mix(in oklab, var(--line) 55%, transparent)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\>\*\]\:flex-1>*{flex:1}@media not all and (width>=800px){.max-\[800px\]\:\[\&\>\*\]\:flex-none>*{flex:none}}.\[\&\>\*\+\*\]\:border-t>*+*{border-top-style:var(--tw-border-style);border-top-width:1px}.\[\&\>\*\+\*\]\:border-line>*+*{border-color:var(--line)}.\[\&\>\:nth-last-child\(-n\+3\)\]\:animate-rise>:nth-last-child(-n+3){animation:var(--animate-rise)}.\[\&\>div\]\:border-b-0>div{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.\[\&\>div\]\:px-3>div{padding-inline:calc(var(--spacing) * 3)}.\[\&\>div\]\:pt-3>div{padding-top:calc(var(--spacing) * 3)}.\[\&\>span\]\:inline-flex>span{display:inline-flex}.\[\&\>span\]\:items-center>span{align-items:center}.\[\&\>span\]\:gap-1>span{gap:var(--spacing)}.\[\&\[hidden\]\]\:hidden[hidden]{display:none}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@keyframes pulse{50%{opacity:.5}}@keyframes kw-fade{0%{opacity:0}to{opacity:1}}@keyframes kw-modal{0%{opacity:0;transform:translateY(14px)scale(.985)}to{opacity:1;transform:none}}@keyframes vibeable-fade{0%,60%{opacity:1}to{opacity:0}}@keyframes kw-rise{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}@keyframes kw-tab-in{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}@keyframes kw-slide-left{0%{opacity:0;transform:translate(-10px)}to{opacity:1;transform:none}}@keyframes kw-breathe{0%,to{opacity:.7}50%{opacity:1}}@keyframes focus-flash{0%,30%{box-shadow:0 0 0 3px color-mix(in srgb, var(--bad) 55%, transparent)}to{box-shadow:0 0 #0000}}
|