sessiongraph-app-darwin-arm64 1.0.10 → 1.0.11
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/package.json +2 -2
- package/payload/SessionGraph.app/Contents/Info.plist +2 -2
- package/payload/SessionGraph.app/Contents/MacOS/sessiongraph +0 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/node +2 -2
- package/payload/SessionGraph.app/Contents/Resources/resources/server.mjs +6 -5
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/external-links-CJk2OPKW.js +1 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/index-DOYyn-b_.js +1 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/{index-BtLEIWKh.js → index-DPovJIlT.js} +12 -12
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/{index-RfmyzBnX.js → index-DhlS3ZId.js} +1 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/{index-BNX-8Jnn.js → index-JjTdnq9-.js} +1 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/index-cVgPCrFV.css +1 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/{mp4-worker-HFPra5JP.js → mp4-worker-Dc_1QUwS.js} +1 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/publishing-CkVIjq_f.js +25 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/{scene-B_CpQ0qP.js → scene-BXs8B_Kk.js} +1 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/share-jfOenMTA.js +7 -0
- package/payload/SessionGraph.app/Contents/Resources/resources/web/index.html +2 -2
- package/payload/SessionGraph.app/Contents/_CodeSignature/CodeResources +53 -53
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/gif-worker-CghHEBpp.js +0 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/index-BcoCDV6F.js +0 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/index-BnhC5gO7.css +0 -1
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/publishing-DoHRK4Ea.js +0 -26
- package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/share-DPdu1Hbo.js +0 -8
package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/publishing-CkVIjq_f.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import{h as pe,j as me,m as ge,D as be,a as ae,k as q,l as ie,t as he,P as fe,g as ye,c as we,i as V}from"./index-DPovJIlT.js";import{TimelineScene as ve}from"./scene-BXs8B_Kk.js";import{s as ke,e as Se,o as Ce}from"./external-links-CJk2OPKW.js";import"./three-D_1Qt16u.js";const xe=["svg",pe,[["path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65-.17.6-.22 1.23-.15 1.85v4"}],["path",{d:"M9 18c-4.51 2-5-2-7-2"}]]],Ae={tokens:"Token counts",timestamps:"Session timestamps",messageCounts:"Message counts",messageTimestamps:"Message timestamps",model:"Model used",harness:"Harness used"},Z={tokens:!0,timestamps:!0,messageCounts:!0,messageTimestamps:!0,model:!0,harness:!0};function oe(t){const r={...Z};if(ce(t))for(const n of Object.keys(r))typeof t[n]=="boolean"&&(r[n]=t[n]);return(!r.timestamps||!r.messageCounts)&&(r.messageTimestamps=!1),r}const re=1e4,Ee=2e6,Pe=1e5,Me="Always excluded: project and session names, messages, code, paths, source IDs, and costs. Anonymous groups and recorded branch links are included. Your GitHub username identifies this profile. Your published graph will appear in Explore graphs. Selected timestamps and usage will be public.",Te=/^(?:gpt-[3-6](?:\.[0-9])?(?:-(?:turbo|mini|nano|pro|codex|astra|instant|thinking|chat|latest|preview|[0-9]{4,8}))*|o[1-4](?:-(?:mini|pro|preview|[0-9]{4,8}))*|claude-(?:(?:sonnet|opus|haiku)-[3-5](?:[.-][0-9])?|[3-5](?:-[0-9])?-(?:sonnet|opus|haiku))(?:-(?:latest|thinking|[0-9]{8}))*|gemini-[1-4](?:\.[0-9])?-(?:pro|flash)(?:-(?:lite|preview|exp|latest|[0-9]{2,4}))*|deepseek-(?:chat|reasoner|v[3-4](?:\.[0-9])?|r1)|grok-[2-5](?:\.[0-9])?(?:-(?:fast|code|reasoning|non-reasoning|[0-9]))*|kimi-k[1-3](?:\.[0-9])?(?:-thinking)?|minimax-m[1-3](?:\.[0-9])?)$/i,Le=t=>{const r=t.split("/").at(-1)||"";return r.length<=100&&Te.test(r)?r.toLowerCase():null},ce=t=>!!t&&typeof t=="object"&&!Array.isArray(t),B=(t,r)=>ce(t)&&Object.keys(t).length===r.length&&r.every(n=>Object.hasOwn(t,n)),Y=(t,r=Number.MAX_SAFE_INTEGER)=>Number.isSafeInteger(t)&&t>=0&&t<=r,W=t=>Y(t,Date.UTC(2100,0,1)),z=t=>t===null||Y(t);function de(t){const r=()=>{throw new Error("Invalid anonymous graph. Reopen the publishing preview and try again.")};if(!B(t,["version","settings","sessions"])||t.version!==1||!Array.isArray(t.sessions)||!B(t.settings,Object.keys(Z))||Object.values(t.settings).some(f=>typeof f!="boolean"))return r();const n=t.settings;if(n.messageTimestamps&&(!n.timestamps||!n.messageCounts))return r();if(t.sessions.length<1||t.sessions.length>re)throw new Error(`Choose between 1 and ${re.toLocaleString("en")} sessions to publish.`);const e=["id","group","parent","fork",...n.timestamps?["timestamps"]:[],...n.tokens?["tokens"]:[],...n.messageCounts?["messages"]:[],...n.messageTimestamps?["messageTimes"]:[],...n.model?["model"]:[],...n.harness?["harness"]:[]];let m=0;for(let f=0;f<t.sessions.length;f++){const i=t.sessions[f];if(!B(i,e)||i.id!==f||!Y(i.group,t.sessions.length-1))return r();for(const p of["parent","fork"])if(i[p]!==null&&(!Y(i[p],t.sessions.length-1)||i[p]===f))return r();if(n.timestamps&&(!B(i.timestamps,["created","lastMessageAt"])||!W(i.timestamps.created)||i.timestamps.lastMessageAt!==null&&!W(i.timestamps.lastMessageAt))||n.tokens&&!z(i.tokens)||n.messageCounts&&(!B(i.messages,["count","untimed","partial"])||!z(i.messages.count)||!z(i.messages.untimed)||typeof i.messages.partial!="boolean")||n.messageTimestamps&&(!B(i.messageTimes,["values","limited"])||!Array.isArray(i.messageTimes.values)||i.messageTimes.values.length>2e3||typeof i.messageTimes.limited!="boolean"||i.messageTimes.values.some(p=>!W(p))||(m+=i.messageTimes.values.length,m>Pe))||n.model&&i.model!==null&&(typeof i.model!="string"||Le(i.model)!==i.model)||n.harness&&i.harness!==null&&(typeof i.harness!="string"||!me(i.harness)))return r()}const o=t.sessions,l=new Uint8Array(o.length);for(let f=0;f<o.length;f++){if(l[f])continue;const i=[[f,!1]];for(;i.length;){const[p,M]=i.pop();if(M){l[p]=2;continue}if(l[p]===1)return r();if(l[p]!==2){l[p]=1,i.push([p,!0]);for(const S of[o[p].parent,o[p].fork])S!==null&&i.push([S,!1])}}}if(new TextEncoder().encode(JSON.stringify(t)).length>Ee)throw new Error("This graph is too large. Choose a smaller date range.");return t}function le(t,r){const n=de(t),e=n.sessions.filter(l=>!r||r.has(l.id)).map(l=>({id:String(l.id),projectID:String(l.group),title:`Session ${l.id+1}`,directory:"",created:l.timestamps?.created??l.id*36e5,updated:l.timestamps?.created??l.id*36e5,tokens:l.tokens??null,cost:null,archived:!1,model:l.model??"",provider:"",agent:"",source:l.harness??void 0,activity:{firstMessageAt:null,lastMessageAt:l.timestamps?.lastMessageAt??null,userMessages:0,untimedUserMessages:0},...l.parent===null?{}:{parentID:String(l.parent)},...l.fork===null?{}:{forkID:String(l.fork)}})),m=[...new Set(n.sessions.map(l=>l.group))].map(l=>({id:String(l),name:`Group ${l+1}`,directory:"",worktrees:[]})),o=ge(e.map(l=>({...l,source:void 0})),m);for(const l of o.nodes)l.session.source=n.sessions[Number(l.session.id)].harness??void 0;return o}function $e(t){const r=t.settings.tokens?t.sessions.filter(e=>typeof e.tokens=="number"):[],n=r.reduce((e,m)=>e+m.tokens,0);return{sessionCount:t.sessions.length,tokenCount:r.length&&Number.isSafeInteger(n)?n:null,tokensPartial:r.length>0&&r.length<t.sessions.length}}function ue(t){const r=$e(t),n=[`${r.sessionCount.toLocaleString()} sessions`];if(t.settings.tokens&&n.push(r.tokenCount===null?"Tokens unavailable":`${r.tokenCount.toLocaleString()} recorded tokens${r.tokensPartial?" (partial coverage)":""}`),t.settings.messageCounts){const e=t.sessions.filter(m=>m.messages?.count!=null);n.push(e.length?`${e.reduce((m,o)=>m+o.messages.count,0).toLocaleString()} recorded messages${e.length<t.sessions.length||t.sessions.some(m=>m.messages?.partial)?" (partial history)":""}`:"Message counts unavailable")}return n.join(" · ")}const Q=t=>t==null?"Unknown":t.toLocaleString(),R=t=>t===null?"Unknown":new Date(t).toLocaleString();function Ie(t,r,n={}){const e=de(r);let m=le(e);t.classList.add("public-viewer"),t.classList.toggle("public-viewer-full",!!n.fullscreen),t.innerHTML=`
|
|
2
|
+
<div class="public-canvas" aria-label="Interactive public session graph"></div>
|
|
3
|
+
<div class="public-toolbar"><button type="button" data-sessions aria-expanded="true">☷ Sessions</button><span class="public-badge">Public snapshot</span></div>
|
|
4
|
+
<nav class="public-view-controls" aria-label="Graph controls"><div class="public-view-switch"><button type="button" data-view="3d" aria-pressed="true">3D</button><button type="button" data-view="2d" aria-pressed="false">2D</button></div><button type="button" data-fit title="Fit view (F)">Fit view</button><button type="button" data-motion aria-pressed="true">Motion</button><button type="button" data-timeline aria-expanded="true">Timeline</button></nav>
|
|
5
|
+
<aside class="public-browser public-panel" aria-label="Public sessions">
|
|
6
|
+
<div class="public-panel-heading"><h2>Sessions <span data-count></span></h2><button type="button" data-close-list aria-label="Close sessions">×</button></div>
|
|
7
|
+
<label class="public-search"><span>Search public data</span><input type="search" placeholder="Session, group, model…" aria-label="Search public sessions"></label>
|
|
8
|
+
<div class="public-filters"><select data-group aria-label="Anonymous group"><option value="">All groups</option></select><select data-harness aria-label="Coding agent"><option value="">All agents</option></select><select data-days aria-label="Date range"><option value="0">All dates</option><option value="7">Last 7 days</option><option value="30">Last 30 days</option><option value="90">Last 90 days</option></select></div>
|
|
9
|
+
<div class="public-list" role="list" aria-label="Sessions"></div><button type="button" data-more hidden>Show more sessions</button>
|
|
10
|
+
</aside>
|
|
11
|
+
<aside class="public-session public-panel" aria-label="Public session details" hidden><div class="public-panel-heading"><h2 data-session-heading></h2><button type="button" data-close-detail aria-label="Close session details">×</button></div><div class="public-session-data"></div></aside>
|
|
12
|
+
<div class="public-tooltip" hidden></div>
|
|
13
|
+
<section class="public-playback public-panel" aria-label="Timeline controls"><div class="public-timeline-heading"><span data-period></span><select data-speed aria-label="Playback speed"><option value="0.5">0.5×</option><option value="1" selected>1×</option><option value="2">2×</option></select></div><div class="public-timeline-track"><button type="button" data-play aria-label="Play timeline">▶</button><div class="public-histogram-wrap"><div class="public-histogram" aria-hidden="true"></div><input type="range" min="0" max="1000" value="1000" aria-label="Graph playback position"></div><output></output></div><p data-summary></p></section>
|
|
14
|
+
<p class="public-hints">Drag to orbit · Scroll to zoom · <kbd>F</kbd> fit · <kbd>Esc</kbd> clear</p>
|
|
15
|
+
<p class="public-announcement" role="status"></p>`;const o=s=>t.querySelector(s),l=o(".public-canvas"),f=o(".public-session"),i=o(".public-session-data"),p=o(".public-list"),M=o("[data-group]"),S=o("[data-harness]"),A=o("[data-days]"),C=o("input[type=search]"),j=o("input[type=range]"),E=o("[data-play]"),y=matchMedia("(prefers-reduced-motion: reduce)"),T=new AbortController,b={...be,muted:!0,clickSounds:!1,focusDimming:!1,messageDots:e.settings.messageTimestamps};let h,w=null,L=e.sessions,O=80,D=0,P=1,a=0,c=!1,v=[],$=ae(m.nodes.map(s=>s.session));const x=()=>{cancelAnimationFrame(D),D=0,h?.setPlaying(!1),E.textContent="▶",E.setAttribute("aria-label","Play timeline")},ee=s=>{o(".public-announcement").textContent=s},N=(s,g)=>{const d=document.createElement("p"),k=document.createElement("strong");k.textContent=`${s}: `,d.append(k,g),i.append(d)};function U(s,g=!1){const d=s===null?void 0:e.sessions[Number(s)];w=d&&L.some(u=>u.id===d.id)?d.id:null,h?.select(w===null?null:String(w)),h?.setEvents([]),v=[],i.replaceChildren(),f.hidden=w===null;for(const u of p.querySelectorAll("button"))u.setAttribute("aria-pressed",String(u.dataset.session===String(w)));if(w===null||!d)return;x(),P=1,H(),o("[data-session-heading]").textContent=`Session ${d.id+1}`,N("Group",`Group ${d.group+1}`),d.timestamps&&(N("Created",R(d.timestamps.created)),N("Last message",R(d.timestamps.lastMessageAt))),"tokens"in d&&N("Tokens",Q(d.tokens)),d.messages&&(N("Messages",`${Q(d.messages.count)}${d.messages.partial?" · partial history":""}`),N("Untimed messages",Q(d.messages.untimed))),"model"in d&&N("Model",d.model??"Unknown or private alias"),"harness"in d&&N("Harness",d.harness?q(d.harness):"Unknown");for(const[u,I]of[["Fork of",d.fork],["Child of",d.parent]])if(I!==null){const _=document.createElement("p"),G=document.createElement("button");_.append(`${u} `),G.textContent=`Session ${I+1}`,G.type="button",G.disabled=!L.some(F=>F.id===I),G.onclick=()=>U(String(I),!0),_.append(G),i.append(_)}if(d.messageTimes){N("Message timestamps",`${d.messageTimes.values.length.toLocaleString()}${d.messageTimes.limited?" · limited coverage":""}`);const u=document.createElement("details"),I=document.createElement("summary");I.textContent="View published timestamps";const _=document.createElement("pre");_.textContent=d.messageTimes.values.map(R).join(`
|
|
16
|
+
`)||"No recorded timestamps.",u.append(I,_),i.append(u),v=d.messageTimes.values.map((G,F)=>({id:`public-${F}`,ordinal:F,kind:"message",name:"Message",role:"user",time:G,timeSource:"recorded",preview:""})),h?.setEvents(v)}const k=document.createElement("p");k.className="public-detail-note",k.textContent="Only published metadata. Names, messages, code, paths, and costs stay private.",i.append(k),g&&h?.focus(String(d.id)),ee(`Selected Session ${d.id+1}.`)}function te(){p.replaceChildren(),o("[data-count]").textContent=String(L.length);const s=new Map(m.nodes.map(g=>[Number(g.session.id),g.color]));for(const g of L.slice(0,O)){const d=document.createElement("div"),k=document.createElement("button"),u=document.createElement("span"),I=document.createElement("small");d.setAttribute("role","listitem"),k.type="button",k.dataset.session=String(g.id),k.setAttribute("aria-pressed",String(w===g.id)),k.style.setProperty("--session-color",s.get(g.id)||"#b0e9d6"),u.textContent=`Session ${g.id+1}`,I.textContent=[`Group ${g.group+1}`,g.harness?q(g.harness):"",g.model||""].filter(Boolean).join(" · "),k.append(u,I),k.onclick=()=>U(String(g.id),!0),d.append(k),p.append(d)}L.length||(p.textContent="No sessions match these filters."),o("[data-more]").hidden=O>=L.length}function H(){h?.setCutoff(P),j.value=String(Math.round(P*1e3));const s=m.start+(m.end-m.start)*P;o("output").textContent=e.settings.timestamps&&m.nodes.length?ye(s,m.end-m.start):`${$(s,P===1)} sessions`,o(".public-histogram-wrap").style.setProperty("--progress",`${P*100}%`)}function K(){x(),O=80,P=1;const s=C.value.toLowerCase().trim(),g=e.settings.timestamps&&Number(A.value)?Math.max(...e.sessions.map(u=>u.timestamps.lastMessageAt??u.timestamps.created))-Number(A.value)*864e5:0;L=e.sessions.filter(u=>(!M.value||String(u.group)===M.value)&&(!S.value||u.harness===S.value)&&(!g||Math.max(u.timestamps.created,u.timestamps.lastMessageAt??0)>=g)&&(!s||`session ${u.id+1} group ${u.group+1} ${u.model??""} ${u.harness?q(u.harness):""}`.toLowerCase().includes(s))),m=le(e,new Set(L.map(u=>u.id))),$=ae(m.nodes.map(u=>u.session)),h?.setGraph(m,!0),U(null);const d=he(m.nodes.map(u=>u.session.created),m.start,m.end,50),k=Math.max(1,...d);o(".public-histogram").replaceChildren(...d.map(u=>{const I=document.createElement("span");return I.style.height=`${Math.max(4,u/k*100)}%`,I})),o("[data-period]").textContent=e.settings.timestamps?L.length?`${new Date(m.start).toLocaleDateString()} — ${new Date(m.end).toLocaleDateString()}`:"No sessions":"Session order · timestamps not shared",o("[data-summary]").textContent=ue({...e,sessions:L}),E.disabled=!L.length,j.disabled=!L.length,te(),H()}try{h=new ve(l,{onSelect:s=>U(s),onPlaybackInterrupt:x,onHover:(s,g,d)=>{const k=o(".public-tooltip");if(k.hidden=!s,s){const u=t.getBoundingClientRect();k.textContent=s.session.title,k.style.left=`${Math.max(8,Math.min(t.clientWidth-135,g-u.left+14))}px`,k.style.top=`${Math.max(8,d-u.top-35)}px`}},onEvent:s=>{const g=v.find(d=>d.id===s);g&&(h?.focusEvent(g),ee(`Published message timestamp: ${R(g.time)}.`))},onEventHover(){}}),h.applyPreferences(b)}catch{l.textContent="3D rendering is unavailable. Explore the published data in the sessions panel.",o(".public-view-controls").hidden=!0}[...new Set(e.sessions.map(s=>s.group))].sort((s,g)=>s-g).forEach(s=>M.add(new Option(`Group ${s+1}`,String(s)))),[...new Set(e.sessions.flatMap(s=>s.harness?[s.harness]:[]))].sort().forEach(s=>S.add(new Option(q(s),s))),S.hidden=!e.settings.harness,A.hidden=!e.settings.timestamps;for(const s of[M,S,A])s.onchange=K;C.oninput=K,o("[data-more]").onclick=()=>{O+=80,te()};const J=s=>{o(".public-browser").hidden=!s,o("[data-sessions]").setAttribute("aria-expanded",String(s))};o("[data-sessions]").onclick=()=>J(o(".public-browser").hidden),o("[data-close-list]").onclick=()=>J(!1),o("[data-close-detail]").onclick=()=>U(null),o("[data-fit]").onclick=()=>h?.reset(),o("[data-timeline]").onclick=()=>{const s=o(".public-playback");s.hidden=!s.hidden,o("[data-timeline]").setAttribute("aria-expanded",String(!s.hidden))};for(const s of t.querySelectorAll("[data-view]"))s.onclick=()=>{b.view=s.dataset.view==="2d"?"2d":"3d",h?.setFlat(s.dataset.view==="2d");for(const g of t.querySelectorAll("[data-view]"))g.setAttribute("aria-pressed",String(g===s))};const X=()=>{h?.applyPreferences(b),o("button[data-motion]").setAttribute("aria-pressed",String(ie(b,y.matches)))};o("button[data-motion]").onclick=()=>{b.motion=ie(b,y.matches)?"off":"on",X()},y.addEventListener("change",X,{signal:T.signal});const se=s=>{c||(P=Math.min(1,P+Math.min(s-a,100)/fe*Number(o("[data-speed]").value)),a=s,H(),P===1?x():D=requestAnimationFrame(se))};E.onclick=()=>{if(D)return x();P>=1&&(P=0),a=performance.now(),h?.setPlaying(!0),E.textContent="Ⅱ",E.setAttribute("aria-label","Pause timeline"),D=requestAnimationFrame(se)},j.oninput=()=>{x(),P=Number(j.value)/1e3,H()},t.tabIndex=-1,t.addEventListener("keydown",s=>{s.target.matches("input, select, textarea")||s.metaKey||s.ctrlKey||s.altKey||(s.key.toLowerCase()==="f"&&(s.preventDefault(),h?.reset()),s.key==="Escape"&&U(null),s.key==="/"&&(s.preventDefault(),J(!0),C.focus()))},{signal:T.signal}),document.addEventListener("visibilitychange",()=>{document.hidden&&x(),h?.setSuspended(document.hidden)},{signal:T.signal});const ne=new IntersectionObserver(([s])=>{s.isIntersecting||x(),h?.setSuspended(!s.isIntersecting||document.hidden)});return ne.observe(t),K(),X(),{dispose(){c=!0,x(),T.abort(),ne.disconnect(),h?.dispose(),t.replaceChildren(),t.classList.remove("public-viewer","public-viewer-full")}}}function Ge(t,r){const n=document.createElement("dialog");n.className="publishing-dialog",n.setAttribute("aria-labelledby","publishing-title"),n.innerHTML=`<div class="publishing-account"><span data-account>Not signed in</span><button class="secondary-button" data-login><span data-login-label>Sign in with GitHub</span></button><button class="text-button" data-logout hidden>Sign out</button><a class="secondary-button" href="https://sessiongraph.ai/account" target="_blank" rel="noopener noreferrer" data-manage hidden>Account & organizations ↗</a></div>
|
|
17
|
+
<div class="publishing-connect" hidden><p>Confirm this code in your browser: <strong data-code></strong></p><a class="secondary-button" data-connect target="_blank" rel="noopener noreferrer">Continue in browser ↗</a><button class="text-button" data-check>Check login</button><label class="publishing-browser-link">Browser link<input type="text" data-connect-url readonly aria-label="Browser sign-in link"></label><button class="text-button" data-copy-link>Copy browser link</button></div>
|
|
18
|
+
<p role="status" class="publishing-status"></p>
|
|
19
|
+
<p class="publishing-disclosure"></p><p class="publishing-scope"></p>
|
|
20
|
+
<fieldset class="publishing-fields"><legend>Publishing settings</legend>${Object.entries(Ae).map(([a,c])=>`<label><input type="checkbox" data-field="${a}"><span>${c}</span></label>`).join("")}</fieldset>
|
|
21
|
+
<p class="publishing-note">Message timestamps require session timestamps and message counts. Models show the last recorded public model ID; private aliases stay hidden. Changes apply when you publish again.</p>
|
|
22
|
+
<div class="publishing-preview"></div><p class="publishing-summary"></p>
|
|
23
|
+
<label class="publishing-confirm"><input type="checkbox" data-confirm><span>I reviewed this preview and want to make the selected data public under my GitHub username.</span></label>
|
|
24
|
+
<footer><button class="text-button" data-json disabled>View exact JSON</button><button class="secondary-button" data-remove hidden>Unpublish</button><button class="primary-button" data-publish disabled>Publish graph</button></footer>
|
|
25
|
+
<a class="publishing-link" target="_blank" rel="noopener noreferrer" hidden></a><pre class="publishing-json" hidden></pre>`,document.body.append(n),n.prepend(ke(n,"publish",()=>r()));const e=a=>n.querySelector(a);e(".publishing-disclosure").textContent=Me;const m=we(xe);m.setAttribute("aria-hidden","true"),e("[data-login]").prepend(m);let o=[],l={...Z},f,i,p=null,M=!1,S=0,A=!1,C=0,j=!1,E=!1,y=0,T;const b=a=>{e(".publishing-status").textContent=a},h=async(a,c="GET",v)=>{const $=await fetch(`/api/sessiongraph/publishing/${a}`,{method:c,headers:{"Content-Type":"application/json","x-sessiongraph-action":"1"},...v===void 0?{}:{body:JSON.stringify(v)}}),x=await $.json();if(!$.ok)throw Object.assign(new Error(x.error||"Please try again."),{status:$.status});return x};function w(){e("[data-publish]").disabled=A||!i||!p||!e("[data-confirm]").checked,e("[data-publish]").textContent=M?"Update public graph":"Publish graph",e("[data-remove]").hidden=!M,e("[data-remove]").disabled=A,e("[data-login]").hidden=!!p||!!T,e("[data-login]").disabled=A||E,e("[data-login-label]").textContent=E?"Opening sign-in…":"Sign in with GitHub",e("[data-login]").setAttribute("aria-busy",String(E)),e("[data-logout]").hidden=!p,e("[data-logout]").disabled=A,e("[data-manage]").hidden=!p,e("[data-account]").textContent=p?`Signed in as @${p}`:T?"Waiting for browser approval":"Not signed in",e("[data-json]").disabled=!i;for(const c of n.querySelectorAll("[data-field]")){const v=c.dataset.field;c.checked=l[v],c.disabled=A||v==="messageTimestamps"&&(!l.timestamps||!l.messageCounts)}const a=e(".publishing-link");a.hidden=!p||!M,p&&(a.href=`https://sessiongraph.ai/@${p}`,a.textContent=a.href)}async function L(){const a=++S;if(i=void 0,e("[data-confirm]").checked=!1,f?.dispose(),f=void 0,e(".publishing-json").hidden=!0,e(".publishing-json").textContent="",w(),!o.length){e(".publishing-preview").textContent="Select sessions on the map to preview a public graph.";return}e(".publishing-preview").textContent="Preparing local preview…";try{const c=await h("preview","POST",{ids:o,settings:l});if(!n.open||a!==S)return;i=c,l=c.graph.settings,f=Ie(e(".publishing-preview"),c.graph),e(".publishing-summary").textContent=ue(c.graph),!E&&!T&&b("Preview prepared locally. Nothing has been uploaded.")}catch(c){a===S&&(e(".publishing-preview").textContent="",b(c.message))}w()}async function O(){const a=y,c=await h("status");!n.open||a!==y||(p=c.username??null,M=!!c.publication,p&&(T=void 0,e(".publishing-connect").hidden=!0,window.clearInterval(C),C=0),w())}async function D(){if(j||!n.open)return;const a=y;j=!0,e("[data-check]").disabled=!0;try{const c=await h("poll","POST",{});if(!n.open||a!==y)return;c.username&&(window.clearInterval(C),C=0,T=void 0,e(".publishing-connect").hidden=!0,p=c.username,w(),await O(),n.open&&a===y&&b("Signed in. Review the preview before publishing."))}catch(c){if(!n.open||a!==y)return;[400,401].includes(c.status)&&(window.clearInterval(C),C=0,T=void 0,e(".publishing-connect").hidden=!0,w()),b(c.message)}finally{j=!1,e("[data-check]").disabled=!1}}e("[data-login]").onclick=async()=>{if(E||T)return;const a=++y;E=!0,w(),b("Preparing browser sign-in…");let c=null;if(!V())try{c=window.open("about:blank","_blank"),c&&(c.opener=null)}catch{c=null}try{const v=await h("login","POST",{});if(!n.open||a!==y){c?.close();return}const $=Se(v.url);if(new URL($).origin!=="https://sessiongraph.ai"||typeof v.code!="string")throw new Error("Could not prepare browser sign-in. Please try again.");T=$,e("[data-code]").textContent=v.code,e("[data-connect]").href=$,e("[data-connect-url]").value=$,e(".publishing-connect").hidden=!1,window.clearInterval(C),C=window.setInterval(()=>{D()},4e3),e("[data-connect]").focus(),b("Continue in your browser to connect this app."),V()?await P(e("[data-connect]")):c&&(c.location.replace($),b("Sign in in the browser tab and confirm the matching code, then return here."))}catch(v){c?.close(),a===y&&b(v.message)}finally{a===y&&(E=!1,w())}};async function P(a){if(a.getAttribute("aria-busy")==="true")return;a.setAttribute("aria-busy","true");const c=y,v=a.hasAttribute("data-connect");try{await Ce(a.href),v&&n.open&&c===y&&b("Browser opened. Sign in and confirm the matching code, then return here.")}catch{n.open&&c===y&&b(v?"Could not open your browser. Copy the browser link below and paste it into your browser to continue.":"Could not open your browser. Copy the link and open it in your browser.")}finally{a.removeAttribute("aria-busy")}}n.addEventListener("click",a=>{const c=a.target.closest('a[target="_blank"]');!c||!V()||a.defaultPrevented||a.button!==0||(a.preventDefault(),P(c))}),e("[data-copy-link]").onclick=async()=>{const a=e("[data-connect-url]");try{await navigator.clipboard.writeText(a.value),b("Browser link copied. Paste it into your browser to sign in and confirm the code.")}catch{a.focus(),a.select(),b("Browser link selected. Copy it and paste it into your browser.")}},e("[data-check]").onclick=()=>{D()},e("[data-logout]").onclick=async()=>{A=!0,w();try{await h("logout","POST",{}),p=null,M=!1,i=void 0,b("Signed out. Your published graph stays online until you unpublish it.")}catch(a){b(a.message)}finally{A=!1,w()}};for(const a of n.querySelectorAll("[data-field]"))a.onchange=()=>{l=oe({...l,[a.dataset.field]:a.checked}),L()};return e("[data-confirm]").onchange=w,e("[data-publish]").onclick=async()=>{if(!(!i||!e("[data-confirm]").checked)){A=!0,w(),b("Publishing…");try{await h("publish","POST",{id:i.id,confirmed:!0}),M=!0,i=void 0,e("[data-confirm]").checked=!1,b("Published. Future imports stay local. Publish again to update this snapshot.")}catch(a){b(a.message)}finally{A=!1,w()}}},e("[data-remove]").onclick=async()=>{A=!0,w();try{await h("unpublish","POST",{}),M=!1,b("Unpublished. Your public graph has been removed.")}catch(a){b(a.message)}finally{A=!1,w()}},e("[data-json]").onclick=()=>{const a=e(".publishing-json");a.hidden=!a.hidden,a.textContent=i?JSON.stringify(i.graph,null,2):""},n.addEventListener("close",()=>{n.open||(S++,y++,E=!1,window.clearInterval(C),C=0,f?.dispose(),f=void 0,i=void 0,t())}),{async open(a){if(n.open)return;S++,y++,window.clearInterval(C),C=0,f?.dispose(),f=void 0,o=[...a],p=null,M=!1,i=void 0,E=!1,b(""),e(".publishing-connect").hidden=!T,e(".publishing-scope").textContent=`${o.length.toLocaleString()} sessions in the current filtered view. Change filters on the map to choose what you publish.`,n.showModal(),t(),w();const c=y,v=O().then(()=>{n.open&&c===y&&T&&!p&&(C=window.setInterval(()=>{D()},4e3),D())}).catch(x=>{n.open&&c===y&&b(x.message)}),$=++S;try{const x=await h("settings");if(!n.open||$!==S)return;l=oe(x),await L()}catch(x){n.open&&$===S&&b(x.message)}await v},dispose(){S++,y++,window.clearInterval(C),f?.dispose(),f=void 0,n.close(),n.remove()}}}export{Ge as createPublishing};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{M as oe,C as L,S as ce,a as M,G,P as ae,I as ne,b as k,D as F,c as I,A as T,d as Y,e as N,B as D,F as S,f as re,g as H,W as ke,h as Pe,O as Se,i as Ae,H as Ce,E as Re,R as Fe,U as Ee,V as O,j as Ie,k as Te,l as ze,m as Be,n as Ue,o as V,p as Ge,q as g,r as De,s as ee,t as Oe,u as Le,v as j,w as te,x as ie,y as He,L as Ne,z as de,J as ue,K as Xe,N as _e}from"./three-D_1Qt16u.js";import{
|
|
1
|
+
import{M as oe,C as L,S as ce,a as M,G,P as ae,I as ne,b as k,D as F,c as I,A as T,d as Y,e as N,B as D,F as S,f as re,g as H,W as ke,h as Pe,O as Se,i as Ae,H as Ce,E as Re,R as Fe,U as Ee,V as O,j as Ie,k as Te,l as ze,m as Be,n as Ue,o as V,p as Ge,q as g,r as De,s as ee,t as Oe,u as Le,v as j,w as te,x as ie,y as He,L as Ne,z as de,J as ue,K as Xe,N as _e}from"./three-D_1Qt16u.js";import{h as ge,o as R,c as Ve,D as $e,l as je,q as C,r as $,u as We,v as qe,w as Ye,x as se,y as fe}from"./index-DPovJIlT.js";const Ke=["svg",ge,[["path",{d:"M12 8V4H8"}],["rect",{width:"16",height:"12",x:"4",y:"8",rx:"2"}],["path",{d:"M2 14h2"}],["path",{d:"M20 14h2"}],["path",{d:"M15 13v2"}],["path",{d:"M9 13v2"}]]];const Qe=["svg",ge,[["circle",{cx:"12",cy:"8",r:"5"}],["path",{d:"M20 21a8 8 0 0 0-16 0"}]]],ye=`
|
|
2
2
|
attribute float nodeIndex;
|
|
3
3
|
uniform float uSelected;
|
|
4
4
|
uniform float uHovered;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/index-DhlS3ZId.js","assets/index-DPovJIlT.js","assets/index-cVgPCrFV.css","assets/index-JjTdnq9-.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{TimelineScene as V}from"./scene-BXs8B_Kk.js";import{i as U,_ as G,c as X,S as J,p as Y,a as Z,t as K,s as Q,b as H,d as ee,e as te,f as ae,g as oe}from"./index-DPovJIlT.js";import{s as re,o as se}from"./external-links-CJk2OPKW.js";import"./three-D_1Qt16u.js";const ne="#b0e9d6",ie="#dbe7e3",L=128,le=10,ce="M102 24 86 40H36a14 14 0 0 0 0 28h40a14 14 0 0 1 0 28H22",de=[[102,24],[36,40],[22,96]],ue=10;let O;function he(e,l,t,s,i=ne){O??=new Path2D(ce),e.save(),e.translate(l,t),e.scale(s/L,s/L),e.strokeStyle=e.fillStyle=i,e.lineWidth=le,e.lineCap=e.lineJoin="round",e.stroke(O);for(const[p,r]of de)e.beginPath(),e.arc(p,r,ue,0,Math.PI*2),e.fill();e.restore()}const pe="Cosmic Wobbly Disco Sneaky Bouncy Galactic Crispy Dizzy Fuzzy Noodle Groovy Sleepy Spicy Jolly Loopy Squishy Turbo Giggly Velvet Soggy Zippy Fluffy Moonwalking Wiggly Fizzy Snazzy Goofy Jazzy Tiny Chunky Dapper Wacky".split(" "),ye="Wombat Pickle Pancake Badger Potato Narwhal Noodle Goblin Otter Turnip Hamster Comet Dumpling Goose Biscuit Llama Muffin Squid Raccoon Toaster Waffle Penguin Yeti Pudding Walrus Taco Jellybean Platypus Sloth Cactus Donut Mongoose".split(" ");function fe(e,l=()=>crypto.getRandomValues(new Uint32Array(1))[0]/2**32){const t=pe.flatMap(s=>ye.map(i=>`${s} ${i}`));for(let s=t.length-1;s>0;s--){const i=Math.floor(l()*(s+1));[t[s],t[i]]=[t[i],t[s]]}return Array.from({length:e},(s,i)=>{const p=Math.floor(i/t.length);return`Project ${"Mega".repeat(p)}${t[i%t.length]}`})}function me(e){const l=fe(e.lanes.length),t=new Map(e.nodes.map((r,a)=>[r.session.id,`session-${a}`])),s=new Map(e.lanes.flatMap((r,a)=>r.nodes.map(o=>[o.session.id,`project-${a}`]))),i=e.nodes.map(r=>{const a=r.session,o={id:t.get(a.id),title:"Session",projectID:s.get(a.id),directory:"",created:a.created,updated:a.created,activity:a.activity&&{firstMessageAt:a.activity.firstMessageAt,lastMessageAt:a.activity.lastMessageAt,userMessages:a.activity.userMessages,untimedUserMessages:a.activity.untimedUserMessages},archived:!1,model:"",provider:"",agent:"",cost:null,source:a.source==="continue"?"continue":a.source==="opencode"||!a.source?"opencode":"unknown",tokens:a.tokens};return a.parentID&&t.has(a.parentID)&&(o.parentID=t.get(a.parentID)),a.forkID&&t.has(a.forkID)&&(o.forkID=t.get(a.forkID)),{session:o,position:[...r.position],startPosition:[...r.startPosition],color:r.color,radius:r.radius}}),p=new Map(i.map(r=>[r.session.id,r]));return{start:e.start,end:e.end,timeFrame:e.timeFrame&&{...e.timeFrame},nodes:i,edges:e.edges.map(r=>({from:t.get(r.from),to:t.get(r.to),kind:r.kind})),lanes:e.lanes.map((r,a)=>({key:`project-${a}`,label:l[a],color:r.color,kind:"directory",y:r.y,z:r.z,nodes:r.nodes.map(o=>p.get(t.get(o.session.id)))}))}}const $={mp4:{label:"MP4",description:"MP4 video",mime:"video/mp4",filename:"sessiongraph-playback.mp4"}},I=`My coding sessions, visualized with SessionGraph.
|
|
3
|
+
https://github.com/arvindell/sessiongraph`,be=`https://x.com/intent/tweet?text=${encodeURIComponent(I)}`,z=e=>e instanceof Error&&e.name==="AbortError";async function ve(e,l,t){const{label:s,description:i,mime:p,filename:r}=$[t];try{if(U()){const[{save:a},{writeFile:o}]=await Promise.all([G(()=>import("./index-DhlS3ZId.js"),__vite__mapDeps([0,1,2])),G(()=>import("./index-JjTdnq9-.js"),__vite__mapDeps([3,1,2]))]),c=await a({title:`Save SessionGraph ${s}`,defaultPath:r,filters:[{name:i,extensions:[t]}]});if(!c)return"cancelled";await o(c,new Uint8Array(await e.arrayBuffer()))}else{const a=window.showSaveFilePicker;if(a){const c=await(await a.call(window,{suggestedName:r,types:[{description:i,accept:{[p]:[`.${t}`]}}]})).createWritable();try{await c.write(e),await c.close()}catch(d){throw await c.abort().catch(()=>{}),d}}else{const o=document.createElement("a");return o.href=l,o.download=r,document.body.append(o),o.click(),o.remove(),"downloaded"}}return"saved"}catch(a){if(z(a))return"cancelled";throw a}}const S=960,T=600,we=e=>Intl.NumberFormat("en",{notation:"compact",maximumFractionDigits:1}).format(e);function ge(e,l,t,s,i,p){const o=T-122,c=Math.max(1,...s);e.save(),he(e,24,14,28),e.fillStyle=ie,e.font='600 14px "Geist Variable", sans-serif',e.textAlign="left",e.textBaseline="middle",e.fillText("SessionGraph",58,28),e.restore();for(let h=0;h<s.length;h++){const f=Math.max(2,s[h]/c*22);e.fillStyle=h/s.length<=t?"#91bfae":"#253d39",e.fillRect(260+h/s.length*440,o-f,440/s.length-2,f)}e.fillStyle="#d6f4e8",e.fillRect(260+440*t,o-27,1,31);const d=l.start+(l.end-l.start)*t,k=i.at(d,t===1).tokens;e.textAlign="center",e.fillStyle="#a0baae",e.font='12px "IBM Plex Mono", monospace',e.fillText(oe(d,l.end-l.start),S/2,o+23),e.fillStyle="#e7f5ee",e.font='36px "Geist Variable", sans-serif',e.fillText(p(d,t===1).toLocaleString("en"),S/2-105,o+66),e.fillText(i.recorded?we(k):"—",S/2+105,o+66),e.font='12px "Geist Variable", sans-serif',e.fillStyle="#92b0a3",e.fillText("Sessions",S/2-105,o+87),e.fillText("Burnt tokens",S/2+105,o+87),e.textAlign="left"}async function Se(e,l,t,s){t.throwIfAborted();const{label:i,mime:p}=$.mp4,r=Y(e.nodes.map(y=>y.session)),a=Z(e.nodes.map(y=>y.session)),o=K(e.nodes.map(y=>Q(y.session)),e.start,e.end),c=document.createElement("div");c.className="share-render-host",c.setAttribute("aria-hidden","true"),c.style.cssText=`position:fixed;left:-12000px;top:0;width:${S}px;height:${T}px;pointer-events:none;visibility:hidden`,document.body.append(c);const d=document.createElement("canvas");d.width=S,d.height=T;const k=d.getContext("2d",{willReadFrequently:!0});let h,f;try{if(!k)throw new Error("Canvas export is unavailable.");h=new V(c,{onSelect(){},onHover(){},onPlaybackInterrupt(){},onEvent(){},onEventHover(){}},{manual:!0}),h.applyPreferences({...l,quality:"balanced",motion:"on",labels:!0,focusDimming:!1,trails:l.trails==="selected"?"all":l.trails}),h.setGraph(e,!0),h.prepareCapture(),await document.fonts.ready,t.throwIfAborted(),f=new Worker(new URL("/assets/mp4-worker-Dc_1QUwS.js",import.meta.url),{type:"module"});const y=(m,C=[])=>new Promise((A,b)=>{t.throwIfAborted();const v=()=>{clearTimeout(D),t.removeEventListener("abort",w),f.onmessage=null,f.onerror=null},w=()=>{v(),b(t.reason)},D=setTimeout(()=>{v(),b(new Error(`${i} encoding timed out. Please try again.`))},6e4);t.addEventListener("abort",w,{once:!0}),f.onmessage=M=>{v(),M.data.error?b(new Error(M.data.error)):A(M.data)},f.onerror=()=>{v(),b(new Error(`Could not start the ${i} encoder.`))},f.postMessage(m,C)});await y({init:!0,width:S,height:T});for(let m=0;m<H;m++){t.throwIfAborted();const C=ee(m);h.captureFrame(C,1/te,k,ae(m)),ge(k,e,C,o,r,a);const A=k.getImageData(0,0,S,T).data.buffer;await y({rgba:A,width:S,height:T},[A]),s((m+1)/H)}const _=await y({finish:!0});return new Blob([_.bytes],{type:p})}finally{f?.terminate(),h?.dispose(),c.remove()}}function De(e,l){const t=document.createElement("dialog");t.className="share-dialog",t.setAttribute("aria-labelledby","share-title"),t.innerHTML=`<p>Create a private MP4 video. Project and session names are hidden, and nothing is uploaded.</p>
|
|
4
|
+
<div class="share-preview"><video aria-label="SessionGraph playback with hidden project and session names" muted loop playsinline controls hidden></video><div class="share-progress"><progress max="100" value="0" aria-label="Creating video"></progress><span role="status">Creating video… 0%</span></div></div>
|
|
5
|
+
<p class="share-notice" role="status" hidden></p>
|
|
6
|
+
<div class="share-actions"><button class="text-button share-close">Cancel</button><button class="secondary-button share-retry" hidden>Try again</button><a class="secondary-button share-x" target="_blank" rel="noopener noreferrer" hidden>Share in X</a><button class="secondary-button share-system" aria-label="Open share tray" aria-controls="playback-share-tray" aria-expanded="false" hidden>Share…</button><button class="primary-button share-save" hidden>Save MP4</button></div>
|
|
7
|
+
<section id="playback-share-tray" class="share-tray" aria-label="Share options" hidden><p>Save the video to attach it in any app.</p><textarea class="share-caption" aria-label="Share caption" readonly rows="3"></textarea><div><button class="secondary-button share-copy">Copy caption</button><a class="secondary-button share-x" target="_blank" rel="noopener noreferrer">Share in X</a><button class="secondary-button share-tray-save">Save MP4</button></div></section>`,t.prepend(re(t,"video",()=>l())),document.body.append(t);const s=t.querySelector("video"),i=t.querySelector("progress"),p=t.querySelector('[role="status"]'),r=t.querySelector(".share-progress"),a=t.querySelector(".share-close"),o=t.querySelector(".share-save"),c=t.querySelector(".share-retry"),d=t.querySelector(".share-system"),k=t.querySelector(".share-actions .share-x"),h=t.querySelector(".share-tray"),f=t.querySelector(".share-notice"),y=t.querySelector(".share-tray-save"),_=t.querySelector(".share-copy"),m=t.querySelector(".share-caption");m.value=I;const C=X(J);C.setAttribute("aria-hidden","true"),C.setAttribute("stroke-width","1.5"),d.prepend(C);let A,b,v,w,D,M,x=Promise.resolve();const g=n=>{f.textContent=n,f.hidden=!n},R=n=>{h.hidden=!n,d.setAttribute("aria-expanded",String(n)),n&&_.focus()},q=()=>{A?.abort(),A=void 0,s.pause(),s.removeAttribute("src"),s.load(),w&&URL.revokeObjectURL(w),w=void 0,b=void 0,v=void 0,R(!1),g(""),t.setAttribute("aria-busy","false")};for(const n of t.querySelectorAll(".share-x"))n.href=be,n.title="Open an X draft, then attach your saved animation",n.onclick=u=>{g("Attach your saved MP4 in X to include the video."),U()&&(u.preventDefault(),se(n.href).catch(()=>g("Could not open your browser. Copy the caption and attach your saved video manually.")))};a.onclick=()=>t.close(),t.addEventListener("cancel",n=>{h.hidden||(n.preventDefault(),R(!1),d.focus())}),t.addEventListener("close",()=>{t.open||(q(),D=void 0,M=void 0,e())});function N(){q();const n=new AbortController;A=n;const{label:u,mime:P,filename:j}=$.mp4;o.textContent=y.textContent=`Save ${u}`,s.hidden=!0,r.hidden=!1,o.hidden=!0,d.hidden=!0,k.hidden=!0,c.hidden=!0,a.textContent="Cancel",i.hidden=!1,i.value=0,i.setAttribute("aria-label",`Creating ${u}`),p.textContent=`Creating ${u}… 0%`,t.setAttribute("aria-busy","true"),x=x.then(async()=>{if(!n.signal.aborted)try{const E=await Se(D,M,n.signal,W=>{if(n.signal.aborted)return;const F=Math.round(W*100);i.value=F,p.textContent=`Creating ${u}… ${F}%`});if(n.signal.aborted)return;b=E,v=new File([E],j,{type:P}),w=URL.createObjectURL(E),s.src=w,s.hidden=!1,s.play().catch(()=>{}),r.hidden=!0,o.hidden=!1,d.hidden=!1,k.hidden=!1,a.textContent="Done"}catch(E){if(n.signal.aborted)return;i.hidden=!0,p.textContent=E instanceof Error?E.message:`Could not create the ${u}.`,c.hidden=!1,a.textContent="Close"}finally{A===n&&t.setAttribute("aria-busy","false")}})}c.onclick=N;const B=async()=>{if(!b||!w||o.disabled)return;const n=b,{label:u}=$.mp4;o.disabled=!0,y.disabled=!0,g(`Choose where to save your ${u}…`);try{const P=await ve(n,w,"mp4");b===n&&g(P==="saved"?`${u} saved.`:P==="downloaded"?`${u} download started. Check your downloads.`:`Save cancelled. Your ${u} is still ready.`)}catch{b===n&&g(`Could not save the ${u}. Try choosing another location.`)}finally{o.disabled=!1,y.disabled=!1}};return o.onclick=B,y.onclick=B,d.onclick=async()=>{if(!v||d.disabled)return;const n=v,u={files:[n],title:"SessionGraph",text:I};if(!navigator.share||!navigator.canShare?.({files:[n]})){R(h.hidden);return}d.disabled=!0,g("");try{await navigator.share(u)}catch(P){v===n&&!z(P)&&(R(!0),g("Could not open system sharing. Save the animation or choose an option below."))}finally{d.disabled=!1}},_.onclick=async()=>{try{await navigator.clipboard.writeText(I),g("Caption copied. Attach your saved animation with it.")}catch{m.focus(),m.select(),g("Copy the selected caption, then attach your saved animation.")}},{open(n,u){t.open||(D=me(n),M={...u},t.showModal(),e(),N())},dispose(){q(),D=void 0,M=void 0,t.close(),t.remove()}}}export{De as createPlaybackShare};
|
|
@@ -12,8 +12,8 @@
|
|
|
12
12
|
<link rel="icon" sizes="any" href="/favicon.ico" />
|
|
13
13
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
|
14
14
|
<link rel="apple-touch-icon" href="/apple-touch-icon.png" />
|
|
15
|
-
<script type="module" crossorigin src="/assets/index-
|
|
16
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
15
|
+
<script type="module" crossorigin src="/assets/index-DPovJIlT.js"></script>
|
|
16
|
+
<link rel="stylesheet" crossorigin href="/assets/index-cVgPCrFV.css">
|
|
17
17
|
</head>
|
|
18
18
|
<body>
|
|
19
19
|
<div id="app"></div>
|
|
@@ -14,16 +14,20 @@
|
|
|
14
14
|
</data>
|
|
15
15
|
<key>Resources/resources/node</key>
|
|
16
16
|
<data>
|
|
17
|
-
|
|
17
|
+
12DkJCJ8qYRbNUUmbUVf5mLKJkE=
|
|
18
18
|
</data>
|
|
19
19
|
<key>Resources/resources/server.mjs</key>
|
|
20
20
|
<data>
|
|
21
|
-
|
|
21
|
+
dLCavUnSBxWw1x4iyd+CmKPs79g=
|
|
22
22
|
</data>
|
|
23
23
|
<key>Resources/resources/web/apple-touch-icon.png</key>
|
|
24
24
|
<data>
|
|
25
25
|
7IrT+H6J4h1FxtVwSpZiqT0xzjI=
|
|
26
26
|
</data>
|
|
27
|
+
<key>Resources/resources/web/assets/external-links-CJk2OPKW.js</key>
|
|
28
|
+
<data>
|
|
29
|
+
jEyWg9pJvGeU5RW5zQ26AUgBl2M=
|
|
30
|
+
</data>
|
|
27
31
|
<key>Resources/resources/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2</key>
|
|
28
32
|
<data>
|
|
29
33
|
yYSDXNlt/tTRaj6rJo8ZMqvY7pQ=
|
|
@@ -44,10 +48,6 @@
|
|
|
44
48
|
<data>
|
|
45
49
|
6MZ7/PEEOeDVF0eHI650KpwKQV8=
|
|
46
50
|
</data>
|
|
47
|
-
<key>Resources/resources/web/assets/gif-worker-CghHEBpp.js</key>
|
|
48
|
-
<data>
|
|
49
|
-
AymSGXqQ+/QDZ1A3Wr1PydS5Xs0=
|
|
50
|
-
</data>
|
|
51
51
|
<key>Resources/resources/web/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2</key>
|
|
52
52
|
<data>
|
|
53
53
|
mDbzFbXDuciYuRDdYbcJkcocaWU=
|
|
@@ -88,45 +88,45 @@
|
|
|
88
88
|
<data>
|
|
89
89
|
LdRX2sBB3T5WDAsZLCwBlsMYXPw=
|
|
90
90
|
</data>
|
|
91
|
-
<key>Resources/resources/web/assets/index-
|
|
91
|
+
<key>Resources/resources/web/assets/index-DOYyn-b_.js</key>
|
|
92
92
|
<data>
|
|
93
|
-
|
|
93
|
+
MwarVN51C0SSIE4i8iTvly4XIpc=
|
|
94
94
|
</data>
|
|
95
|
-
<key>Resources/resources/web/assets/index-
|
|
95
|
+
<key>Resources/resources/web/assets/index-DPovJIlT.js</key>
|
|
96
96
|
<data>
|
|
97
|
-
|
|
97
|
+
HW9l9wX3GViTx2wIAfJniSh2CL8=
|
|
98
98
|
</data>
|
|
99
|
-
<key>Resources/resources/web/assets/index-
|
|
99
|
+
<key>Resources/resources/web/assets/index-DhlS3ZId.js</key>
|
|
100
100
|
<data>
|
|
101
|
-
|
|
101
|
+
ZzR7CqspdYbmuLT5MUXlv5ii3lI=
|
|
102
102
|
</data>
|
|
103
|
-
<key>Resources/resources/web/assets/index-
|
|
103
|
+
<key>Resources/resources/web/assets/index-JjTdnq9-.js</key>
|
|
104
104
|
<data>
|
|
105
|
-
|
|
105
|
+
ydgcgJxsJ+sSiKCt95NunhCeysg=
|
|
106
106
|
</data>
|
|
107
|
-
<key>Resources/resources/web/assets/index-
|
|
107
|
+
<key>Resources/resources/web/assets/index-cVgPCrFV.css</key>
|
|
108
108
|
<data>
|
|
109
|
-
|
|
109
|
+
iF/RrbIsDFqLG24iTldy8j0AaJU=
|
|
110
110
|
</data>
|
|
111
|
-
<key>Resources/resources/web/assets/mp4-worker-
|
|
111
|
+
<key>Resources/resources/web/assets/mp4-worker-Dc_1QUwS.js</key>
|
|
112
112
|
<data>
|
|
113
|
-
|
|
113
|
+
2/71pbsZ0DyFW7H+mzqWhzexMXI=
|
|
114
114
|
</data>
|
|
115
|
-
<key>Resources/resources/web/assets/publishing-
|
|
115
|
+
<key>Resources/resources/web/assets/publishing-CkVIjq_f.js</key>
|
|
116
116
|
<data>
|
|
117
|
-
|
|
117
|
+
I34GpqHzBf5zAGlP30htpkWNoFw=
|
|
118
118
|
</data>
|
|
119
119
|
<key>Resources/resources/web/assets/publishing-VJhUmdPH.css</key>
|
|
120
120
|
<data>
|
|
121
121
|
6fWzMO88QnTllqV2/V6JoSphpq8=
|
|
122
122
|
</data>
|
|
123
|
-
<key>Resources/resources/web/assets/scene-
|
|
123
|
+
<key>Resources/resources/web/assets/scene-BXs8B_Kk.js</key>
|
|
124
124
|
<data>
|
|
125
|
-
|
|
125
|
+
LMNX9Bs4c4b5hueocpCyUuL0gss=
|
|
126
126
|
</data>
|
|
127
|
-
<key>Resources/resources/web/assets/share-
|
|
127
|
+
<key>Resources/resources/web/assets/share-jfOenMTA.js</key>
|
|
128
128
|
<data>
|
|
129
|
-
|
|
129
|
+
HFyzbGW7mdYpZOfCCnoBluoC1Sc=
|
|
130
130
|
</data>
|
|
131
131
|
<key>Resources/resources/web/assets/three-D_1Qt16u.js</key>
|
|
132
132
|
<data>
|
|
@@ -166,7 +166,7 @@
|
|
|
166
166
|
</data>
|
|
167
167
|
<key>Resources/resources/web/index.html</key>
|
|
168
168
|
<data>
|
|
169
|
-
|
|
169
|
+
7GYxUsrJlijddy42QVLNPq7clAM=
|
|
170
170
|
</data>
|
|
171
171
|
<key>Resources/resources/web/sources/LICENSE-APACHE-2.0.txt</key>
|
|
172
172
|
<data>
|
|
@@ -425,14 +425,14 @@
|
|
|
425
425
|
<dict>
|
|
426
426
|
<key>hash2</key>
|
|
427
427
|
<data>
|
|
428
|
-
|
|
428
|
+
2N3Kqsh+d+SLnmGx3m1wl8tfqvPrPfW1IoIaB7Gazp8=
|
|
429
429
|
</data>
|
|
430
430
|
</dict>
|
|
431
431
|
<key>Resources/resources/server.mjs</key>
|
|
432
432
|
<dict>
|
|
433
433
|
<key>hash2</key>
|
|
434
434
|
<data>
|
|
435
|
-
|
|
435
|
+
mu2pgz4N3e7kk5aWigjjwM5VT7AYV7G5Y0sW4tnsmmk=
|
|
436
436
|
</data>
|
|
437
437
|
</dict>
|
|
438
438
|
<key>Resources/resources/web/apple-touch-icon.png</key>
|
|
@@ -442,6 +442,13 @@
|
|
|
442
442
|
r0avunkAKv+j4kuQJ3Lk5pFwJ+ds28pxrEPQMyqVahc=
|
|
443
443
|
</data>
|
|
444
444
|
</dict>
|
|
445
|
+
<key>Resources/resources/web/assets/external-links-CJk2OPKW.js</key>
|
|
446
|
+
<dict>
|
|
447
|
+
<key>hash2</key>
|
|
448
|
+
<data>
|
|
449
|
+
BZZOuW7gccoHENF1x9CK4GBj+Cp7QUtoOpkP7y+c8hA=
|
|
450
|
+
</data>
|
|
451
|
+
</dict>
|
|
445
452
|
<key>Resources/resources/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2</key>
|
|
446
453
|
<dict>
|
|
447
454
|
<key>hash2</key>
|
|
@@ -477,13 +484,6 @@
|
|
|
477
484
|
j6QOXSSCR3NeuXoL1ZO4hSRAQwYA1roBNkwx/gq8H+E=
|
|
478
485
|
</data>
|
|
479
486
|
</dict>
|
|
480
|
-
<key>Resources/resources/web/assets/gif-worker-CghHEBpp.js</key>
|
|
481
|
-
<dict>
|
|
482
|
-
<key>hash2</key>
|
|
483
|
-
<data>
|
|
484
|
-
Gqm87v0a6wkspaC1UVuZ9V/7+MroKhoHHeHwsIe3SjM=
|
|
485
|
-
</data>
|
|
486
|
-
</dict>
|
|
487
487
|
<key>Resources/resources/web/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2</key>
|
|
488
488
|
<dict>
|
|
489
489
|
<key>hash2</key>
|
|
@@ -554,53 +554,53 @@
|
|
|
554
554
|
vO1WHZkeP4HBUMCOcff6hJ/L/1I1YPYFkkXy7c4ZtgA=
|
|
555
555
|
</data>
|
|
556
556
|
</dict>
|
|
557
|
-
<key>Resources/resources/web/assets/index-
|
|
557
|
+
<key>Resources/resources/web/assets/index-DOYyn-b_.js</key>
|
|
558
558
|
<dict>
|
|
559
559
|
<key>hash2</key>
|
|
560
560
|
<data>
|
|
561
|
-
|
|
561
|
+
aQO4VHltQltjC4yLWcOqrRIbRLI99lhiNJVOMhaWXrM=
|
|
562
562
|
</data>
|
|
563
563
|
</dict>
|
|
564
|
-
<key>Resources/resources/web/assets/index-
|
|
564
|
+
<key>Resources/resources/web/assets/index-DPovJIlT.js</key>
|
|
565
565
|
<dict>
|
|
566
566
|
<key>hash2</key>
|
|
567
567
|
<data>
|
|
568
|
-
|
|
568
|
+
/kgfUhSr34iJXrowRhwoNFxUTXQMVsTKvxZNwaxLTqo=
|
|
569
569
|
</data>
|
|
570
570
|
</dict>
|
|
571
|
-
<key>Resources/resources/web/assets/index-
|
|
571
|
+
<key>Resources/resources/web/assets/index-DhlS3ZId.js</key>
|
|
572
572
|
<dict>
|
|
573
573
|
<key>hash2</key>
|
|
574
574
|
<data>
|
|
575
|
-
|
|
575
|
+
0bJQFyqo5UijLKyxIN31zAHVAcjzbqirjawAahYnv7s=
|
|
576
576
|
</data>
|
|
577
577
|
</dict>
|
|
578
|
-
<key>Resources/resources/web/assets/index-
|
|
578
|
+
<key>Resources/resources/web/assets/index-JjTdnq9-.js</key>
|
|
579
579
|
<dict>
|
|
580
580
|
<key>hash2</key>
|
|
581
581
|
<data>
|
|
582
|
-
|
|
582
|
+
OeQ8citIU4tSKiNsGQsLITGsHHobkYJYajGEP6ZdMLk=
|
|
583
583
|
</data>
|
|
584
584
|
</dict>
|
|
585
|
-
<key>Resources/resources/web/assets/index-
|
|
585
|
+
<key>Resources/resources/web/assets/index-cVgPCrFV.css</key>
|
|
586
586
|
<dict>
|
|
587
587
|
<key>hash2</key>
|
|
588
588
|
<data>
|
|
589
|
-
|
|
589
|
+
u0PLkjTcM8ruYmTQ3Yp4BwAhqq8AohSPTU9Uor/7tbw=
|
|
590
590
|
</data>
|
|
591
591
|
</dict>
|
|
592
|
-
<key>Resources/resources/web/assets/mp4-worker-
|
|
592
|
+
<key>Resources/resources/web/assets/mp4-worker-Dc_1QUwS.js</key>
|
|
593
593
|
<dict>
|
|
594
594
|
<key>hash2</key>
|
|
595
595
|
<data>
|
|
596
|
-
|
|
596
|
+
VaH6cQJD5lKhlsXhS1dVQylTIaiWiRK8K2VSicyCuzg=
|
|
597
597
|
</data>
|
|
598
598
|
</dict>
|
|
599
|
-
<key>Resources/resources/web/assets/publishing-
|
|
599
|
+
<key>Resources/resources/web/assets/publishing-CkVIjq_f.js</key>
|
|
600
600
|
<dict>
|
|
601
601
|
<key>hash2</key>
|
|
602
602
|
<data>
|
|
603
|
-
|
|
603
|
+
d3+2a7f5Zc0UqmJPT7SeUCNoeiqsDg/YCnSg7CnFtow=
|
|
604
604
|
</data>
|
|
605
605
|
</dict>
|
|
606
606
|
<key>Resources/resources/web/assets/publishing-VJhUmdPH.css</key>
|
|
@@ -610,18 +610,18 @@
|
|
|
610
610
|
qp+02zzJ3eDSRmM1QFKIs/gPNJJ1VudOM7MVpmEOywY=
|
|
611
611
|
</data>
|
|
612
612
|
</dict>
|
|
613
|
-
<key>Resources/resources/web/assets/scene-
|
|
613
|
+
<key>Resources/resources/web/assets/scene-BXs8B_Kk.js</key>
|
|
614
614
|
<dict>
|
|
615
615
|
<key>hash2</key>
|
|
616
616
|
<data>
|
|
617
|
-
|
|
617
|
+
wupaNIsZ3ENfR6muy+XKsB8RjtLgCfsXqdibGdV3/yQ=
|
|
618
618
|
</data>
|
|
619
619
|
</dict>
|
|
620
|
-
<key>Resources/resources/web/assets/share-
|
|
620
|
+
<key>Resources/resources/web/assets/share-jfOenMTA.js</key>
|
|
621
621
|
<dict>
|
|
622
622
|
<key>hash2</key>
|
|
623
623
|
<data>
|
|
624
|
-
|
|
624
|
+
YhJZvV3OCey4ixKjg/ZkSqlDO1TEh6ud/IoTv8wcj/4=
|
|
625
625
|
</data>
|
|
626
626
|
</dict>
|
|
627
627
|
<key>Resources/resources/web/assets/three-D_1Qt16u.js</key>
|
|
@@ -691,7 +691,7 @@
|
|
|
691
691
|
<dict>
|
|
692
692
|
<key>hash2</key>
|
|
693
693
|
<data>
|
|
694
|
-
|
|
694
|
+
UhiED2Ex/SM5AFK/YizjNSk/t9H2tVUQf1aLcAiFTdM=
|
|
695
695
|
</data>
|
|
696
696
|
</dict>
|
|
697
697
|
<key>Resources/resources/web/sources/LICENSE-APACHE-2.0.txt</key>
|
package/payload/SessionGraph.app/Contents/Resources/resources/web/assets/gif-worker-CghHEBpp.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";var N={trailer:59};function H(t=256){let r=0,c=new Uint8Array(t);return{get buffer(){return c.buffer},reset(){r=0},bytesView(){return c.subarray(0,r)},bytes(){return c.slice(0,r)},writeByte(a){n(r+1),c[r]=a,r++},writeBytes(a,i=0,f=a.length){n(r+f);for(let l=0;l<f;l++)c[r++]=a[l+i]},writeBytesView(a,i=0,f=a.byteLength){n(r+f),c.set(a.subarray(i,i+f),r),r+=f}};function n(a){var i=c.length;if(i>=a)return;var f=1024*1024;a=Math.max(a,i*(i<f?2:1.125)>>>0),i!=0&&(a=Math.max(a,256));let l=c;c=new Uint8Array(a),r>0&&c.set(l.subarray(0,r),0)}}var C=12,T=5003,Q=[0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535];function X(t,r,c,n,a=H(512),i=new Uint8Array(256),f=new Int32Array(T),l=new Int32Array(T)){let w=f.length,y=Math.max(2,n);i.fill(0),l.fill(0),f.fill(-1);let o=0,e=0,h=y+1,p=h,u=!1,d=p,s=(1<<d)-1,B=1<<h-1,v=B+1,M=B+2,b=0,A=c[0],G=0;for(let g=w;g<65536;g*=2)++G;G=8-G,a.writeByte(y),k(B);let m=c.length;for(let g=1;g<m;g++)t:{let U=c[g],F=(U<<C)+A,x=U<<G^A;if(f[x]===F){A=l[x];break t}let _=x===0?1:w-x;for(;f[x]>=0;)if(x-=_,x<0&&(x+=w),f[x]===F){A=l[x];break t}k(A),A=U,M<1<<C?(l[x]=M++,f[x]=F):(f.fill(-1),M=B+2,u=!0,k(B))}return k(A),k(v),a.writeByte(0),a.bytesView();function k(g){for(o&=Q[e],e>0?o|=g<<e:o=g,e+=d;e>=8;)i[b++]=o&255,b>=254&&(a.writeByte(b),a.writeBytesView(i,0,b),b=0),o>>=8,e-=8;if((M>s||u)&&(u?(d=p,s=(1<<d)-1,u=!1):(++d,s=d===C?1<<d:(1<<d)-1)),g==v){for(;e>0;)i[b++]=o&255,b>=254&&(a.writeByte(b),a.writeBytesView(i,0,b),b=0),o>>=8,e-=8;b>0&&(a.writeByte(b),a.writeBytesView(i,0,b),b=0)}}}var Z=X;function $(t,r,c){return t<<8&63488|r<<2&992|c>>3}function W(t,r,c,n){return t>>4|r&240|(c&240)<<4|(n&240)<<8}function tt(t,r,c){return t>>4<<8|r&240|c>>4}function q(t,r,c){return t<r?r:t>c?c:t}function z(t){return t*t}function j(t,r,c){var n=0,a=1e100;let i=t[r],f=i.cnt;i.ac;let l=i.rc,w=i.gc,y=i.bc;for(var o=i.fw;o!=0;o=t[o].fw){let h=t[o],p=h.cnt,u=f*p/(f+p);if(!(u>=a)){var e=0;e+=u*z(h.rc-l),!(e>=a)&&(e+=u*z(h.gc-w),!(e>=a)&&(e+=u*z(h.bc-y),!(e>=a)&&(a=e,n=o)))}}i.err=a,i.nn=n}function R(){return{ac:0,rc:0,gc:0,bc:0,cnt:0,nn:0,fw:0,bk:0,tm:0,mtm:0,err:0}}function et(t,r){let c=r==="rgb444"?4096:65536,n=new Array(c),a=t.length;if(r==="rgba4444")for(let i=0;i<a;++i){let f=t[i],l=f>>24&255,w=f>>16&255,y=f>>8&255,o=f&255,e=W(o,y,w,l),h=e in n?n[e]:n[e]=R();h.rc+=o,h.gc+=y,h.bc+=w,h.ac+=l,h.cnt++}else if(r==="rgb444")for(let i=0;i<a;++i){let f=t[i],l=f>>16&255,w=f>>8&255,y=f&255,o=tt(y,w,l),e=o in n?n[o]:n[o]=R();e.rc+=y,e.gc+=w,e.bc+=l,e.cnt++}else for(let i=0;i<a;++i){let f=t[i],l=f>>16&255,w=f>>8&255,y=f&255,o=$(y,w,l),e=o in n?n[o]:n[o]=R();e.rc+=y,e.gc+=w,e.bc+=l,e.cnt++}return n}function rt(t,r,c={}){let{format:n="rgb565",clearAlpha:a=!0,clearAlphaColor:i=0,clearAlphaThreshold:f=0,oneBitAlpha:l=!1}=c;if(!t||!t.buffer)throw new Error("quantize() expected RGBA Uint8Array data");if(!(t instanceof Uint8Array)&&!(t instanceof Uint8ClampedArray))throw new Error("quantize() expected RGBA Uint8Array data");let w=new Uint32Array(t.buffer),y=c.useSqrt!==!1,o=n==="rgba4444",e=et(w,n),h=e.length,p=h-1,u=new Uint32Array(h+1);for(var d=0,s=0;s<h;++s){let E=e[s];if(E!=null){var B=1/E.cnt;o&&(E.ac*=B),E.rc*=B,E.gc*=B,E.bc*=B,e[d++]=E}}z(r)/d<.022&&(y=!1);for(var s=0;s<d-1;++s)e[s].fw=s+1,e[s+1].bk=s,y&&(e[s].cnt=Math.sqrt(e[s].cnt));y&&(e[s].cnt=Math.sqrt(e[s].cnt));var v,M,b;for(s=0;s<d;++s){j(e,s);var A=e[s].err;for(M=++u[0];M>1&&(b=M>>1,!(e[v=u[b]].err<=A));M=b)u[M]=v;u[M]=s}var G=d-r;for(s=0;s<G;){for(var m;;){var k=u[1];if(m=e[k],m.tm>=m.mtm&&e[m.nn].mtm<=m.tm)break;m.mtm==p?k=u[1]=u[u[0]--]:(j(e,k),m.tm=s);var A=e[k].err;for(M=1;(b=M+M)<=u[0]&&(b<u[0]&&e[u[b]].err>e[u[b+1]].err&&b++,!(A<=e[v=u[b]].err));M=b)u[M]=v;u[M]=k}var g=e[m.nn],U=m.cnt,F=g.cnt,B=1/(U+F);o&&(m.ac=B*(U*m.ac+F*g.ac)),m.rc=B*(U*m.rc+F*g.rc),m.gc=B*(U*m.gc+F*g.gc),m.bc=B*(U*m.bc+F*g.bc),m.cnt+=g.cnt,m.mtm=++s,e[g.bk].fw=g.fw,e[g.fw].bk=g.bk,g.mtm=p}let x=[];var _=0;for(s=0;;++_){let E=q(Math.round(e[s].rc),0,255),P=q(Math.round(e[s].gc),0,255),D=q(Math.round(e[s].bc),0,255),I=255;o&&(I=q(Math.round(e[s].ac),0,255),l&&(I=I<=(typeof l=="number"?l:127)?0:255),a&&I<=f&&(E=P=D=i,I=0));let K=o?[E,P,D,I]:[E,P,D];if(nt(x,K)||x.push(K),(s=e[s].fw)==0)break}return x}function nt(t,r){for(let c=0;c<t.length;c++){let n=t[c],a=n[0]===r[0]&&n[1]===r[1]&&n[2]===r[2],i=n.length>=4&&r.length>=4?n[3]===r[3]:!0;if(a&&i)return!0}return!1}function at(t={}){let{initialCapacity:r=4096,auto:c=!0}=t,n=H(r),a=5003,i=new Uint8Array(256),f=new Int32Array(a),l=new Int32Array(a),w=!1;return{reset(){n.reset(),w=!1},finish(){n.writeByte(N.trailer)},bytes(){return n.bytes()},bytesView(){return n.bytesView()},get buffer(){return n.buffer},get stream(){return n},writeHeader:y,writeFrame(o,e,h,p={}){let{transparent:u=!1,transparentIndex:d=0,delay:s=0,palette:B=null,repeat:v=0,colorDepth:M=8,dispose:b=-1}=p,A=!1;if(c?w||(A=!0,y(),w=!0):A=!!p.first,e=Math.max(0,Math.floor(e)),h=Math.max(0,Math.floor(h)),A){if(!B)throw new Error("First frame must include a { palette } option");ft(n,e,h,B,M),L(n,B),v>=0&&ct(n,v)}let G=Math.round(s/10);it(n,b,G,u,d);let m=!!B&&!A;lt(n,e,h,m?B:null),m&&L(n,B),ot(n,o,e,h,M,i,f,l)}};function y(){O(n,"GIF89a")}}function it(t,r,c,n,a){t.writeByte(33),t.writeByte(249),t.writeByte(4),a<0&&(a=0,n=!1);var i,f;n?(i=1,f=2):(i=0,f=0),r>=0&&(f=r&7),f<<=2,t.writeByte(0|f|0|i),V(t,c),t.writeByte(a||0),t.writeByte(0)}function ft(t,r,c,n,a=8){let i=1,f=0,l=S(n.length)-1,w=i<<7|a-1<<4|f<<3|l;V(t,r),V(t,c),t.writeBytes([w,0,0])}function ct(t,r){t.writeByte(33),t.writeByte(255),t.writeByte(11),O(t,"NETSCAPE2.0"),t.writeByte(3),t.writeByte(1),V(t,r),t.writeByte(0)}function L(t,r){let c=1<<S(r.length);for(let n=0;n<c;n++){let a=[0,0,0];n<r.length&&(a=r[n]),t.writeByte(a[0]),t.writeByte(a[1]),t.writeByte(a[2])}}function lt(t,r,c,n){if(t.writeByte(44),V(t,0),V(t,0),V(t,r),V(t,c),n){let a=0,i=0,f=S(n.length)-1;t.writeByte(128|a|i|0|f)}else t.writeByte(0)}function ot(t,r,c,n,a=8,i,f,l){Z(c,n,r,a,t,i,f,l)}function V(t,r){t.writeByte(r&255),t.writeByte(r>>8&255)}function O(t,r){for(var c=0;c<r.length;c++)t.writeByte(r.charCodeAt(c))}function S(t){return Math.max(Math.ceil(Math.log2(t)),1)}var st=Object.freeze({__proto__:null,GIFEncoder:at,quantize:rt});const Y=30,ut=t=>(Math.round((t+1)*100/Y)-Math.round(t*100/Y))*10,{GIFEncoder:wt,quantize:ht}=st,yt=[0,8,2,10,12,4,14,6,3,11,1,9,15,7,13,5];function bt(t,r,c){const n=new Uint8Array(t.length/4),a=new Map,i=(f,l,w)=>{const y=f|l<<8|w<<16,o=a.get(y);if(o!==void 0)return o;let e=0,h=1/0;for(let p=0;p<r.length;p++){const u=r[p],d=f-u[0],s=l-u[1],B=w-u[2],v=d*d+s*s+B*B;if(v<h&&(e=p,h=v,!v))break}return a.set(y,e),e};for(let f=0,l=0;f<n.length;f++,l+=4){const w=t[l],y=t[l+1],o=t[l+2];let e=i(w,y,o);const h=r[e],p=(w-h[0])**2+(y-h[1])**2+(o-h[2])**2;if(Math.max(w,y,o)<128&&p>2){const u=(yt[((f/c|0)&3)*4+(f%c&3)]-7.5)/7.5*Math.min(3,Math.sqrt(p/3));e=i(Math.max(0,Math.min(255,Math.round(w+u))),Math.max(0,Math.min(255,Math.round(y+u))),Math.max(0,Math.min(255,Math.round(o+u))))}n[f]=e}return n}function Bt(){const t=wt();let r=0;return{add(c,n,a){if(c.length!==n*a*4)throw new Error("Incomplete GIF frame.");const i=ht(c,256,{format:"rgb565"});t.writeFrame(bt(c,i,n),n,a,{palette:i,delay:ut(r++),repeat:0,dispose:1})},finish(){return t.finish(),t.bytes()}}}const J=Bt();self.onmessage=t=>{try{if(t.data.finish){const r=J.finish();self.postMessage({bytes:r.buffer},{transfer:[r.buffer]})}else J.add(new Uint8Array(t.data.rgba),t.data.width,t.data.height),self.postMessage({ready:!0})}catch{self.postMessage({error:"GIF encoding failed. Please try again."})}}})();
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{y as a,R as i,C as o}from"./index-BtLEIWKh.js";class l extends i{constructor(e){super(e.rid),this.available=!0,this.currentVersion=e.currentVersion,this.version=e.version,this.date=e.date,this.body=e.body,this.rawJson=e.rawJson}async download(e,n){const d=new o;e&&(d.onmessage=e);const r=await a("plugin:updater|download",{onEvent:d,rid:this.rid,...n,headers:t(n?.headers)});await this.downloadedBytes?.close().catch(()=>{}),this.downloadedBytes=new i(r)}async install(e){if(!this.downloadedBytes)throw new Error("Update.install called before Update.download");await a("plugin:updater|install",{updateRid:this.rid,bytesRid:this.downloadedBytes.rid,...e}),this.downloadedBytes=void 0}async downloadAndInstall(e,n){const d=new o;e&&(d.onmessage=e),await a("plugin:updater|download_and_install",{onEvent:d,rid:this.rid,...n,headers:t(n?.headers)})}async close(){await this.downloadedBytes?.close(),await super.close()}}async function w(s){const e=await a("plugin:updater|check",{...s,headers:t(s?.headers)});return e?new l(e):null}function t(s){return s?Array.from(new Headers(s).entries()):void 0}export{l as Update,w as check};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2) format("woff2-variations");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2) format("woff2-variations");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2) format("woff2-variations");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2) format("woff2-variations");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Geist Variable;font-style:normal;font-display:swap;font-weight:100 900;src:url(/assets/geist-latin-wght-normal-BgDaEnEv.woff2) format("woff2-variations");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff) format("woff");unicode-range:U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2) format("woff2"),url(/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff) format("woff");unicode-range:U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2) format("woff2"),url(/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff) format("woff");unicode-range:U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff) format("woff");unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Mono;font-style:normal;font-display:swap;font-weight:400;src:url(/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2) format("woff2"),url(/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff) format("woff");unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}:root{font-family:Geist Variable,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;color:#dbe7e3;background:#080e13;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;color-scheme:dark;--line: #c9e3db14;--muted: #82978f;--mint: #b0e9d6;--mono: "IBM Plex Mono", "SFMono-Regular", Consolas, monospace;--control-bg: #122321;--control-border: #b0e9d626;--control-hover: #b0e9d610;--control-radius: 8px;--popover-bg: #0e1c20}*{box-sizing:border-box}html,body,#app{width:100%;height:100%;margin:0;overflow:hidden}#app{height:100dvh;isolation:isolate}button,input,select{font:inherit}button,a,input,select,summary{-webkit-tap-highlight-color:transparent}button{cursor:pointer;color:inherit;border:0;background:none;transition:background .18s,color .18s,border-color .18s}button:disabled{cursor:default;opacity:.45}a{color:inherit;text-decoration:none}button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible,summary:focus-visible{outline:2px solid #b0e9d6aa;outline-offset:3px}svg{width:16px;height:16px;flex-shrink:0}[hidden]{display:none!important}::selection{background:#b0e9d632;color:#f0fff8}::-webkit-scrollbar{width:4px;height:4px}::-webkit-scrollbar-thumb{background:#3a5149;border-radius:4px}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;border:0}.muted{color:var(--muted)}.map,#scene{position:absolute;inset:0}#scene canvas{display:block;width:100%;height:100%;touch-action:none}.canvas-vignette{position:absolute;inset:0;pointer-events:none;box-shadow:inset 0 0 150px 20px #04090d55}.glass{background:color-mix(in srgb,#0c161b var(--panel-opacity, 90%),transparent);border:1px solid #d6eee119;box-shadow:0 12px 48px #0003,inset 0 1px #ffffff04;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px)}.app-header,.map-controls{position:fixed;top:24px;display:flex;align-items:center;gap:5px;height:48px;border-radius:14px;padding:5px 7px;z-index:40}.app-header{left:24px;padding-left:13px;gap:10px}.brand{display:flex;align-items:center;gap:8px}.brand img{width:24px;height:24px}.brand>span{font-size:21px;font-weight:600;letter-spacing:-1px;line-height:1;white-space:nowrap}.brand-dot{color:var(--mint)}.connection{display:flex;align-items:center}.status-dot{width:5px;height:5px;border-radius:50%;background:#d6b578}.connected .status-dot{background:#a9d9c5;box-shadow:0 0 8px #b0e9d630}.toolbar-divider{width:1px;height:18px;background:var(--line);margin:0 3px}.toolbar-button{display:flex;align-items:center;gap:7px;padding:9px 10px;border-radius:8px;font-size:12px;color:#9eafa9}.toolbar-button:hover,.icon-button:hover{background:#c2e9d90c;color:#e9fff4}.toolbar-button[aria-expanded=true],.map-controls .icon-button[aria-expanded=true]{background:#b0e9d60c;color:var(--mint)}.icon-button{width:34px;height:34px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border-radius:8px;color:#8ba198}.map-controls{right:24px}.view-switch{display:flex;gap:2px}.view-switch button{min-width:37px;padding:9px 8px;border-radius:8px;font-size:12px;color:#7d9489}.view-switch .active{color:#d4f6e7;background:#b0e9d614}.floating-panel{position:fixed;z-index:10;border-radius:16px;animation:panel-in .2s ease-out}.floating-panel.front{z-index:20}.panel-heading{display:flex;align-items:center;padding:10px 10px 8px 16px;gap:3px;flex-shrink:0}.panel-handle{display:flex;align-items:center;gap:8px;flex:1;min-width:0;padding:8px 0;text-align:left;cursor:grab;touch-action:none;-webkit-user-select:none;user-select:none;font-size:13px;font-weight:480;color:#bdcec6}.panel-handle>svg{width:13px;height:13px;color:#597368}.panel-handle:hover>svg{color:#b0e9d6}.dragging{-webkit-user-select:none;user-select:none;box-shadow:0 20px 80px #0006}.dragging .panel-handle{cursor:grabbing}.small-badge{font:10px var(--mono);font-weight:400;color:#879f93;margin-left:2px}.sidebar{top:86px;left:24px;width:330px;height:min(580px,calc(100dvh - 230px));max-height:calc(100dvh - 100px);display:flex;flex-direction:column;overflow:hidden}.search-box{display:flex;align-items:center;gap:9px;margin:3px 16px 0;padding:10px 11px;background:#d5f6e703;border:1px solid #d1e9dc16;border-radius:9px;color:#7c9588}.search-box:focus-within{border-color:#b0e9d650}.search-box svg{width:14px;height:14px}.search-trigger{text-align:left;font-size:12px}.search-trigger span{flex:1}.search-trigger:hover{border-color:#b0e9d644;color:#d1ecdf}.search-box input{width:100%;min-width:0;background:none;border:0;outline:none;color:#e3ece9;font-size:12px}.search-box input::placeholder{color:#7f948a}kbd{border:1px solid #c4e1d71c;border-radius:4px;padding:2px 5px;font:11px var(--mono);color:#8fa69a}.filters{padding:16px;border-bottom:1px solid var(--line)}.filter-row{display:flex;align-items:center;gap:8px;margin-bottom:8px}.select-wrap{display:flex;align-items:center;position:relative;min-width:0;margin-bottom:8px;color:#8ea99b}.filter-row>.select-wrap{flex:1;margin-bottom:0}.select-wrap>svg,.select-wrap>#source-filter-icon{pointer-events:none;position:absolute;left:9px;width:14px;height:14px}.select-wrap>svg:last-child{left:auto;right:9px;width:12px}.select-wrap select{appearance:none;width:100%;min-width:0;height:34px;padding:7px 29px 7px 32px;background:transparent;color:#bdcfc6;border:1px solid transparent;border-radius:8px;font-size:12px;cursor:pointer;text-overflow:ellipsis}.select-wrap:hover select{background:#b0e9d606}.select-wrap select:focus-visible{outline:2px solid #b0e9d680;outline-offset:0;background:#b0e9d609}#source-filter-icon .source-icon{width:14px;height:14px;flex-basis:14px}select option{background:#14211e;color:#e1e8ea}.filter-toggles{display:flex;gap:18px;margin-top:16px}.filter-toggles label{display:flex;align-items:center;gap:6px;font-size:11px;color:#91a99b;cursor:pointer}.filter-toggles input{width:12px;height:12px;margin:0;accent-color:#a0c9ba}.session-list{padding:0 8px 10px;flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain}.list-date{display:flex;gap:7px;padding:17px 12px 8px;font-size:11px;color:#8ca196}.list-date span{color:#647e70}.session-card{width:100%;display:flex;text-align:left;gap:10px;padding:11px 12px;border:1px solid transparent;border-radius:9px;margin-bottom:2px}.session-card:hover{background:#dbf5e805}.session-card.selected{background:#b0e9d60b;border-color:#b0e9d61a}.session-dot{width:5px;height:5px;margin-top:6px;flex-shrink:0;border-radius:50%;background:var(--node-color, #b0e9d6);box-shadow:0 0 7px color-mix(in srgb,var(--node-color, #b0e9d6) 25%,transparent)}.session-card-body{flex:1;min-width:0}.session-title{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12px;font-weight:420;line-height:1.55;color:#bccfc5}.selected .session-title{color:#e1f2eb}.session-meta{display:flex;align-items:center;gap:5px;margin-top:6px;font-size:10px;color:#748e7f}.session-meta svg{width:11px;height:11px}.session-meta span:first-of-type{max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-meta span:last-child{margin-left:auto;white-space:nowrap}.timeline-dock{bottom:24px;left:50%;transform:translate(-50%);width:min(620px,calc(100% - 48px))}.timeline-panel{padding:9px 14px 18px;border-radius:16px}.timeline-top{display:flex;align-items:center;gap:4px;margin-bottom:14px}.timeline-top .panel-handle{font-size:12px;font-weight:400;white-space:nowrap}.range-buttons{display:flex;gap:2px;margin-left:8px}.range-buttons button{font-size:11px;color:#859d8e;border-radius:6px;padding:6px 8px}.range-buttons button:hover{color:var(--mint)}.range-buttons button.active{color:var(--mint);background:#b0e9d613}.timeline-track{display:flex;align-items:center;gap:15px}.play-button{width:32px;height:32px;flex-shrink:0;display:flex;align-items:center;justify-content:center;border:1px solid #b0e9d62b;border-radius:50%;color:var(--mint);background:#b0e9d604}.play-button:hover{background:#b0e9d613}.play-button svg{width:13px;height:13px}.histogram-wrap{flex:1;position:relative;height:30px;border-bottom:1px solid #b0e9d620}.histogram{display:flex;align-items:flex-end;height:100%;gap:3px;-webkit-mask-image:linear-gradient(to right,black var(--progress, 100%),#ffffff30 var(--progress, 100%));mask-image:linear-gradient(to right,black var(--progress, 100%),#ffffff30 var(--progress, 100%))}.histogram span{flex:1;min-width:0;background:linear-gradient(#a6d5c7ba,#61887d35);border-radius:2px 2px 0 0}#scrubber{appearance:none;position:absolute;inset:-6px -7px;margin:0;width:calc(100% + 14px);height:calc(100% + 12px);background:transparent;cursor:ew-resize}#scrubber::-webkit-slider-thumb{appearance:none;width:12px;height:40px;opacity:0}#scrubber::-moz-range-thumb{width:12px;height:40px;opacity:0}.timeline-cursor{pointer-events:none;position:absolute;top:-3px;bottom:-2px;width:1px;background:#d3eee0;box-shadow:0 0 8px #b0e9d640}.timeline-cursor:before{content:"";position:absolute;top:-2px;left:-2px;width:5px;height:5px;background:var(--mint);border-radius:50%}.playback-date{width:43px;text-align:right;white-space:nowrap;font-size:11px;color:#9ab1a3}.playback-period{display:none;text-align:center;color:#a0baae;font:11px var(--mono);letter-spacing:.06em;font-variant-numeric:tabular-nums}.playback-summary{display:flex;flex-wrap:wrap;align-items:baseline;justify-content:center;gap:12px 28px;margin:16px 0 0;color:#829e91;font-size:11px}.playback-summary strong{color:#e3f3eb;font-size:26px;font-weight:450;letter-spacing:-.8px;font-variant-numeric:tabular-nums;margin-right:9px}.playback-summary small{flex-basis:100%;text-align:center;font:9px var(--mono)}.playback-share{display:flex;justify-content:center;margin-bottom:12px;visibility:hidden;opacity:0;pointer-events:none;transition:opacity .18s ease}.playback-share.ready{visibility:visible;opacity:1;pointer-events:auto}.playback-share button{flex:0 0 auto;min-height:44px;padding:12px 22px;gap:10px;border-radius:10px;font-size:13px;font-weight:550}.playback-share button:hover:not(:disabled){background:#cbf7e7}.playback-share svg{width:17px;height:17px}#app.playback-mode .app-header,#app.playback-mode .map-controls,#app.playback-mode .shortcut-hints,#app.playback-mode .desktop-update,#app.playback-mode .node-tooltip{display:none}#app.playback-mode .timeline-dock{bottom:max(24px,env(safe-area-inset-bottom));top:auto!important;left:50%!important;transform:translate(-50%)!important;width:min(580px,calc(100% - 40px))}#app.playback-mode .timeline-panel{background:none;border:0;box-shadow:none;backdrop-filter:none;-webkit-backdrop-filter:none;padding:0}#app.playback-mode .timeline-top,#app.playback-mode .playback-date,#app.playback-mode .playback-summary small{display:none}#app.playback-mode .play-button{background:none;border:0;box-shadow:none}#app.playback-mode .playback-period{display:block;margin-top:14px}#app.playback-mode .playback-summary{display:flex;justify-content:center;text-align:center;gap:20px clamp(28px,6vw,64px);margin:14px 0 0}#app.playback-mode .playback-summary>span{display:flex;flex-direction:column;gap:4px}#app.playback-mode .playback-summary strong{font-size:clamp(36px,6vw,48px);line-height:1;margin:0;letter-spacing:-1.8px}#app.playback-mode .timeline-cursor{box-shadow:none}.share-dialog{width:min(900px,calc(100% - 32px));max-width:none}.share-dialog h2{margin-bottom:8px}.share-dialog>p{margin:0 0 20px}.share-formats{display:flex;gap:4px;width:fit-content;margin-bottom:18px;padding:4px;border:1px solid var(--control-border);border-radius:10px;background:#070f1380}.share-formats button{min-width:100px;min-height:38px;padding:9px 18px;border-radius:7px;color:#8ea99b;font-size:12px}.share-formats button:hover{color:#e1f2eb;background:var(--control-hover)}.share-formats button[aria-pressed=true]{background:#b0e9d6;color:#182e29;font-weight:550}.share-preview{aspect-ratio:8 / 5;display:grid;place-items:center;background:#030609;border-radius:9px;overflow:hidden}.share-preview img,.share-preview video{display:block;width:100%;height:auto}.share-progress{display:grid;gap:18px;justify-items:center;color:#a0bfaf;font-size:12px}.share-progress progress{width:min(260px,50vw);height:4px;accent-color:var(--mint)}.share-actions{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:10px;margin-top:20px}.share-actions .share-close{margin-right:auto}.share-actions .primary-button,.share-actions .secondary-button{flex:0 0 auto}.share-x{text-decoration:none}.share-dialog .share-notice{margin:14px 0 0}.share-tray{margin-top:16px;padding:16px;border:1px solid var(--line);border-radius:10px}.share-tray p{margin:0 0 12px}.share-tray>div{display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.share-caption{width:100%;resize:none;padding:10px;border:1px solid var(--line);border-radius:6px;background:#070f1380;color:#b8d2c5;font:11px/1.7 Geist Variable,sans-serif}.custom-dates{position:relative}summary{cursor:pointer;list-style:none}summary::-webkit-details-marker{display:none}.date-positioner,.ui-select-positioner{margin:0;padding:0;border:0;background:transparent;color:inherit;overflow:visible;z-index:150}.date-popover{width:min(344px,calc(100vw - 24px));max-height:min(570px,calc(100dvh - 24px));overflow:auto;padding:18px;border:1px solid var(--control-border);border-radius:16px;background:var(--popover-bg);box-shadow:0 20px 70px #0008,inset 0 1px #ffffff05}.date-heading{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}.date-heading .eyebrow{font:8px var(--mono);letter-spacing:.14em;color:#789e8d}.date-heading h2{margin:5px 0 0;font-size:18px;font-weight:500;letter-spacing:-.5px}.date-close{font-size:23px}.date-fields{display:flex;align-items:center;gap:10px}.date-fields>span{padding-top:16px;color:#5f8072}.date-fields label{flex:1;min-width:0;color:#8aa79a;font-size:10px}.date-fields input{display:block;width:100%;margin-top:6px;padding:10px;border:1px solid var(--control-border);border-radius:var(--control-radius);background:#070f1380;color:#d4e8df;font:11px var(--mono)}.date-fields input:focus{border-color:#b0e9d670}.date-fields input[aria-invalid=true]{border-color:#eab894}.date-presets{display:flex;gap:6px;margin:12px 0 16px}.date-presets button{flex:1;padding:7px 4px;border:1px solid var(--control-border);border-radius:6px;color:#9ebcae;font-size:10px}.date-presets button:hover{background:var(--control-hover);color:var(--mint)}.date-calendar{padding-top:10px;border-top:1px solid var(--line)}.date-navigation{display:flex;align-items:center;gap:8px;margin-bottom:9px}.date-view{flex:1;padding:8px;border-radius:var(--control-radius);font-size:13px;font-weight:500}.date-view:hover{background:var(--control-hover)}.date-calendar table{width:100%;table-layout:fixed;border-spacing:0 3px;font-size:12px}.date-calendar th{padding-bottom:10px;color:#729183;font-size:10px;font-weight:400}.date-calendar td{padding:0;text-align:center}.date-calendar td button{width:100%;height:34px;border-radius:7px;font-size:11px;color:#c6dacf;position:relative}.date-calendar td button:hover{background:#b0e9d61c}.date-calendar td button[data-outside-range]{color:#50675e}.date-calendar td button[data-in-range],.date-calendar td button[data-in-hover-range]{background:#b0e9d610;border-radius:0;color:#c8e7d9}.date-calendar td button[data-range-start],.date-calendar td button[data-range-end]{border-radius:7px;color:#10251e;background:var(--mint);font-weight:600}.date-calendar td button[data-today]:after{content:"";position:absolute;width:3px;height:3px;bottom:4px;left:calc(50% - 1.5px);border-radius:50%;background:currentColor}.date-calendar td button:focus-visible{outline-offset:-2px;z-index:1}.date-calendar table:not([data-calendar-view=day]) td{padding:3px}.date-calendar table:not([data-calendar-view=day]) button{height:47px}.date-footer{display:flex;align-items:center;gap:12px;border-top:1px solid var(--line);margin-top:12px;padding-top:14px}.date-status{flex:1;color:#7f9d8f;font-size:10px;line-height:1.6}.date-footer .primary-button{flex:0 0 auto;font-size:11px}.ui-select{display:inline-flex;min-width:0;position:relative}.ui-select-trigger{display:inline-flex;align-items:center;justify-content:space-between;gap:10px;width:100%;min-width:0;min-height:34px;padding:8px 10px;border:1px solid var(--control-border);border-radius:var(--control-radius);background:var(--control-bg);color:#c7dfd2;font-size:12px;text-align:left}.ui-select-trigger>span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ui-select-trigger>svg{width:12px;height:12px;color:#7f9d90}.ui-select-trigger:hover,.ui-select-trigger[data-state=open]{background:var(--control-hover);border-color:#b0e9d645}.ui-select-menu{min-width:max(150px,var(--reference-width));max-width:min(400px,calc(100vw - 24px));max-height:min(300px,var(--available-height, 300px));overflow:auto;padding:5px;border:1px solid var(--control-border);border-radius:10px;background:var(--popover-bg);box-shadow:0 12px 40px #0007;outline:none}.ui-select-option{position:relative;padding:9px 30px 9px 10px;border-radius:6px;color:#a8c3b5;font-size:12px;line-height:1.5;cursor:pointer;overflow-wrap:anywhere}.ui-select-option[data-highlighted]{color:#e0f4e9;background:var(--control-hover)}.ui-select-option[data-state=checked]{color:var(--mint)}.ui-select-option[data-state=checked]:after{content:"✓";position:absolute;right:10px}.ui-select-option[data-disabled]{opacity:.4;cursor:default}.select-wrap .ui-select{width:100%}.select-wrap>svg,.select-wrap>#source-filter-icon{z-index:1}.select-wrap>svg:last-child{display:none}.select-wrap .ui-select-trigger{padding-left:32px;background:transparent;border-color:transparent}.select-wrap .ui-select-trigger:hover,.select-wrap .ui-select-trigger[data-state=open]{background:#b0e9d609}.setting-row>.ui-select{min-width:120px;max-width:180px}.setting-row .ui-select-trigger{font-size:11px}.search-options .ui-select-trigger{background:transparent;border-color:transparent;padding-left:0;min-height:28px}.launch-destination .ui-select{max-width:77%}.inspector-stack{top:86px;right:24px;width:360px;max-height:calc(100dvh - 230px);display:flex;flex-direction:column;gap:12px;pointer-events:none}.inspector-stack>aside{pointer-events:auto;border-radius:16px}.inspector-stack.has-events{height:calc(100dvh - 110px);max-height:calc(100dvh - 110px)}.inspector{min-height:0;display:flex;flex-direction:column;overflow:hidden}.has-events .inspector{flex:0 1 220px;max-height:32%}.has-events .detail-title h2{font-size:17px}.detail-scroll{overflow-y:auto;min-height:0;overscroll-behavior:contain}.detail-title{padding:3px 20px 0}.detail-title h2{font-size:20px;line-height:1.4;letter-spacing:-.45px;font-weight:460;color:#e2ede9;margin:0 0 10px;overflow-wrap:anywhere}.detail-date{font-size:11px;color:#8ba699}.detail-actions{display:flex;align-items:center;gap:9px;padding:17px 20px}.secondary-button,.primary-button{display:flex;align-items:center;justify-content:center;gap:7px;padding:9px 12px;border:1px solid #b0e9d625;border-radius:8px;font-size:12px;color:#b8d9c7;background:#b0e9d606;flex:1}.secondary-button:hover{background:#b0e9d610}.secondary-button svg{width:14px;height:14px}.primary-button{flex:0;background:#b0e9d6;color:#182e29}.text-button{display:inline-flex;align-items:center;gap:7px;padding:8px;font-size:12px;color:#a6c9b6}.detail-section{border-top:1px solid var(--line);padding:17px 20px}.section-label{display:flex;align-items:center;gap:8px;margin-bottom:12px;font-size:12px;font-weight:450;color:#b3c8bc}.section-label>span{margin-left:auto;font:11px var(--mono);color:#8ca896}.file-list{list-style:none;margin:0;padding:0}.file-list li{display:flex;align-items:center;gap:9px;padding:9px 0;border-bottom:1px solid #d1f1df07}.file-list li>svg{width:14px;height:14px;color:#c2b08f}.file-list li>div{flex:1;min-width:0}.file-list strong{display:block;font:11px var(--mono);color:#c7dbcf;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-list li span{display:block;margin-top:4px;font-size:11px;color:#7d9988;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.file-list small{font:10px var(--mono);color:#89a994}.coverage-note{font-size:11px;line-height:1.7;color:#8ba597;margin:14px 0 0}.no-files p{font-size:12px;color:#8ca698;margin:0}.detail-loading{display:flex;align-items:center;gap:8px;font-size:12px;color:#97b6a4}.detail-loading svg{width:14px;height:14px}.load-more{display:flex;align-items:center;justify-content:center;gap:7px;width:100%;margin-top:14px;padding:10px;border:1px solid #b0e9d61c;border-radius:8px;font-size:11px;color:#a2cbb3}.load-more:hover{background:#b0e9d609}.load-more svg{width:13px;height:13px}.relation{display:flex;align-items:center;gap:10px;width:100%;padding:10px 0;text-align:left;border-bottom:1px solid #d1f1df07}.relation>svg{width:14px;height:14px;color:#b6a3d9}.relation>svg:last-child{width:12px;color:#7c9788;margin-left:auto}.relation>span{min-width:0}.relation small{display:block;font-size:11px;color:#8fa598;margin-bottom:4px}.relation strong{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12px;line-height:1.5;font-weight:400;color:#bdd1c7}.relation:hover strong{color:#e2f6e9}.more-details summary{display:flex;align-items:center;gap:8px;font-size:12px;color:#9ab4a3}.more-details summary>span{margin-left:auto;font:11px var(--mono)}.more-details summary svg{width:13px;height:13px;margin-left:auto}.more-details[open] summary{margin-bottom:14px;color:#c6e0ce}.more-details[open] summary svg{transform:rotate(180deg)}.metadata{margin:0;font-size:12px}.metadata>div{display:flex;justify-content:space-between;gap:15px;padding:7px 0}.metadata dt{color:#829e8d;flex-shrink:0}.metadata dd{margin:0;text-align:right;overflow-wrap:anywhere;font:11px var(--mono);color:#c1d7cc}.directory-card{margin-top:13px;padding:12px;border:1px solid var(--line);border-radius:8px}.directory-card>span{font-size:11px;color:#93b19e}.directory-card code,.location-entry code{display:block;margin-top:6px;font:11px/1.7 var(--mono);color:#8eaa9a;overflow-wrap:anywhere}.location-entry{margin-top:14px}.location-entry>span{font-size:11px;color:#afc9b8}.tools-list>div{display:flex;justify-content:space-between;gap:12px;padding:6px 0;font:11px var(--mono)}.tools-list span{overflow-wrap:anywhere;color:#91af9b}.tools-list strong{font-weight:400;color:#b4cebe}.scene-labels{position:absolute;inset:0;pointer-events:none;overflow:hidden}.scene-label{position:absolute;left:0;top:0;max-width:155px;padding:5px 8px;font:10px var(--mono);color:var(--label-color);opacity:0;filter:blur(3px);transition:opacity .45s ease,filter .45s ease;background:#080f1266;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.scene-label.visible{opacity:.55;filter:blur(0)}.selected-label{width:260px;max-width:calc(100% - 24px);padding:7px 10px;font-size:11px;background:#0d1c22ed;border:1px solid #b0e9d62b;border-radius:6px;box-shadow:0 3px 15px #0005;z-index:1}.selected-label.visible{opacity:1}.event-marker-icon{position:absolute;top:0;left:0;width:12px;height:12px;color:#d7e5df;opacity:0;pointer-events:none}.event-marker-icon.visible{opacity:.38}.event-marker-icon svg{display:block;width:12px;height:12px}.scene-labels[data-motion=false] .scene-label{transition:none}.node-tooltip{position:absolute;z-index:30;width:260px;padding:14px;background:#101e1cf2;border:1px solid #b0e9d62b;border-radius:10px;box-shadow:0 12px 32px #0006;pointer-events:none;-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px)}.node-tooltip strong{display:block;font-size:13px;font-weight:450;line-height:1.5;color:#e1efec;margin-bottom:7px}.node-tooltip>span{font-size:11px;color:#91af9d}.message-tooltip{width:min(390px,calc(100vw - 24px));border-color:color-mix(in srgb,var(--event-color) 35%,transparent)}.message-tooltip pre{margin:10px 0;white-space:pre-wrap;overflow-wrap:anywhere;font:12px/1.7 var(--mono);color:#d9e9e0;max-height:min(280px,38dvh);overflow:hidden}.message-tooltip>span{display:block;font-size:10px;line-height:1.6}.graph-message{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;flex-direction:column;background:#080e1333;padding:32px;text-align:center}.graph-message>svg{width:28px;height:28px;color:var(--mint)}.graph-message h3{font-size:18px;font-weight:450;margin:18px 0;color:#cde1d7}.graph-message p{max-width:350px;font-size:13px;line-height:1.8;color:#91b09f}.loading-orbit{position:relative;width:64px;height:64px}.loading-orbit span{position:absolute;inset:0;border:1px solid #b0e9d629;border-radius:50%;transform:rotateX(55deg) rotateY(20deg);animation:orbit 3s linear infinite}.loading-orbit span:nth-child(2){animation-delay:-.8s}.loading-orbit span:nth-child(3){animation-delay:-1.6s}.empty-list{padding:20px 12px;font-size:12px;line-height:1.8;color:#86a593}.list-loading{padding:22px 8px}.skeleton{height:48px;margin-bottom:20px;border-radius:8px;background:linear-gradient(100deg,#ffffff02,#ffffff05,#ffffff02);background-size:200%;animation:shimmer 2s infinite}.spinning>svg,svg.spinning{animation:spin 2s linear infinite}dialog{max-width:420px;width:calc(100% - 32px);max-height:calc(100dvh - 40px);background:#101d1cf7;color:#d1e2dc;border:1px solid #b0e9d62b;border-radius:18px;padding:28px;box-shadow:0 25px 100px #0009}dialog::backdrop{background:#02070c88;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.dialog-close{position:absolute;top:12px;right:12px}dialog h2{font-size:22px;font-weight:450;letter-spacing:-.5px;margin:0 0 18px}dialog p{font-size:12px;line-height:1.8;color:#92ad9e;margin:18px 0}.help-rows>div{display:flex;justify-content:space-between;align-items:center;padding:9px 0;font-size:12px;border-bottom:1px solid var(--line)}.graph-legend{display:flex;flex-wrap:wrap;gap:13px 18px;margin-top:22px;font-size:12px;color:#a5c2b0}.graph-legend>span{display:flex;align-items:center;gap:7px}.legend-node{width:5px;height:5px;border-radius:50%;background:var(--mint)}.legend-node.message{width:3px;height:3px;background:#dcfff0}.legend-file{width:5px;height:5px;background:#edc899;transform:rotate(45deg)}.legend-line{width:14px;height:1px}.legend-line.fork{background:#edbc8d}.legend-line.child{background:#bda6ef}.legend-line.lane{background:#849d95}.motion-button{width:100%}.motion-button[aria-pressed=false]{color:#728b7e;background:transparent}html[data-density=compact] .session-card{padding-block:6px}html[data-density=compact] .session-title{-webkit-line-clamp:1}html[data-density=compact] .list-date{padding-top:12px}html[data-motion=false] *,html[data-motion=false] *:before,html[data-motion=false] *:after{animation-duration:.01ms!important;transition-duration:.01ms!important}.event-panel{flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.event-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:8px 10px 2px 18px}.event-heading h2{margin:0;font-size:13px;font-weight:480;color:#bdcec6}.event-close{font-size:22px}.event-toolbar{display:flex;align-items:center;gap:12px;padding:12px 0;font-size:11px}.event-toolbar label{display:flex;align-items:center;gap:10px}.event-toolbar select{padding:8px;border:1px solid #b0e9d630;border-radius:6px;background:#142620;color:#d0e6da;max-width:180px}.event-count{color:#adc6b8;font:9px var(--mono);margin-left:8px}.event-scroll{flex:1;min-height:0;overflow:auto;overscroll-behavior:contain}.event-browser{margin:0 16px 16px;border-top:1px solid var(--line);padding-top:12px}.event-browser summary,.event-footer summary{cursor:pointer;font-size:11px;color:#9ab4a3}.event-browser>summary,.event-footer summary,.event-provenance>summary{display:flex;align-items:center;gap:8px}.event-browser>summary:after,.event-footer summary:after,.event-provenance>summary:after{content:"";width:6px;height:6px;flex-shrink:0;margin-left:auto;margin-right:3px;border-right:1px solid currentColor;border-bottom:1px solid currentColor;transform:translateY(-2px) rotate(45deg)}.event-browser[open]>summary:after,.event-footer details[open]>summary:after,.event-provenance[open]>summary:after{transform:translateY(2px) rotate(225deg)}.event-list{max-height:230px;overflow:auto;overscroll-behavior:contain}.event-row{display:block;width:100%;padding:10px;margin-bottom:5px;border:1px solid transparent;border-radius:9px;text-align:left}.event-row:hover{background:#b0e9d608}.event-row[aria-current=true]{background:#b0e9d610;border-color:#b0e9d635}.event-row-top{display:flex;align-items:center;justify-content:space-between;gap:5px;margin-bottom:8px}.event-row-top small{color:#7e9c8a;font:9px var(--mono)}.event-badge{font:10px var(--mono);color:var(--event-color);display:inline-flex;align-items:center;gap:7px}.event-badge:before{content:"";width:7px;height:7px;border-radius:50%;background:var(--event-color);flex-shrink:0}.event-row strong{display:block;font-size:12px;font-weight:480;color:#d2e4da;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.event-preview{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:11px;color:#8aa798;line-height:1.6;margin:6px 0;overflow-wrap:anywhere}.event-row time{font:9px var(--mono);color:#6f9380}.event-pagination{display:flex;justify-content:space-between;gap:10px;padding-top:10px;border-top:1px solid var(--line)}.event-pagination button{font-size:10px}.event-content{padding:16px;min-width:0}.event-detail-nav{display:flex;align-items:center;gap:8px;padding:8px 16px 12px;border-bottom:1px solid var(--line)}.event-detail-nav>span{font:9px var(--mono);color:#92ad9e;text-align:center}.event-detail-nav button{font-size:11px;padding:7px 9px}.event-detail-heading h3{font-size:18px;font-weight:450;letter-spacing:-.4px;overflow-wrap:anywhere;margin:10px 0}.event-detail-heading p{color:#7f9f8c;font:10px var(--mono);line-height:1.6}.event-status{display:inline-block;margin-left:12px;color:#9ab7a6;font:9px var(--mono);border:1px solid #b0e9d629;padding:4px 7px;border-radius:4px}.event-status.failed{color:#eeaa9d;border-color:#eeaa9d40}.event-payload{margin-top:18px}.event-content h4{font:10px var(--mono);text-transform:uppercase;letter-spacing:.1em;color:#8aa997;margin:0 0 12px}.event-payload pre{margin:0;white-space:pre-wrap;overflow-wrap:anywhere;font:11px/1.8 var(--mono);color:#d4e6db;padding:12px;border:1px solid #b0e9d619;border-radius:9px;background:#050e123d;tab-size:2}.event-warning{padding:12px;background:#eac5940a;border:1px solid #eac59430;border-radius:7px;font-size:11px;color:#d6bc97}.event-correlations{margin-top:20px}.event-correlations p{font-size:11px;color:#91a999}.event-link{display:flex;align-items:center;gap:9px;padding:10px;width:100%;border:1px solid var(--line);border-radius:7px;margin-bottom:6px;text-align:left}.event-link>span:nth-child(2){flex:1;overflow-wrap:anywhere;font-size:12px}.event-link small{font:9px var(--mono);color:#8ca594}.event-provenance{margin-top:18px;font-size:11px;color:#7e9d8b}.event-provenance summary{cursor:pointer;padding-block:10px}.event-provenance dl{display:grid;grid-template-columns:90px minmax(0,1fr);gap:10px}.event-provenance dd{margin:0;overflow-wrap:anywhere;font-family:var(--mono);font-size:10px}.event-footer{display:flex;align-items:center;gap:12px;padding:8px 16px;border-top:1px solid var(--line);background:#081216}.event-footer>.event-coverage{flex:1}.event-coverage{font-size:10px;line-height:1.6;color:#7d9c8b;max-height:70px;overflow:auto}.event-reload{font-size:11px;white-space:nowrap}.event-empty{padding:24px 12px;color:#90aa9c;font-size:12px;line-height:1.7}.event-panel button:disabled{opacity:.4;cursor:default}.event-panel[aria-busy=true] .event-scroll{opacity:.65}.event-key{display:flex;flex-wrap:wrap;gap:12px;margin:14px 0}.event-key span{font:9px var(--mono)}.event-key i{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:5px;background:var(--event-color)}.explore-events{width:100%;justify-content:center;margin-top:10px}.history-coverage{margin-top:16px;padding-top:12px;border-top:1px solid var(--line)}.history-coverage>summary{min-height:24px;border-radius:4px}.settings-dialog{width:min(850px,calc(100% - 32px));max-width:none;height:min(710px,calc(100dvh - 48px));padding:0;overflow:hidden;background:#0c191e}.settings-dialog[open]{display:flex;flex-direction:column}.settings-heading{display:flex;align-items:flex-start;justify-content:space-between;padding:30px 30px 24px;border-bottom:1px solid var(--line);background:radial-gradient(ellipse at top left,#28534a44,transparent 70%)}.settings-heading h2{margin:0 0 4px;font-size:27px;letter-spacing:-.8px}.settings-heading p{margin:0;font-size:12px;color:#87a69a}.settings-close{font-size:25px;margin:-10px -12px 0 0}.settings-layout{display:grid;grid-template-columns:175px minmax(0,1fr);flex:1;min-height:0}.settings-tabs{padding:20px 12px;border-right:1px solid var(--line);background:#040b0e33}.settings-tabs button{display:flex;align-items:center;gap:10px;width:100%;padding:12px;margin-bottom:5px;text-align:left;font-size:12px;border-radius:8px;color:#8aa79a}.settings-tabs button>svg{width:16px;height:16px;color:#6b9582}.settings-tabs button[aria-selected=true]{color:#d5eee2;background:#b0e9d610}.settings-tabs button[aria-selected=true]>svg{color:#b0e9d6}.settings-tabs button:hover{background:#b0e9d609}.settings-content{min-width:0;overflow-y:auto;overscroll-behavior:contain;padding:26px 30px}.settings-content h3{font-size:18px;font-weight:450;margin:0 0 7px;letter-spacing:-.4px}.settings-description{margin:0 0 20px;font-size:12px}.settings-sources-list{margin-top:20px;color:var(--muted);font-size:12px}.settings-import-progress{color:var(--muted);font-size:11px;line-height:1.6;margin-top:16px}.setting-row{display:flex;align-items:center;justify-content:space-between;gap:22px;padding:16px 0;border-bottom:1px solid var(--line)}.setting-row>span:first-child{flex:1;min-width:0}.setting-row strong{display:block;font-size:12px;font-weight:470;color:#d1e3d9}.setting-row small{display:block;margin-top:5px;font-size:11px;line-height:1.55;color:#83a090}.setting-row select{max-width:165px;min-width:120px;padding:9px;border:1px solid #b0e9d621;border-radius:7px;background:#142620;color:#c7dfd2;font-size:11px}.setting-row input[type=checkbox]{appearance:none;flex-shrink:0;position:relative;width:34px;height:20px;margin:0;border-radius:20px;border:1px solid #779c8b40;background:#1c2e28;cursor:pointer}.setting-row input[type=checkbox]:before{content:"";position:absolute;width:12px;height:12px;top:3px;left:3px;border-radius:50%;background:#718f80;transition:transform .18s,background .18s}.setting-row input[type=checkbox]:checked{background:#b0e9d625;border-color:#b0e9d64a}.setting-row input[type=checkbox]:checked:before{transform:translate(14px);background:#b0e9d6}.setting-slider{display:flex;align-items:center;width:160px;gap:10px;flex-shrink:0}.setting-slider input{accent-color:#b0e9d6;width:108px;min-width:0;cursor:pointer}.setting-slider output{min-width:36px;font:10px var(--mono);color:#bddaca;text-align:right}.setting-row:has(:disabled){opacity:.45}.settings-note{display:flex;align-items:center;gap:14px;margin-top:22px}.settings-note>span{flex:1;font-size:11px;color:#85a495;line-height:1.6}.settings-note button{flex:0 0 auto;font-size:11px}.settings-footnote{font-size:10px;color:#6f9280;margin-bottom:0}.settings-footer{display:flex;align-items:center;gap:12px;padding:15px 22px;border-top:1px solid var(--line);background:#081216}.settings-save-status{flex:1;font-size:10px;color:#7d9c8b;line-height:1.5}.settings-footer .text-button{font-size:11px}.settings-footer .primary-button{padding-inline:20px}@media(max-width:650px){.settings-dialog{width:calc(100% - 20px);height:calc(100dvh - 24px);max-height:none}.settings-heading{padding:23px 20px 18px}.settings-heading h2{font-size:23px}.settings-layout{display:flex;flex-direction:column}.settings-tabs{display:flex;padding:9px;border-right:0;border-bottom:1px solid var(--line);overflow-x:auto;flex-shrink:0}.settings-tabs button{width:auto;flex:1 0 auto;margin:0;padding:9px 11px;font-size:11px;justify-content:center}.settings-tabs button>svg{width:14px;height:14px}.settings-content{padding:22px 18px}.setting-row{gap:12px}.setting-slider{width:128px}.setting-slider input{width:78px}.setting-row select{min-width:100px;max-width:135px}.settings-footer{flex-wrap:wrap;padding:12px 18px}.settings-save-status{flex-basis:100%}.settings-footer .text-button{margin-right:auto}}.toast{position:fixed;left:50%;bottom:155px;transform:translate(-50%);max-width:min(440px,calc(100% - 32px));padding:12px 18px;background:#15251ff5;color:#c8e5d4;border:1px solid #9fbfad44;border-radius:10px;box-shadow:0 10px 30px #0005;font-size:12px;line-height:1.7;z-index:100}.desktop-update{position:fixed;left:24px;bottom:24px;z-index:45;display:inline-flex;align-items:center;justify-content:center;gap:7px;min-height:32px;min-width:86px;padding:6px 12px;border-radius:10px;color:var(--mint);font-size:11px;font-weight:450;line-height:18px;white-space:nowrap}.desktop-update svg{width:13px;height:13px}.desktop-update:hover{background:#172c29;border-color:#b0e9d633;color:#e9fff4}.desktop-update:disabled{opacity:1;color:#8ba198}.desktop-update[data-phase=downloading] svg,.desktop-update[data-phase=installing] svg{opacity:.65}.shortcut-hints{position:fixed;left:24px;bottom:24px;z-index:10;display:grid;gap:7px;color:#82938f;font-size:10px;pointer-events:none}.shortcut-hints span{display:flex;align-items:center;gap:8px}.shortcut-hints kbd{min-width:22px;padding:2px 4px;border:1px solid #a3bdb523;border-radius:4px;color:#a3b5ae;background:#0b141b66;font:9px var(--mono);text-align:center}#app:has(.desktop-update:not([hidden])) .shortcut-hints{bottom:66px}@media(min-width:760px)and (max-width:1000px){.shortcut-hints{bottom:165px}#app:has(.desktop-update:not([hidden])) .shortcut-hints{bottom:165px}}@keyframes panel-in{0%{opacity:0}to{opacity:1}}@keyframes orbit{to{transform:rotateX(55deg) rotateY(20deg) rotate(360deg)}}@keyframes shimmer{to{background-position:-200% 0}}@keyframes spin{to{transform:rotate(360deg)}}@media(max-width:1000px){.sidebar{width:300px}.inspector-stack{width:320px}}@media(max-width:759px){.shortcut-hints{display:none}.app-header{top:12px;left:12px;height:44px}.brand>span{font-size:19px}.app-header .toolbar-button{padding-inline:7px}.map-controls{top:auto;right:auto;left:50%;bottom:max(12px,env(safe-area-inset-bottom));transform:translate(-50%);height:46px}.floating-panel{border-radius:14px}.sidebar,.inspector-stack{top:70px;left:12px;right:auto;width:min(330px,calc(100% - 24px));max-height:calc(100dvh - 280px)}.sidebar{height:min(500px,calc(100dvh - 280px))}.inspector-stack{width:min(350px,calc(100% - 24px));inset:auto 12px 250px auto;max-height:min(40dvh,calc(100dvh - 450px))}.inspector-stack.has-events{height:min(420px,40dvh);gap:8px}.has-events .inspector{flex-basis:135px;max-height:26%}.event-content{padding:12px}.event-detail-heading h3{font-size:16px}.timeline-dock{bottom:max(72px,calc(env(safe-area-inset-bottom) + 60px));width:calc(100% - 24px)}.timeline-panel{padding:9px 12px 15px;border-radius:14px}.timeline-top{flex-wrap:wrap;gap:0;margin-bottom:13px}.timeline-top .panel-handle{flex-basis:calc(100% - 72px);font-size:12px}.timeline-top .range-buttons{order:4;width:100%;margin:4px 0 0;gap:5px}.range-buttons button{padding:5px 12px}.timeline-top .icon-button{width:32px;height:32px}.timeline-track{gap:12px}.histogram{gap:2px}.toast{bottom:230px}.desktop-update{left:12px;bottom:max(72px,calc(env(safe-area-inset-bottom) + 60px))}#app:has(.desktop-update:not([hidden])) .timeline-dock{bottom:max(112px,calc(env(safe-area-inset-bottom) + 100px))}#app:has(.desktop-update:not([hidden])) .inspector-stack{bottom:290px}}@media(min-width:760px)and (max-height:600px){.sidebar,.inspector-stack,.inspector-stack.has-events{max-height:calc(100dvh - 100px)}.sidebar{height:calc(100dvh - 100px)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation-duration:.01ms!important;transition-duration:.01ms!important}}.search-dialog{width:min(960px,calc(100% - 48px));max-width:none;height:min(680px,calc(100dvh - 100px));max-height:none;padding:0;overflow:hidden;border-radius:18px;background:#0b171bf5;-webkit-backdrop-filter:blur(28px);backdrop-filter:blur(28px);box-shadow:0 30px 120px #0009}.search-dialog[open]{display:flex;flex-direction:column}.search-dialog::backdrop{background:#02070c88;-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px)}.search-command{display:flex;align-items:center;gap:13px;padding:17px 20px;border-bottom:1px solid var(--line)}.search-command-icon{font-size:26px;color:#9dcab7}.search-command input{min-width:0;flex:1;border:0;outline:0;background:none;color:#e0f1e8;font-size:17px}.search-command input::placeholder{color:#6c8b7b}.search-close{font-size:23px}.search-options{display:flex;align-items:center;gap:10px;padding:12px 20px;border-bottom:1px solid var(--line)}.search-options select{font-size:12px;color:#bcdbcb;padding:5px 20px 5px 0;border:0;background:none}.search-chip{padding:5px 9px;border:1px solid #bddfd21a;border-radius:6px;font-size:11px;color:#8fa99b}.search-chip[aria-pressed=true]{color:#b7e2cd;background:#b0e9d60a;border-color:#b0e9d629}#search-index-state{margin-left:auto;font-size:11px;color:#7d9c8c}.search-body{display:grid;grid-template-columns:minmax(0,1.12fr) minmax(0,1fr);flex:1;min-height:0}.search-results{overflow-y:auto;overscroll-behavior:contain;min-height:0}.search-results-inner{position:relative}.search-result{position:absolute;left:7px;right:7px;height:86px;border-radius:8px;padding:11px 13px;cursor:pointer;border:1px solid transparent}.search-result.active{border-color:#b0e9d626;background:#b0e9d60e}.search-result:hover{background:#b0e9d60a}.search-result-title{font-size:13px;font-weight:440;color:#d2e5d9;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.search-result-meta{display:flex;justify-content:space-between;gap:10px;font-size:10px;color:#8ca996;margin-top:7px}.search-result-meta>span:first-child{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.match-kind{flex-shrink:0;color:#a0c7b0}.search-result-excerpt{font-size:11px;color:#759586;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin-top:6px}.search-dialog mark{color:#dbffe7;background:#b6f4d111;border-radius:2px}.search-preview{border-left:1px solid var(--line);min-height:0;overflow-y:auto;overscroll-behavior:contain}.search-preview-heading{padding:22px}.search-preview-heading>span{color:#8ba898;font-size:11px}.search-preview-heading h2{margin:10px 0;font-size:20px;line-height:1.4;overflow-wrap:anywhere}.search-preview-heading p{margin:0 0 18px;font-size:11px}.search-open{width:100%}.search-open span{margin-left:auto}.search-launch{width:100%;justify-content:center;margin-top:7px}.search-preview-section{padding:19px 22px;border-top:1px solid var(--line)}.search-preview-section h3{color:#a9c6b4;font-size:12px;font-weight:450;margin:0 0 14px}.search-preview-section p{margin:8px 0 15px;font-size:12px;line-height:1.75;overflow-wrap:anywhere;white-space:pre-line}.search-preview-section article{margin:15px 0}.search-preview-section article>span{color:#b5d1bd;font-size:11px}.search-preview-section .preview-coverage{color:#718f7e;font-size:11px;margin-bottom:0}.search-footer{position:relative;display:flex;align-items:center;gap:14px;padding:12px 18px;border-top:1px solid var(--line);color:#87a592;font-size:11px}.search-footer button{color:#b0e9d6;font-size:11px}.search-keys{margin-left:auto;white-space:nowrap}.search-keys kbd{padding:1px 4px;margin-right:3px;font-size:10px}.search-keys kbd:not(:first-child){margin-left:10px}.search-syntax>div{position:absolute;bottom:45px;right:18px;display:flex;flex-direction:column;gap:10px;padding:18px;background:#132722;border:1px solid #b0e9d629;border-radius:10px;box-shadow:0 10px 30px #0006}.search-syntax code{color:#b4d7c2;font:11px var(--mono)}#search-clear-cache{margin-top:4px;padding:12px 0 0;border-top:1px solid var(--line);text-align:left}.source-badge{display:inline-flex;align-items:center;gap:6px;font:10px var(--mono);letter-spacing:.02em;color:#b5c8d9}.source-icon{display:inline-block;width:16px;height:16px;flex:0 0 16px;vertical-align:-3px;background:currentColor;mask:var(--source-icon) center / contain no-repeat;-webkit-mask:var(--source-icon) center / contain no-repeat}.source-icon-claude{color:#d9a387}.source-icon-openai{color:#b4d9c6}.source-icon-t3{color:#d2b7ec}.source-icon-opencode{color:#c7d0d7}.source-icon-gemini,.source-icon-cline{color:#9cbcf6}.source-icon-qwen{color:#b8a6ec}.source-icon-pi{color:#e9a89c}.source-icon-copilot{color:#c7d0d7}.source-icon-roo{color:#d9b59a}.source-icon-kilo{color:#e6ce83}.source-icon-continue{color:#abd9bb}.source-icon-openclaw,.source-icon-cherry{color:#efa2a0}.source-icon-hermes,.source-icon-amp,.source-icon-mistral{color:#e9bd85}.source-icon-kimi,.source-icon-deepseek,.source-icon-minimax,.source-icon-antigravity{color:#a7bcf2}.source-icon-grok,.source-icon-zed,.source-icon-warp,.source-icon-lmstudio{color:#c3d2d7}.source-icon-junie,.source-icon-kiro,.source-icon-muse{color:#c4adea}.source-icon-mimo{color:#e9ae82}.source-icon-devin,.source-icon-goose,.source-icon-unsloth,.source-icon-trae{color:#a8d6b9}.source-icon-codebuddy,.source-icon-commandcode{color:#b3d6dd}.source-icon-prime,.source-icon-senpi,.source-icon-kimchi,.source-icon-gajae{color:#d5c4a9}.source-icon-droid,.source-icon-codebuff,.source-icon-freebuff,.source-icon-jcode,.source-icon-zcode{color:#bed2c5}.source-icon-proma,.source-icon-aside,.source-icon-augment,.source-icon-fx,.source-icon-crush,.source-icon-octofriend,.source-icon-mux,.source-icon-reasonix,.source-icon-hindsight{color:#d0c0dd}.source-symbol .source-icon{width:20px;height:20px;flex-basis:20px}.source-badge .source-icon,.search-result-meta .source-icon{width:12px;height:12px;flex-basis:12px;vertical-align:-2px}.search-result-meta .source-icon{margin-right:5px}.search-launch{display:inline-flex;gap:8px;align-items:center}#source-filter-icon{display:flex;align-items:center}.source-badge[data-source=claude-code]{color:#d8b297}.source-badge[data-source=codex]{color:#a5d1ba}.detail-title>.source-badge{margin-bottom:10px}.imports-dialog{width:min(680px,calc(100vw - 28px));max-width:680px;padding:32px}.imports-dialog[open]{display:flex;flex-direction:column;overflow-y:auto}.imports-dialog>*{flex-shrink:0}.imports-dialog>.import-sources{flex:1 1 auto;min-height:100px;overflow-y:auto;overscroll-behavior:contain;padding-right:4px}.imports-dialog .primary-button{flex:0 0 auto;white-space:nowrap}.imports-dialog .eyebrow{font:10px var(--mono);letter-spacing:.18em;color:#83b9a3}.imports-dialog h2{margin:16px 0 12px;font-size:clamp(24px,4vw,32px);font-weight:450;letter-spacing:-.04em}.imports-intro{color:#91a99d;font-size:13px;line-height:1.6;margin-bottom:14px}.privacy-disclosure{color:#91a99d;font-size:11px;line-height:1.65;margin-bottom:24px}.privacy-disclosure summary{cursor:pointer;color:#aec9bb}.privacy-disclosure p{font-size:inherit;line-height:inherit;margin:10px 0 0}.import-sources{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));grid-auto-rows:max-content;align-content:start;gap:6px}.import-source{display:flex;align-items:center;min-width:0;min-height:52px;gap:9px;padding:8px 10px;border:1px solid #b0e9d61c;border-radius:8px;cursor:pointer;background:#b0e9d603}.import-source:has(input:checked){border-color:#b0e9d658;background:#b0e9d608}.import-source:hover{background:#b0e9d60e}.import-source:focus-within{outline:1px solid #b0e9d6;outline-offset:1px}.import-source:has(input:disabled){opacity:.6;cursor:wait}.import-source input{accent-color:#a4d8bf;flex:0 0 auto;margin:0}.source-symbol{display:grid;place-items:center;width:22px;height:22px;color:#bed3c7;flex:0 0 auto}.source-copy{flex:1;min-width:0}.import-source strong{display:block;font-size:12px;font-weight:500;line-height:1.4;overflow-wrap:anywhere}.import-source .source-meta{display:flex;flex-wrap:wrap;gap:4px 8px;color:#879d90;font-size:10px;line-height:1.35;margin-top:3px}.import-source .source-error{display:block;color:#e4ba96;font-size:10px;line-height:1.4;margin-top:3px;overflow-wrap:anywhere}.source-detected{color:#789083;white-space:nowrap}.source-detected.detected{color:#aedbc4}.imports-progress{font:11px var(--mono);color:#9fc2af;margin-top:20px;line-height:1.8;min-height:20px}.imports-dialog footer{display:flex;align-items:center;justify-content:space-between;gap:18px;margin-top:18px}.imports-dialog footer>span{color:#789083;font-size:11px}.imports-notes{color:#91a99d;font-size:11px;line-height:1.6;margin-top:12px}.imports-notes>div{max-height:150px;overflow-y:auto}@media(max-width:600px){.imports-dialog{padding:26px 20px}.import-sources{grid-template-columns:minmax(0,1fr);gap:4px}.import-source{min-height:44px;padding:6px 9px}.imports-dialog footer{flex-wrap:wrap}}.search-empty{padding:30px 22px;color:#98b4a4;font-size:13px}.launch-dialog{width:min(520px,calc(100% - 32px));max-height:calc(100dvh - 48px);padding:28px;border-radius:16px}.launch-dialog h2{font-size:20px;margin:0 35px 10px 0}.launch-title{margin:0 0 24px;font-size:12px;line-height:1.6;overflow-wrap:anywhere}.launch-destination{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:20px;font-size:12px;color:#a9c6b4}.launch-destination select{min-width:0;max-width:77%;border:1px solid var(--line);border-radius:7px;padding:9px;background:#132321;color:#d1e5d9;font-size:12px}.launch-web-link{width:100%}.launch-pairing{margin-top:19px;font-size:11px;color:#8fa99b}.launch-pairing p,.launch-hint{font-size:11px;line-height:1.7}.launch-directory-label{display:grid;gap:9px;margin-bottom:18px;color:#a9c6b4;font-size:12px}.launch-directory{min-width:0;width:100%;padding:10px;background:#071114;color:#c8e5d5;border:1px solid var(--line);border-radius:7px;font:11px var(--mono)}.launch-summary{margin-bottom:18px;padding:13px;border:1px solid #b0e9d625;border-radius:9px;background:#b0e9d608}.launch-mode{color:#b8ddc9;font-size:12px;font-weight:500}.launch-hint{margin:7px 0 0;color:#9eb6a8}.launch-context{margin-top:12px;color:#a1b9ac;font-size:11px}.launch-context summary{cursor:pointer}.launch-coverage{line-height:1.7}.launch-context-path{display:block;overflow-wrap:anywhere;font:10px/1.7 var(--mono);color:#7e9e8e}.launch-availability{color:#c4b89b;font-size:11px;line-height:1.7;margin-bottom:0}.launch-availability:empty{display:none}.launch-command{display:block;width:100%;background:#071114;border:1px solid var(--line);border-radius:7px;padding:11px;color:#c8e5d5;font:11px var(--mono)}.launch-actions{display:flex;flex-wrap:wrap;gap:9px;margin-top:14px}.launch-actions>button{flex:1;white-space:nowrap}.launch-status{margin:14px 0 0;font-size:12px;line-height:1.6}.launch-status:empty{display:none}@media(max-width:759px){.search-dialog{width:calc(100% - 24px);height:calc(100dvh - 48px);border-radius:14px}.search-command{padding:12px;gap:8px}.search-command input{font-size:16px}.search-options{flex-wrap:wrap;padding:9px 14px;gap:7px 12px}#search-index-state{flex-basis:100%;margin-left:0}.search-body{grid-template-columns:1fr;grid-template-rows:minmax(150px,1fr) minmax(130px,.7fr)}.search-preview{border-left:0;border-top:1px solid var(--line)}.search-preview-heading{padding:16px}.search-preview-heading h2{font-size:17px}.search-preview-section{padding:16px}.search-footer{padding:10px 14px}.search-keys{display:none}.search-syntax{margin-left:auto}}.publishing-dialog{width:min(1000px,calc(100% - 32px));max-width:none}.publishing-dialog>header{display:flex;justify-content:space-between;align-items:center;gap:20px}.publishing-dialog h2{margin:0}.publishing-disclosure,.publishing-scope,.publishing-note,.publishing-summary{color:#a1b6ad;font-size:12px;line-height:1.7}.publishing-fields{display:grid;grid-template-columns:repeat(3,1fr);gap:14px 20px;padding:18px;border:1px solid #c9e3db20;border-radius:6px}.publishing-fields legend{padding-inline:8px;font-size:13px}.publishing-fields label,.publishing-confirm{display:flex;gap:9px;align-items:center;font-size:12px;line-height:1.7}.publishing-dialog input[type=checkbox]{accent-color:#b0e9d6}.publishing-account,.publishing-dialog footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-top:18px}.publishing-account{font-size:13px}.publishing-status{font-size:13px;line-height:1.7;color:#b0e9d6;min-height:22px}.publishing-confirm{align-items:flex-start}.publishing-confirm input{margin-top:4px}.publishing-dialog footer{justify-content:flex-end}.publishing-dialog footer [data-animation]{margin-right:auto}.publishing-json{max-height:280px;overflow:auto;padding:15px;background:#060b10;font:11px/1.5 monospace}.publishing-link{display:block;text-align:right;margin-top:15px;color:#b0e9d6;font-size:13px}.publishing-connect{margin-block:15px;font-size:13px}.publishing-connect strong{font-family:monospace;letter-spacing:.1em}@media(max-width:600px){.publishing-fields{grid-template-columns:repeat(2,1fr)}}
|