grooph 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +33 -31
  2. package/THIRD-PARTY-NOTICES.md +5 -1
  3. package/dist/app/assets/App-CT9KxzfQ.css +1 -0
  4. package/dist/app/assets/App-D1pDFbEY.js +5 -0
  5. package/dist/app/assets/EmbedApp-CTausQWY.js +1 -0
  6. package/dist/app/assets/ExportPanel-CbRH4C69.js +8 -0
  7. package/dist/app/assets/Import-DF0XLxRI.js +1 -0
  8. package/dist/app/assets/SketchView-BjeUHG4X.js +143 -0
  9. package/dist/app/assets/{brakes-BJPDrrJT.js → brakes-B9b3hDX8.js} +1 -1
  10. package/dist/app/assets/{builtins-D_22fKRF.js → builtins-DzyPaYdd.js} +1 -1
  11. package/dist/app/assets/{compile-BAvi-rd0.js → compile-DL2budwP.js} +8 -8
  12. package/dist/app/assets/{front-BRl7rl-u.js → front-OxfL-OaD.js} +1 -1
  13. package/dist/app/assets/full-C0asYORc.js +1 -0
  14. package/dist/app/assets/graph-more-Dn_hNa20.js +2 -0
  15. package/dist/app/assets/graph-stage-CwNePnN4.js +4 -0
  16. package/dist/app/assets/graph-views-CmkQ41zC.js +2 -0
  17. package/dist/app/assets/{index-CeaKwKuU.js → index-B5ZkSF4L.js} +2 -2
  18. package/dist/app/assets/mermaid-read-cyqJ32v-.js +17 -0
  19. package/dist/app/assets/{plan-templates-BQu8G2sX.js → plan-templates-u2fF3GnS.js} +1 -1
  20. package/dist/app/assets/runs-BA5HKtsx.js +1 -0
  21. package/dist/app/assets/screens-CMMuexid.js +16 -0
  22. package/dist/app/assets/share-DV3wsAsJ.js +8 -0
  23. package/dist/app/assets/site-looks.v1.css +223 -0
  24. package/dist/app/assets/space-Cuy4YqyZ.js +1 -0
  25. package/dist/app/assets/styles-Dlp-yYlE.css +1 -0
  26. package/dist/app/assets/templates-DbAhWvP6.js +2 -0
  27. package/dist/app/assets/{themes-DtOBrLk0.js → themes-C34TrvOJ.js} +1 -1
  28. package/dist/app/assets/{units-DOIUgOIU.js → units-DlniUjfH.js} +1 -1
  29. package/dist/app/assets/{views-CLwg5VNv.js → views-CFqRShXD.js} +2 -1
  30. package/dist/app/grooph-app.json +1 -1
  31. package/dist/app/index.html +14 -11
  32. package/dist/app/llms.txt +6 -7
  33. package/dist/app/manifest.webmanifest +1 -1
  34. package/dist/app/og.png +0 -0
  35. package/dist/app/routes.json +42 -33
  36. package/dist/app/sw.js +7 -2
  37. package/dist/browser/grooph.d.ts +44 -0
  38. package/dist/browser/grooph.global.js +7 -0
  39. package/dist/browser/grooph.js +7 -0
  40. package/dist/bundle/grooph.js +6734 -2536
  41. package/hooks/grooph-event.mjs +163 -14
  42. package/package.json +14 -6
  43. package/dist/app/assets/App-48y1Ec5B.js +0 -5
  44. package/dist/app/assets/App-Cv1auMeh.css +0 -1
  45. package/dist/app/assets/EmbedApp-390Z2d4x.js +0 -1
  46. package/dist/app/assets/ExportPanel-Ca3wBB38.js +0 -8
  47. package/dist/app/assets/Import-ByMI7Uz9.js +0 -1
  48. package/dist/app/assets/graph-more-393HTgQE.js +0 -2
  49. package/dist/app/assets/graph-stage-BkrQGQ-z.js +0 -4
  50. package/dist/app/assets/graph-views-COQF_QTQ.js +0 -2
  51. package/dist/app/assets/runs-DcjRi7S6.js +0 -1
  52. package/dist/app/assets/screens-aIjMSzZg.js +0 -16
  53. package/dist/app/assets/share-BzIzB4EY.js +0 -8
  54. package/dist/app/assets/space-DWgrlnfB.js +0 -1
  55. package/dist/app/assets/styles-BA1aVO9R.css +0 -1
  56. package/dist/app/assets/templates-CoNTzuuz.js +0 -2
  57. package/dist/app/demo/run.txt +0 -1
@@ -0,0 +1 @@
1
+ import{t as e}from"./full-C0asYORc.js";var t=128,n=14,r=104,i=24,a=56,o=34,s=36,c={yaw:-.46,pitch:.46},l=e=>e.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/g,``).replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`),u={"claude-code":`Claude Code`,codex:`Codex`};function d(e,t){return e.place&&t.place&&e.place!==t.place?1.8:e.machine===t.machine?1:1.35}function f(e){let t=e.working>0?`working`:e.waiting>0?`waiting`:(e.quiet??0)>0?`quiet`:`ended`,n=e.agentsRunning>0?` · ${e.agentsRunning} agent${e.agentsRunning===1?``:`s`}`:``;return{state:t,says:`${t===`quiet`?`gone quiet`:t}${t===`working`?n:``}`}}function p(e,t,n={}){let[,,,,,,,,,r,i,a,,,,o,,,,,,,s,,,c,p,m,h]=e,g=o(`auto`),_=Math.max(1,n.per??3),{sessions:v,people:y,handoffs:b,numberOf:x}=i(t),S=e=>t.sessions.find(t=>t.id===e)?.name||(t.people??[]).find(t=>t.id===e)?.name||e,C=(e,t,n,r,i,o=``,c)=>{let u=i>1?`×${i}`:``,d=u?m(u,9.5,`bold`)+10:0,_=h(t,e=>112-(u&&e===0?d+4:0),12.5,3,`bold`),v=c?f(c):void 0,y=7+_.length*15+13+(o?11.5:0)+(v?15:0)+6;return{id:e,h:y,svg:()=>{let t=[s(.7,.7,126.6,y-1.4,n?{fill:g(`gate-soft`),stroke:g(`gate`),rx:12,width:1.4,mark:`card`}:{fill:g(`surface`),stroke:g(`line-strong`),rx:8,mark:`card`})],i=5;if(_.forEach((e,n)=>{i+=15,t.push(p(8,i,e,{size:12.5,fill:g(`ink`),weight:`bold`})),n===0&&u&&t.push(s(120-d,i-10.5,d,14,{fill:g(`accent-soft`),rx:7})+p(120-d/2,i,u,{size:9.5,fill:g(`accent`),weight:`bold`,anchor:`middle`}))}),i+=13,t.push(p(8,i,h(r,112,9.5,1,`bold`)[0],{size:9.5,fill:g(n?`gate`:r===`Codex`?`check`:`accent`),weight:`bold`})),o&&t.push(p(8,i+=11.5,h(o,112,9,1)[0],{size:9,fill:g(`ink-3`)})),v){i+=15;let e=g(v.state===`working`?`accent`:v.state===`waiting`?`warning`:`ink-3`),n=v.state===`working`||v.state===`ended`?`<circle cx="11" cy="${a(i-3.2)}" r="3.4" style="fill:${e}"/>`:`<circle cx="11" cy="${a(i-3.2)}" r="2.8" fill="none" stroke-width="1.6" style="stroke:${e}"/>`;t.push(n+p(18,i,h(v.says,104,9,1,`bold`)[0],{size:9,fill:e,weight:`bold`}))}return`<g data-${n?`person`:`session`}="${l(e)}"${v?` data-live="${v.state}"`:``}>${t.join(``)}</g>`}}},w=t.lanes,T=[...y.length?[{cls:` is-people`,mark:`data-people=""`,name:y.length===1?`Person`:`People`,sub:`on no machine, under no account`,place:``,gap:0,items:y.map(e=>C(e.id,e.name||e.id,!0,`person`,1))}]:[],...w.map((e,t)=>({cls:``,mark:`data-lane="${l(e.id)}"`,name:e.name||e.id,sub:`${e.machine} · ${e.account}`,place:e.place??``,gap:t===0?1:d(w[t-1],e),items:v.filter(t=>t.lane===e.id).map(e=>C(e.id,e.name||e.id,!1,Object.hasOwn(u,e.harness)?u[e.harness]:e.harness,e.count??1,e.model,n.live?.[e.id]))}))],E=b.map(e=>({id:e.id,n:x.get(e.id),from:e.from,to:e.to,style:c(e)})),D=b.length,O=[{short:`all handoffs`,says:D===0?`This map has no handoffs to step through.`:D===1?`The map's one handoff is lit.`:`All ${D} handoffs are lit. Move the slider or press Play to light them one at a time.`}];if(b.forEach((e,n)=>{let i=e.from===e.to?`${S(e.from)} to itself`:`${S(e.from)} to ${S(e.to)}`;O.push({handoff:e.id,short:`handoff ${E[n].n} of ${t.handoffs.length}`,says:`Handoff ${E[n].n} of ${t.handoffs.length}: ${i} · ${r(t,e)}${e.what?` · ${e.what}`:``}`})}),n.live){let e=Object.values(n.live).map(e=>f(e).state),t=(t,n)=>e.includes(t)?[`${e.filter(e=>e===t).length} ${n}`]:[],r=[...t(`working`,`working`),...t(`waiting`,`waiting`),...t(`quiet`,`gone quiet`),...t(`ended`,`ended`)];O.push({now:!0,short:`now`,says:`Now${n.at?`, as the hooks saw it at ${n.at.slice(0,16).replace(`T`,` `)} UTC`:``}: ${r.length?r.join(`, `):`no session has been seen`}.`})}return{title:t.name||t.id,sheets:T,links:E,stops:O,per:_,link:`handoff`,links_:`handoffs`,none:` · no sessions`,range:`Handoff, in the order the map lists them`,note:`The order the map lists its handoffs in. An order, not a clock: a map records no times${n.live?`; the slider's last stop is now`:``}.`,flat:` The picture and the sequence show the same map, flat. <button type="button" data-flat="picture">Picture</button> <button type="button" data-flat="sequence">Sequence</button>`}}function m({sheets:e,links:t,per:l}){let u=Math.max(1,Math.min(l,Math.max(...e.map(e=>e.items.length),1))),d=48+u*128+(u-1)*n,f=e=>48+(Math.max(1,Math.ceil(e/u))-1)*r,p=Math.max(0,...e.map(e=>f(e.items.length)))+Math.max(0,e.length-1)*o,m=Math.max(40,...e.flatMap(e=>e.items.map(e=>e.h))),h=new Map,g=[],_=[],v=0;e.forEach((t,s)=>{v+=m+(s===0?0:a*t.gap),g.push(v);let c=f(t.items.length),l=p-(e.length-1-s)*o,y=l-c,b=[];_.push({sheet:t,floor:v,front:l,back:y,depth:c,at:b}),t.items.forEach((e,a)=>{let o=Math.floor(a/u),s=Math.min(u,t.items.length-o*u),c=(d-s*128-(s-1)*n)/2+a%u*142,f=l-i-o*r;b.push([c,v-e.h,f]),h.set(e.id,{at:b[a],h:e.h})})});let y=new Map;t.forEach((e,t)=>{let[n,r]=[h.get(e.from),h.get(e.to)];(y.get(e.from)??y.set(e.from,[]).get(e.from)).push({arc:t,from:!0,toward:r.at[0]-n.at[0]}),(y.get(e.to)??y.set(e.to,[]).get(e.to)).push({arc:t,from:!1,toward:n.at[0]-r.at[0]})});let b=new Map;for(let[e,t]of y){let n=h.get(e);t.sort((e,t)=>e.toward-t.toward||e.arc-t.arc||(e.from?-1:1));let r=Math.min(11,108/Math.max(1,t.length-1));t.forEach((e,i)=>b.set(`${e.arc}${e.from?`a`:`b`}`,[n.at[0]+64+(i-(t.length-1)/2)*r,n.at[1],n.at[2]]))}let x=new Map,C=t.map((e,t)=>{let[n,r]=[b.get(`${t}a`),b.get(`${t}b`)],i=[e.from,e.to].sort().join(` `),a=x.get(i)??0;x.set(i,a+1);let o=Math.hypot(r[0]-n[0],r[1]-n[1],r[2]-n[2]);return{id:e.id,n:e.n,from:e.from,to:e.to,a:n,b:r,lift:16+o*.16+a*9}}),w={min:[0,0,0],max:[d,(g[g.length-1]??0)+s,p]};for(let e of C){let t=S(e,c.yaw,c.pitch);for(let n of[0,1,2]){let r=(e.a[n]+e.b[n])/2+t[n]*(e.lift+9);w.min[n]=Math.min(w.min[n],r),w.max[n]=Math.max(w.max[n],r)}}return{width:d,placed:_,cards:h,arcs:C,floors:g,box:w}}var h=(e,t)=>[e[0]-t[0],e[1]-t[1],e[2]-t[2]],g=(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2],_=(e,t)=>[e[1]*t[2]-e[2]*t[1],e[2]*t[0]-e[0]*t[2],e[0]*t[1]-e[1]*t[0]],v=(e,t)=>[e[0]*t,e[1]*t,e[2]*t],y=e=>v(e,1/(Math.hypot(e[0],e[1],e[2])||1));function b(e,t,n){let[r,i]=[e[0]*Math.cos(t)+e[2]*Math.sin(t),-e[0]*Math.sin(t)+e[2]*Math.cos(t)];return[r,e[1]*Math.cos(n)+i*Math.sin(n),-e[1]*Math.sin(n)+i*Math.cos(n)]}var x=(e,t)=>[-Math.cos(t)*Math.sin(e),-Math.sin(t),Math.cos(t)*Math.cos(e)];function S(e,t,n,r){let i=y(h(e.b,e.a)),a=x(t,n),o=h(a,v(i,g(a,i)));if(Math.hypot(...o)<.001)return r??[0,-1,0];let s=y(_(y(o),i)),c=b(s,t,n);return(r?g(s,r):Math.abs(c[1])>.2?-c[1]:-c[0])<0&&(s=v(s,-1)),s}function C(e,t,n,r,i=c.yaw,a=c.pitch){let o=v([e.min[0]+e.max[0],e.min[1]+e.max[1],e.min[2]+e.max[2]],.5),s=[0,1,2,3,4,5,6,7].map(t=>b(h([t&1?e.max[0]:e.min[0],t&2?e.max[1]:e.min[1],t&4?e.max[2]:e.min[2]],o),i,a)),l=e=>s.every(i=>{let a=r/Math.max(1,r-i[2]*e);return Math.abs(i[0]*e*a)<=t/2-14&&Math.abs(i[1]*e*a)<=n/2-14}),[u,d]=[.02,4];for(let e=0;e<24;e++){let e=(u+d)/2;l(e)?u=e:d=e}return u}var w=`.map-picture:has(>.space){box-shadow:none;border:0;padding:0;overflow:visible;aspect-ratio:auto!important;max-width:1180px!important}.space{font:13px/1.4 var(--font);color:var(--ink);gap:10px;padding:0 12px;display:grid}@media (min-width:1100px){.is-wide .space{padding:0}.is-wide .map-picture [data-picture=space] :is([data-handoff],[data-number]){opacity:1!important}}.space button{border:1px solid var(--line-strong);background:var(--surface);min-width:40px;min-height:40px;font:inherit;color:var(--ink);cursor:pointer;border-radius:10px;padding:0 12px}.space button:is(:hover,:focus-visible){background:var(--surface-2)}.space button:disabled{opacity:.5;cursor:default}.space-bar,.space-steps{align-items:center;gap:6px;display:flex}.space-bar span{color:var(--ink-3);text-wrap:pretty;flex:1;font-size:12.5px}.space-scene{border:1px solid var(--line);background:var(--gp-bg);touch-action:none;cursor:grab;-webkit-user-select:none;user-select:none;border-radius:14px;height:clamp(340px,100vh - 300px,820px);position:relative;overflow:clip}.space-scene:active{cursor:grabbing}.space-scene:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.space-lens{position:absolute;inset:0}.space-world,.space-world>div{transform-origin:0 0;position:absolute;top:0;left:0}.space-world{transform-style:preserve-3d}.space-sheet{box-sizing:border-box;border:1.2px solid var(--gp-line-strong);background:color-mix(in srgb, var(--gp-surface-2) 72%, transparent);border-radius:12px}.space-sheet.is-people{border-style:dashed}.space-label{box-sizing:border-box;white-space:nowrap;text-overflow:ellipsis;color:var(--gp-ink-3);pointer-events:none;padding:0 4px;font-size:10.5px;line-height:1.5;overflow:hidden}.space-label b{color:var(--gp-ink);margin-right:6px;font-size:12px}.space-label i{border:1px solid var(--gp-line-strong);color:var(--gp-ink-2);border-radius:9px;padding:1px 7px;font-style:normal}.space-label span{text-overflow:ellipsis;display:block;overflow:hidden}.space svg{font-family:var(--font);overflow:visible}.space-arc{pointer-events:none}.space-arc [data-handoff]{pointer-events:stroke}.space-hit{fill:none;stroke:#0000;stroke-width:16px}.space-n{width:22px}.space-arc,.space-n{transition:opacity .16s ease-out}.space .is-past{opacity:.5}.space .is-ahead{opacity:.16}.space .space-arc.is-lit [data-handoff]>path:first-of-type{stroke-width:3.8px}.space [data-handoff]:focus-visible>.space-hit{stroke:var(--gp-accent);stroke-opacity:.3}.space :is([data-session],[data-person]):focus-visible>rect[data-card]{stroke-width:2.6px;stroke-dasharray:6 3;stroke:var(--gp-ink)!important}.space-n.is-lit svg{scale:1.45}.space :is([data-session],[data-person]).is-end>rect[data-card]{stroke-width:2.4px;stroke:var(--gp-accent)!important;fill:var(--gp-accent-soft)!important}.space-sheet.is-end{border-color:var(--gp-accent);background:color-mix(in srgb, var(--gp-accent-soft) 80%, transparent)}.space.is-now [data-live=working]>rect[data-card]{stroke-width:2.4px;stroke:var(--gp-accent)!important}.space.is-now [data-live=ended]{opacity:.55}.space-time{gap:6px;display:grid}.space-steps input{min-width:0;min-height:40px;accent-color:var(--accent);flex:1}.space output{text-wrap:pretty;min-height:2.8em;font-size:14px}.space-note,.space-flat{color:var(--ink-3);margin:0;font-size:12.5px}.space-flat{border:1px solid var(--line-strong);background:var(--surface);color:var(--ink);border-radius:10px;padding:10px 12px}.space.is-flat>:not(.space-flat,style){display:none}@media (prefers-reduced-motion:reduce){.space-arc,.space-n{transition:none}}`,T=.96,E=[.1,1.05],D=30,O=1.4;function k(e,t,n={}){return A(e,p(e,t,n))}function A(e,t){let{title:n,sheets:r,links:i,stops:a,link:o,links_:s,none:c,range:u,note:d,flat:f,step:p=o}=t,[,,,,,,,,,,,h,g,,,_,,v,,,,,,,y]=e,b=_(`auto`),{width:x,placed:S,cards:C,arcs:w,floors:T,box:E}=m(t),D=[];for(let{sheet:e,floor:t,front:n,back:r,depth:i,at:a}of S)D.push(`<div class="space-sheet${e.cls}" ${e.mark} style="width:${h(x)}px;height:${h(i)}px;transform:translate3d(0,${h(t)}px,${h(r)}px) rotateX(90deg)"></div><div class="space-label" style="width:${h(x)}px;transform:translate3d(0,${h(t+3)}px,${h(n)}px)"><b>${l(e.name)}</b>${e.place?`<i>${l(e.place)}</i>`:``}<span>${l(e.sub)}${e.items.length?``:c}</span></div>`),e.items.forEach((e,t)=>{let[n,r,i]=a[t];D.push(`<div class="space-card" style="width:128px;height:${h(e.h)}px;transform:translate3d(${h(n)}px,${h(r)}px,${h(i)}px)"><svg viewBox="0 0 128 ${h(e.h)}" width="128" height="${h(e.h)}">${e.svg()}</svg></div>`)});w.forEach((e,t)=>{let n=i[t],r=n.style,a=b(r.color),s=Math.max(1,Math.hypot(e.b[0]-e.a[0],e.b[1]-e.a[1],e.b[2]-e.a[2])),c=e.lift+9,[u,d]=[s/2,c-2*e.lift],f=Math.atan2(c-d,s-u),[p,m]=[s-Math.cos(f)*5,c-Math.sin(f)*5],g=`M0,${h(c)} Q${h(u)},${h(d)} ${h(p)},${h(m)}`;D.push(`<div class="space-arc" data-arc="${t}" style="width:${h(s)}px;height:${h(c+9)}px"><svg viewBox="0 0 ${h(s)} ${h(c+9)}" width="${h(s)}" height="${h(c+9)}"><g data-${o}="${l(n.id)}" tabindex="0"><path d="${g}" ${y(r,a)}/><path class="space-hit" d="${g}"/><circle cx="0" cy="${h(c)}" r="2.4" style="fill:${a}"/><path d="M0,0 L-8,-3.8 L-8,3.8 z" transform="translate(${h(s)},${h(c)}) rotate(${h(f*180/Math.PI)})" style="fill:${a}"/></g></svg></div><div class="space-n" data-arc="${t}" aria-hidden="true"><svg data-number="${l(n.id)}" viewBox="-11 -9 22 18" width="22" height="18">${v(0,0,String(e.n),a,b)}</svg></div>`)});let O=/<style>[\s\S]*?<\/style>/.exec(g(1,1,``,`auto`,b,``,`space`))?.[0]??``,k=a.length-1;return{html:`<div class="space grooph-picture" data-picture="space">${O}<div class="space-bar"><span>Drag to turn. Pinch to move in and out, or pick the scene and scroll.</span><button type="button" data-do="out" aria-label="Move out">−</button><button type="button" data-do="in" aria-label="Move in">+</button><button type="button" data-do="reset">Starting view</button></div><div class="space-scene" tabindex="0" role="group" aria-label="${l(n)} in three dimensions: ${r.length} sheets, ${C.size} cards, ${i.length} ${s}. Drag, or use the arrow keys, to turn it; pinch, scroll, or use plus and minus, to move in and out."><div class="space-lens"><div class="space-world">${D.join(``)}</div></div></div><div class="space-time"><div class="space-steps"><button type="button" data-do="play" aria-label="Play"${k===0?` disabled`:``}>Play</button><button type="button" data-do="back" aria-label="Previous ${p}"${k===0?` disabled`:``}>‹</button><button type="button" data-do="next" aria-label="Next ${p}"${k===0?` disabled`:``}>›</button><input type="range" min="0" max="${k}" step="1" value="0" aria-label="${u}"${k===0?` disabled`:``}></div><output>${l(a[0].says)}</output><p class="space-note">${d}</p></div><p class="space-flat" role="status" hidden><span></span>${f}</p></div>`,box:E,arcs:w,stops:a,cards:C,floors:T}}function ee(e){if(e.length<24)return;let t=Math.round(1e3/e.slice(-24).sort((e,t)=>e-t)[12]);return t<30?t:void 0}function te(e,t){let n=e.stops[Math.max(0,Math.min(e.stops.length-1,t))],r=e.arcs.findIndex(e=>e.id===n.handoff);return{stop:n,arcs:e.arcs.map((e,t)=>n.now?`past`:r<0?``:t===r?`lit`:n.alone?``:t<r?`past`:`ahead`),ends:r<0?n.ends??[]:[e.arcs[r].from,e.arcs[r].to]}}var j=()=>({...c,zoom:1,step:0}),M=!1;function N(t,n,r,i){if(!M){let t=document.createElement(`style`);t.textContent=w+e,document.head.append(t),M=!0}let a=e=>t.querySelector(e),o=a(`.space-scene`),s=a(`.space-lens`),l=a(`.space-world`),u=t.closest(`.map-stage`),d=a(`input[type="range"]`),f=a(`output`),p=a(`.space-flat`),m=a(`[data-do="play"]`),g=typeof matchMedia==`function`&&matchMedia(`(prefers-reduced-motion: reduce)`).matches,b=[],x=(e,t,n,r)=>{e.addEventListener(t,n,r),b.push(()=>e.removeEventListener(t,n,r))},D=e=>{p.querySelector(`span`).textContent=e,p.hidden=!1};if(x(p,`click`,e=>{let t=e.target.closest(`[data-flat]`)?.dataset.flat;t&&i(t),e.stopPropagation()}),typeof CSS>`u`||!CSS.supports(`transform-style`,`preserve-3d`))return t.classList.add(`is-flat`),D(`This browser cannot draw the map in three dimensions.`),()=>b.forEach(e=>e());let k=[(n.box.min[0]+n.box.max[0])/2,(n.box.min[1]+n.box.max[1])/2,(n.box.min[2]+n.box.max[2])/2],A=[...t.querySelectorAll(`.space-arc`)],j=[...t.querySelectorAll(`.space-n`)],N=n.arcs.map(()=>void 0),P=1400,F=1,I=()=>{let{yaw:e,pitch:t}=r;s.style.transform=`scale(${r.zoom})`,l.style.transform=`translate3d(${o.clientWidth/2}px,${o.clientHeight/2}px,0) scale3d(${F},${F},${F}) rotateX(${-t}rad) rotateY(${e}rad) translate3d(${-k[0]}px,${-k[1]}px,${-k[2]}px)`,n.arcs.forEach((n,r)=>{let i=y(h(n.b,n.a)),a=N[r]=S(n,e,t,N[r]),o=_(i,v(a,-1)),s=n.lift+9,c=[n.a[0]+a[0]*s,n.a[1]+a[1]*s,n.a[2]+a[2]*s];A[r].style.transform=`matrix3d(${i[0]},${i[1]},${i[2]},0,${-a[0]},${-a[1]},${-a[2]},0,${o[0]},${o[1]},${o[2]},0,${c[0]},${c[1]},${c[2]},1)`;let l=[(n.a[0]+n.b[0])/2+a[0]*n.lift,(n.a[1]+n.b[1])/2+a[1]*n.lift,(n.a[2]+n.b[2])/2+a[2]*n.lift];j[r].style.transform=`translate3d(${l[0]}px,${l[1]}px,${l[2]}px) rotateY(${-e}rad) rotateX(${t}rad) translate(-50%,-50%)`})},L=u?.clientHeight??0,R=()=>{let e=u?.closest(`.is-focus`)?innerHeight:Math.max(340,Math.min(820,innerHeight-300));o.style.height=`${Math.max(180,Math.min(e,u?u.clientHeight-12-Number(u.dataset.keep??0):e))}px`,u&&u.clientHeight<L&&t.querySelector(`.is-on`)&&o.scrollIntoView({block:`nearest`}),L=u?.clientHeight??0,P=Math.max(900,o.clientWidth*1.7),s.style.perspective=`${P}px`,F=Math.min(O,C(n.box,o.clientWidth,o.clientHeight,P)),I()},z=[],B=0,V=0,H=0,U=!1,W=``,G,ne=e=>{if(B=0,U&&(H=e+160),U=!1,G){let t=Math.min(1,(e-(G.start||=e))/320),n=1-(1-t)**3;r.yaw=G.from.yaw+(c.yaw-G.from.yaw)*n,r.pitch=G.from.pitch+(c.pitch-G.from.pitch)*n,r.zoom=G.from.zoom+(1-G.from.zoom)*n,t>=1&&(G=void 0)}let t=`${r.yaw} ${r.pitch} ${r.zoom}`;V&&t!==W&&z.push(e-V),z.length>96&&z.splice(0,48),W=t,V=e,I();let n=ee(z);n!==void 0&&p.hidden&&D(`This device is drawing the map in three dimensions ${n} times a second, fewer than 30: too slowly to turn it smoothly.`),G||e<H?B=requestAnimationFrame(ne):V=0},K=()=>{U=!0,B||=requestAnimationFrame(ne)};b.push(()=>cancelAnimationFrame(B));let re=()=>{V=0,z.length=0};document.addEventListener(`visibilitychange`,re),b.push(()=>document.removeEventListener(`visibilitychange`,re));let ie=(e,t)=>{r.yaw=Math.max(-.96,Math.min(T,e)),r.pitch=Math.max(E[0],Math.min(E[1],t)),K()},q=e=>{r.zoom=Math.max(.4,Math.min(5,r.zoom*e)),K()},ae=()=>{g?(Object.assign(r,c,{zoom:1}),I()):(G={from:{...r},start:0},K())},J=new Map,Y=!1,X=0;x(o,`pointerdown`,e=>{(e.pointerType!==`mouse`||e.button===0)&&(e.isPrimary&&J.clear(),J.set(e.pointerId,[e.clientX,e.clientY]),clearTimeout(X),Y=!1,G=void 0)}),x(o,`pointermove`,e=>{e.pointerType===`mouse`&&e.buttons===0&&J.delete(e.pointerId);let t=J.get(e.pointerId);if(!t)return;let[n,i]=[e.clientX-t[0],e.clientY-t[1]];if(J.size===2){let n=[...J].find(([t])=>t!==e.pointerId)[1],[r,i]=[Math.hypot(t[0]-n[0],t[1]-n[1]),Math.hypot(e.clientX-n[0],e.clientY-n[1])];r>0&&q(i/r),Y=!0}else if(Y||Math.hypot(n,i)>4){if(!Y)try{o.setPointerCapture(e.pointerId)}catch{}Y=!0,ie(r.yaw+n*.006,r.pitch+i*.005)}else return;J.set(e.pointerId,[e.clientX,e.clientY])});for(let e of[`pointerup`,`pointercancel`])x(o,e,e=>{J.delete(e.pointerId),clearTimeout(X),X=window.setTimeout(()=>Y=!1,60)});b.push(()=>clearTimeout(X)),x(document,`click`,e=>{Y&&=(e.stopPropagation(),e.preventDefault(),!1)},{capture:!0}),x(o,`wheel`,e=>{(e.ctrlKey||o.contains(document.activeElement))&&(e.preventDefault(),q(Math.exp(-e.deltaY*(e.ctrlKey?.01:.0016))))},{passive:!1}),x(o,`keydown`,e=>{if(e.target!==o||e.metaKey||e.ctrlKey||e.altKey)return;let t={ArrowLeft:[-.09,0],ArrowRight:[.09,0],ArrowUp:[0,-.07],ArrowDown:[0,.07]}[e.key];if(t)ie(r.yaw+t[0],r.pitch+t[1]);else if(e.key===`+`||e.key===`=`)q(1.15);else if(e.key===`-`||e.key===`_`)q(1/1.15);else if(e.key===`0`||e.key===`Home`)ae();else return;e.preventDefault()});let Z=0,Q=()=>{clearInterval(Z),Z=0,m.textContent=`Play`,m.setAttribute(`aria-label`,`Play`)},$=e=>{r.step=Math.max(0,Math.min(n.stops.length-1,e));let{stop:i,arcs:a,ends:o}=te(n,r.step);a.forEach((e,t)=>{for(let n of[A[t],j[t]])for(let t of[`lit`,`past`,`ahead`])n.classList.toggle(`is-${t}`,e===t)});for(let e of t.querySelectorAll(`.is-end`))e.classList.remove(`is-end`);for(let e of o)t.querySelector([`session`,`person`,`node`].map(t=>`[data-${t}="${CSS.escape(e)}"]`).join())?.classList.add(`is-end`);i.sheet&&t.querySelector(`.space-sheet[${i.sheet}]`)?.classList.add(`is-end`),t.classList.toggle(`is-now`,i.now===!0),d.value=String(r.step),d.setAttribute(`aria-valuetext`,i.short),f.textContent=i.says};x(d,`input`,()=>{Q(),$(Number(d.value))}),x(a(`.space-time`),`click`,e=>{let t=e.target.closest(`[data-do]`)?.dataset.do;if(e.stopPropagation(),t===`back`||t===`next`)Q(),$(r.step+(t===`next`?1:-1));else if(t===`play`){if(Z)return Q();r.step>=n.stops.length-1&&$(0),m.textContent=`Pause`,m.setAttribute(`aria-label`,`Pause`),Z=window.setInterval(()=>{$(r.step+1),r.step>=n.stops.length-1&&Q()},2400)}}),b.push(Q),x(a(`.space-bar`),`click`,e=>{let t=e.target.closest(`[data-do]`)?.dataset.do;e.stopPropagation(),t===`reset`?ae():t&&q(t===`in`?1.25:.8)});let oe=!1,se=window.setTimeout(()=>oe=!0,0);b.push(()=>clearTimeout(se));let ce=new MutationObserver(e=>{for(let t of e){let e=t.target,i=e.getAttribute(`data-handoff`);if(!i||!e.classList.contains(`is-on`)||/\bis-on\b/.test(t.oldValue??``))continue;let a=n.stops.findIndex(e=>e.handoff===i);a>0&&a!==r.step&&(oe||r.step===0)&&(Q(),$(a))}});if(ce.observe(l,{attributes:!0,attributeFilter:[`class`],attributeOldValue:!0,subtree:!0}),b.push(()=>ce.disconnect()),x(o,`scroll`,()=>o.scrollTo(0,0)),typeof ResizeObserver==`function`){let e=new ResizeObserver(R);e.observe(o),u&&e.observe(u),b.push(()=>e.disconnect())}return R(),$(r.step),()=>b.forEach(e=>e())}export{t as CARD,D as FRAMES,c as START,d as apart,N as attach,S as bow,C as fit,j as held,te as lights,k as plan,A as scene,x as toEye,ee as tooSlow,b as turned};
@@ -0,0 +1 @@
1
+ :root{--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light dark;--bg:#f1f5f3;--surface:#fdfefd;--surface-2:#e8eeeb;--ink:#161c19;--ink-2:#414a46;--ink-3:#5c6661;--line:#dadfdd;--line-strong:#b8c0bc;--dots:#c2c9c6;--accent:#1f5f4a;--accent-ink:#fff;--accent-soft:#d6efe3;--focus:#2f7d62;--error:#b42318;--error-soft:#fceae7;--warning:#955500;--warning-soft:#fcf0d9;--ok:#1f7a4d;--ok-soft:#d8f3e3;--edge:#6b7470;--highlight:#d97706;--kind-agent:#1f5f4a;--kind-human-gate:#b25e09;--kind-check:#2b5f9e;--kind-merge:#6b4fa0;--kind-stop:#5b5f66;--loop-0:#7a4cc2;--loop-1:#0f7c8c;--loop-2:#c2410c;--loop-3:#b5306e;--z-overlay:10;--z-toolbar:20;--z-banner:30;--z-chrome:40;--radius:10px;--shadow:0 1px 2px #12181512, 0 4px 14px #12181512;--shadow-up:0 -6px 24px #1218151a;--font:"Atkinson Hyperlegible Next", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--mono:"Atkinson Hyperlegible Mono", ui-monospace, "SF Mono", SFMono-Regular, Menlo, Consolas, "Roboto Mono", monospace;--night:#061a14;--night-2:#0d261f;--night-line:#2d423b;--night-ink:#edf4f0;--night-muted:#acbcb4;--bright:#64eab7;--mark:#64eab780;--shadow-card:0 1px 2px #061a140f, 0 18px 40px -16px #061a1447;--shadow-night:0 24px 60px -20px #000100cc;--gutter:clamp(16px, 4vw, 40px)}@media (prefers-color-scheme:dark){:root{--lightningcss-light: ;--lightningcss-dark:initial}}@supports (color:lab(0% 0 0)){:root{--bg:lab(96.3555% -1.64139 .476933);--surface:lab(99.563% -.656158 .190723);--surface-2:lab(93.5985% -2.29895 .667858);--ink:lab(9.68119% -3.97921 1.14982);--ink-2:lab(30.5884% -4.62346 1.33902);--ink-3:lab(42.1885% -4.61686 1.33817);--line:lab(88.4944% -2.29913 .66787);--line-strong:lab(76.9349% -3.28752 .954521);--dots:lab(80.4149% -3.2872 .954473);--accent-soft:lab(92.2838% -9.90188 2.86862);--ok-soft:lab(93.5137% -11.2521 4.4686);--edge:lab(47.9617% -3.95238 1.14636);--shadow:0 1px 2px lab(7.35267% -3.02959 .884002/.07), 0 4px 14px lab(7.35267% -3.02959 .884002/.07);--shadow-up:0 -6px 24px lab(7.35267% -3.02959 .884002/.1)}}@media (prefers-color-scheme:dark){:root{--bg:#0d100f;--surface:#171a19;--surface-2:#1e2321;--ink:#e8ecea;--ink-2:#b9bfbc;--ink-3:#939a97;--line:#2a2f2d;--line-strong:#464c49;--dots:#2a2f2d;--accent:#5dbb94;--accent-ink:#0d1a14;--accent-soft:#193429;--focus:#7fd0ad;--error:#ff8f80;--error-soft:#3a1e1b;--warning:#f0b35a;--warning-soft:#362a15;--ok:#6fcf9d;--ok-soft:#183124;--edge:#8d9491;--highlight:#f5a524;--kind-agent:#5dbb94;--kind-human-gate:#eb9a45;--kind-check:#6fa3e0;--kind-merge:#a88be0;--kind-stop:#9ba0a8;--loop-0:#a883f0;--loop-1:#3cc0d0;--loop-2:#f0874f;--loop-3:#ee6fa6;--shadow:0 1px 2px #0000004d, 0 4px 14px #00000040;--shadow-up:0 -6px 24px #0006;--mark:#64eab74d;--shadow-card:0 1px 2px #0000004d, 0 18px 40px -16px #000000b3}@supports (color:lab(0% 0 0)){:root{--bg:lab(4.49263% -1.31775 .384095);--surface:lab(9.03422% -2.31057 .66936);--surface-2:lab(13.1077% -2.64038 .764957);--ink:lab(93.121% -1.97011 .572383);--ink-2:lab(76.9079% -2.62874 .763452);--ink-3:lab(63.0148% -3.28898 .954711);--line:lab(18.9078% -2.63751 .764579);--line-strong:lab(31.6947% -3.29536 .955534);--dots:lab(18.9078% -2.63751 .764579);--accent-soft:lab(19.3333% -13.5044 3.86299);--ok-soft:lab(18.1729% -13.1214 5.17942);--edge:lab(60.6948% -3.28925 .954747)}}}@font-face{font-family:Atkinson Hyperlegible Next;src:url(/grooph/assets/fonts/atkinson-hyperlegible-next.v1.woff2)format("woff2");font-weight:400 800;font-style:normal;font-display:swap}@font-face{font-family:Atkinson Hyperlegible Next;src:url(/grooph/assets/fonts/atkinson-hyperlegible-next-italic.v1.woff2)format("woff2");font-weight:400 800;font-style:italic;font-display:swap}@font-face{font-family:Atkinson Hyperlegible Mono;src:url(/grooph/assets/fonts/atkinson-hyperlegible-mono.v1.woff2)format("woff2");font-weight:400 700;font-style:normal;font-display:swap}*,:before,:after{box-sizing:border-box}html,body,#root{height:100%}body{font:15px/1.45 var(--font);background:var(--bg);color:var(--ink);-webkit-tap-highlight-color:transparent;-webkit-text-size-adjust:100%;margin:0}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer}a{color:var(--accent)}.mono{font-family:var(--mono);font-size:.92em}.muted{color:var(--ink-3)}.sr-only{clip:rect(0 0 0 0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}::placeholder{color:var(--ink-3);opacity:1}:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.loop-c0{--loop:var(--loop-0)}.loop-c1{--loop:var(--loop-1)}.loop-c2{--loop:var(--loop-2)}.loop-c3{--loop:var(--loop-3)}.btn{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--surface);min-height:44px;color:var(--ink);white-space:nowrap;justify-content:center;align-items:center;gap:6px;padding:0 16px;font-size:15px;font-weight:550;text-decoration:none;display:inline-flex}.btn:active{background:var(--surface-2)}.btn:disabled{opacity:.45;cursor:default}.btn-primary{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.btn-primary:active{background:var(--accent);filter:brightness(.92)}.btn-quiet{color:var(--ink-2);background:0 0;border-color:#0000}.btn-danger{background:var(--error);border-color:var(--error);color:var(--surface)}.btn-danger-text{color:var(--error)}.btn-small{min-height:44px;padding:0 12px;font-size:14px}.btn-large{min-height:52px;padding:0 20px;font-size:16px}.icon-btn{border-radius:var(--radius);width:44px;height:44px;color:var(--ink-2);background:0 0;border:0;flex:none;justify-content:center;align-items:center;display:inline-flex}.icon-btn:active{background:var(--surface-2)}.icon-btn[aria-pressed=true]{background:var(--accent-soft);color:var(--accent)}.icon-btn svg,.tool svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:22px;height:22px}.icon-btn svg circle{fill:currentColor;stroke:none}.link{color:var(--accent);text-underline-offset:3px;background:0 0;border:0;padding:0;font-weight:600;text-decoration:underline}.library{max-width:720px;padding:calc(20px + env(safe-area-inset-top)) 16px calc(28px + env(safe-area-inset-bottom));margin:0 auto}.library-head{margin-bottom:18px}.wordmark{letter-spacing:-.03em;color:var(--accent);margin:0;font-size:30px;font-weight:760}.library-head p{margin:2px 0 0}.library-actions{flex-wrap:wrap;gap:10px;margin-bottom:20px;display:flex}.library-actions .btn{flex:160px}.file-btn{position:relative}.file-btn input{opacity:0;cursor:pointer;width:100%;position:absolute;inset:0}.library-empty{text-align:center;padding:32px 0}.library-empty p{margin:4px 0}.graph-list{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.graph-row{border-bottom:1px solid var(--line);grid-template-columns:1fr auto;align-items:center;display:grid}.graph-open{text-align:left;background:0 0;border:0;flex-direction:column;gap:2px;min-width:0;min-height:64px;padding:12px 4px;display:flex}.graph-name{font-size:16px;font-weight:620}.graph-meta{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.row-actions,.rename{flex-wrap:wrap;grid-column:1/-1;gap:8px;padding:0 0 12px;display:flex}.rename{padding-top:10px}.rename .input{flex:180px}.library-foot{margin-top:28px;font-size:13px}.library-head{justify-content:space-between;align-items:flex-start;gap:12px;display:flex}.library-about{text-underline-offset:3px;align-items:center;min-height:44px;font-size:14px;font-weight:600;display:inline-flex}@media (min-width:900px){.library{max-width:1120px;padding-left:32px;padding-right:32px}.library .library-actions .btn{flex:none}.graph-list{grid-template-columns:minmax(0,1fr) minmax(0,1fr);align-items:start;column-gap:32px;display:grid}}.land{-webkit-font-smoothing:antialiased;font-size:1.0625rem;line-height:1.6}.land h1,.land h2,.land h3{text-wrap:balance}.land p,.land li{text-wrap:pretty}.land .btn{border-width:1.5px;border-radius:12px;min-height:48px;padding:0 20px;font-size:1rem;font-weight:700}.land .btn-small{border-radius:10px;min-height:44px;padding:0 14px;font-size:.92rem}.land mark{background:linear-gradient(transparent 58%, var(--mark) 58%, var(--mark) 92%, transparent 92%);color:inherit;padding:0 .08em}.land-hero{background:var(--night);color:var(--night-ink);padding:clamp(36px,6vw,80px) 0 clamp(48px,7vw,96px);position:relative;overflow:hidden}.land-hero:before{content:"";background:radial-gradient(closest-side, color-mix(in oklch, var(--bright) 12%, transparent), transparent 70%);pointer-events:none;width:70vw;max-width:900px;height:70vw;max-height:900px;position:absolute;inset:-40% -10% auto auto}.land-hero .site-wrap{gap:clamp(28px,4vw,44px);display:grid;position:relative}.land-hero .muted{color:var(--night-muted)}.land-hero a,.land-hero .link-button{color:var(--night-ink)}.land-hero :focus-visible{outline-color:var(--bright)}.land-hero .btn{--hover:1.08;border-color:var(--night-line);color:var(--night-ink);background:#ffffff05;background:lab(100% 0 0/.02)}.land-hero .btn-primary{background:var(--bright);color:var(--night);border-color:#0000}.land-chip{border:1px solid var(--night-line);color:var(--night-muted);border-radius:999px;align-items:center;gap:8px;margin:0 0 20px;padding:6px 12px 6px 10px;font-size:.88rem;font-weight:600;display:inline-flex}.land-chip:before{content:"";background:var(--bright);width:8px;height:8px;box-shadow:0 0 0 4px color-mix(in oklch, var(--bright) 18%, transparent);border-radius:50%}.land-headline{letter-spacing:-.035em;margin:0;font-size:clamp(2.5rem,1.5rem + 4.2vw,4.25rem);font-weight:800;line-height:.98}.land-headline span{color:var(--bright);display:block}.land-lede{max-width:34em;color:var(--night-muted);margin:0;font-size:clamp(1.08rem,1rem + .35vw,1.28rem);line-height:1.55}.land-cta{flex-wrap:wrap;gap:12px;margin-top:28px;display:flex}.land-promise{color:var(--night-muted);flex-wrap:wrap;gap:8px 20px;margin:26px 0 0;padding:0;font-size:.95rem;list-style:none;display:flex}.land-promise li{align-items:center;gap:8px;display:inline-flex}.land-promise svg{width:16px;height:16px;color:var(--bright)}.land-figure{min-width:0;margin:0}.land-picture{box-shadow:var(--shadow-night);border:1px solid #ffffff1a;border:1px solid lab(100% 0 0/.1);border-radius:16px;overflow:hidden}.land-picture svg{width:100%;height:auto;display:block}.land-figure figcaption{margin-top:12px;font-size:.9rem}.land-section{padding:clamp(56px,8vw,112px) 0}.land-section+.land-section{border-top:1px solid var(--line)}.land-alt{background:var(--surface-2)}.land-h2{letter-spacing:-.03em;max-width:760px;margin:0 0 clamp(28px,4vw,48px);font-size:clamp(1.9rem,1.35rem + 2vw,3rem);font-weight:800;line-height:1.06}.land h3{letter-spacing:-.01em;margin:0;font-size:1.25rem;font-weight:750}.land-claims{gap:clamp(24px,4vw,48px);margin:0;padding:0;list-style:none;display:grid}.land-claims li{border-top:2px solid var(--accent);color:var(--ink-2);padding-top:14px}.land-claims strong{color:var(--ink);letter-spacing:-.01em;margin-bottom:6px;font-size:1.25rem;font-weight:750;display:block}.land-ways{gap:16px;display:grid}.land-way,.land-more-list li,.land-poster{border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-card);border-radius:20px}.land-way{flex-direction:column;gap:12px;min-width:0;padding:clamp(20px,3vw,32px);display:flex}.land-way p,.land-more-list p,.land-poster p{color:var(--ink-2);margin:0}.land-way-actions{flex-wrap:wrap;gap:10px;margin-top:auto;display:flex}.copy-line{flex-wrap:wrap;align-items:center;gap:8px;margin-top:auto;display:flex}.copy-line-text{background:var(--surface-2);font-family:var(--mono);overflow-wrap:anywhere;-webkit-user-select:all;user-select:all;border-radius:8px;flex:100%;padding:10px 12px;font-size:13.5px;line-height:1.45}.copy-line-said{font-size:13px}.land-way .copy-line-text{background:var(--night);color:var(--night-ink);border-radius:12px;padding:14px 16px;font-size:.9rem;line-height:1.6}.land-device{margin-top:24px}.land-empty{text-align:left;padding:4px 0 12px}.land-device .library-actions{margin-bottom:12px}.land-strip-list{grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin:0;padding:0;list-style:none;display:grid}.land-tile{border:1px solid var(--line);background:var(--surface);height:100%;color:var(--ink);border-radius:14px;flex-direction:column;gap:8px;padding:10px 10px 12px;font-size:.95rem;font-weight:650;line-height:1.25;text-decoration:none;display:flex}.land-tile-glyph{background:var(--bg);border-radius:8px;height:64px;padding:6px}.land-poster h3{margin-bottom:8px}.land-poster{align-items:center;gap:20px;margin-top:clamp(28px,4vw,48px);padding:clamp(16px,3vw,28px);display:grid}.land-poster>a{border:1px solid var(--line);border-radius:12px;display:block;overflow:hidden}.land-poster img{aspect-ratio:3/2;object-fit:cover;object-position:top;width:100%;height:auto;display:block}.land-more-list{gap:16px;margin:0;padding:0;list-style:none;display:grid}.land-more-list li{align-content:start;gap:8px;padding:clamp(20px,3vw,28px);display:grid}.land-honest p{max-width:62ch;color:var(--ink-2);margin:0;font-size:1.25rem;line-height:1.5}.land .btn,.land-tile,.template-row{transition:border-color .16s ease-out,background-color .16s ease-out,transform .16s ease-out}@media (hover:hover){.land-hero .btn:hover{border-color:var(--night-muted);background:#ffffff12;background:lab(100% 0 0/.07)}.land-hero .btn-primary:hover{background:var(--bright);border-color:#0000}.land-tile:hover,.template-row:hover{border-color:var(--line-strong);transform:translateY(-1px)}}@media (min-width:640px){.land-strip-list{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:760px){.land-claims,.land-more-list{grid-template-columns:repeat(3,minmax(0,1fr))}.land-ways{grid-template-columns:minmax(0,1fr) minmax(0,1fr)}.land-poster{grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:clamp(24px,4vw,48px)}.land-device .library-actions .btn{flex:none}}@media (min-width:980px){.land-hero .site-wrap{grid-template:"title figure""copy figure"1fr/minmax(0,1fr) minmax(0,420px);align-items:start;column-gap:clamp(40px,6vw,88px)}.land-hero-title{grid-area:title;padding-top:24px}.land-hero-text{grid-area:copy}.land-figure{grid-area:figure}.land-strip-list{grid-template-columns:repeat(6,minmax(0,1fr))}}@media (prefers-reduced-motion:reduce){.land .btn,.land-tile,.template-row{transition:none}.land-tile:hover,.template-row:hover{transform:none}}.notice{border-radius:var(--radius);background:var(--warning-soft);color:var(--warning);padding:10px 12px;font-size:14px}.loading,.notfound{text-align:center;height:100%;color:var(--ink-2);place-content:center;gap:12px;display:grid}.editor{overscroll-behavior:none;grid-template-rows:auto auto minmax(0,1fr) auto;grid-template-columns:minmax(0,1fr);height:100dvh;display:grid;overflow:hidden}.topbar{padding:calc(6px + env(safe-area-inset-top)) 8px 6px 4px;background:var(--surface);border-bottom:1px solid var(--line);z-index:var(--z-chrome);align-items:center;gap:6px;display:flex}.title-btn{text-align:left;background:0 0;border:0;border-radius:8px;flex-direction:column;flex:1;justify-content:center;min-width:0;min-height:44px;padding:2px 6px;display:flex}.title-btn:active{background:var(--surface-2)}.title-name{text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:650;overflow:hidden}.title-sub{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.status{white-space:nowrap;border:1px solid #0000;border-radius:999px;flex:none;min-height:36px;padding:0 12px;font-size:13px;font-weight:650;position:relative}.status:before{content:"";position:absolute;inset:-4px 0}.status-ok{background:var(--ok-soft);color:var(--ok)}.status-warning{background:var(--warning-soft);color:var(--warning)}.status-error{background:var(--error-soft);color:var(--error)}.topbar-export{min-height:40px;padding:0 14px}.editor>.topbar{grid-row:1}.editor>.editor-notice{grid-row:2}.editor>.stage{grid-row:3}.editor>.sheet{grid-row:4}.stage{background:var(--bg);min-height:0;position:relative}.stage .react-flow{--xy-background-pattern-dots-color-default:var(--dots);--xy-edge-stroke-default:var(--edge);background:var(--bg)}.react-flow__attribution{opacity:.55;background:0 0;font-size:9px}.react-flow__attribution a{color:var(--ink-3)}.toolbar{left:50%;bottom:calc(12px + env(safe-area-inset-bottom));border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);z-index:var(--z-toolbar);border-radius:16px;gap:2px;max-width:calc(100% - 16px);padding:4px;display:flex;position:absolute;transform:translate(-50%)}.has-sheet .toolbar{bottom:12px}.tool{min-width:60px;min-height:52px;color:var(--ink-2);background:0 0;border:0;border-radius:12px;flex-direction:column;justify-content:center;align-items:center;gap:2px;padding:4px 8px;font-size:12px;font-weight:600;display:flex}.tool:active{background:var(--surface-2)}.tool[aria-pressed=true]{background:var(--accent-soft);color:var(--accent)}.tool:disabled{opacity:.4;cursor:default}.loop-legend{z-index:var(--z-overlay);pointer-events:none;flex-wrap:wrap;gap:6px;display:flex;position:absolute;top:10px;left:10px;right:80px}.loop-pill{border:1px solid var(--line);background:var(--surface);min-height:34px;box-shadow:var(--shadow);color:var(--ink-2);pointer-events:auto;border-radius:999px;align-items:center;gap:7px;padding:0 12px;font-size:13px;font-weight:600;display:inline-flex;position:relative}.loop-pill:before{content:"";position:absolute;inset:-5px -2px}.loop-pill.is-on{border-color:var(--loop);color:var(--ink)}.loop-dot{background:var(--loop);border-radius:50%;flex:none;width:9px;height:9px;display:inline-block}.mode-banner{border:1px solid var(--accent);background:var(--accent-soft);color:var(--ink);z-index:var(--z-banner);box-shadow:var(--shadow);border-radius:12px;align-items:center;gap:10px;padding:8px 8px 8px 12px;font-size:14px;font-weight:550;display:flex;position:absolute;top:8px;left:8px;right:8px}.mode-banner span{flex:1}.empty-canvas{text-align:center;pointer-events:none;place-content:center;padding:0 32px 100px;display:grid;position:absolute;inset:0}.empty-canvas p{margin:3px 0}.sheet{background:var(--surface);border-top:1px solid var(--line);min-height:0;max-height:52dvh;box-shadow:var(--shadow-up);z-index:var(--z-chrome);border-radius:16px 16px 0 0;flex-direction:column;animation:.18s ease-out sheet-in;display:flex}@keyframes sheet-in{0%{opacity:0;transform:var(--sheet-from,translateY(14px))}}.sheet-expanded .sheet{max-height:86dvh}.sheet-expanded{grid-template-rows:auto auto minmax(72px,1fr) auto}.mode-active .sheet-body{display:none}.mode-active .sheet-toggle{visibility:hidden}.sheet-head{border-bottom:1px solid var(--line);align-items:center;gap:2px;padding:6px 6px 6px 16px;display:flex;position:relative}.sheet-grip{touch-action:none;cursor:grab;z-index:1;width:112px;height:22px;margin-left:-56px;position:absolute;top:0;left:50%}.sheet-grip:before{content:"";background:var(--line-strong);border-radius:2px;width:36px;height:4px;margin-left:-18px;position:absolute;top:5px;left:50%}.sheet.is-dragged{animation:none}.mode-active .sheet-grip{visibility:hidden}.sheet-title{flex:1;min-width:0;padding-top:6px}.sheet-title h2{margin:0;font-size:16px;font-weight:680}.sheet-sub{color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:13px;display:block;overflow:hidden}.sheet-body{overscroll-behavior:contain;-webkit-overflow-scrolling:touch;padding-bottom:env(safe-area-inset-bottom);overflow-y:auto}@media (min-width:900px){.editor{grid-template-rows:auto auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) 400px}.editor>.editor-notice{grid-column:1}.editor:not(.has-sheet){grid-template-columns:minmax(0,1fr)}.topbar{grid-column:1/-1}.editor>.sheet,.sheet-expanded .sheet{border-top:0;border-left:1px solid var(--line);max-height:none;box-shadow:none;border-radius:0;grid-area:2/2/-1}.sheet-grip,.sheet-toggle{display:none}}.inspector{padding:12px 16px 28px}.inspector-actions{flex-wrap:wrap;gap:8px;margin-bottom:14px;display:flex}.field{margin-bottom:14px}.field-label{color:var(--ink-2);margin-bottom:6px;font-size:13px;font-weight:620;display:block}.field-hint{color:var(--ink-3);margin-top:5px;font-size:13px}.level-list{margin:0;padding-left:1.1em}.level-list li+li{margin-top:2px}.level-list .is-on{color:var(--ink)}.input{border:1px solid var(--line-strong);border-radius:var(--radius);background:var(--surface);width:100%;min-height:44px;padding:10px 12px;font-size:16px;line-height:1.35;display:block}.input:focus{outline:2px solid var(--focus);outline-offset:-1px;border-color:#0000}.input.mono{font-size:15px}.textarea{resize:vertical;min-height:72px}.select{appearance:none;background-image:linear-gradient(45deg, transparent 50%, var(--ink-3) 50%), linear-gradient(135deg, var(--ink-3) 50%, transparent 50%);background-position:calc(100% - 18px),calc(100% - 13px);background-repeat:no-repeat;background-size:5px 5px;padding-right:36px}.segmented{background:var(--surface-2);border-radius:12px;flex-wrap:wrap;gap:3px;padding:3px;display:flex}.seg{min-height:40px;color:var(--ink-2);background:0 0;border:0;border-radius:9px;flex:auto;padding:0 10px;font-size:14px}.seg-on{background:var(--surface);color:var(--ink);box-shadow:var(--shadow);font-weight:650}.chips{flex-wrap:wrap;gap:6px;display:flex}.chip{border:1px solid var(--line-strong);background:var(--surface);min-height:44px;color:var(--ink-2);border-radius:999px;align-items:center;gap:6px;padding:0 12px;font-size:14px;display:inline-flex}.chip-on{border-color:var(--accent);background:var(--accent-soft);color:var(--ink);font-weight:600}.chip-small{font-size:13px}.inline-add{gap:8px;margin-top:8px;display:flex}.inline-add .input{flex:1;min-width:0}.toggle{cursor:pointer;align-items:center;gap:12px;min-height:44px;display:flex}.toggle input{opacity:0;width:1px;height:1px;position:absolute}.toggle-track{background:var(--line-strong);border-radius:14px;flex:none;width:46px;height:28px;transition:background .15s;position:relative}.toggle-track:after{content:"";background:var(--surface);border-radius:50%;width:22px;height:22px;transition:transform .15s;position:absolute;top:3px;left:3px;box-shadow:0 1px 2px #00000040}.toggle input:checked+.toggle-track{background:var(--accent)}.toggle input:checked+.toggle-track:after{transform:translate(18px)}.toggle input:focus-visible+.toggle-track{outline:2px solid var(--focus);outline-offset:2px}.toggle-label{font-weight:550}.section{border-top:1px solid var(--line);margin-top:8px;padding-top:14px}.section-head{justify-content:space-between;align-items:center;gap:8px;margin-bottom:10px;display:flex}.section-head h3{letter-spacing:.01em;margin:0;font-size:14px;font-weight:720}.card{border:1px solid var(--line);background:var(--surface-2);border-radius:12px;margin-bottom:10px;padding:12px 12px 4px}.card .input{background-color:var(--surface)}.card-head{align-items:flex-start;gap:10px;display:flex}.card-head .field{flex:1}.card-index{background:var(--surface);border:1px solid var(--line-strong);border-radius:50%;flex:none;place-content:center;width:28px;height:28px;margin-top:26px;font-size:13px;font-weight:700;display:grid}.card-actions{justify-content:flex-end;gap:4px;margin:-4px -6px 4px 0;display:flex}.more{border-top:1px solid var(--line);margin:4px 0 8px}.more>summary{min-height:48px;color:var(--ink-2);cursor:pointer;align-items:center;font-size:14px;font-weight:650;list-style:none;display:flex}.more>summary::-webkit-details-marker{display:none}.more>summary:before{content:"";border-bottom:2px solid;border-right:2px solid;width:7px;height:7px;margin:0 12px 0 4px;transition:transform .15s;transform:rotate(-45deg)}.more[open]>summary:before{transform:rotate(45deg)}.danger-zone{border-top:1px solid var(--line);margin-top:18px;padding-top:16px}.edge-route{margin:0 0 12px;font-size:16px}.pins .pin-row{align-items:center;gap:10px;display:flex}.pin-model{flex:1}.readonly{grid-template-columns:auto 1fr;gap:6px 14px;margin:0;font-size:14px;display:grid}.readonly dt{color:var(--ink-3)}.readonly dd{margin:0}.readonly-item{display:block}.empty{color:var(--ink-3);padding:16px}.add-menu{gap:10px;padding:12px 16px 24px;display:grid}@media (min-width:560px){.add-menu{grid-template-columns:1fr 1fr}}.add-kind{border:1px solid var(--line-strong);background:var(--surface);text-align:left;border-radius:12px;flex-direction:column;gap:2px;min-height:64px;padding:12px 14px;display:flex}.add-kind:active{background:var(--surface-2)}.add-kind-name{align-items:center;gap:9px;font-size:16px;font-weight:650;display:flex}.add-kind-hint{color:var(--ink-2);padding-left:19px;font-size:13.5px}.kind-mark{background:var(--kind);flex:none;width:10px;height:10px;display:inline-block}.kind-agent{border-radius:50%}.kind-human-gate{border-radius:1px;width:9px;height:9px;margin:0 .5px;transform:rotate(45deg)}.kind-check{border-radius:2px}.kind-merge{clip-path:polygon(50% 0,100% 100%,0 100%)}.kind-stop{clip-path:polygon(30% 0,70% 0,100% 30%,100% 70%,70% 100%,30% 100%,0 70%,0 30%)}.add-agent,.gnode-agent,.kind-agent{--kind:var(--kind-agent)}.add-human-gate,.gnode-human-gate,.kind-human-gate{--kind:var(--kind-human-gate)}.add-check,.gnode-check,.kind-check{--kind:var(--kind-check)}.gnode-merge,.kind-merge{--kind:var(--kind-merge)}.add-stop,.gnode-stop,.kind-stop{--kind:var(--kind-stop)}.all-clear{background:var(--ok-soft);color:var(--ok);border-radius:12px;margin:4px 0;padding:12px;font-weight:600}.issue-summary{color:var(--ink-2);margin:0 0 12px;font-size:14px}.issues{margin:0;padding:0;list-style:none}.issues li{margin-bottom:12px}.issue{border:1px solid var(--line);background:var(--surface);text-align:left;border-radius:10px;flex-direction:column;gap:4px;width:100%;padding:10px 12px;display:flex}.issue-error{--sev:var(--error)}.issue-warning{--sev:var(--warning)}.issue-active{background:var(--surface-2);outline:2px solid var(--highlight);outline-offset:-1px}.issue-head{align-items:baseline;gap:8px;display:flex}.issue-severity{color:var(--sev);align-items:center;gap:6px;font-size:13px;font-weight:700;display:inline-flex}.issue-severity:before{content:"";background:var(--sev);width:9px;height:9px}.issue-error .issue-severity:before{border-radius:50%}.issue-warning .issue-severity:before{clip-path:polygon(50% 0,100% 100%,0 100%)}.issue-code{color:var(--ink-2);font-size:12.5px}.issue-message{font-size:14px}.issue-at{flex-wrap:wrap;gap:6px;margin-top:6px;display:flex}.refusal{border:1px solid var(--error);background:var(--error-soft);border-radius:12px;margin-bottom:14px;padding:12px}.refusal p{margin:0 0 6px}.refusal .refusal-hint{font-weight:600}.warnings{background:var(--warning-soft);border-radius:12px;margin:12px 0;padding:10px 12px}.warnings p{color:var(--warning);margin:0 0 6px;font-weight:600}.issue-lines{font-family:var(--mono);white-space:pre-wrap;word-break:break-word;margin:8px 0;font-size:12px}.export-actions{flex-direction:column;gap:8px;display:flex}.files-title{margin:18px 0 8px;font-size:14px;font-weight:720}.files{border-top:1px solid var(--line);margin:0;padding:0;list-style:none}.files li{border-bottom:1px solid var(--line)}.file{text-align:left;background:0 0;border:0;justify-content:space-between;align-items:center;gap:10px;width:100%;min-height:44px;padding:8px 2px;display:flex}.file-path{word-break:break-all;min-width:0;font-size:13px}.file-size{color:var(--ink-3);flex:none;font-size:12px}.file-body{background:var(--surface-2);max-height:50dvh;font-family:var(--mono);white-space:pre-wrap;word-break:break-word;border-radius:8px;margin:0 0 10px;padding:10px;font-size:12px;overflow:auto}.gnode{border:1px solid var(--line-strong);background:var(--surface);width:200px;min-height:72px;box-shadow:var(--shadow);outline-offset:7px;border-radius:10px;outline-color:#0000;padding:9px 12px 10px;transition:opacity .15s,outline-color .16s,outline-offset .16s ease-out;position:relative}.gnode-stop{border-radius:22px;padding-left:16px}.gnode-kind{color:var(--kind);align-items:center;gap:6px;font-size:12px;font-weight:650;display:flex}.gnode-name{overflow-wrap:anywhere;margin-top:1px;font-size:15px;font-weight:650;line-height:1.25}.gnode-sub{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;margin-top:2px;font-size:12.5px;overflow:hidden}.gnode-loops{gap:4px;display:flex;position:absolute;top:9px;right:10px}.gnode-issue{border:2px solid var(--surface);border-radius:50%;width:14px;height:14px;position:absolute;top:-6px;right:-6px}.issue-dot-error{background:var(--error)}.issue-dot-warning{background:var(--warning)}.gnode.in-loop{outline:2px solid var(--loop);outline-offset:2px}.gnode.is-selected{outline:2.5px solid var(--accent);outline-offset:2px}.gnode.is-highlighted{outline:3px solid var(--highlight);outline-offset:3px}.gnode.is-source{outline:2.5px dashed var(--accent);outline-offset:3px;animation:1.2s ease-in-out infinite pulse}.gnode.is-picked{outline:3px solid var(--loop);outline-offset:2px}.gnode.is-unpicked{opacity:.55}@keyframes pulse{50%{outline-offset:6px}}@media (prefers-reduced-motion:reduce){.gnode.is-source,.sheet{animation:none}.gnode{transition:none}}.ghandle{opacity:0;pointer-events:none}.react-flow__node{cursor:pointer}.react-flow__node:focus-visible{outline:0}.react-flow__node:focus-visible .gnode{outline:2px solid var(--focus);outline-offset:5px}.react-flow__node.dragging{cursor:grabbing}.gedge{color:var(--edge)}.gedge-hit{pointer-events:stroke;cursor:pointer}.gedge-line{stroke:currentColor;stroke-width:1.7px}.gedge-arrow{fill:currentColor}.gedge.is-back{color:var(--loop)}.gedge.is-back .gedge-line{stroke-dasharray:7 5}.gedge.has-error{color:var(--error)}.gedge.is-selected{color:var(--accent)}.gedge.is-selected .gedge-line,.gedge.is-highlighted .gedge-line,.gedge.is-picked .gedge-line{stroke-width:3px}.gedge.is-highlighted{color:var(--highlight)}.gedge.is-picked{color:var(--loop)}.gedge.is-unpicked{opacity:.4}.react-flow__viewport-portal{z-index:1;pointer-events:none}.gedge-label{border:1px solid var(--line-strong);background:var(--surface);min-height:28px;color:var(--ink-2);pointer-events:all;white-space:nowrap;border-radius:999px;align-items:center;gap:5px;padding:0 10px;font-size:12px;font-weight:650;display:inline-flex;position:absolute}.gedge-label:before{content:"";position:absolute;inset:-10px -6px}.gedge-label.is-quiet{border-width:2px;border-color:var(--edge);width:14px;height:14px;min-height:0;padding:0}.gedge-label.is-quiet:before{inset:-15px}.gedge-label.is-back{border-color:var(--loop);color:var(--loop)}.gedge-label.is-selected{background:var(--accent);border-color:var(--accent);color:var(--accent-ink)}.gedge-label.is-picked{background:var(--loop);border-color:var(--loop);color:var(--surface)}.gedge-approval{background:var(--warning-soft);color:var(--warning);border-radius:999px;padding:1px 6px;font-size:11px;font-weight:700}.viewer .stage .react-flow__node{cursor:pointer}.viewer-bar{left:12px;right:12px;bottom:calc(12px + env(safe-area-inset-bottom));border:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow);z-index:var(--z-toolbar);border-radius:14px;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px 12px;padding:8px 8px 8px 14px;display:flex;position:absolute}.view-fit,.canvas-size{bottom:calc(12px + env(safe-area-inset-bottom));z-index:var(--z-overlay);border:1px solid var(--line);background:var(--surface);min-height:44px;box-shadow:var(--shadow);color:var(--ink-2);pointer-events:all;border-radius:999px;align-items:center;gap:6px;padding:0 14px;font-size:13px;font-weight:600;display:inline-flex;position:absolute}.view-fit{right:10px}.canvas-size{left:10px}.view-fit svg,.canvas-size svg{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;width:18px;height:18px}.view-fit:active,.canvas-size:active{background:var(--surface-2)}.viewer .view-fit{bottom:calc(108px + env(safe-area-inset-bottom))}@media (max-width:899px){.viewer.has-sheet .view-fit{bottom:12px}}.viewer-note{color:var(--ink-3);flex:160px;font-size:13px}.viewer-saved{flex:1;margin:0;padding:6px 0;font-size:14px}.has-sheet .viewer-bar{display:none}@media (min-width:900px){.has-sheet .viewer-bar{display:flex}}.readonly-row{display:contents}.readonly dd .prose,.readonly dd .plain-list{margin:0}.prose{white-space:pre-wrap;overflow-wrap:anywhere}.plain-list{margin:0;padding-left:18px}.link-problem{max-width:560px;padding:calc(40px + env(safe-area-inset-top)) 20px 32px;margin:0 auto}.link-problem h1{letter-spacing:-.01em;margin:0 0 10px;font-size:22px;font-weight:700}.link-problem p{margin:0 0 14px}.link-problem .btn{margin-top:8px}.compare{--gutter:16px;flex-direction:column;min-height:100dvh;display:flex}.compare-top{padding:calc(8px + env(safe-area-inset-top)) var(--gutter) 2px 4px;align-items:center;gap:6px;display:flex}.compare-heading{flex:1;min-width:0}.overline{letter-spacing:.02em;color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:650;display:block;overflow:hidden}.compare-heading h1{letter-spacing:-.01em;margin:0;font-size:19px;font-weight:720;line-height:1.25}.compare-brief{padding:4px var(--gutter) 10px;color:var(--ink-2);font-size:14px}.compare-brief>p{margin:0}.compare-brief .is-clamped{-webkit-line-clamp:3;line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.compare-saved{color:var(--ok);margin:8px 0 0;font-weight:600}.cards{padding:4px var(--gutter) 16px;scroll-snap-type:x mandatory;scroll-padding-inline:var(--gutter);overscroll-behavior-x:contain;scrollbar-width:none;align-items:flex-start;gap:10px;display:flex;overflow-x:auto}.cards::-webkit-scrollbar{display:none}.ccard{scroll-snap-align:center;scroll-snap-stop:always;border:1px solid var(--line);background:var(--surface);max-width:460px;box-shadow:var(--shadow);border-radius:16px;flex-direction:column;flex:0 0 calc(100% - 22px);gap:12px;min-width:0;padding:14px 14px 16px;display:flex}.cards>.ccard:only-child{flex-basis:100%}.ccard.is-recommended{border-color:var(--accent);box-shadow:0 0 0 1px var(--accent), var(--shadow)}.ccard-head{flex-direction:column;gap:4px;display:flex}.ccard-title{align-items:center;gap:8px;display:flex}.ccard-title h2{letter-spacing:-.02em;overflow-wrap:anywhere;margin:0;font-size:23px;font-weight:760;line-height:1.15}.ccard-index{font-variant-numeric:tabular-nums;margin-left:auto;font-size:12px}.badge{background:var(--accent);color:var(--accent-ink);border-radius:999px;flex:none;padding:3px 9px;font-size:12px;font-weight:700}.ccard-why{background:var(--accent-soft);border-radius:10px;margin:0;padding:7px 10px;font-size:13.5px;line-height:1.4}.ccard-based{font-size:12.5px}.credits{color:var(--ink-3);margin:0;padding:0;font-size:12.5px;line-height:1.4;list-style:none}.credits li+li{margin-top:2px}.ccard-profile{flex-wrap:wrap;align-content:flex-start;align-items:flex-start;gap:6px;margin:0;padding:0;list-style:none;display:flex}.pchip{border:1px solid var(--line-strong);color:var(--ink-2);border-radius:999px;align-items:center;gap:6px;padding:4px 10px 4px 8px;font-size:13px;font-weight:600;display:inline-flex}.meter{align-items:flex-end;gap:2px;height:11px;display:inline-flex}.meter i{background:var(--line-strong);border-radius:1px;width:3px}.meter i:first-child{height:5px}.meter i:nth-child(2){height:8px}.meter i:nth-child(3){height:11px}.meter[data-level="1"] i:first-child,.meter[data-level="2"] i:nth-child(-n+2),.meter[data-level="3"] i{background:var(--accent)}.ccard-shape p{margin:0}.shape-line{font-variant-numeric:tabular-nums;font-size:14px;font-weight:650}.tier-line{font-size:13px}.ccard-rationale{margin:0;font-size:14.5px;line-height:1.5}.ccard-status{flex-wrap:wrap;align-items:baseline;gap:6px 8px;font-size:13px;display:flex}.ccard-status .status{min-height:26px;padding:3px 10px}.ccard-status .status:before{content:none}.ccard-issues{color:var(--ink-2);flex-basis:100%;margin:0;padding-left:18px}.ccard-issues .mono{color:var(--warning);font-size:11.5px}.ccard-list h3{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:0 0 4px;font-size:12px;font-weight:700}.ccard-list p{margin:0;font-size:14px}.pros,.cons{margin:0;padding:0;font-size:14px;list-style:none}.pros li,.cons li{padding-left:20px;position:relative}.pros li+li,.cons li+li{margin-top:4px}.pros li:before,.cons li:before{font-weight:800;position:absolute;top:0;left:2px}.pros li:before{content:"+";color:var(--ok)}.cons li:before{content:"−";color:var(--warning)}.ccard-canvas{flex-direction:column;align-items:flex-start;gap:8px;display:flex}.ccard-actions{display:none}.compare-bar{padding:8px var(--gutter) calc(10px + env(safe-area-inset-bottom));border-top:1px solid var(--line);background:var(--surface);box-shadow:var(--shadow-up);z-index:var(--z-chrome);margin-top:auto;position:sticky;bottom:0}.pager{align-items:center;gap:2px;margin-bottom:6px;display:flex}.pager-dot{background:0 0;border:0;width:28px;height:28px;position:relative}.pager-dot:after{content:"";background:var(--line-strong);border-radius:50%;transition:transform .15s;position:absolute;inset:10px}.pager-dot[aria-current=true]:after{background:var(--accent);transform:scale(1.35)}.pager-count{color:var(--ink-3);font-variant-numeric:tabular-nums;margin-left:6px;font-size:13px}.actions-row{gap:8px;display:flex}.actions-row .btn{flex:1 1 0;min-width:0;padding:0 12px}.actions-row .btn-primary{text-overflow:ellipsis;overflow:hidden}.actions-note{color:var(--ink-2);overflow-wrap:anywhere;margin:6px 0 0;font-size:13px}.selectable{-webkit-user-select:all;user-select:all}@media (min-width:900px){.compare{--gutter:28px;max-width:1400px;margin:0 auto}.compare-top{padding-top:calc(18px + env(safe-area-inset-top))}.compare-heading h1{font-size:24px}.compare-brief{max-width:78ch;font-size:15px}.compare-brief .is-clamped{-webkit-line-clamp:unset;line-clamp:none;display:block}.compare-brief>.link{display:none}.cards{grid-template-columns:repeat(var(--cards), minmax(0, 1fr));grid-template-rows:repeat(9,auto);gap:0 16px;padding-bottom:32px;display:grid;overflow:visible}.ccard{grid-row:span 9;grid-template-rows:subgrid;gap:0;max-width:none;padding:18px 18px 20px;display:grid}.ccard>*{padding-bottom:14px}.ccard>.ccard-list{border-top:1px solid var(--line);padding-top:12px}.ccard-actions{padding-bottom:0;display:block}.compare-bar{display:none}}.screen-head{align-items:flex-start;gap:6px;margin:0 0 14px -12px;display:flex}.screen-head h1{letter-spacing:-.02em;margin:4px 0 0;font-size:24px;font-weight:740;line-height:1.2}.screen-head p{margin:2px 0 0}.screen-head .overline{white-space:normal;margin-top:4px}.list-title{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);margin:22px 0 8px;padding:0;font-size:13px;font-weight:720}.template-list,.insert-list,.slot-list,.id-map{margin:0;padding:0;list-style:none}.template-list{gap:10px;display:grid}@media (min-width:640px){.template-list{grid-template-columns:1fr 1fr}}.template-list>li{display:flex}.template-list>li>.template-row{flex:auto}@media (min-width:900px){.template-list{grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}.template-list .template-row{flex-direction:column;align-items:stretch;gap:10px;padding:12px}.template-list .template-glyph,.template-list .template-glyph.is-long{width:100%;height:84px}}.template-row,.insert-row{border:1px solid var(--line);background:var(--surface);width:100%;min-height:64px;color:var(--ink);text-align:left;box-shadow:var(--shadow);border-radius:12px;flex-direction:column;gap:6px;padding:12px 14px;text-decoration:none;display:flex}.template-row{flex-direction:row;align-items:flex-start;gap:12px;padding:10px 12px 10px 10px}.template-row:active,.insert-row:active{background:var(--surface-2)}.template-text{flex-direction:column;flex:auto;gap:3px;min-width:0;display:flex}.template-title{flex-wrap:wrap;align-items:center;gap:8px;font-size:16px;font-weight:660;line-height:1.25;display:flex}.template-when,.template-not,.insert-summary{color:var(--ink-2);font-size:14px;line-height:1.4}.template-row .template-when{-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;line-height:1.35;display:-webkit-box;overflow:hidden}.template-label{color:var(--ink);font-weight:700}.template-not .template-label{color:var(--warning)}.template-profile{margin-top:2px}.template-meters{gap:12px;margin:2px 0 0;padding:0;list-style:none;display:flex}.template-meter{letter-spacing:.02em;color:var(--ink-3);align-items:center;gap:5px;font-size:11.5px;font-weight:600;display:inline-flex}.glyph{display:block}.glyph svg{width:100%;height:100%;display:block}.template-glyph{background:var(--bg);border-radius:8px;flex:none;width:92px;height:58px;padding:4px}.graph-glyph{background:var(--surface-2);border-radius:6px;flex:none;width:72px;height:44px;padding:3px}.graph-open{flex-direction:row;align-items:center;gap:12px}.graph-text{flex-direction:column;gap:2px;min-width:0;display:flex}.template-row.has-long-glyph,.graph-open.has-long-glyph{flex-direction:column;align-items:stretch;gap:8px}.template-glyph.is-long,.graph-glyph.is-long{width:100%;height:64px}.ccard-glyph{border:1px solid var(--line);background:var(--bg);border-radius:12px;width:100%;max-height:180px;padding:10px 12px}.ccard-glyph svg{max-height:160px;margin:0 auto}.glyph-card{margin:0 0 12px}.glyph-large{border:1px solid var(--line);background:var(--bg);border-radius:12px;width:100%;max-height:200px;padding:12px}.glyph-large svg{max-height:176px;margin:0 auto}.glyph-actions{flex-wrap:wrap;gap:8px;margin-top:8px;display:flex}.glyph-note{margin-top:6px}.browse{gap:8px;margin-bottom:4px;display:grid}.browse-row{align-items:center;gap:8px;display:flex}.browse-q{flex:auto;min-width:0}.browse-toggle{flex:none;gap:6px}.browse-toggle.is-on{border-color:var(--accent);color:var(--accent)}.browse-count{background:var(--accent);min-width:20px;height:20px;color:var(--accent-ink);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:12px;font-weight:700;display:inline-flex}.browse-meta{min-height:36px;font-size:13.5px}.browse-shown{font-variant-numeric:tabular-nums;flex:auto}.browse-sort{align-items:center;gap:6px;display:inline-flex}.browse-sort .input{width:auto;min-height:36px;padding:4px 8px;font-size:14px}.browse-clear{font-size:13.5px}.browse-filters{border:1px solid var(--line);background:var(--surface);border-radius:12px;gap:10px;padding:10px 12px 12px;display:grid}.browse-group{gap:6px;display:grid}.browse-group-label{letter-spacing:.04em;text-transform:uppercase;color:var(--ink-3);font-size:12px;font-weight:720}.browse-chips .chip{min-height:40px}.chip-more{color:var(--accent);border-style:dashed}.browse-none,.templates .list-title{margin-top:16px}.templates-hint{margin-top:20px;font-size:14px}.badge-quiet{background:var(--surface-2);color:var(--ink-2);font-weight:650}.template-details .ccard-profile{margin:10px 0 6px}.template-details .credits{margin:2px 0 12px}.template-use{width:100%;margin:4px 0 6px}.slot-list{gap:8px;display:grid}.slot-list li{background:var(--surface-2);border-radius:10px;flex-direction:column;gap:2px;padding:9px 12px;display:flex}.slot-ask{font-weight:600}.slot-key{color:var(--accent);font-size:13px}.slot-example{color:var(--ink-2);font-size:13.5px}.use-form{gap:4px;display:grid}.use-form .slots{border:0;min-width:0;margin:8px 0 0;padding:0}.use-form .slots .list-title{margin-top:8px}.use-actions{padding:12px 16px calc(12px + env(safe-area-inset-bottom));background:var(--bg);border-top:1px solid var(--line);gap:4px;margin:12px -16px 0;display:grid;position:sticky;bottom:0}.insert-list{gap:8px;margin-top:10px;display:grid}.insert-row{box-shadow:none;border-color:var(--line-strong)}.insert-chosen{margin:4px 0 12px}.id-map{gap:2px;margin-bottom:10px;font-size:14px;display:grid}.id-map li{color:var(--ink-3);padding:4px 0}.id-map li.is-renamed{color:var(--ink);font-weight:650}.add-template{border-style:dashed}.kind-template{--kind:var(--accent);width:10px;height:10px;box-shadow:3px 3px 0 -1px var(--surface), 3px 3px 0 0 var(--accent);border-radius:2px}.title-btn.is-highlighted{box-shadow:inset 0 0 0 2px var(--highlight)}.persist-notice,.offer,.rename-warning{border:1px solid var(--line-strong);background:var(--surface);border-radius:12px;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0 0 14px;padding:10px 12px;font-size:14px;display:flex}.persist-notice p,.offer p,.rename-warning p{flex:220px;margin:0}.persist-notice.is-granted{border-color:var(--ok);background:var(--ok-soft)}.persist-notice.is-denied,.rename-warning{border-color:var(--warning);background:var(--warning-soft)}.offer{border-color:var(--accent);background:var(--accent-soft)}.offer-actions{flex-wrap:wrap;gap:8px;display:flex}.rename{flex-direction:column}.rename-row{flex-wrap:wrap;gap:8px;display:flex}.rename-row .input{flex:180px}.rename-warning{margin:0}.inspector .rename-warning{margin:0 0 12px}.editor-notice{margin:6px 8px 0;padding:6px 6px 6px 12px;font-size:13.5px;line-height:1.35}.toast{left:50%;bottom:calc(84px + env(safe-area-inset-bottom));background:var(--ink);max-width:calc(100% - 24px);color:var(--bg);box-shadow:var(--shadow);z-index:var(--z-banner);border-radius:12px;align-items:center;gap:4px;padding:4px 4px 4px 16px;font-size:14px;font-weight:560;animation:.16s ease-out toast-in;display:flex;position:absolute;transform:translate(-50%)}.toast span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.toast-action{min-width:64px;min-height:44px;color:inherit;text-underline-offset:3px;background:0 0;border:0;border-radius:9px;flex:none;padding:0 14px;font-weight:750;text-decoration:underline}.toast-action:active{background:color-mix(in oklch, var(--bg) 18%, transparent)}@keyframes toast-in{0%{opacity:0;transform:translate(-50%,8px)}}@media (max-width:899px){.sheet-expanded .toolbar,.sheet-expanded .loop-legend{display:none}.has-sheet .stage{flex-direction:column;display:flex}.has-sheet .stage>.react-flow{flex:1 1 0;height:auto;min-height:0}.has-sheet .toolbar{max-width:none;box-shadow:none;border-width:1px 0 0;border-radius:0;flex:none;justify-content:space-around;padding:2px 4px;position:static;transform:none}.has-sheet .toolbar .tool{flex:1 1 0;min-width:0;min-height:48px}.has-sheet .toast{bottom:62px}}@media (prefers-reduced-motion:reduce){.toast{animation:none}}.run-view{overscroll-behavior:none;grid-template-rows:auto minmax(220px,42dvh) minmax(0,1fr);grid-template-columns:minmax(0,1fr);height:100dvh;display:grid;overflow:hidden}.run-view>.topbar{grid-row:1}.run-view>.stage{border-bottom:1px solid var(--line);grid-row:2}.run-panel{background:var(--surface);flex-direction:column;grid-row:3;min-height:0;display:flex}@media (min-width:900px){.run-view{grid-template-rows:auto minmax(0,1fr);grid-template-columns:minmax(0,1fr) 440px}.run-view>.topbar{grid-column:1/-1}.run-view>.stage{border-bottom:0;grid-column:1}.run-panel{border-left:1px solid var(--line);grid-area:2/2}}@media (max-width:899px){.run-view.is-tall{grid-template-rows:auto minmax(220px,76dvh) minmax(0,1fr)}}@media (min-width:900px){.canvas-size{display:none}}.run-title:active{background:0 0}.run-view .stage .react-flow__node{cursor:pointer}.run-view .loop-legend{right:10px}.run-status{align-items:center;gap:5px;display:inline-flex}.run-status-running{background:var(--accent-soft);color:var(--accent)}.run-status-ended{background:var(--surface-2);color:var(--ink-2)}.state-icon{fill:none;stroke:currentColor;stroke-width:2px;stroke-linecap:round;stroke-linejoin:round;flex:none;width:14px;height:14px}.state-icon .fill{fill:currentColor;stroke:none}.run-badge{background:var(--surface-2);color:var(--ink-2);border-radius:999px;align-items:center;gap:4px;margin-top:7px;padding:2px 9px 2px 6px;font-size:12px;font-weight:650;display:inline-flex}.run-badge-running{background:var(--accent-soft);color:var(--accent)}.run-badge-passed{background:var(--ok-soft);color:var(--ok)}.run-badge-failed{background:var(--error-soft);color:var(--error)}.run-badge-halted{background:var(--warning-soft);color:var(--warning)}.run-count{font-variant-numeric:tabular-nums;opacity:.85}.gnode.run-pending{background:var(--bg);box-shadow:none;border-style:dashed}.gnode.run-running{border-color:var(--accent)}.gnode.run-passed{border-color:var(--ok)}.gnode.run-failed{border-color:var(--error)}.gnode.run-halted{border-color:var(--warning);border-width:2px}.gnode.run-running:after{content:"";border:2px solid var(--accent);pointer-events:none;border-radius:15px;animation:1.6s ease-out infinite run-pulse;position:absolute;inset:-7px}.gnode-stop.run-running:after{border-radius:27px}@keyframes run-pulse{0%{opacity:.9;transform:scale(.99)}75%,to{opacity:0;transform:scale(1.05)}}@media (prefers-reduced-motion:reduce){.gnode.run-running:after{opacity:1;animation:none;transform:none}}.loop-round{color:var(--ink-3);font-weight:600}.loop-stop{color:var(--ink-3);margin-left:-3px;font-weight:500}.run-facts{flex:none;padding:8px 14px 6px}.run-line{color:var(--ink-3);font-variant-numeric:tabular-nums;margin:0;font-size:13px}.run-origin{color:var(--ink-2);flex-wrap:wrap;align-items:center;gap:4px 10px;margin:4px 0 0;font-size:13px;display:flex}.run-origin>span:first-child{flex:180px}.run-origin .btn{min-height:44px}.run-origin.is-problem{color:var(--warning)}.live-dot{background:var(--ink-3);border-radius:50%;width:9px;height:9px;flex:none!important}.live-dot.is-on{background:var(--ok);animation:2s ease-in-out infinite live-blink}@keyframes live-blink{50%{opacity:.35}}@media (prefers-reduced-motion:reduce){.live-dot.is-on{animation:none}}.run-tabs{border-bottom:1px solid var(--line);scrollbar-width:none;flex:none;gap:2px;padding:0 8px;display:flex;overflow-x:auto}.run-tab{min-height:44px;color:var(--ink-3);white-space:nowrap;background:0 0;border:0;border-bottom:2.5px solid #0000;align-items:center;gap:6px;padding:0 10px;font-size:14px;font-weight:620;display:inline-flex}.run-tab.is-on{border-bottom-color:var(--accent);color:var(--ink)}.run-tab-count{background:var(--surface-2);font-variant-numeric:tabular-nums;text-align:center;border-radius:999px;min-width:20px;padding:0 6px;font-size:12px}.run-body{overscroll-behavior:contain;min-height:0;padding:4px 14px calc(24px + env(safe-area-inset-bottom));flex:1;overflow-y:auto}.run-intro{color:var(--ink-3);margin:8px 0 10px;font-size:13px}.run-log{font-family:var(--mono);white-space:pre-wrap;overflow-wrap:anywhere;margin:8px 0;font-size:12.5px;line-height:1.5}.tl-list{margin:0;padding:0;list-style:none}.tl-item{border-top:1px solid var(--line)}.tl-item.is-on{background:var(--surface-2);margin:0 -14px;padding:0 14px}.tl-note{text-align:left;background:0 0;border:0;flex-direction:column;gap:3px;width:100%;min-height:48px;padding:10px 0;display:flex}.tl-head{flex-wrap:wrap;align-items:center;gap:4px 8px;font-size:14px;display:flex}.tl-where{font-weight:650}.tl-round,.tl-stop{color:var(--ink-3);font-size:12.5px}.tl-dot{flex:none;justify-content:center;align-items:center;width:14px;height:14px;display:inline-flex}.tl-dot:after{content:"";background:var(--ink-3);border-radius:50%;width:5px;height:5px}.tl-note .state-icon.state-passed{color:var(--ok)}.tl-note .state-icon.state-failed{color:var(--error)}.tl-note .state-icon.state-halted{color:var(--warning)}.tl-note .state-icon.state-running{color:var(--accent)}.tl-outcome{background:var(--surface-2);color:var(--ink-2);border-radius:999px;padding:1px 8px;font-size:12px;font-weight:650}.outcome-passed{background:var(--ok-soft);color:var(--ok)}.outcome-failed{background:var(--error-soft);color:var(--error)}.outcome-halted{background:var(--warning-soft);color:var(--warning)}.outcome-running{background:var(--accent-soft);color:var(--accent)}.tl-id{color:var(--ink-3);margin-left:auto;font-size:12px}.tl-marks{gap:6px;display:flex}.mark{letter-spacing:.02em;border:1px solid;border-radius:999px;padding:1px 8px;font-size:11.5px;font-weight:700}.mark-amendment{color:var(--kind-merge)}.mark-proposal{color:var(--kind-check)}.tl-text{color:var(--ink-2);overflow-wrap:anywhere;-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:13.5px;display:-webkit-box;overflow:hidden}.tl-item.is-on .tl-text{-webkit-line-clamp:unset;display:block}.tl-details{padding:0 0 12px 22px}.tl-details .readonly{margin:0 0 8px}.tl-actions{flex-wrap:wrap;gap:6px;display:flex}.tl-pinned{margin:0;font-size:14px}.tl-unread{margin-top:14px}.tl-unread li{color:var(--ink-2);font-size:13px}.change-list,.proposal-list,.op-list{margin:0;padding:0;list-style:none}.change,.proposal{border-top:1px solid var(--line);padding:12px 0}.change-line,.proposal-summary{overflow-wrap:anywhere;margin:0 0 6px;font-size:15px;font-weight:650}.field-change{margin:6px 0}.field-key{color:var(--ink-3);margin-bottom:3px;font-size:12px;display:block}.field-diff{margin:0;padding:0;font-size:13px;list-style:none}.field-diff li,div.field-diff{overflow-wrap:anywhere;border-radius:6px;grid-template-columns:16px 1fr;gap:4px;padding:4px 6px;display:grid}.field-diff li+li,div.field-diff+div.field-diff{margin-top:3px}.field-diff .del,div.field-diff.del{background:var(--error-soft)}.field-diff .ins,div.field-diff.ins{background:var(--ok-soft)}.field-diff del{color:var(--ink-2);-webkit-text-decoration-color:var(--error);text-decoration-color:var(--error)}.field-diff ins{color:var(--ink);text-decoration:none}.sign{color:var(--ink-3);font-weight:700}.field-kept{color:var(--ink-3);margin:3px 0 0;font-size:12px}.change-why{color:var(--ink-2);margin:8px 0 0;font-size:13px}.change-why .link{min-height:0;font-size:12.5px}.change-why-label{font-weight:650}.change-why.is-unexplained{background:var(--warning-soft);color:var(--warning);border-radius:8px;padding:6px 8px;font-weight:600}.adopt{border-top:1px solid var(--line-strong);margin-top:14px;padding-top:12px}.adopt .actions-row{gap:8px;display:flex}.adopt-done{background:var(--ok-soft);border-radius:10px;margin:0;padding:10px 12px;font-size:14px}.proposal-meta{color:var(--ink-3);margin:0 0 6px;font-size:13px}.proposal-text{color:var(--ink-2);margin:0 0 8px;font-size:13.5px}.op-list{margin:6px 0}.op-list li{background:var(--surface-2);overflow-wrap:anywhere;border-radius:6px;padding:4px 8px;font-size:12.5px}.op-list li+li{margin-top:3px}.proposal .more{margin:4px 0 8px}.proposal-other .field-hint{margin:6px 0}.proposal .refusal-hint{background:var(--warning-soft);color:var(--warning);border-radius:8px;margin:8px 0 0;padding:8px 10px;font-size:13.5px;font-weight:600}.run-rows{border-left:2px solid var(--line);grid-column:1/-1;margin:-4px 0 10px;padding:0 0 0 14px;list-style:none}.run-row{min-height:44px;color:var(--ink);flex-wrap:wrap;align-items:baseline;gap:2px 10px;padding:10px 4px;text-decoration:none;display:flex}.run-row-name{font-size:14px;font-weight:600}.run-row-meta{color:var(--ink-3);font-size:13px}.orphan-runs .run-rows{margin:0}.map-stage{-webkit-overflow-scrolling:touch;overflow:auto}.map-picture{max-width:560px;margin:0 auto;padding:0 0 24px}.map-picture svg{width:100%;height:auto;display:block}.map-picture [data-session],.map-picture [data-person],.map-picture [data-handoff],.map-picture [data-plate],.map-picture [data-number],.map-picture [data-handoff-row]{cursor:pointer;outline:none}.map-picture [data-session].is-on>rect[data-card],.map-picture [data-session]:focus-visible>rect[data-card],.map-picture [data-person].is-on>rect[data-card],.map-picture [data-person]:focus-visible>rect[data-card]{stroke-width:2.4px;stroke:var(--accent)!important}.map-picture [data-handoff-row].is-on>rect[data-row],.map-picture [data-handoff-row]:focus-visible>rect[data-row]{fill:var(--accent-soft)!important}.map-picture [data-handoff].is-on>path:first-of-type{stroke-width:3.4px}.map-by-hand{gap:4px;margin:0;padding-left:1.1em;display:grid}.map-graph-link{color:var(--accent)}.map-handoffs{gap:6px;margin:0 0 12px;padding:0;list-style:none;display:grid}.map-handoff-line{border:1px solid var(--line);border-radius:var(--radius);background:var(--surface);width:100%;min-height:44px;color:var(--ink-2);text-align:left;align-items:flex-start;gap:10px;padding:8px 10px;font-size:14px;display:flex}.map-handoff-line strong{color:var(--ink)}.map-handoff-n{border:1.5px solid var(--line-strong);width:22px;height:22px;color:var(--ink);border-radius:50%;flex:none;place-items:center;font-size:12px;font-weight:700;display:inline-grid}.keep{border-top:1px solid var(--line);margin-top:14px;padding-top:4px}.outline{padding:4px 16px 28px}.outline-section{border-bottom:1px solid var(--line);padding:14px 0 12px}.outline-section:last-child{border-bottom:0}.outline-kind{color:var(--accent);margin:0;font-size:12px;font-weight:700}.outline-head{justify-content:space-between;align-items:center;gap:10px;display:flex}.outline-head h3{margin:0;font-size:18px;line-height:1.3}.outline-items{margin:4px 0 0}.outline-item dt{color:var(--ink-3);margin-top:10px;font-size:13px;font-weight:600}.outline-item dd{white-space:pre-wrap;overflow-wrap:anywhere;margin:2px 0 0;line-height:1.5}.outline-item .plain-list{margin:0}@media (max-width:479px){.editor:not(.viewer)>.topbar{gap:4px}.editor:not(.viewer)>.topbar .icon-btn[aria-label=Outline]{width:38px}.editor:not(.viewer)>.topbar .topbar-export{padding:0 11px}.editor:not(.viewer)>.topbar .status{padding-left:10px;padding-right:10px}}.live-view{grid-template-rows:auto minmax(0,1fr);height:100dvh;display:grid}.live-main{padding:12px 12px calc(28px + env(safe-area-inset-bottom));overflow:auto}.live-group{max-width:640px;margin:0 auto}.live-source{letter-spacing:.02em;color:var(--ink-3);text-transform:uppercase;margin:14px 4px 6px;font-size:13px;font-weight:700}.live-empty{max-width:640px;margin:24px auto;padding:0 8px}.live-session{border:1px solid var(--line);background:var(--surface);border-radius:14px;margin:0 0 12px;overflow:hidden}.live-session.live-working{border-color:var(--accent)}.live-session-head{padding:12px 14px 10px}.live-session-title{justify-content:space-between;align-items:center;gap:10px;display:flex}.live-harness{color:var(--kind-agent);font-size:16px;font-weight:700}.live-harness-codex{color:var(--kind-check)}.live-state{align-items:center;gap:6px;min-height:28px;display:inline-flex}.live-state:before{display:none}.live-state-working{background:var(--accent-soft);color:var(--accent)}.live-state-quiet{background:var(--surface-2);color:var(--ink-3)}.live-state-waiting{background:var(--warning-soft);color:var(--warning)}.live-state-ended{background:var(--surface-2);color:var(--ink-3)}.live-session-sub,.live-session-facts{color:var(--ink-3);overflow-wrap:anywhere;margin:2px 0 0;font-size:13px}.live-session-facts{color:var(--ink-2)}.live-agents{border-top:1px solid var(--line);margin:0;padding:4px 14px 12px;list-style:none}.live-agent{align-items:flex-start;gap:10px;padding:8px 0 4px;display:flex}.live-mark{background:var(--ok-soft);width:20px;height:20px;color:var(--ok);border-radius:50%;flex:none;place-items:center;margin-top:1px;display:inline-grid}.live-mark svg{fill:none;stroke:currentColor;stroke-width:2.6px;stroke-linecap:round;stroke-linejoin:round;width:14px;height:14px}.live-agent.is-running .live-mark{background:var(--accent);box-shadow:0 0 0 0 var(--accent);animation:1.6s ease-out infinite live-ring}@keyframes live-ring{0%{box-shadow:0 0 0 0 color-mix(in oklab, var(--accent) 55%, transparent)}to{box-shadow:0 0 0 9px #0000}}@media (prefers-reduced-motion:reduce){.live-agent.is-running .live-mark{box-shadow:0 0 0 3px var(--accent-soft);animation:none}}.live-agent-text{flex-direction:column;min-width:0;display:flex}.live-agent-name{overflow-wrap:anywhere;flex-wrap:wrap;align-items:baseline;gap:6px;font-weight:650;display:flex}.live-id{color:var(--ink-3);font-size:12px;font-weight:400}.live-agent-facts{color:var(--ink-2);font-size:13px}.live-foot{max-width:640px;margin:8px auto 0;padding:0 4px}.live-plan{border-top:1px solid var(--line);background:var(--surface-2);padding:10px 14px 8px}.live-plan-head{margin:0 0 4px;font-size:14px;font-weight:650}.live-plan-sum{color:var(--ink-2);font-size:13px;font-weight:400;display:block}.live-plan-list{margin:0;padding:0;list-style:none}.live-plan-list li{grid-template-columns:1fr auto;gap:0 10px;padding:4px 0;font-size:14px;display:grid}.live-plan-type{font-weight:600}.live-plan-state{color:var(--ink-3);font-size:13px}[data-plan-state=started] .live-plan-state{color:var(--ok)}[data-plan-state=running] .live-plan-state{color:var(--accent);font-weight:650}.live-plan-purpose{color:var(--ink-3);grid-column:1/-1;font-size:13px}.live-plan-extra{color:var(--warning);margin:4px 0 0;font-size:13px}.live-notes{border-top:1px solid var(--line);color:var(--ink-2);margin:0;padding:8px 14px 12px;font-size:14px;list-style:none}.live-notes li{border-left:3px solid var(--line-strong);overflow-wrap:anywhere;margin:4px 0;padding:2px 0 2px 10px}.live-map{border:1px solid var(--line);border-radius:14px;max-width:640px;margin:0 auto 14px;overflow:hidden}.live-map .map-picture{max-width:none;padding:0}.outline-section.is-current{background:var(--bg);box-shadow:inset 3px 0 var(--accent);margin:0 -16px;padding-left:16px;padding-right:16px}@media (hover:hover){:is(.btn,.chip,.add-kind,.loop-pill,button.issue,.view-fit,.insert-row):hover:not(:disabled){filter:brightness(var(--hover,.96))}:is(.icon-btn,.tool,button.title-btn,.file,.seg):hover:not(:disabled,.seg-on,[aria-pressed=true]){background:var(--surface-2)}.gnode:hover:not(.run-state){border-color:var(--ink-3)}}@media (prefers-color-scheme:dark){:root{--hover:1.2}}@media (max-width:1099px){.sheet-rail:has(~.sheet){display:none}}@media (min-width:900px){.use-template{max-width:720px}}@media (min-width:1100px){.topbar{gap:8px;min-height:56px;padding:0 16px 0 8px}.topbar:before{content:"";background:var(--line-strong);order:1;width:1px;height:20px;margin:0 4px}.topbar>*{order:2}.topbar>a.icon-btn{order:0;gap:2px;padding-left:4px}.topbar .icon-btn{gap:7px;width:auto;padding:0 10px;font-size:14.5px;font-weight:560;text-decoration:none}.topbar .icon-btn:after{content:attr(aria-label)}.topbar .icon-btn svg{width:18px;height:18px}.title-btn{text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-height:36px;padding:0 10px;line-height:36px;display:block;overflow:hidden}.title-name{font-size:15px}.title-sub{margin-left:10px}.title-btn+*{margin-left:auto}.editor{--rail:clamp(280px, 22vw, 340px);--side:clamp(340px, 27vw, 400px);grid-template-columns:minmax(0, 1fr) var(--side)}.editor.has-rail{grid-template-columns:var(--rail) minmax(0, 1fr)}.editor.has-rail.has-side{grid-template-columns:var(--rail) minmax(0, 1fr) var(--side)}.has-rail>.stage,.has-rail>.editor-notice{grid-column:2}.has-rail>.sheet{grid-column:3}.has-rail>.sheet-rail{--sheet-from:translateX(-14px);border-left:0;border-right:1px solid var(--line);grid-column:1}.sheet{--sheet-from:translateX(14px)}.sheet-head{min-height:56px;padding-right:8px}.sheet-title{padding-top:0}.mode-active .sheet-body{display:block}.mode-active .loop-legend{visibility:hidden}.add-menu{grid-template-columns:1fr}.outline-head h3{font-size:16px}.outline-item dd{font-size:14px}.editor-notice{border-width:0 0 1px;border-radius:0;margin:0;padding:5px 8px 5px 16px}.toolbar{border-radius:12px}.viewer-bar,.mode-banner{border-radius:12px;gap:8px 16px;width:max-content;max-width:calc(100% - 300px);padding:6px 6px 6px 16px;left:50%;right:auto;transform:translate(-50%)}.viewer .view-fit{bottom:calc(12px + env(safe-area-inset-bottom))}}@media (min-width:1100px) and (pointer:fine){.editor .btn{min-height:36px;padding:0 14px;font-size:14px}.editor .btn-small{min-height:30px;padding:0 10px;font-size:13px}.inspector-actions .btn-quiet{padding:0 8px}.editor .input{min-height:36px;padding:7px 10px;font-size:14px}.editor .input.mono{font-size:13px}.editor .chip,.editor .seg{min-height:30px;font-size:13px}.editor .toggle{min-height:36px}.topbar .icon-btn{height:36px}.sheet .icon-btn{width:32px;height:32px}.status,.loop-pill{min-height:28px;font-size:12.5px}.view-fit{min-height:36px}.tool{border-radius:8px;flex-direction:row;gap:6px;min-width:0;min-height:36px;padding:0 12px;font-size:13px}.tool svg{width:18px;height:18px}}
@@ -0,0 +1,2 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/builtins-DzyPaYdd.js","assets/share-DV3wsAsJ.js","assets/plan-templates-u2fF3GnS.js"])))=>i.map(i=>d[i]);
2
+ import{n as e,r as t}from"./index-B5ZkSF4L.js";import{Gt as n,Ht as r,Wt as i,dt as a,ot as o,yn as s}from"./share-DV3wsAsJ.js";var c,l=()=>e(`builtins`,()=>t(()=>import(`./builtins-DzyPaYdd.js`),__vite__mapDeps([0,1]))).then(e=>c=e.BUILT_IN_TEMPLATES),u=()=>c;function d(e){let t=e=>+(e.template?.kind===`fragment`);return[...e].sort((e,n)=>t(e)-t(n)||e.template.title.localeCompare(n.template.title))}var f=e=>c?.find(t=>t.id===e),p,m=()=>e(`plan-templates`,()=>t(()=>import(`./plan-templates-u2fF3GnS.js`),__vite__mapDeps([2,1]))).then(e=>p=e.PLAN_TEMPLATES),h=`A plan: a graph a person follows. It has no recorded run, and no package for a harness is made of a graph with a person's step.`,g=()=>p;function _(e,t){let n=o(e,{loops:`errors`});if(!s(n))return null;let r=[],i=new Set(e.nodes.map(e=>e.id));for(let e of t?.loops??[]){let n=e.members.filter(e=>!i.has(e));if(n.length>0&&n.length<e.members.length){let i=n.map(e=>{let n=t.nodes.find(t=>t.id===e)?.name;return n?`${e} (${n})`:e});r.push(`loop "${e.id}" stayed behind: a loop comes along only with all its members; add ${i.join(`, `)} to the selected nodes`)}}return{issues:n,hints:r}}function v(e){let t=e.template?.slots??[];return a(e).map(e=>t.find(t=>t.key===e)??{key:e,ask:`What should "${e}" be?`,example:``})}function y(e){let t={};for(let[n,r]of Object.entries(e))r.trim()!==``&&(t[n]=r.trim());return t}function b(e,t,a){let o=r(t);o.delete(t.id);for(let e of a)o.add(e);return n(i(e,`graph`),o)}var x={cost:{low:`Low cost`,medium:`Medium cost`,high:`High cost`},speed:{fast:`Fast`,medium:`Medium speed`,slow:`Slow`},rigor:{light:`Light rigor`,standard:`Standard rigor`,high:`High rigor`}},S={cost:{low:1,medium:2,high:3},speed:{fast:3,medium:2,slow:1},rigor:{light:1,standard:2,high:3}},C={cost:[`low`,`medium`,`high`],speed:[`fast`,`medium`,`slow`],rigor:[`light`,`standard`,`high`]};export{f as a,b as c,g as d,v as f,x as i,l,_ as m,S as n,u as o,d as p,C as r,y as s,h as t,m as u};
@@ -1 +1 @@
1
- var e=[`paper`,`blueprint`,`ink`,`phosphor`,`transit`,`chalk`],t=`"Atkinson Hyperlegible Next",system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif`,n=`"Atkinson Hyperlegible Mono",ui-monospace,"SF Mono",Menlo,Consolas,"Roboto Mono",monospace`,r=`Georgia,"Times New Roman",Times,serif`,i=`"Chalkboard SE","Comic Sans MS",${t}`,a=`& rect[data-card]`,o=`& rect[data-card][stroke-width="1.8"]`,s=`& rect[data-card][stroke-width="1.4"]`,c=`& rect[data-card][rx="16"]`,l=`& [data-node]>rect[data-card],& [data-session]>rect[data-card],& [data-session]>rect[rx="9"]`,u=`& rect[rx="7.4"],& rect[rx="6.5"],& rect[rx="8.1"]`,d=`& [data-edge] path[fill="none"]`,f=`& [data-node]>text[font-size="9.5"]`,p=`& [data-node]>text[font-size="10.5"]`,m=`letter-spacing:-.05em`,h={name:`blueprint`,label:`Blueprint`,use:`For architecture notes and slides, where the picture should read as an engineering drawing.`,light:{bg:`#f2f6fc`,surface:`#f8fbff`,"surface-2":`#e3ebf7`,ink:`#0f2f63`,"ink-2":`#24467e`,"ink-3":`#48628f`,line:`#d3dff0`,"line-strong":`#24467e`,accent:`#0f2f63`,"accent-soft":`#dde7f6`,gate:`#a4470b`,"gate-soft":`#fbeedd`,check:`#1d4e9e`,merge:`#5a3fa0`,stop:`#48628f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#0a6a9c`,"loop-1":`#6a45b5`,"loop-2":`#a8431a`,"loop-3":`#9c2a63`},dark:{bg:`#143d73`,surface:`#184683`,"surface-2":`#1d4f92`,ink:`#f1f6ff`,"ink-2":`#d0def5`,"ink-3":`#b3c8eb`,line:`#2a5594`,"line-strong":`#d0def5`,accent:`#f1f6ff`,"accent-soft":`#24579e`,gate:`#ffc566`,"gate-soft":`#3a4f6e`,check:`#a9d1ff`,merge:`#d7c2ff`,stop:`#b3c8eb`,ok:`#9ff0c0`,"ok-soft":`#1c5a60`,warning:`#ffd27f`,error:`#ffb3a8`,"error-soft":`#5a3550`,"loop-0":`#7fe3ff`,"loop-1":`#d7c2ff`,"loop-2":`#ffb08a`,"loop-3":`#f8afdb`},rules:()=>`${a}{stroke-width:1.2}${o}{stroke-width:2.4}${l},${u}{rx:0;ry:0}${c}{rx:16px;ry:16px}${f}{font-family:${n};font-weight:500;text-transform:uppercase;letter-spacing:.09em}${p},& [data-lane] text[font-size="10.5"]{font-family:${n};font-size:8.5px;${m}}& text[font-size="17"]{text-transform:uppercase;letter-spacing:.06em;font-size:12.5px}`,defs:(e,t)=>`<pattern id="${t}" width="20" height="20" patternUnits="userSpaceOnUse"><path d="M20,.5H.5V20" fill="none" stroke-width="1" style="stroke:${e(`line`)}"/></pattern>`,ground:!0,canvas:{radius:0,stop:16,border:1.2,gate:2.4,edge:1.5,caps:.09,labelFace:n}},g=`#000000`,_=`#f6f6f6`,v={name:`ink`,label:`Ink`,use:`For papers and print. One ink and no tints, so it survives a photocopier.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#f1f1f1`,ink:g,"ink-2":`#1c1c1c`,"ink-3":`#3d3d3d`,line:`#bdbdbd`,"line-strong":g,accent:g,"accent-soft":`#ececec`,gate:g,"gate-soft":`#ececec`,check:g,merge:g,stop:g,ok:g,"ok-soft":`#ececec`,warning:g,error:g,"error-soft":`#ececec`,"loop-0":g,"loop-1":g,"loop-2":g,"loop-3":g},dark:{bg:`#0b0b0b`,surface:`#0b0b0b`,"surface-2":`#1c1c1c`,ink:_,"ink-2":`#e2e2e2`,"ink-3":`#bdbdbd`,line:`#4a4a4a`,"line-strong":_,accent:_,"accent-soft":`#222222`,gate:_,"gate-soft":`#222222`,check:_,merge:_,stop:_,ok:_,"ok-soft":`#222222`,warning:_,error:_,"error-soft":`#222222`,"loop-0":_,"loop-1":_,"loop-2":_,"loop-3":_},face:r,rules:()=>`${a}{stroke-width:.8}${o}{stroke-width:3}${s}{stroke-width:2.4}${l}{rx:2px;ry:2px}${c}{rx:16px;ry:16px}${d}{stroke-width:1.1}& [data-edge] path[stroke-width="2"]{stroke-width:2.4}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:3.5 2.5}${f}{text-transform:uppercase;letter-spacing:.1em;font-size:8.5px}`,canvas:{radius:2,stop:16,border:.8,gate:3,edge:1.1,caps:.1}},y={bg:`#0a0f0b`,surface:`#0e1610`,"surface-2":`#132017`,ink:`#b8f5c2`,"ink-2":`#8fd69b`,"ink-3":`#6aa876`,line:`#1c2e21`,"line-strong":`#3c6b48`,accent:`#5dff8a`,"accent-soft":`#123620`,gate:`#ffb84a`,"gate-soft":`#33260e`,check:`#7fd4ff`,merge:`#c9a6ff`,stop:`#9fb5a4`,ok:`#5dff8a`,"ok-soft":`#123620`,warning:`#ffb84a`,error:`#ff7a6a`,"error-soft":`#3a1714`,"loop-0":`#6fe3ff`,"loop-1":`#ffd84a`,"loop-2":`#ff8f6a`,"loop-3":`#ff8fd0`},b={blueprint:h,ink:v,phosphor:{name:`phosphor`,label:`Phosphor`,use:`For terminals and dark dashboards. Fixed-width lettering on a dark screen, with gates in amber.`,light:y,dark:y,face:n,rules:()=>`& g rect,&>rect[rx]{rx:2px;ry:2px}${c}{rx:16px;ry:16px}${s}{rx:12px;ry:12px}& rect[rx="7.2"]{rx:7.2px;ry:7.2px}${o}{stroke-width:2.2}& text{${m}}& text[font-size="17"]{font-size:16px}& text[font-size="13.5"]{font-size:12.25px}& text[font-size="12.5"]{font-size:11.25px}& text[font-size="12"]{font-size:11px}& text[font-size="11.5"]{font-size:9.75px}& text[font-size="11"]{font-size:9px}& text[font-size="10.5"]{font-size:8.5px}& text[font-size="10"]{font-size:8px}& text[font-size="11"][font-weight="700"]{font-size:10.5px}& text[font-size="10.5"][font-weight="700"]{font-size:9.75px}& text[font-size="10"][font-weight="700"]{font-size:9.5px}& text[font-size="9.5"]{font-size:8.75px}& text[font-size="9"]{font-size:8.25px}${f}{text-transform:uppercase;letter-spacing:.06em}`,defs:(e,t)=>`<pattern id="${t}" width="3" height="3" patternUnits="userSpaceOnUse"><path d="M0,.5H3" fill="none" stroke-width="1" style="stroke:${e(`surface-2`)}"/></pattern>`,ground:!0,canvas:{radius:2,stop:16,border:1,gate:2.2,edge:1.5,caps:.1}},transit:{name:`transit`,label:`Transit`,use:`For talks and posters seen from across a room. Edges are thick route lines and each loop keeps its own color.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#eef1f5`,ink:`#0f1b2d`,"ink-2":`#26344a`,"ink-3":`#4a5a72`,line:`#d5dbe4`,"line-strong":`#0f1b2d`,accent:`#0f1b2d`,"accent-soft":`#e3e9f2`,gate:`#b04f00`,"gate-soft":`#fdeed9`,check:`#0057b8`,merge:`#6b3fb0`,stop:`#0f1b2d`,ok:`#007a4d`,"ok-soft":`#dbf2e6`,warning:`#8f5200`,error:`#c4281c`,"error-soft":`#fde7e4`,"loop-0":`#d7261e`,"loop-1":`#007a4d`,"loop-2":`#b85300`,"loop-3":`#b0178a`,route:`#0057b8`},dark:{bg:`#0d1524`,surface:`#121c2e`,"surface-2":`#1a2740`,ink:`#f3f6fb`,"ink-2":`#cfd8e6`,"ink-3":`#9fadc2`,line:`#26344d`,"line-strong":`#f3f6fb`,accent:`#f3f6fb`,"accent-soft":`#1f2e49`,gate:`#ffab4a`,"gate-soft":`#3a2a12`,check:`#6db3ff`,merge:`#b99cff`,stop:`#f3f6fb`,ok:`#5fd6a0`,"ok-soft":`#143a2a`,warning:`#ffc266`,error:`#ff8a7d`,"error-soft":`#3d1c19`,"loop-0":`#ff6b5e`,"loop-1":`#5fd6a0`,"loop-2":`#ffab4a`,"loop-3":`#f07ad0`,route:`#6db3ff`},face:t,rules:e=>`& [data-edge] [style="stroke:${e(`ink-2`)}"]{stroke:${e(`route`)}!important}& [data-edge] [style="fill:${e(`ink-2`)}"]{fill:${e(`route`)}!important}${d}{stroke-width:4.5}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:10 5;stroke-linecap:butt}& [data-edge] path[stroke-dasharray="1.5 3"]{stroke-dasharray:.1 8}@supports (transform-box:fill-box){& [data-edge] path+path,& [data-edge] circle+path{transform-box:fill-box;transform-origin:center;transform:scale(1.6)}}& [data-edge] circle{r:4.2px;stroke:${e(`bg`)};stroke-width:1.5}${a}{stroke-width:2.6}${o}{stroke-width:4.2}${s}{stroke-width:3.4}${l}{rx:22px;ry:22px}${c}{rx:5px;ry:5px}${f}{text-transform:uppercase;letter-spacing:.08em}`,canvas:{radius:22,stop:5,border:2.6,gate:4.2,edge:4.5,caps:.08}},chalk:{name:`chalk`,label:`Chalk`,use:`For early drafts and teaching. Hand lettering and lines that wobble say the graph is still open to change.`,light:{bg:`#f6f7f7`,surface:`#fbfbfb`,"surface-2":`#eceeee`,ink:`#2a2e32`,"ink-2":`#454a50`,"ink-3":`#62686f`,line:`#d5d8db`,"line-strong":`#4a5057`,accent:`#2456a6`,"accent-soft":`#dfe8f6`,gate:`#a94e08`,"gate-soft":`#fbeedd`,check:`#2456a6`,merge:`#6a45b5`,stop:`#62686f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#7a3fb8`,"loop-1":`#0e7584`,"loop-2":`#b8430f`,"loop-3":`#a82a66`},dark:{bg:`#26302e`,surface:`#2a3533`,"surface-2":`#313d3a`,ink:`#f3f2ec`,"ink-2":`#d9dcd5`,"ink-3":`#b0b8b1`,line:`#3d4a47`,"line-strong":`#d9dcd5`,accent:`#a8d8ff`,"accent-soft":`#2f4652`,gate:`#ffd28a`,"gate-soft":`#4a4230`,check:`#a8d8ff`,merge:`#d9c2ff`,stop:`#b0b8b1`,ok:`#a6e8c0`,"ok-soft":`#2c4a3c`,warning:`#ffd28a`,error:`#ffb0a6`,"error-soft":`#4f3532`,"loop-0":`#f5a8cc`,"loop-1":`#9fe0d6`,"loop-2":`#ffb48a`,"loop-3":`#d9c2ff`},face:i,rules:()=>`${a},& [data-edge],& [data-plate],& [data-lane]>rect,& [data-people]>rect,&[data-picture="map"] [data-handoff]{filter:url(#gp-chalk)}${a}{stroke-width:1.5}${o}{stroke-width:2.6}${d}{stroke-width:1.8}& text{letter-spacing:.01em}`,defs:()=>`<filter id="gp-chalk"><feTurbulence type="fractalNoise" baseFrequency=".035" numOctaves="2" seed="4" result="n"/><feDisplacementMap in="SourceGraphic" in2="n" scale="3" xChannelSelector="R" yChannelSelector="G"/></filter>`,canvas:{radius:9,stop:16,border:1.5,gate:2.6,edge:1.8}}},x=t=>e.includes(t);function S(e,t=`auto`){if(e===void 0||e===`paper`||!x(e))return;let n=b[e],r=`.grooph-picture[data-look="${n.name}"]`,i=e=>Object.keys(e).map(t=>`--gp-${t}:${e[t]}`).join(`;`),a=`gp-${n.name}${t===`auto`?``:`-${t}`}`,o=t===`auto`,s=t===`dark`?n.dark:n.light,c=o?e=>`var(--gp-${e})`:e=>s[e]??``,l=`${r}:not([data-theme="light"])`,u=o?n.dark===n.light?`${r},${l}{${i(n.light)}}`:`${r}{${i(n.light)}}@media (prefers-color-scheme:dark){${l}{${i(n.dark)}}}${r}[data-theme="dark"]{${i(n.dark)}}`:``,d=n.face?`${r}{font-family:${n.face}}`:``;return{name:n.name,css:`${u}${d}${n.rules(c).replaceAll(`&`,r)}`,defs:n.defs?n.defs(c,a):``,ground:n.ground?`<rect width="100%" height="100%" fill="url(#${a})"/>`:``,colors:s}}function C(e,t,n=`auto`){let r=S(t,n);if(!r)return e;let i=/^(<svg [^>]* data-picture="[a-z]+")([^>]*>)(<title>[^<]*<\/title>)<style>[^<]*<\/style>(<rect [^>]*\/>)/;if(!i.test(e)||/^<svg [^>]* data-look=/.test(e))throw Error(`themed() takes a picture as core draws it to follow the viewer: picture(doc), with no theme of its own`);let a=e.replace(i,(e,t,n,i,a)=>`${t} data-look="${r.name}"${n}${i}<style>${r.css}</style>${r.defs?`<defs>${r.defs}</defs>`:``}${a}${r.ground}`);return n===`auto`?a:a.replace(/ style="[^"]*"/g,e=>e.replace(/var\(--gp-([a-z0-9-]+)\)/g,(e,t)=>r.colors[t]))}var w=(e,t)=>S(t)?e.replace(/<svg xmlns="http:\/\/www\.w3\.org\/2000\/svg" class="grooph-picture"[^]*?<\/svg>/,e=>C(`${e}\n`,t).trimEnd()):e,T=`groophPicture`,E={paper:`#1f5f4a`,blueprint:`#24467e`,ink:`#1c1c1c`,phosphor:`#5dff8a`,transit:`#0057b8`,chalk:`#a94e08`},D=e=>e===`paper`?`Paper`:b[e].label,O=t=>e.find(e=>e===t),k=typeof document<`u`,A=(()=>{try{return O(localStorage.getItem(T))??`paper`}catch{return`paper`}})();function j(e){let t=/^#\/(?:open|embed)\?(?:[^&]*&)*?theme=([^&]*)/.exec(e)?.[1]?.replace(/(?:^|-)(?:light|dark|auto)$/,``);return t?O(t)??`paper`:void 0}var M=(e=location.hash)=>j(e)??(e.startsWith(`#/embed`)?`paper`:A);function N(e){if(j(e)===void 0)return e;let[t,n=``]=[e.slice(0,e.indexOf(`?`)),e.slice(e.indexOf(`?`)+1)],r=n.split(`&`).filter(e=>!e.startsWith(`theme=`));return r.length?`${t}?${r.join(`&`)}`:t}function P(e){A=e;try{localStorage.setItem(T,e)}catch{}let t=N(location.hash);t!==location.hash&&history.replaceState(history.state,``,`${location.pathname}${location.search}${t}`),q()}function F(){let e=M();return e===`paper`?void 0:{id:e,picture:(t,n)=>C(t,e,n),page:t=>w(t,e)}}var I=e=>e.map(([e,t])=>`--${e}:${t}`).join(`;`),L=e=>e.ok===e[`line-strong`],R=e=>L(e)?void 0:e.ok,z=e=>I([[`bg`,e.bg],[`surface`,e.surface],[`surface-2`,e[`surface-2`]],[`ink`,e.ink],[`ink-2`,e[`ink-2`]],[`ink-3`,e[`ink-3`]],[`line`,e.line],[`line-strong`,e[`line-strong`]],[`dots`,e.line],[`edge`,e.route??e[`ink-2`]],[`kind-agent`,e.accent],[`kind-human-gate`,e.gate],[`kind-check`,e.check],[`kind-merge`,e.merge],[`kind-stop`,e.stop],[`loop-0`,e[`loop-0`]],[`loop-1`,e[`loop-1`]],[`loop-2`,e[`loop-2`]],[`loop-3`,e[`loop-3`]],...L(e)?[]:[[`accent`,e.accent],[`accent-ink`,e.bg],[`accent-soft`,e[`accent-soft`]],[`focus`,e.ok],[`highlight`,e.gate],[`error`,e.error],[`error-soft`,e[`error-soft`]],[`warning`,e.warning],[`warning-soft`,e[`gate-soft`]],[`ok`,e.ok],[`ok-soft`,e[`ok-soft`]]]])+`;color:${e.ink}`,B=(e,t)=>t(e.light)+(e.dark===e.light?``:`@media (prefers-color-scheme:dark){${t(e.dark)}}`);function V(e){let t=`.stage[data-look="${e.name}"]`,n=`${t} .react-flow,${t} .loop-legend,${t} .empty-canvas`,r=e.canvas;return B(e,e=>`${n}{${z(e)}}`)+(e.face?`:where(${t}) .react-flow{font-family:${e.face}}`:``)+`:where(${t}) .gnode{border-radius:${r.radius}px;border-width:${r.border}px}:where(${t}) .gnode-stop{border-radius:${r.stop}px}:where(${t}) .gnode-human-gate{border-width:${r.gate}px;border-color:var(--kind-human-gate)}:where(${t}) .gedge-line{stroke-width:${r.edge}}`+(r.radius<9?`:where(${t}) .gedge-label{border-radius:${r.radius}px}`:``)+(r.caps?`:where(${t}) .gnode-kind{text-transform:uppercase;letter-spacing:${r.caps}em}`:``)+(r.labelFace?`:where(${t}) .gnode-kind,:where(${t}) .gnode-sub{font-family:${r.labelFace}}`:``)+`${t} .gedge.is-selected .gedge-line,${t} .gedge.is-highlighted .gedge-line,${t} .gedge.is-picked .gedge-line{stroke-width:${Math.max(3,r.edge+1.5)}}${t} .gnode.run-halted{border-width:${Math.max(2,r.border+.8)}px}${t} .gnode-human-gate.run-halted{border-width:${Math.max(2,r.gate)}px}`}function H(e){let t=`.map-picture[data-look="${e.name}"]`,n=Math.max(e.canvas.border,1.4)+1.4;return B(e,e=>`${t}{${I([...R(e)?[[`accent`,R(e)]]:[],[`accent-soft`,e[`surface-2`]]])}}`)+`${t} :is([data-session],[data-person]):is(.is-on,:focus-visible)>rect[data-card]{stroke-width:${n}}`}function U(e){let t=`.gx[data-look="${e.name}"]`,n=e=>I([...[`bg`,`surface`,`surface-2`,`ink`,`ink-2`,`ink-3`,`line`,`line-strong`,`accent`,`ok`,`error`,`gate`,`loop-0`,`loop-1`,`loop-2`,`loop-3`].map(t=>[`gx-${t}`,e[t]]),...R(e)?[[`gx-focus`,R(e)]]:[]]),r=`${t} .gx-canvas g[data-node]`,i=e.canvas,a=[`${r}:focus-visible`,`${r}.is-picked`,`${r}:hover`,...[`running`,`passed`,`failed`,`halted`].map(e=>`${t}[data-replay] g[data-node][data-state="${e}"]`)],o=[`${t}[data-replay] g[data-node][data-focus]`],s=(e,t)=>`${e.map(e=>`${e} rect[data-card]`).join(`,`)}{stroke-width:${Math.max(2.5,i.border+t)}px}${e.map(e=>`${e} rect[data-card][stroke-width="1.8"]`).join(`,`)}{stroke-width:${Math.max(2.5,i.gate+t)}px}`;return(e.dark===e.light?`${t},${t}:not([data-theme="light"]),${t}[data-theme]{${n(e.light)};background:var(--gx-bg)}`:`${t}{${n(e.light)};background:var(--gx-bg)}@media (prefers-color-scheme:dark){${t}:not([data-theme="light"]){${n(e.dark)}}}${t}[data-theme="dark"]{${n(e.dark)}}`)+s(a,.9)+s(o,1.9)+`${t}[data-replay] g[data-edge][data-focus] path:first-child{stroke-width:${Math.max(3,i.edge+1.5)}px}`}var W=()=>Object.values(b).map(e=>S(e.name).css+V(e)+H(e)+U(e)).join(``)+`[data-pictures][data-now]::after{content:attr(data-now);opacity:.72}`,G=`data-of-look`;function K(e,t){if(e.dataset.look===t)return;if(e.querySelector(`:scope > [${G}]`)?.remove(),!t)return void delete e.dataset.look;e.dataset.look=t;let n=S(t),r=`${n.defs?`<defs>${n.defs}</defs>`:``}${n.ground}`;r&&e.querySelector(`:scope > rect`)?.insertAdjacentHTML(`afterend`,`<g ${G}="">${r}</g>`)}function q(){let e=M(),t=e===`paper`?void 0:e;for(let e of document.querySelectorAll(`svg.grooph-picture`))K(e,t);for(let e of document.querySelectorAll(`main.stage,.map-picture,.gx`)){let n=e.querySelector(`[data-picture="space"]`)?void 0:t;e.dataset.look!==n&&(n?e.dataset.look=n:delete e.dataset.look)}Y&&Y.host.getClientRects().length===0&&Y.shut();for(let t of document.querySelectorAll(`[data-pictures]`)){t.style.setProperty(`--dot`,E[e]);let n=t.hasAttribute(`aria-label`)?`aria-label`:`data-now`,r=n===`aria-label`?`Picture theme: ${D(e)}`:D(e);t.getAttribute(n)!==r&&t.setAttribute(n,r)}for(let e of document.querySelectorAll(`iframe.land-run-frame`)){let n=e.getAttribute(`src`)??``,r=n.replace(/&theme=[^&]*/,``)+(t?`&theme=${t}`:``);r!==n&&e.setAttribute(`src`,r)}}var J=`<svg viewBox="0 0 20 20" aria-hidden="true"><path d="m4.5 10.5 3.5 3.5 7.5-8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,Y;function X(t){let n=Y?.at===t;if(Y?.shut(),n)return;let r=t.closest(`.site-theme`)??t.parentElement,i=r.querySelector(`.site-theme-toggle`)??t,a=M(),o=document.createElement(`ul`);o.className=`site-theme-list`,o.setAttribute(`role`,`menu`),o.setAttribute(`aria-label`,`Picture theme`),o.innerHTML=e.map(e=>`<li role="none"><button type="button" role="menuitemradio" aria-checked="${e===a}" tabindex="-1" data-id="${e}"><span class="site-theme-dot" style="--dot:${E[e]}" aria-hidden="true"></span>${D(e)}${J}</button></li>`).join(``),r.append(o),i.setAttribute(`aria-expanded`,`true`);let s=r.classList.contains(`look-dot`);s&&(r.style.zIndex=`50`),o.style.maxHeight=`${Math.max(140,innerHeight-o.getBoundingClientRect().top-8)}px`,o.style.overflowY=`auto`;let c=[...o.querySelectorAll(`button`)],l=e=>{!o.contains(e.target)&&!t.contains(e.target)&&u(!1)},u=e=>{o.remove(),document.removeEventListener(`pointerdown`,l),s&&(r.style.zIndex=``),i.setAttribute(`aria-expanded`,`false`),Y=void 0,e&&i.focus()};Y={at:t,host:r,shut:()=>u(!1)},o.addEventListener(`click`,e=>{let t=e.target.closest(`button`);t&&(P(t.dataset.id),u(!0))}),o.addEventListener(`keydown`,e=>{let t=c.indexOf(document.activeElement),n=e.key===`ArrowDown`?(t+1)%c.length:e.key===`ArrowUp`?(t-1+c.length)%c.length:e.key===`Home`?0:e.key===`End`?c.length-1:-1;n>=0?(e.preventDefault(),c[n].focus()):e.key===`Escape`?(e.stopPropagation(),u(!0)):e.key===`Tab`&&u(!1)}),document.addEventListener(`pointerdown`,l),c[e.indexOf(a)].focus()}if(k){let e=document.createElement(`style`);e.textContent=W(),document.head.append(e),q(),new MutationObserver(q).observe(document.documentElement,{childList:!0,subtree:!0}),addEventListener(`hashchange`,q)}export{q as apply,P as choose,D as labelOf,F as look,j as lookNamed,M as lookNow,X as open,W as styles,N as withoutLook};
1
+ var e=[`paper`,`blueprint`,`ink`,`phosphor`,`transit`,`chalk`],t=`"Atkinson Hyperlegible Next",system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif`,n=`"Atkinson Hyperlegible Mono",ui-monospace,"SF Mono",Menlo,Consolas,"Roboto Mono",monospace`,r=`Georgia,"Times New Roman",Times,serif`,i=`"Chalkboard SE","Comic Sans MS",${t}`,a=`& rect[data-card]`,o=`& rect[data-card][stroke-width="1.8"]`,s=`& rect[data-card][stroke-width="1.4"]`,c=`& rect[data-card][rx="16"]`,l=`& [data-node]>rect[data-card],& [data-session]>rect[data-card],& [data-session]>rect[rx="9"]`,u=`& rect[rx="7.4"],& rect[rx="6.5"],& rect[rx="8.1"]`,d=`& [data-edge] path[fill="none"]`,f=`& [data-node]>text[font-size="9.5"]`,p=`& [data-node]>text[font-size="10.5"]`,m=`letter-spacing:-.05em`,h={name:`blueprint`,label:`Blueprint`,use:`For architecture notes and slides, where the picture should read as an engineering drawing.`,light:{bg:`#f2f6fc`,surface:`#f8fbff`,"surface-2":`#e3ebf7`,ink:`#0f2f63`,"ink-2":`#24467e`,"ink-3":`#48628f`,line:`#d3dff0`,"line-strong":`#24467e`,accent:`#0f2f63`,"accent-soft":`#dde7f6`,gate:`#a4470b`,"gate-soft":`#fbeedd`,check:`#1d4e9e`,merge:`#5a3fa0`,stop:`#48628f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#0a6a9c`,"loop-1":`#6a45b5`,"loop-2":`#a8431a`,"loop-3":`#9c2a63`},dark:{bg:`#143d73`,surface:`#184683`,"surface-2":`#1d4f92`,ink:`#f1f6ff`,"ink-2":`#d0def5`,"ink-3":`#b3c8eb`,line:`#2a5594`,"line-strong":`#d0def5`,accent:`#f1f6ff`,"accent-soft":`#24579e`,gate:`#ffc566`,"gate-soft":`#3a4f6e`,check:`#a9d1ff`,merge:`#d7c2ff`,stop:`#b3c8eb`,ok:`#9ff0c0`,"ok-soft":`#1c5a60`,warning:`#ffd27f`,error:`#ffb3a8`,"error-soft":`#5a3550`,"loop-0":`#7fe3ff`,"loop-1":`#d7c2ff`,"loop-2":`#ffb08a`,"loop-3":`#f8afdb`},rules:()=>`${a}{stroke-width:1.2}${o}{stroke-width:2.4}${l},${u}{rx:0;ry:0}${c}{rx:16px;ry:16px}${f}{font-family:${n};font-weight:500;text-transform:uppercase;letter-spacing:.09em}${p},& [data-lane] text[font-size="10.5"]{font-family:${n};font-size:8.5px;${m}}& text[font-size="17"]{text-transform:uppercase;letter-spacing:.06em;font-size:12.5px}`,defs:(e,t)=>`<pattern id="${t}" width="20" height="20" patternUnits="userSpaceOnUse"><path d="M20,.5H.5V20" fill="none" stroke-width="1" style="stroke:${e(`line`)}"/></pattern>`,ground:!0,canvas:{radius:0,stop:16,border:1.2,gate:2.4,edge:1.5,caps:.09,labelFace:n}},g=`#000000`,_=`#f6f6f6`,v={name:`ink`,label:`Ink`,use:`For papers and print. One ink and no tints, so it survives a photocopier.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#f1f1f1`,ink:g,"ink-2":`#1c1c1c`,"ink-3":`#3d3d3d`,line:`#bdbdbd`,"line-strong":g,accent:g,"accent-soft":`#ececec`,gate:g,"gate-soft":`#ececec`,check:g,merge:g,stop:g,ok:g,"ok-soft":`#ececec`,warning:g,error:g,"error-soft":`#ececec`,"loop-0":g,"loop-1":g,"loop-2":g,"loop-3":g},dark:{bg:`#0b0b0b`,surface:`#0b0b0b`,"surface-2":`#1c1c1c`,ink:_,"ink-2":`#e2e2e2`,"ink-3":`#bdbdbd`,line:`#4a4a4a`,"line-strong":_,accent:_,"accent-soft":`#222222`,gate:_,"gate-soft":`#222222`,check:_,merge:_,stop:_,ok:_,"ok-soft":`#222222`,warning:_,error:_,"error-soft":`#222222`,"loop-0":_,"loop-1":_,"loop-2":_,"loop-3":_},face:r,rules:()=>`${a}{stroke-width:.8}${o}{stroke-width:3}${s}{stroke-width:2.4}${l}{rx:2px;ry:2px}${c}{rx:16px;ry:16px}${d}{stroke-width:1.1}& [data-edge] path[stroke-width="2"]{stroke-width:2.4}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:3.5 2.5}${f}{text-transform:uppercase;letter-spacing:.1em;font-size:8.5px}`,canvas:{radius:2,stop:16,border:.8,gate:3,edge:1.1,caps:.1}},y={bg:`#0a0f0b`,surface:`#0e1610`,"surface-2":`#132017`,ink:`#b8f5c2`,"ink-2":`#8fd69b`,"ink-3":`#6aa876`,line:`#1c2e21`,"line-strong":`#3c6b48`,accent:`#5dff8a`,"accent-soft":`#123620`,gate:`#ffb84a`,"gate-soft":`#33260e`,check:`#7fd4ff`,merge:`#c9a6ff`,stop:`#9fb5a4`,ok:`#5dff8a`,"ok-soft":`#123620`,warning:`#ffb84a`,error:`#ff7a6a`,"error-soft":`#3a1714`,"loop-0":`#6fe3ff`,"loop-1":`#ffd84a`,"loop-2":`#ff8f6a`,"loop-3":`#ff8fd0`},b={blueprint:h,ink:v,phosphor:{name:`phosphor`,label:`Phosphor`,use:`For terminals and dark dashboards. Fixed-width lettering on a dark screen, with gates in amber.`,light:y,dark:y,face:n,rules:()=>`& g rect,&>rect[rx]{rx:2px;ry:2px}${c}{rx:16px;ry:16px}${s}{rx:12px;ry:12px}& rect[rx="7.2"]{rx:7.2px;ry:7.2px}${o}{stroke-width:2.2}& text{${m}}& text[font-size="17"]{font-size:16px}& text[font-size="13.5"]{font-size:12.25px}& text[font-size="12.5"]{font-size:11.25px}& text[font-size="12"]{font-size:11px}& text[font-size="11.5"]{font-size:9.75px}& text[font-size="11"]{font-size:9px}& text[font-size="10.5"]{font-size:8.5px}& text[font-size="10"]{font-size:8px}& text[font-size="11"][font-weight="700"]{font-size:10.5px}& text[font-size="10.5"][font-weight="700"]{font-size:9.75px}& text[font-size="10"][font-weight="700"]{font-size:9.5px}& text[font-size="9.5"]{font-size:8.75px}& text[font-size="9"]{font-size:8.25px}${f}{text-transform:uppercase;letter-spacing:.06em}`,defs:(e,t)=>`<pattern id="${t}" width="3" height="3" patternUnits="userSpaceOnUse"><path d="M0,.5H3" fill="none" stroke-width="1" style="stroke:${e(`surface-2`)}"/></pattern>`,ground:!0,canvas:{radius:2,stop:16,border:1,gate:2.2,edge:1.5,caps:.1}},transit:{name:`transit`,label:`Transit`,use:`For talks and posters seen from across a room. Edges are thick route lines and each loop keeps its own color.`,light:{bg:`#ffffff`,surface:`#ffffff`,"surface-2":`#eef1f5`,ink:`#0f1b2d`,"ink-2":`#26344a`,"ink-3":`#4a5a72`,line:`#d5dbe4`,"line-strong":`#0f1b2d`,accent:`#0f1b2d`,"accent-soft":`#e3e9f2`,gate:`#b04f00`,"gate-soft":`#fdeed9`,check:`#0057b8`,merge:`#6b3fb0`,stop:`#0f1b2d`,ok:`#007a4d`,"ok-soft":`#dbf2e6`,warning:`#8f5200`,error:`#c4281c`,"error-soft":`#fde7e4`,"loop-0":`#d7261e`,"loop-1":`#007a4d`,"loop-2":`#b85300`,"loop-3":`#b0178a`,route:`#0057b8`},dark:{bg:`#0d1524`,surface:`#121c2e`,"surface-2":`#1a2740`,ink:`#f3f6fb`,"ink-2":`#cfd8e6`,"ink-3":`#9fadc2`,line:`#26344d`,"line-strong":`#f3f6fb`,accent:`#f3f6fb`,"accent-soft":`#1f2e49`,gate:`#ffab4a`,"gate-soft":`#3a2a12`,check:`#6db3ff`,merge:`#b99cff`,stop:`#f3f6fb`,ok:`#5fd6a0`,"ok-soft":`#143a2a`,warning:`#ffc266`,error:`#ff8a7d`,"error-soft":`#3d1c19`,"loop-0":`#ff6b5e`,"loop-1":`#5fd6a0`,"loop-2":`#ffab4a`,"loop-3":`#f07ad0`,route:`#6db3ff`},face:t,rules:e=>`& [data-edge] [style="stroke:${e(`ink-2`)}"]{stroke:${e(`route`)}!important}& [data-edge] [style="fill:${e(`ink-2`)}"]{fill:${e(`route`)}!important}${d}{stroke-width:4.5}& [data-edge] path[stroke-dasharray="5 3"]{stroke-dasharray:10 5;stroke-linecap:butt}& [data-edge] path[stroke-dasharray="1.5 3"]{stroke-dasharray:.1 8}@supports (transform-box:fill-box){& [data-edge] path+path,& [data-edge] circle+path{transform-box:fill-box;transform-origin:center;transform:scale(1.6)}}& [data-edge] circle{r:4.2px;stroke:${e(`bg`)};stroke-width:1.5}${a}{stroke-width:2.6}${o}{stroke-width:4.2}${s}{stroke-width:3.4}${l}{rx:22px;ry:22px}${c}{rx:5px;ry:5px}${f}{text-transform:uppercase;letter-spacing:.08em}`,canvas:{radius:22,stop:5,border:2.6,gate:4.2,edge:4.5,caps:.08}},chalk:{name:`chalk`,label:`Chalk`,use:`For early drafts and teaching. Hand lettering and lines that wobble say the graph is still open to change.`,light:{bg:`#f6f7f7`,surface:`#fbfbfb`,"surface-2":`#eceeee`,ink:`#2a2e32`,"ink-2":`#454a50`,"ink-3":`#62686f`,line:`#d5d8db`,"line-strong":`#4a5057`,accent:`#2456a6`,"accent-soft":`#dfe8f6`,gate:`#a94e08`,"gate-soft":`#fbeedd`,check:`#2456a6`,merge:`#6a45b5`,stop:`#62686f`,ok:`#1c6b4a`,"ok-soft":`#dcf0e6`,warning:`#8a5200`,error:`#a8261c`,"error-soft":`#fbe6e3`,"loop-0":`#7a3fb8`,"loop-1":`#0e7584`,"loop-2":`#b8430f`,"loop-3":`#a82a66`},dark:{bg:`#26302e`,surface:`#2a3533`,"surface-2":`#313d3a`,ink:`#f3f2ec`,"ink-2":`#d9dcd5`,"ink-3":`#b0b8b1`,line:`#3d4a47`,"line-strong":`#d9dcd5`,accent:`#a8d8ff`,"accent-soft":`#2f4652`,gate:`#ffd28a`,"gate-soft":`#4a4230`,check:`#a8d8ff`,merge:`#d9c2ff`,stop:`#b0b8b1`,ok:`#a6e8c0`,"ok-soft":`#2c4a3c`,warning:`#ffd28a`,error:`#ffb0a6`,"error-soft":`#4f3532`,"loop-0":`#f5a8cc`,"loop-1":`#9fe0d6`,"loop-2":`#ffb48a`,"loop-3":`#d9c2ff`},face:i,rules:()=>`${a},& [data-edge],& [data-plate],& [data-lane]>rect,& [data-people]>rect,&[data-picture="map"] [data-handoff]{filter:url(#gp-chalk)}${a}{stroke-width:1.5}${o}{stroke-width:2.6}${d}{stroke-width:1.8}& text{letter-spacing:.01em}`,defs:()=>`<filter id="gp-chalk"><feTurbulence type="fractalNoise" baseFrequency=".035" numOctaves="2" seed="4" result="n"/><feDisplacementMap in="SourceGraphic" in2="n" scale="3" xChannelSelector="R" yChannelSelector="G"/></filter>`,canvas:{radius:9,stop:16,border:1.5,gate:2.6,edge:1.8}}},x=t=>e.includes(t);function S(e,t=`auto`){if(e===void 0||e===`paper`||!x(e))return;let n=b[e],r=`.grooph-picture[data-look="${n.name}"]`,i=e=>Object.keys(e).map(t=>`--gp-${t}:${e[t]}`).join(`;`),a=`gp-${n.name}${t===`auto`?``:`-${t}`}`,o=t===`auto`,s=t===`dark`?n.dark:n.light,c=o?e=>`var(--gp-${e})`:e=>s[e]??``,l=`${r}:not([data-theme="light"])`,u=o?n.dark===n.light?`${r},${l}{${i(n.light)}}`:`${r}{${i(n.light)}}@media (prefers-color-scheme:dark){${l}{${i(n.dark)}}}${r}[data-theme="dark"]{${i(n.dark)}}`:``,d=n.face?`${r}{font-family:${n.face}}`:``;return{name:n.name,css:`${u}${d}${n.rules(c).replaceAll(`&`,r)}`,defs:n.defs?n.defs(c,a):``,ground:n.ground?`<rect width="100%" height="100%" fill="url(#${a})"/>`:``,colors:s}}function C(e,t,n=`auto`){let r=S(t,n);if(!r)return e;let i=/^(<svg [^>]* data-picture="[a-z]+")([^>]*>)(<title>[^<]*<\/title>)<style>[^<]*<\/style>(<rect [^>]*\/>)/;if(!i.test(e)||/^<svg [^>]* data-look=/.test(e))throw Error(`themed() takes a picture as core draws it to follow the viewer: picture(doc), with no theme of its own`);let a=e.replace(i,(e,t,n,i,a)=>`${t} data-look="${r.name}"${n}${i}<style>${r.css}</style>${r.defs?`<defs>${r.defs}</defs>`:``}${a}${r.ground}`);return n===`auto`?a:a.replace(/ style="[^"]*"/g,e=>e.replace(/var\(--gp-([a-z0-9-]+)\)/g,(e,t)=>r.colors[t]))}var w=(e,t)=>S(t)?e.replace(/<svg xmlns="http:\/\/www\.w3\.org\/2000\/svg" class="grooph-picture"[^]*?<\/svg>/,e=>C(`${e}\n`,t).trimEnd()):e,T=`groophPicture`,E={paper:`#1f5f4a`,blueprint:`#24467e`,ink:`#1c1c1c`,phosphor:`#5dff8a`,transit:`#0057b8`,chalk:`#a94e08`},D=e=>e===`paper`?`Paper`:b[e].label,O=t=>e.find(e=>e===t),k=typeof document<`u`,A=(()=>{try{return O(localStorage.getItem(T))??`paper`}catch{return`paper`}})();function j(e){let t=/^#\/(?:open|embed)\?(?:[^&]*&)*?theme=([^&]*)/.exec(e)?.[1]?.replace(/(?:^|-)(?:light|dark|auto)$/,``);return t?O(t)??`paper`:void 0}var M=(e=location.hash)=>j(e)??(e.startsWith(`#/embed`)?`paper`:A);function N(e){if(j(e)===void 0)return e;let[t,n=``]=[e.slice(0,e.indexOf(`?`)),e.slice(e.indexOf(`?`)+1)],r=n.split(`&`).filter(e=>!e.startsWith(`theme=`));return r.length?`${t}?${r.join(`&`)}`:t}function P(e){A=e;try{localStorage.setItem(T,e)}catch{}let t=N(location.hash);t!==location.hash&&history.replaceState(history.state,``,`${location.pathname}${location.search}${t}`),J()}function F(){let e=M();return e===`paper`?void 0:{id:e,picture:(t,n)=>C(t,e,n),page:t=>w(t,e)}}var I=e=>e.map(([e,t])=>`--${e}:${t}`).join(`;`),L=e=>e.ok===e[`line-strong`],R=e=>L(e)?void 0:e.ok,z=e=>I([[`bg`,e.bg],[`surface`,e.surface],[`surface-2`,e[`surface-2`]],[`ink`,e.ink],[`ink-2`,e[`ink-2`]],[`ink-3`,e[`ink-3`]],[`line`,e.line],[`line-strong`,e[`line-strong`]],[`dots`,e.line],[`edge`,e.route??e[`ink-2`]],[`kind-agent`,e.accent],[`kind-human-gate`,e.gate],[`kind-check`,e.check],[`kind-merge`,e.merge],[`kind-stop`,e.stop],[`loop-0`,e[`loop-0`]],[`loop-1`,e[`loop-1`]],[`loop-2`,e[`loop-2`]],[`loop-3`,e[`loop-3`]],...L(e)?[]:[[`accent`,e.accent],[`accent-ink`,e.bg],[`accent-soft`,e[`accent-soft`]],[`focus`,e.ok],[`highlight`,e.gate],[`error`,e.error],[`error-soft`,e[`error-soft`]],[`warning`,e.warning],[`warning-soft`,e[`gate-soft`]],[`ok`,e.ok],[`ok-soft`,e[`ok-soft`]]]])+`;color:${e.ink}`,B=(e,t)=>t(e.light)+(e.dark===e.light?``:`@media (prefers-color-scheme:dark){${t(e.dark)}}`);function V(e){let t=`.stage[data-look="${e.name}"]`,n=`${t} .react-flow,${t} .loop-legend,${t} .empty-canvas`,r=e.canvas;return B(e,e=>`${n}{${z(e)}}`)+(e.face?`:where(${t}) .react-flow{font-family:${e.face}}`:``)+`:where(${t}) .gnode{border-radius:${r.radius}px;border-width:${r.border}px}:where(${t}) .gnode-stop{border-radius:${r.stop}px}:where(${t}) .gnode-human-gate{border-width:${r.gate}px;border-color:var(--kind-human-gate)}:where(${t}) .gedge-line{stroke-width:${r.edge}}`+(r.radius<9?`:where(${t}) .gedge-label{border-radius:${r.radius}px}`:``)+(r.caps?`:where(${t}) .gnode-kind{text-transform:uppercase;letter-spacing:${r.caps}em}`:``)+(r.labelFace?`:where(${t}) .gnode-kind,:where(${t}) .gnode-sub{font-family:${r.labelFace}}`:``)+`${t} .gedge.is-selected .gedge-line,${t} .gedge.is-highlighted .gedge-line,${t} .gedge.is-picked .gedge-line{stroke-width:${Math.max(3,r.edge+1.5)}}${t} .gnode.run-halted{border-width:${Math.max(2,r.border+.8)}px}${t} .gnode-human-gate.run-halted{border-width:${Math.max(2,r.gate)}px}`}function H(e){let t=`.map-picture[data-look="${e.name}"]`,n=Math.max(e.canvas.border,1.4)+1.4;return B(e,e=>`${t}{${I([...R(e)?[[`accent`,R(e)]]:[],[`accent-soft`,e[`surface-2`]]])}}`)+`${t} :is([data-session],[data-person]):is(.is-on,:focus-visible)>rect[data-card]{stroke-width:${n}}`}function U(e){let t=`.gx[data-look="${e.name}"]`,n=e=>I([...[`bg`,`surface`,`surface-2`,`ink`,`ink-2`,`ink-3`,`line`,`line-strong`,`accent`,`ok`,`error`,`gate`,`loop-0`,`loop-1`,`loop-2`,`loop-3`].map(t=>[`gx-${t}`,e[t]]),...R(e)?[[`gx-focus`,R(e)]]:[]]),r=`${t} .gx-canvas g[data-node]`,i=e.canvas,a=[`${r}:focus-visible`,`${r}.is-picked`,`${r}:hover`,...[`running`,`passed`,`failed`,`halted`].map(e=>`${t}[data-replay] g[data-node][data-state="${e}"]`)],o=[`${t}[data-replay] g[data-node][data-focus]`],s=(e,t)=>`${e.map(e=>`${e} rect[data-card]`).join(`,`)}{stroke-width:${Math.max(2.5,i.border+t)}px}${e.map(e=>`${e} rect[data-card][stroke-width="1.8"]`).join(`,`)}{stroke-width:${Math.max(2.5,i.gate+t)}px}`;return(e.dark===e.light?`${t},${t}:not([data-theme="light"]),${t}[data-theme]{${n(e.light)};background:var(--gx-bg)}`:`${t}{${n(e.light)};background:var(--gx-bg)}@media (prefers-color-scheme:dark){${t}:not([data-theme="light"]){${n(e.dark)}}}${t}[data-theme="dark"]{${n(e.dark)}}`)+s(a,.9)+s(o,1.9)+`${t}[data-replay] g[data-edge][data-focus] path:first-child{stroke-width:${Math.max(3,i.edge+1.5)}px}`}function W(e){let[t,n,r]=[`s3-frame`,`space-scene`,`s3-key`].map(t=>`.${t}[data-look="${e.name}"]`),i=e=>I(Object.keys(e).map(t=>[`gp-${t}`,e[t]]));return`${r}{padding:8px 10px;border:1px solid;border-radius:10px}`+B(e,e=>`${t}>*,${r}{${z(e)}}${t},${r}{background:${e.bg};border-color:${e.line}}${n}{${i(e)}}`)+(e.face?`${t},${n},${n} svg{font-family:${e.face}}`:``)}var G=()=>Object.values(b).map(e=>S(e.name).css+V(e)+H(e)+U(e)+W(e)).join(``)+`[data-pictures][data-now]::after{content:attr(data-now);opacity:.72}`,K=`data-of-look`;function q(e,t){if(e.dataset.look===t)return;if(e.querySelector(`:scope > [${K}]`)?.remove(),!t)return void delete e.dataset.look;e.dataset.look=t;let n=S(t),r=`${n.defs?`<defs>${n.defs}</defs>`:``}${n.ground}`;r&&e.querySelector(`:scope > rect`)?.insertAdjacentHTML(`afterend`,`<g ${K}="">${r}</g>`)}function J(){let e=M(),t=e===`paper`?void 0:e,n=(e,t)=>void(e.dataset.look===t||(t?e.dataset.look=t:delete e.dataset.look));for(let e of document.querySelectorAll(`svg.grooph-picture`))q(e,t);for(let e of document.querySelectorAll(`main.stage,.map-picture,.gx`))n(e,e.querySelector(`[data-picture="space"]`)?void 0:t);for(let e of document.querySelectorAll(`.s3-frame,.s3-key,.space-scene`))n(e,t);X&&X.host.getClientRects().length===0&&X.shut();for(let t of document.querySelectorAll(`[data-pictures]`)){t.style.setProperty(`--dot`,E[e]);let n=t.hasAttribute(`aria-label`)?`aria-label`:`data-now`,r=n===`aria-label`?`Picture theme: ${D(e)}`:D(e);t.getAttribute(n)!==r&&t.setAttribute(n,r)}}var Y=`<svg viewBox="0 0 20 20" aria-hidden="true"><path d="m4.5 10.5 3.5 3.5 7.5-8" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/></svg>`,X;function Z(t){let n=X?.at===t;if(X?.shut(),n)return;let r=t.closest(`.site-theme`)??t.parentElement,i=r.querySelector(`.site-theme-toggle`)??t,a=M(),o=document.createElement(`ul`);o.className=`site-theme-list`,o.setAttribute(`role`,`menu`),o.setAttribute(`aria-label`,`Picture theme`),o.innerHTML=e.map(e=>`<li role="none"><button type="button" role="menuitemradio" aria-checked="${e===a}" tabindex="-1" data-id="${e}"><span class="site-theme-dot" style="--dot:${E[e]}" aria-hidden="true"></span>${D(e)}${Y}</button></li>`).join(``),r.append(o),i.setAttribute(`aria-expanded`,`true`);let s=r.classList.contains(`look-dot`);s&&(r.style.zIndex=`50`),o.style.maxHeight=`${Math.max(140,innerHeight-o.getBoundingClientRect().top-8)}px`,o.style.overflowY=`auto`;let c=[...o.querySelectorAll(`button`)],l=e=>{!o.contains(e.target)&&!t.contains(e.target)&&u(!1)},u=e=>{o.remove(),document.removeEventListener(`pointerdown`,l),s&&(r.style.zIndex=``),i.setAttribute(`aria-expanded`,`false`),X=void 0,e&&i.focus()};X={at:t,host:r,shut:()=>u(!1)},o.addEventListener(`click`,e=>{let t=e.target.closest(`button`);t&&(P(t.dataset.id),u(!0))}),o.addEventListener(`keydown`,e=>{let t=c.indexOf(document.activeElement),n=e.key===`ArrowDown`?(t+1)%c.length:e.key===`ArrowUp`?(t-1+c.length)%c.length:e.key===`Home`?0:e.key===`End`?c.length-1:-1;n>=0?(e.preventDefault(),c[n].focus()):e.key===`Escape`?(e.stopPropagation(),u(!0)):e.key===`Tab`&&u(!1)}),document.addEventListener(`pointerdown`,l),c[e.indexOf(a)].focus()}if(k){let e=document.createElement(`style`);e.textContent=G(),document.head.append(e),J(),new MutationObserver(J).observe(document.documentElement,{childList:!0,subtree:!0}),addEventListener(`hashchange`,J)}export{J as apply,P as choose,D as labelOf,F as look,j as lookNamed,M as lookNow,Z as open,G as styles,N as withoutLook};
@@ -1 +1 @@
1
- import{a as e,c as t,t as n}from"./index-CeaKwKuU.js";import{t as r}from"./groups-CjEPiwfv.js";var i=(e,t)=>e===0?[]:[`${e} ${t}${e===1?``:`s`}`];function a(e,t=[]){let n=(e.groups??[]).filter(e=>e.from!==void 0),i=new Map,a=new Map(n.map(e=>[e.id,0])),o=new Map;for(let t of n){let n=r(e,t.id);i.set(t.id,new Set(n.nodes)),o.set(t.id,n.loops);for(let e of n.groups)a.has(e)&&a.set(e,a.get(e)+1)}let s=e=>n.filter(t=>i.get(t.id).has(e)).sort((e,t)=>a.get(e.id)-a.get(t.id)),c=e=>t===`all`||t.includes(e.id),l=e=>s(e).find(e=>!c(e))?.id??e,u=new Map(n.map(e=>[e.id,e])),d=new Set,f=[];for(let t of e.nodes){let e=l(t.id);d.has(e)||(d.add(e),f.push(e===t.id?t:{id:e,kind:`merge`,name:u.get(e).name,merges:[]}))}let p=e.edges.flatMap(e=>{let t=l(e.from),n=l(e.to);return t===n&&e.from!==e.to?[]:[{...e,from:t,to:n}]}),m=new Set(p.map(e=>e.id)),h=e.loops.flatMap(e=>{let t=[...new Set(e.members.map(l))];return t.length===1&&u.has(t[0])?[]:[{...e,members:t,back:e.back.filter(e=>m.has(e))}]}),{groups:g,layout:_,...v}=e,y=n.filter(e=>i.get(e.id).size>0&&(d.has(e.id)||c(e)&&[...i.get(e.id)].some(t=>s(t).every(t=>a.get(t.id)>a.get(e.id)||c(t))))).sort((e,t)=>a.get(e.id)-a.get(t.id)).map(t=>({group:t,open:!d.has(t.id),depth:a.get(t.id),nodes:e.nodes.filter(e=>i.get(t.id).has(e.id)).map(e=>e.id),cards:[...new Set([...i.get(t.id)].map(l))],loops:o.get(t.id)}));return{doc:{...v,nodes:f,edges:p,loops:h},boxes:y,stands:l,chain:s}}function o(e,t){let n=new Set(t.nodes),{groups:r,layout:i,...a}=e;return{...a,name:t.group.name,nodes:e.nodes.filter(e=>n.has(e.id)),edges:e.edges.filter(e=>n.has(e.from)&&n.has(e.to)),loops:e.loops.filter(e=>t.loops.includes(e.id))}}function s(e,t){let n=new Set(t.nodes),r=e.nodes.filter(e=>n.has(e.id));return{line:[t.group.from,...i(r.length,`node`),...i(r.filter(e=>e.kind===`human-gate`).length,`human gate`),...i(t.loops.length,`loop`)].join(` · `),irreversible:r.flatMap(e=>e.kind===`agent`?e.irreversible??[]:[])}}var c=t(e(),1),l=`.unit{border-radius:14px;width:100%;height:100%}.unit-closed{border:1px solid var(--line-strong);background:var(--surface);box-shadow:5px 5px 0 -1px var(--surface-2), 5px 5px 0 0 var(--line-strong), var(--shadow);outline-offset:7px;outline-color:#0000;flex-direction:column;gap:2px;padding:10px 14px 12px;display:flex;position:relative}.unit-kind{color:var(--ink-2);align-items:center;gap:6px;font-size:12px;font-weight:650;display:flex}.unit-mark{border:2px solid var(--ink-2);width:10px;height:10px;box-shadow:2px 2px 0 0 var(--ink-3);border-radius:3px;flex:none}.unit-name{overflow-wrap:anywhere;font-size:15px;font-weight:650;line-height:1.25}.unit-line,.unit-about{color:var(--ink-2);font-size:12.5px}.unit-about{color:var(--ink-3)}.unit-warn{color:var(--kind-human-gate);font-size:12px;font-weight:650}.unit-glyph{flex:1;align-items:center;min-height:0;margin-top:4px;display:flex}.unit-glyph svg{width:auto;max-width:100%;height:auto;max-height:100%}.unit-hint{border:1px solid var(--line-strong);color:var(--ink-2);background:var(--surface);border-radius:999px;padding:1px 8px;font-size:11.5px;font-weight:650;position:absolute;top:9px;right:12px}.react-flow__node:focus-visible .unit-closed{outline:2px solid var(--focus);outline-offset:5px}.react-flow__node.unit-frame{pointer-events:none;cursor:default}.unit-open{border:1.5px dashed var(--line-strong);background:color-mix(in srgb, var(--surface-2) 45%, transparent)}.unit-head{align-items:center;gap:8px;height:34px;padding:0 6px 0 14px;display:flex}.unit-head .unit-name{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.unit-from{min-width:0;color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}.unit-close{pointer-events:all;border:1px solid var(--line-strong);min-height:26px;font:inherit;color:var(--ink);background:var(--surface);cursor:pointer;border-radius:999px;padding:0 10px;font-size:12px;font-weight:650}.unit-close:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.unit-close:after{content:"";position:absolute;inset:-9px}.unit-close{position:relative}.outline-unit{border:1.5px dashed var(--line-strong);border-radius:14px;margin:12px 0;padding:0 12px}.outline-unit>summary{cursor:pointer;gap:1px;padding:12px 26px 12px 0;list-style:none;display:grid;position:relative}.outline-unit>summary::-webkit-details-marker{display:none}.outline-unit>summary:after{content:"";border-right:2px solid var(--ink-3);border-bottom:2px solid var(--ink-3);width:9px;height:9px;position:absolute;top:22px;right:4px;transform:rotate(45deg)}.outline-unit[open]>summary:after{top:26px;transform:rotate(-135deg)}.outline-unit>summary:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:8px}.outline-unit-name{font-size:18px;font-weight:650;line-height:1.3}.outline-unit-line{color:var(--ink-3);font-size:13px}.outline-unit[open]>summary{border-bottom:1px solid var(--line)}`,u=n(),d=document.createElement(`style`);d.textContent=l,document.head.append(d);var f=14,p=34,m={w:200,h:84};function h(e,t,n,r){let i=a(e,t),c=new Map;for(let e of[...i.boxes].reverse()){let t=new Set(e.nodes),a=e.nodes.map(e=>({...n[e]??{x:0,y:0},...r(e)}));for(let n of i.boxes)n.depth>e.depth&&n.nodes.every(e=>t.has(e))&&c.has(n.group.id)&&a.push(c.get(n.group.id));let o=Math.min(...a.map(e=>e.x))-f,s=Math.min(...a.map(e=>e.y))-p;c.set(e.group.id,{x:o,y:s,w:Math.max(...a.map(e=>e.x+e.w))+f-o,h:Math.max(...a.map(e=>e.y+e.h))+f-s})}let l=new Map(i.boxes.map(e=>[e.group.id,e]));return{doc:i.doc,boxes:i.boxes.map(t=>{let n=s(e,t),r=t.group.name||t.group.id;return{rect:c.get(t.group.id),face:{id:t.group.id,name:r,open:t.open,line:n.line,...t.group.description?{about:t.group.description}:{},irreversible:n.irreversible,holds:o(e,t),label:`Subgrooph: ${r}, ${n.line.split(` · `).slice(1).join(`, `)}${t.open?``:`. Closed: Enter opens it`}`}}}),nodesOf:e=>l.get(e)?.nodes??[],hides:e=>{let n=i.chain(e).map(e=>e.id),r=n.findIndex(e=>!(t===`all`||t.includes(e)));return r<0?[]:n.slice(r)}}}function g({section:e,count:t,open:n,onToggle:r,children:i}){let a=e.items.find(e=>e.label===`Placed from`)?.text;return(0,u.jsxs)(`details`,{className:`outline-unit`,"data-outline-id":e.id,open:n,onToggle:e=>r(e.currentTarget.open),children:[(0,u.jsxs)(`summary`,{children:[(0,u.jsx)(`span`,{className:`outline-kind`,children:`Subgrooph`}),(0,u.jsx)(`span`,{className:`outline-unit-name`,children:e.title}),(0,u.jsxs)(`span`,{className:`outline-unit-line`,children:[t,` `,t===1?`node`:`nodes`,a?`, placed from ${a}`:``]})]}),i]})}function _({sections:e,current:t,one:n}){let[r,i]=(0,c.useState)(new Set),a=t=>{let n=e.find(e=>e.id===t)?.inside;return n===void 0?[]:[n,...a(n)]},o=a(t).join(` `);(0,c.useEffect)(()=>{o!==``&&(i(e=>new Set([...e,...o.split(` `)])),requestAnimationFrame(()=>document.querySelector(`.outline .is-current`)?.scrollIntoView({block:`nearest`})))},[t,o]);let s=t=>{let o=new Set;return e.flatMap((c,l)=>{let d=[c.id,...a(c.id)],f=t===void 0?d.length:d.indexOf(t),p=f>0?d[f-1]:void 0;if(p===void 0||o.has(p))return[];o.add(p);let m=p===c.id?c:e.find(e=>e.id===p&&e.kind===`Subgrooph`);if(!m)return[];if(m.kind!==`Subgrooph`)return[n(m,l)];let h=e.filter(e=>e.kind!==`Subgrooph`&&a(e.id).includes(m.id)).length;return[(0,u.jsxs)(g,{section:m,count:h,open:r.has(m.id),onToggle:e=>i(t=>new Set(e?[...t,m.id]:[...t].filter(e=>e!==m.id))),children:[n(m,e.indexOf(m)),s(m.id)]},`unit-${m.id}`)]})};return(0,u.jsx)(u.Fragment,{children:s(void 0)})}function v({face:e,severity:t,onToggle:n,glyph:r}){let i=(0,c.useMemo)(()=>e.open?``:r(e.holds),[e,r]);return e.open?(0,u.jsx)(`div`,{className:`unit unit-open`,"data-unit-id":e.id,"data-open":``,children:(0,u.jsxs)(`div`,{className:`unit-head`,children:[(0,u.jsx)(`span`,{className:`unit-name`,children:e.name}),(0,u.jsx)(`span`,{className:`unit-from`,children:e.line.split(` · `)[0]}),(0,u.jsx)(`button`,{type:`button`,className:`unit-close nodrag nopan`,"aria-label":`Close ${e.name}`,"aria-expanded":`true`,onClick:e=>{e.stopPropagation(),n()},children:`Close`})]})}):(0,u.jsxs)(`div`,{className:`unit unit-closed`,"data-unit-id":e.id,role:`button`,tabIndex:0,"aria-expanded":`false`,"aria-label":e.label,onClick:e=>{e.stopPropagation(),n()},onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),n())},children:[(0,u.jsxs)(`div`,{className:`unit-kind`,children:[(0,u.jsx)(`span`,{className:`unit-mark`,"aria-hidden":`true`}),`Subgrooph`]}),(0,u.jsx)(`div`,{className:`unit-name`,children:e.name}),(0,u.jsx)(`div`,{className:`unit-line`,children:e.line}),e.about?(0,u.jsx)(`div`,{className:`unit-about`,children:e.about}):null,e.irreversible.length>0?(0,u.jsxs)(`div`,{className:`unit-warn`,children:[`irreversible inside: `,e.irreversible.join(`, `)]}):null,(0,u.jsx)(`div`,{className:`unit-glyph`,"aria-hidden":`true`,dangerouslySetInnerHTML:{__html:i}}),(0,u.jsx)(`div`,{className:`unit-hint`,children:`Open`}),t?(0,u.jsx)(`span`,{className:`gnode-issue issue-dot-${t}`,role:`img`,"aria-label":`has ${t}s inside`}):null]})}var y=(0,c.memo)(function({unit:e,Handle:t,glyph:n}){return(0,u.jsxs)(`div`,{style:{width:e.rect.w,height:e.rect.h},children:[e.face.open?null:(0,u.jsx)(t,{type:`target`,position:`top`,isConnectable:!1,className:`ghandle`}),(0,u.jsx)(v,{...e,glyph:n}),e.face.open?null:(0,u.jsx)(t,{type:`source`,position:`bottom`,isConnectable:!1,className:`ghandle`})]})}),b=[];function x(e,t,n,r,i=b,a,o=!1){let[s,l]=(0,c.useState)(b),u=(0,c.useCallback)(e=>l(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),[]),d=(0,c.useMemo)(()=>h(e,o?`all`:s,t,e=>({w:Math.max(n[e]?.width??0,m.w),h:Math.max(n[e]?.height??0,m.h)})),[e,o,s,t,n]),f=[...i,...a===void 0?[]:[a]].join(` `);return(0,c.useEffect)(()=>{let e=f===``?[]:[...new Set(f.split(` `).flatMap(e=>d.hides(e)))];e.length>0&&l(t=>[...new Set([...t,...e])])},[d,f]),(0,c.useMemo)(()=>{let e=e=>{let t=d.nodesOf(e).map(e=>r.get(e));return t.includes(`error`)?`error`:t.includes(`warning`)?`warning`:void 0},n=new Map(d.boxes.map(({face:t,rect:n})=>{let r=t.open?void 0:e(t.id);return[t.id,{face:t,rect:n,...r?{severity:r}:{},onToggle:()=>u(t.id)}]})),i=(e,t)=>({id:e,kind:`merge`,name:t.face.name,merges:[],unit:t}),a=[...n].filter(([,e])=>e.face.open).map(([e,t])=>({id:e,type:`graph`,position:{x:t.rect.x,y:t.rect.y},measured:{width:t.rect.w,height:t.rect.h},zIndex:-1,draggable:!1,focusable:!1,className:`unit-frame`,data:{node:i(e,t),loops:[],selected:!1,highlighted:!1,connectFrom:!1}})),o=new WeakMap;return{doc:{...d.doc,nodes:d.doc.nodes.map(e=>n.has(e.id)?i(e.id,n.get(e.id)):e)},positions:{...t,...Object.fromEntries([...n].map(([e,t])=>[e,{x:t.rect.x,y:t.rect.y}]))},with:e=>o.get(e)??o.set(e,[...a,...e.map(e=>n.has(e.id)?{...e,focusable:!1,draggable:!1}:e)]).get(e)}},[d,t,r,u])}export{_ as OutlineFold,y as UnitNode,h as boxesFor,x as useBoxes};
1
+ import{a as e,c as t,t as n}from"./index-B5ZkSF4L.js";import{t as r}from"./groups-CjEPiwfv.js";var i=(e,t)=>e===0?[]:[`${e} ${t}${e===1?``:`s`}`];function a(e,t=[]){let n=(e.groups??[]).filter(e=>e.from!==void 0),i=new Map,a=new Map(n.map(e=>[e.id,0])),o=new Map;for(let t of n){let n=r(e,t.id);i.set(t.id,new Set(n.nodes)),o.set(t.id,n.loops);for(let e of n.groups)a.has(e)&&a.set(e,a.get(e)+1)}let s=e=>n.filter(t=>i.get(t.id).has(e)).sort((e,t)=>a.get(e.id)-a.get(t.id)),c=e=>t===`all`||t.includes(e.id),l=e=>s(e).find(e=>!c(e))?.id??e,u=new Map(n.map(e=>[e.id,e])),d=new Set,f=[];for(let t of e.nodes){let e=l(t.id);d.has(e)||(d.add(e),f.push(e===t.id?t:{id:e,kind:`merge`,name:u.get(e).name,merges:[]}))}let p=e.edges.flatMap(e=>{let t=l(e.from),n=l(e.to);return t===n&&e.from!==e.to?[]:[{...e,from:t,to:n}]}),m=new Set(p.map(e=>e.id)),h=e.loops.flatMap(e=>{let t=[...new Set(e.members.map(l))];return t.length===1&&u.has(t[0])?[]:[{...e,members:t,back:e.back.filter(e=>m.has(e))}]}),{groups:g,layout:_,...v}=e,y=n.filter(e=>i.get(e.id).size>0&&(d.has(e.id)||c(e)&&[...i.get(e.id)].some(t=>s(t).every(t=>a.get(t.id)>a.get(e.id)||c(t))))).sort((e,t)=>a.get(e.id)-a.get(t.id)).map(t=>({group:t,open:!d.has(t.id),depth:a.get(t.id),nodes:e.nodes.filter(e=>i.get(t.id).has(e.id)).map(e=>e.id),cards:[...new Set([...i.get(t.id)].map(l))],loops:o.get(t.id)}));return{doc:{...v,nodes:f,edges:p,loops:h},boxes:y,stands:l,chain:s}}function o(e,t){let n=new Set(t.nodes),{groups:r,layout:i,...a}=e;return{...a,name:t.group.name,nodes:e.nodes.filter(e=>n.has(e.id)),edges:e.edges.filter(e=>n.has(e.from)&&n.has(e.to)),loops:e.loops.filter(e=>t.loops.includes(e.id))}}function s(e,t){let n=new Set(t.nodes),r=e.nodes.filter(e=>n.has(e.id));return{line:[t.group.from,...i(r.length,`node`),...i(r.filter(e=>e.kind===`human-gate`).length,`human gate`),...i(t.loops.length,`loop`)].join(` · `),irreversible:r.flatMap(e=>e.kind===`agent`?e.irreversible??[]:[])}}var c=t(e(),1),l=`.unit{border-radius:14px;width:100%;height:100%}.unit-closed{border:1px solid var(--line-strong);background:var(--surface);box-shadow:5px 5px 0 -1px var(--surface-2), 5px 5px 0 0 var(--line-strong), var(--shadow);outline-offset:7px;outline-color:#0000;flex-direction:column;gap:2px;padding:10px 14px 12px;display:flex;position:relative}.unit-kind{color:var(--ink-2);align-items:center;gap:6px;font-size:12px;font-weight:650;display:flex}.unit-mark{border:2px solid var(--ink-2);width:10px;height:10px;box-shadow:2px 2px 0 0 var(--ink-3);border-radius:3px;flex:none}.unit-name{overflow-wrap:anywhere;font-size:15px;font-weight:650;line-height:1.25}.unit-line,.unit-about{color:var(--ink-2);font-size:12.5px}.unit-about{color:var(--ink-3)}.unit-warn{color:var(--kind-human-gate);font-size:12px;font-weight:650}.unit-glyph{flex:1;align-items:center;min-height:0;margin-top:4px;display:flex}.unit-glyph svg{width:auto;max-width:100%;height:auto;max-height:100%}.unit-hint{border:1px solid var(--line-strong);color:var(--ink-2);background:var(--surface);border-radius:999px;padding:1px 8px;font-size:11.5px;font-weight:650;position:absolute;top:9px;right:12px}.react-flow__node:focus-visible .unit-closed{outline:2px solid var(--focus);outline-offset:5px}.react-flow__node.unit-frame{pointer-events:none;cursor:default}.unit-open{border:1.5px dashed var(--line-strong);background:color-mix(in srgb, var(--surface-2) 45%, transparent)}.unit-head{align-items:center;gap:8px;height:34px;padding:0 6px 0 14px;display:flex}.unit-head .unit-name{color:var(--ink-2);text-overflow:ellipsis;white-space:nowrap;font-size:13px;overflow:hidden}.unit-from{min-width:0;color:var(--ink-3);text-overflow:ellipsis;white-space:nowrap;flex:1;font-size:12px;overflow:hidden}.unit-close{pointer-events:all;border:1px solid var(--line-strong);min-height:26px;font:inherit;color:var(--ink);background:var(--surface);cursor:pointer;border-radius:999px;padding:0 10px;font-size:12px;font-weight:650}.unit-close:focus-visible{outline:2px solid var(--focus);outline-offset:2px}.unit-close:after{content:"";position:absolute;inset:-9px}.unit-close{position:relative}.outline-unit{border:1.5px dashed var(--line-strong);border-radius:14px;margin:12px 0;padding:0 12px}.outline-unit>summary{cursor:pointer;gap:1px;padding:12px 26px 12px 0;list-style:none;display:grid;position:relative}.outline-unit>summary::-webkit-details-marker{display:none}.outline-unit>summary:after{content:"";border-right:2px solid var(--ink-3);border-bottom:2px solid var(--ink-3);width:9px;height:9px;position:absolute;top:22px;right:4px;transform:rotate(45deg)}.outline-unit[open]>summary:after{top:26px;transform:rotate(-135deg)}.outline-unit>summary:focus-visible{outline:2px solid var(--focus);outline-offset:2px;border-radius:8px}.outline-unit-name{font-size:18px;font-weight:650;line-height:1.3}.outline-unit-line{color:var(--ink-3);font-size:13px}.outline-unit[open]>summary{border-bottom:1px solid var(--line)}`,u=n(),d=document.createElement(`style`);d.textContent=l,document.head.append(d);var f=14,p=34,m={w:200,h:84};function h(e,t,n,r){let i=a(e,t),c=new Map;for(let e of[...i.boxes].reverse()){let t=new Set(e.nodes),a=e.nodes.map(e=>({...n[e]??{x:0,y:0},...r(e)}));for(let n of i.boxes)n.depth>e.depth&&n.nodes.every(e=>t.has(e))&&c.has(n.group.id)&&a.push(c.get(n.group.id));let o=Math.min(...a.map(e=>e.x))-f,s=Math.min(...a.map(e=>e.y))-p;c.set(e.group.id,{x:o,y:s,w:Math.max(...a.map(e=>e.x+e.w))+f-o,h:Math.max(...a.map(e=>e.y+e.h))+f-s})}let l=new Map(i.boxes.map(e=>[e.group.id,e]));return{doc:i.doc,boxes:i.boxes.map(t=>{let n=s(e,t),r=t.group.name||t.group.id;return{rect:c.get(t.group.id),face:{id:t.group.id,name:r,open:t.open,line:n.line,...t.group.description?{about:t.group.description}:{},irreversible:n.irreversible,holds:o(e,t),label:`Subgrooph: ${r}, ${n.line.split(` · `).slice(1).join(`, `)}${t.open?``:`. Closed: Enter opens it`}`}}}),nodesOf:e=>l.get(e)?.nodes??[],hides:e=>{let n=i.chain(e).map(e=>e.id),r=n.findIndex(e=>!(t===`all`||t.includes(e)));return r<0?[]:n.slice(r)}}}function g({section:e,count:t,open:n,onToggle:r,children:i}){let a=e.items.find(e=>e.label===`Placed from`)?.text;return(0,u.jsxs)(`details`,{className:`outline-unit`,"data-outline-id":e.id,open:n,onToggle:e=>r(e.currentTarget.open),children:[(0,u.jsxs)(`summary`,{children:[(0,u.jsx)(`span`,{className:`outline-kind`,children:`Subgrooph`}),(0,u.jsx)(`span`,{className:`outline-unit-name`,children:e.title}),(0,u.jsxs)(`span`,{className:`outline-unit-line`,children:[t,` `,t===1?`node`:`nodes`,a?`, placed from ${a}`:``]})]}),i]})}function _({sections:e,current:t,one:n}){let[r,i]=(0,c.useState)(new Set),a=t=>{let n=e.find(e=>e.id===t)?.inside;return n===void 0?[]:[n,...a(n)]},o=a(t).join(` `);(0,c.useEffect)(()=>{o!==``&&(i(e=>new Set([...e,...o.split(` `)])),requestAnimationFrame(()=>document.querySelector(`.outline .is-current`)?.scrollIntoView({block:`nearest`})))},[t,o]);let s=t=>{let o=new Set;return e.flatMap((c,l)=>{let d=[c.id,...a(c.id)],f=t===void 0?d.length:d.indexOf(t),p=f>0?d[f-1]:void 0;if(p===void 0||o.has(p))return[];o.add(p);let m=p===c.id?c:e.find(e=>e.id===p&&e.kind===`Subgrooph`);if(!m)return[];if(m.kind!==`Subgrooph`)return[n(m,l)];let h=e.filter(e=>e.kind!==`Subgrooph`&&a(e.id).includes(m.id)).length;return[(0,u.jsxs)(g,{section:m,count:h,open:r.has(m.id),onToggle:e=>i(t=>new Set(e?[...t,m.id]:[...t].filter(e=>e!==m.id))),children:[n(m,e.indexOf(m)),s(m.id)]},`unit-${m.id}`)]})};return(0,u.jsx)(u.Fragment,{children:s(void 0)})}function v({face:e,severity:t,onToggle:n,glyph:r}){let i=(0,c.useMemo)(()=>e.open?``:r(e.holds),[e,r]);return e.open?(0,u.jsx)(`div`,{className:`unit unit-open`,"data-unit-id":e.id,"data-open":``,children:(0,u.jsxs)(`div`,{className:`unit-head`,children:[(0,u.jsx)(`span`,{className:`unit-name`,children:e.name}),(0,u.jsx)(`span`,{className:`unit-from`,children:e.line.split(` · `)[0]}),(0,u.jsx)(`button`,{type:`button`,className:`unit-close nodrag nopan`,"aria-label":`Close ${e.name}`,"aria-expanded":`true`,onClick:e=>{e.stopPropagation(),n()},children:`Close`})]})}):(0,u.jsxs)(`div`,{className:`unit unit-closed`,"data-unit-id":e.id,role:`button`,tabIndex:0,"aria-expanded":`false`,"aria-label":e.label,onClick:e=>{e.stopPropagation(),n()},onKeyDown:e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),e.stopPropagation(),n())},children:[(0,u.jsxs)(`div`,{className:`unit-kind`,children:[(0,u.jsx)(`span`,{className:`unit-mark`,"aria-hidden":`true`}),`Subgrooph`]}),(0,u.jsx)(`div`,{className:`unit-name`,children:e.name}),(0,u.jsx)(`div`,{className:`unit-line`,children:e.line}),e.about?(0,u.jsx)(`div`,{className:`unit-about`,children:e.about}):null,e.irreversible.length>0?(0,u.jsxs)(`div`,{className:`unit-warn`,children:[`irreversible inside: `,e.irreversible.join(`, `)]}):null,(0,u.jsx)(`div`,{className:`unit-glyph`,"aria-hidden":`true`,dangerouslySetInnerHTML:{__html:i}}),(0,u.jsx)(`div`,{className:`unit-hint`,children:`Open`}),t?(0,u.jsx)(`span`,{className:`gnode-issue issue-dot-${t}`,role:`img`,"aria-label":`has ${t}s inside`}):null]})}var y=(0,c.memo)(function({unit:e,Handle:t,glyph:n}){return(0,u.jsxs)(`div`,{style:{width:e.rect.w,height:e.rect.h},children:[e.face.open?null:(0,u.jsx)(t,{type:`target`,position:`top`,isConnectable:!1,className:`ghandle`}),(0,u.jsx)(v,{...e,glyph:n}),e.face.open?null:(0,u.jsx)(t,{type:`source`,position:`bottom`,isConnectable:!1,className:`ghandle`})]})}),b=[];function x(e,t,n,r,i=b,a,o=!1){let[s,l]=(0,c.useState)(b),u=(0,c.useCallback)(e=>l(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e]),[]),d=(0,c.useMemo)(()=>h(e,o?`all`:s,t,e=>({w:Math.max(n[e]?.width??0,m.w),h:Math.max(n[e]?.height??0,m.h)})),[e,o,s,t,n]),f=[...i,...a===void 0?[]:[a]].join(` `);return(0,c.useEffect)(()=>{let e=f===``?[]:[...new Set(f.split(` `).flatMap(e=>d.hides(e)))];e.length>0&&l(t=>[...new Set([...t,...e])])},[d,f]),(0,c.useMemo)(()=>{let e=e=>{let t=d.nodesOf(e).map(e=>r.get(e));return t.includes(`error`)?`error`:t.includes(`warning`)?`warning`:void 0},n=new Map(d.boxes.map(({face:t,rect:n})=>{let r=t.open?void 0:e(t.id);return[t.id,{face:t,rect:n,...r?{severity:r}:{},onToggle:()=>u(t.id)}]})),i=(e,t)=>({id:e,kind:`merge`,name:t.face.name,merges:[],unit:t}),a=[...n].filter(([,e])=>e.face.open).map(([e,t])=>({id:e,type:`graph`,position:{x:t.rect.x,y:t.rect.y},measured:{width:t.rect.w,height:t.rect.h},zIndex:-1,draggable:!1,focusable:!1,className:`unit-frame`,data:{node:i(e,t),loops:[],selected:!1,highlighted:!1,connectFrom:!1}})),o=new WeakMap;return{doc:{...d.doc,nodes:d.doc.nodes.map(e=>n.has(e.id)?i(e.id,n.get(e.id)):e)},positions:{...t,...Object.fromEntries([...n].map(([e,t])=>[e,{x:t.rect.x,y:t.rect.y}]))},with:e=>o.get(e)??o.set(e,[...a,...e.map(e=>n.has(e.id)?{...e,focusable:!1,draggable:!1}:e)]).get(e)}},[d,t,r,u])}export{_ as OutlineFold,y as UnitNode,h as boxesFor,x as useBoxes};
@@ -1 +1,2 @@
1
- import{a as e,c as t,n,r,t as i}from"./index-CeaKwKuU.js";function a(e){let[t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k]=e;return{BADGE_R:t,M:n,PAD:r,SLOT:i,TRACK:a,TRACK_MIN:o,PICTURE_WIDTH:s,assignTracks:c,badgeHalf:l,carriedBy:u,drawn:d,fmt:f,frame:p,handoffRow:m,heading:h,inkFor:g,laneHead:_,numberBadge:v,numberRing:y,numberText:b,personCard:x,placeNumber:S,rect:C,sessionCard:w,stroke:T,styleOf:E,text:D,textWidth:O,wrap:k}}var o=168,s=150,c=9,l=18,u=10,d=11,f=5.5,p=3,m=2.5,h=150,g=340,_=(e,t,n)=>Math.max(t,Math.min(n,e));function v(e){let t=[];for(let n of e){let e=t[t.length-1],r=t[t.length-2];e&&e[0]===n[0]&&e[1]===n[1]||(e&&r&&(r[0]===e[0]&&e[0]===n[0]||r[1]===e[1]&&e[1]===n[1])&&t.pop(),t.push(n))}return t}function y(e,t,n={}){let{BADGE_R:r,M:i,PAD:y,SLOT:b,TRACK:x,TRACK_MIN:S,assignTracks:C,badgeHalf:w,drawn:T,fmt:E,frame:D,handoffRow:O,heading:k,inkFor:A,laneHead:ee,numberRing:j,numberText:M,personCard:te,placeNumber:ne,rect:N,sessionCard:P,stroke:re,styleOf:F,text:I}=a(e),L=n.theme??`auto`,R=A(L),z=t.lanes,B=z.length,{sessions:ie,people:V,handoffs:H,numberOf:U}=T(t),ae=z.map(e=>ie.filter(t=>t.lane===e.id)),W=new Map;V.forEach((e,t)=>W.set(e.id,{lane:-1,k:t})),ae.forEach((e,t)=>e.forEach((e,n)=>W.set(e.id,{lane:t,k:n})));let oe=H.map(e=>[W.get(e.from),W.get(e.to)]),G=z.map(()=>[0,0]),se=z.map(()=>!1);for(let[e,t]of oe)e.lane>=0&&t.lane>=0&&e.lane!==t.lane?(G[e.lane][+(e.lane<t.lane)]++,G[t.lane][+(t.lane<e.lane)]++):e.lane<0!=t.lane<0&&(se[Math.max(e.lane,t.lane)]=!0);let ce=G.map(([e,t])=>e<=t?0:1),le=G.map(([e,t],n)=>se[n]?1-ce[n]:+(t<=e)),ue=[],de=[],fe=H.map((e,t)=>{let[n,r]=oe[t],i=(e,t,n,r)=>ue[ue.push({g:e,group:t,lo:Math.min(n,r),hi:Math.max(n,r),t:0})-1],a=(n,r,i,a)=>de[de.push({id:n?e.from:e.to,other:n?e.to:e.from,side:r,lean:i,run:a,arc:t,from:n,y:0})-1];if(n.lane<0&&r.lane<0)return{};if(n.lane<0||r.lane<0){let e=n.lane<0?r:n,t=ce[e.lane],o=a(n.lane>=0,t,-1,i(e.lane+t,t?0:2,-1,e.k));return n.lane<0?{to:o}:{from:o}}if(n.lane===r.lane){let e=le[n.lane],t=i(n.lane+e,e?0:2,n.k,r.k);return{from:a(!0,e,Math.sign(r.k-n.k),t),to:a(!1,e,Math.sign(n.k-r.k),t)}}let o=+(n.lane<r.lane);if(Math.abs(n.lane-r.lane)===1){let e=i(Math.max(n.lane,r.lane),1,0,0);return{from:a(!0,o,0,e),to:a(!1,1-o,0,e)}}return{from:a(!0,o,-1,i(n.lane+o,o?0:2,-1,n.k)),to:a(!1,1-o,-1,i(r.lane+1-o,o?2:0,-1,r.k))}}),pe=Array.from({length:B+1},()=>[0,0,0]);for(let e=0;e<=B;e++)for(let t of[0,2]){let n=ue.filter(n=>n.g===e&&n.group===t),{tracks:r,count:i}=C(n.map(e=>({from:e.lo,to:e.hi})));n.forEach((e,t)=>e.t=r[t]),pe[e][t]=i}for(let e of ue)e.group===1&&(e.t=pe[e.g][1]++);let me=pe.map(e=>e[0]+e[1]+e[2]),he=me.reduce((e,t)=>e+Math.max(0,t-1),0),ge=e=>e===0&&V.length?l:c,_e=e=>me[e]?ge(e)+(e===B&&V.length?l:c):e>0&&e<B?u:0,ve=2*i+B*2*y+me.reduce((e,t,n)=>e+_e(n),0),ye=x,K=o,be=n.width;if(be!==void 0&&Number.isFinite(be)&&B>0){let e=e=>(be-ve-he*e)/B;e(x)<s&&he&&(ye=_((be-ve-B*s)/he,S,x)),K=_(e(ye),s,o)}let xe=[],q=[],J=i;for(let e=0;e<=B;e++)xe.push(J),J+=_e(e)+Math.max(0,me[e]-1)*ye,e<B&&(q.push(J),J+=K+2*y);let Y=Math.max(J+i,g,V.length?2*(i+y)+V.length*h+(V.length-1)*8:0),Se=(Y-J-i)/2;q.forEach((e,t)=>q[t]=e+Se);let X=e=>Se+xe[e.g]+ge(e.g)+(e.group===0?e.t:e.group===1?pe[e.g][0]+e.t:me[e.g]-1-e.t)*ye,Z=[],Ce=[],Q=k(t,Y,n,R,Z),we=new Map,Te=Q;if(V.length>0){let e=Q,t=(Y-2*i-2*y-(V.length-1)*8)/V.length,n=V.map(e=>te(e,t,0,R,p)),r=Math.max(...n.map(e=>e.height));V.forEach((a,o)=>{let s=i+y+o*(t+8);we.set(a.id,[s,s+t]),Ce.push(n[o].draw(s,e+y+21.5,r))}),Te=e+y+21.5+r,Q=Te+y,Z.push(`<g data-people="">${N(i,e,Y-2*i,Q-e,{fill:R(`surface-2`),stroke:R(`line`),rx:12,dash:`5 4`})}${I(i+y+2,e+y+12,V.length===1?`Person`:`People`,{size:12.5,fill:R(`ink`),weight:`bold`})}</g>`)}let Ee=V.map(()=>[]),De=e=>(we.get(V[e].id)[0]+we.get(V[e].id)[1])/2;H.forEach((e,t)=>{let[n,r]=oe[t],{from:i,to:a}=fe[t];n.lane<0&&Ee[n.k].push({arc:t,end:0,toward:a?X(a.run):n.k===r.k?NaN:De(r.k)}),r.lane<0&&Ee[r.k].push({arc:t,end:1,toward:i?X(i.run):n.k===r.k?NaN:De(n.k)})});let Oe=H.map(()=>[0,0]),ke=ue.map(X);V.forEach((e,t)=>{let[n,r]=we.get(e.id),i=e=>e>=n+9.5&&e<=r-9.5,a=_((r-n-16)/(Ee[t].filter(e=>!i(e.toward)).length+1),3,b),o=[],s=(e,t)=>{let i=_(e,n+8,r-8);for(let e=a;e>=1.5;e/=2)for(let a=i;a>=n+8&&a<=r-8;a+=t)if(ke.every(t=>Math.abs(t-a)>=Math.min(5,e))&&o.every(t=>Math.abs(t-a)>=e-.01))return o.push(a),a;return o.push(i),i};for(let e of Ee[t]){let a=e.toward;Oe[e.arc][e.end]=i(a)?a:Number.isNaN(a)?s(De(t)+(e.end?7:-7),e.end?1:-1):a<n+9.5?s(n+12,1):s(r-12,-1)}});let Ae=H.map((e,t)=>{let{from:n,to:r}=fe[t];if(!(n&&r&&n.run===r.run))return[n?X(n.run):Oe[t][0],r?X(r.run):Oe[t][1]]}),je=Ae.flatMap((e,t)=>e&&e[0]!==e[1]?[{arc:t,from:e[0],to:e[1]}]:[]),Me=C(je,6),$=Q+(Me.count?20+(Me.count-1)*d:V.length?10:0),Ne=new Map(je.map((e,t)=>[e.arc,$-10-Me.tracks[t]*d])),Pe=z.map((e,t)=>ee(e,q[t]+y,K,$+y+12,R,p)),Fe=Math.max($+y,...Pe.map(e=>e.cardsTop)),Ie=new Map;for(let e of de)(Ie.get(e.id)??Ie.set(e.id,[[],[]]).get(e.id))[e.side].push(e);let Le=new Map,Re=Fe;ae.forEach((e,r)=>{let i=Fe;for(let a of e){let e=Ie.get(a.id)??[[],[]],o=P(t,a,K,Math.max(e[0].length,e[1].length),R,n,p);Le.set(a.id,{x:q[r]+y,y:i,h:o.height}),Ce.push(o.draw(q[r]+y,i)),i+=o.height+(o.family?14:8)}e.length===0&&(Pe[r].svg.push(I(q[r]+y+2,Fe+12,`no sessions`,{size:10.5,fill:R(`ink-3`)})),i+=20),Re=Math.max(Re,i+y-8)}),z.forEach((e,t)=>Z.push(`<g data-lane="${e.id}">${N(q[t],$,K+2*y,Re-$,{fill:R(`surface-2`),stroke:R(`line`),rx:12})}${Pe[t].svg.join(``)}</g>`)),Z.push(...Ce),Q=B>0?Re+10:$;let ze=e=>Le.get(e).y+Le.get(e).h/2,Be=e=>e.lean?-e.lean*e.run.t:e.run.group===1?ze(e.other):-1/0;for(let[e,t]of Ie)for(let n of t)n.sort((e,t)=>e.lean-t.lean||Be(e)-Be(t)||e.arc-t.arc||(e.from?-1:1)),n.forEach((t,r)=>t.y=ze(e)+(r-(n.length-1)/2)*b+(t.side?-2.5:m));for(let e=1;e<B;e++){let t=fe.flatMap(({from:t,to:n})=>t&&n&&t.run===n.run&&t.run.g===e&&t.run.group===1?[t.side?{run:t.run,left:t.y,right:n.y}:{run:t.run,left:n.y,right:t.y}]:[]),n=e=>e.right<e.left;t.sort((e,t)=>Number(n(t))-Number(n(e))||(n(e)?e.left-t.left:t.left-e.left));let r=(e,t)=>Math.abs(e.left-t.right)<2;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++)r(t[n],t[e])&&!r(t[e],t[n])&&([t[e],t[n]]=[t[n],t[e]]);t.forEach((e,t)=>e.run.t=t)}let Ve=e=>[Le.get(e.id).x+(e.side?K:0),e.y],He=H.map((e,t)=>{let{from:n,to:r}=fe[t];if(n&&r&&n.run===r.run)return v([Ve(n),[X(n.run),n.y],[X(r.run),r.y],Ve(r)]);let[i,a]=Ae[t],o=Ne.get(t)??$,s=(e,t)=>e?[Ve(e),[t,e.y]]:[[t,Te]];return v([...s(n,i),[i,o],[a,o],...s(r,a).reverse()])}),Ue=He.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[1]===e[r][1]?[{y:n[1],from:Math.min(n[0],e[r][0]),to:Math.max(n[0],e[r][0]),of:t}]:[])),We=He.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[0]===e[r][0]?[{y:n[0],from:Math.min(n[1],e[r][1]),to:Math.max(n[1],e[r][1]),of:t}]:[])),Ge=[],Ke=[],qe=[],Je=[],Ye=[];if(H.forEach((e,t)=>{let n=He[t],i=F(e),a=R(i.color),o=String(U.get(e.id)),s=n.length-2;if(s<0)return;let c=e=>Math.abs(n[e+1][0]-n[e][0])+Math.abs(n[e+1][1]-n[e][1]),l=e=>n[e][0]===n[e+1][0],u=n.map((e,t)=>t===0||t>s?0:Math.min(6,c(t-1)/2,c(t)/2)),d=e=>{let t=-1;for(let n=0;n<=s;n++)l(n)===e&&(t<0||c(n)>c(t))&&(t=n);return t},p=d(!1),m=d(!0);p>=0&&(m<0||c(m)<24&&c(p)>=40)&&(m=-1);let h=w(o),[g,_,v]=[0,0,!1];if(m>=0){let[e,i]=[n[m][1],n[m+1][1]],a=Math.sign(i-e);g=n[m][0],_=ne(g,e,i,h,t,Ge,Ue),Ke.push({x:_,y:g,half:r}),v=(_-a*r-(e+a*u[m]))*a>=0&&(i-a*(m===s?f:u[m+1])-(_+a*r))*a>=0}else p>=0&&(_=n[p][1],g=ne(_,n[p][0],n[p+1][0],r,t,Ke,We),Ge.push({x:g,y:_,half:h}));let y=`M${E(n[0][0])},${E(n[0][1])}`,b=0,x=0;for(let e=0;e<=s;e++){let[t,i]=n[e+1];b=Math.sign(t-n[e][0]),x=Math.sign(i-n[e][1]);let a=e===s?f:u[e+1];v&&e===m&&(y+=` L${E(g)},${E(_-x*r)} M${E(g)},${E(_+x*r)}`),y+=` L${E(t-b*a)},${E(i-x*a)}`,e<s&&(y+=` Q${E(t)},${E(i)} ${E(t+Math.sign(n[e+2][0]-t)*a)},${E(i+Math.sign(n[e+2][1]-i)*a)}`)}let[S,C]=[n[s+1][0]-.5*b,n[s+1][1]-.5*x],T=`<path d="M${E(S)},${E(C)} L${E(S-6.5*b-3.6*x)},${E(C-6.5*x-3.6*b)} L${E(S-6.5*b+3.6*x)},${E(C-6.5*x+3.6*b)} z" style="fill:${a}"/>`,D=`<circle cx="${E(n[0][0])}" cy="${E(n[0][1])}" r="2.2" style="fill:${a}"/>`,O=`<g data-plate="${e.id}">${j(g,_,o,a,R)}</g>`;v&&qe.push(O),Je.push(`<g data-handoff="${e.id}"><path d="${y}" ${re(i,a)}/>${D}${T}</g>${v?``:O}`),Ye.push(`<g data-number="${e.id}">${M(g,_,o,R)}</g>`)}),Z.push(...qe,...Je,...Ye),t.handoffs.length>0){Q+=6,Z.push(I(i,Q+11,`Handoffs`,{size:12.5,fill:R(`ink`),weight:`bold`})),Q+=20;let e=_(Math.floor((Y-2*i+16)/306),1,t.handoffs.length),n=(Y-2*i-(e-1)*16)/e,r=(e,r,i)=>O(t,e,U.get(e.id),r,i,n,R,p),a=t.handoffs.map(e=>r(e,0,0).bottom),o=a.reduce((e,t)=>e+t,0),s=0,c=Q,l=0,u=Q;t.handoffs.forEach((t,d)=>{let f=Math.min(e-1,Math.floor((l+a[d]/2)*e/o));f!==s&&(c=Q),s=f;let p=r(t,i+s*(n+16),c);Z.push(p.svg),c=p.bottom,l+=a[d],u=Math.max(u,c)}),Q=u}return D(Y,Q+i-6,t.name||t.id,L,R,Z.join(``),`map`)}var b=104,x=62,S=270,C=190,w=360,T=30,E=`Read down: the order the map lists its handoffs in. An order, not a clock: a map records no times.`;function D(e,t,n={}){let{M:r,PICTURE_WIDTH:i,carriedBy:o,drawn:s,fmt:c,frame:l,heading:u,inkFor:d,numberBadge:f,rect:p,stroke:m,styleOf:h,text:g,textWidth:_,wrap:v}=a(e),y=n.theme??`auto`,D=d(y),{sessions:O,people:k,handoffs:A,numberOf:ee}=s(t),j=[...k.length?[{id:``,name:k.length===1?`Person`:`People`,person:!0,of:k.map(e=>({id:e.id,name:e.name||e.id}))}]:[],...t.lanes.map(e=>({id:e.id,name:e.name||e.id,person:!1,of:O.filter(t=>t.lane===e.id).map(e=>({id:e.id,name:`${e.name||e.id}${(e.count??1)>1?` ×${e.count}`:``}`}))}))].filter(e=>e.of.length>0),M=j.flatMap(e=>e.of),te=Math.max(1,M.length),ne=Math.max(0,...M.flatMap(e=>e.name.split(/\s+/).map(e=>_(e,10,`bold`)))),N=Math.min(b,Math.max(x,ne+14)),P=r+te*N+14,re=Number.isFinite(n.width)?Math.min(w,Math.max(C,n.width-r-P)):S,F=P+re+r,I=new Map(M.map((e,t)=>[e.id,r+(t+.5)*N])),L=[],R=Math.min(F,i),z=u(t,R,n,D,L)-12;for(let e of v(E,R-2*r,11,3))z+=14,L.push(g(r,z,e,{size:11,fill:D(`ink-2`)}));z+=12;let B=z,ie=j.map(e=>v(e.name,e.of.length*N-14,9.5,3,`bold`)),V=M.map(e=>v(e.name,N-12,10,6,`bold`)),H=B+8+Math.max(0,...ie.map(e=>e.length))*12+3,U=9+Math.max(1,...V.map(e=>e.length))*12.5,ae=[],W=[],oe=0;j.forEach((e,t)=>{let n=r+oe*N,i=e.of.length*N,a=ie[t].map((e,t)=>g(n+i/2,B+16+t*12,e,{size:9.5,fill:D(`ink-2`),weight:`bold`,anchor:`middle`})).join(``);ae.push(t=>`<g data-${e.person?`people=""`:`lane="${e.id}"`}>${p(n+1.5,B,i-3,t-B,{fill:D(`surface-2`),stroke:D(`line`),rx:12,...e.person?{dash:`5 4`}:{}})}${a}</g>`);for(let t of e.of){let n=I.get(t.id),r=V[oe++];W.push(`<g data-${e.person?`person`:`session`}="${t.id}">${p(n-N/2+4,H,N-8,U,e.person?{fill:D(`gate-soft`),stroke:D(`gate`),rx:12,width:1.4,mark:`card`}:{fill:D(`surface`),stroke:D(`line-strong`),rx:8,mark:`card`})}${r.map((e,t)=>g(n,H+(U-r.length*12.5)/2+9.5+t*12.5,e,{size:10,fill:D(`ink`),weight:`bold`,anchor:`middle`})).join(``)}</g>`)}}),L.push(g(P,H+U/2+3.5,`Carried by, and what is handed`,{size:10,fill:D(`ink-3`)})),z=H+U+8;let G=[],se=[];A.forEach((e,n)=>{let i=h(e),a=D(i.color),s=v(o(t,e),re,10.5,3,`bold`),l=e.what?v(e.what,re,10.5,8):[],u=Math.max(T,(s.length+l.length)*13+12),d=z+u/2;n>0&&se.push(`<path d="M${c(r)},${c(z)} H${c(F-r)}" stroke-width="1" style="stroke:${D(`line`)}"/>`);let _=I.get(e.from),y=I.get(e.to),b=Math.sign(y-_),x=b===0?`M${c(_)},${c(d-6)} h20 v12 H${c(_+5.5)}`:`M${c(_)},${c(d)} H${c(y-b*5.5)}`,[S,C,w]=b===0?[_+.5,d+6,-1]:[y-b*.5,d,b],E=d-(s.length+l.length)*13/2-3;G.push(`<g data-handoff="${e.id}">${p(r-4,z+1.5,F-2*r+8,u-3,{fill:`transparent`,rx:8,mark:`row`})}<path d="${x}" ${m(i,a)}/><circle cx="${c(_)}" cy="${c(b===0?d-6:d)}" r="2.2" style="fill:${a}"/><path d="M${c(S)},${c(C)} l${c(-6.5*w)},-3.6 v7.2 z" style="fill:${a}"/>`+f(b===0?_+20:_+b*Math.min(19,Math.abs(y-_)*.42),d,String(ee.get(e.id)),a,D)+s.map(e=>g(P,E+=13,e,{size:10.5,fill:a,weight:`bold`})).join(``)+l.map(e=>g(P,E+=13,e,{size:10.5,fill:D(`ink-2`)})).join(``)+`</g>`),z+=u}),A.length===0&&(z+=T);let ce=z+6,le=M.map(e=>`<path d="M${c(I.get(e.id))},${c(H+U)} V${c(ce-6)}" stroke-width="1" style="stroke:${D(`line-strong`)}"/>`);return L.push(...ae.map(e=>e(ce)),...se,...le,...W,...G),l(F,ce+r,t.name||t.id,y,D,L.join(``),`sequence`)}var O=t(e(),1),k=`.map-views{width:-moz-fit-content;width:fit-content;margin:10px auto 12px}.map-views .seg{min-width:min(104px,27vw)}.map-views-note{text-align:center;max-width:44ch;color:var(--ink-3);margin:-4px auto 12px;font-size:13px}.map-picture.is-sequence{max-width:min(100%, calc(var(--map-units) * 1.25));overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;overflow-x:auto}.map-picture.is-sequence svg{min-width:var(--map-units)}.map-picture [data-picture=sequence] [data-handoff]:is(.is-on,.is-hot,:focus-visible)>rect[data-row]{fill-opacity:.6;fill:var(--accent-soft)!important}@media (min-width:1100px){.is-wide .map-stage{scrollbar-gutter:stable}.is-wide .map-picture.is-sequence{max-width:min(100%, calc(var(--map-units) * 1.25));overflow-x:auto}.is-wide .map-picture.is-sequence svg{min-width:calc(var(--map-units) * .85)}.is-wide .map-picture [data-picture=sequence] :is([data-handoff],[data-plate],[data-number]){opacity:1!important}.map-side .map-list{align-content:start}}`,A=i(),ee=document.createElement(`style`);ee.textContent=k,document.head.append(ee);var j,M=[[`picture`,`Picture`],[`sequence`,`Sequence`],[`space`,`3D`]],te=1.3,ne=(e,t)=>{let n=Number(/viewBox="0 0 ([\d.]+)/.exec(e)?.[1]??0);return{svg:e,sequence:t,style:t?{"--map-units":`${n}px`}:{maxWidth:`${Math.round(n*te)}px`}}};function N({map:e,kit:t,wide:i,stage:a,onDrawn:o,live:s,at:c}){let[l,u]=(0,O.useState)(`picture`),[d,f]=(0,O.useState)(`picture`),[p,m]=(0,O.useState)(j),[h,g]=(0,O.useState)(),_=d===`sequence`,v=l===`space`&&p?p:void 0,b=(0,O.useRef)(d);b.current=d;let x=e=>{if(u(e),e!==`space`)return f(e);p||n(`space`,()=>r(()=>import(`./space-DWgrlnfB.js`),[])).then(e=>m(j=e),()=>(m(null),u(e=>e===`space`?b.current:e)))};F(a.current),(0,O.useEffect)(()=>I(a.current)),(0,O.useLayoutEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=getComputedStyle(e);g(Math.max(0,Math.floor((e.clientWidth-parseFloat(t.paddingLeft)-parseFloat(t.paddingRight))/20)*20))};if(t(),typeof ResizeObserver!=`function`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let S=(0,O.useMemo)(()=>v?``:(_?D:y)(t,e,i&&h?{width:h}:{}),[e,i,_,h,v]),C=!h||h<640?3:h<900?4:6,w=(0,O.useMemo)(()=>v?.plan(t,e,{per:C,...s?{live:s}:{},...c?{at:c}:{}}),[e,v,C,s,c]);(0,O.useLayoutEffect)(()=>o(w?{svg:w.html,sequence:!1,style:{}}:i||_?ne(S,_):void 0),[S,i,_,w]);let T=(0,O.useRef)(void 0),E=(0,O.useRef)(void 0);return(0,O.useEffect)(()=>{let e=w&&a.current?.querySelector(`.space`)||void 0;(e!==E.current?.el||e&&w!==E.current?.made)&&(E.current?.off(),E.current=e&&v&&w?{el:e,made:w,off:v.attach(e,w,T.current??=v.held(),x)}:void 0)}),(0,O.useEffect)(()=>()=>E.current?.off(),[]),(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`div`,{className:`segmented map-views`,role:`radiogroup`,"aria-label":`View of the map`,children:M.map(([e,t])=>(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":l===e,className:l===e?`seg seg-on`:`seg`,onClick:()=>x(e),children:t},e))}),p===null?(0,A.jsx)(`p`,{className:`map-views-note`,role:`status`,children:`The view in three dimensions could not be fetched. The picture and the sequence show the same map.`}):null]})}var P,re=[`session`,`person`,`handoff`,`handoff-row`];function F(e){let t=e?.contains(document.activeElement)?document.activeElement:null,n=re.find(e=>t?.hasAttribute(`data-${e}`));P=n?`[data-${n}="${CSS.escape(t.getAttribute(`data-${n}`))}"]`:t?.closest(`.space`)?t.dataset.do?`.space [data-do="${t.dataset.do}"]`:t.matches(`input`)?`.space input`:t.matches(`.space-scene`)?`.space-scene`:void 0:void 0}function I(e){if(!P||document.activeElement!==document.body)return;let t=e?.querySelector(P);P.startsWith(`[`)&&t?.setAttribute(`tabindex`,`0`),t?.focus({preventScroll:!0})}export{N as Views,ne as drawn};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/space-Cuy4YqyZ.js","assets/full-C0asYORc.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,n,r,t as i}from"./index-B5ZkSF4L.js";function a(e){let[t,n,r,i,a,o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k]=e;return{BADGE_R:t,M:n,PAD:r,SLOT:i,TRACK:a,TRACK_MIN:o,PICTURE_WIDTH:s,assignTracks:c,badgeHalf:l,carriedBy:u,drawn:d,fmt:f,frame:p,handoffRow:m,heading:h,inkFor:g,laneHead:_,numberBadge:v,numberRing:y,numberText:b,personCard:x,placeNumber:S,rect:C,sessionCard:w,stroke:T,styleOf:E,text:D,textWidth:O,wrap:k}}var o=168,s=150,c=9,l=18,u=10,d=11,f=5.5,p=3,m=2.5,h=150,g=340,_=(e,t,n)=>Math.max(t,Math.min(n,e));function v(e){let t=[];for(let n of e){let e=t[t.length-1],r=t[t.length-2];e&&e[0]===n[0]&&e[1]===n[1]||(e&&r&&(r[0]===e[0]&&e[0]===n[0]||r[1]===e[1]&&e[1]===n[1])&&t.pop(),t.push(n))}return t}function y(e,t,n={}){let{BADGE_R:r,M:i,PAD:y,SLOT:b,TRACK:x,TRACK_MIN:S,assignTracks:C,badgeHalf:w,drawn:T,fmt:E,frame:D,handoffRow:O,heading:k,inkFor:A,laneHead:ee,numberRing:j,numberText:M,personCard:te,placeNumber:ne,rect:N,sessionCard:P,stroke:re,styleOf:F,text:I}=a(e),L=n.theme??`auto`,R=A(L),z=t.lanes,B=z.length,{sessions:ie,people:V,handoffs:H,numberOf:U}=T(t),ae=z.map(e=>ie.filter(t=>t.lane===e.id)),W=new Map;V.forEach((e,t)=>W.set(e.id,{lane:-1,k:t})),ae.forEach((e,t)=>e.forEach((e,n)=>W.set(e.id,{lane:t,k:n})));let oe=H.map(e=>[W.get(e.from),W.get(e.to)]),G=z.map(()=>[0,0]),se=z.map(()=>!1);for(let[e,t]of oe)e.lane>=0&&t.lane>=0&&e.lane!==t.lane?(G[e.lane][+(e.lane<t.lane)]++,G[t.lane][+(t.lane<e.lane)]++):e.lane<0!=t.lane<0&&(se[Math.max(e.lane,t.lane)]=!0);let ce=G.map(([e,t])=>e<=t?0:1),le=G.map(([e,t],n)=>se[n]?1-ce[n]:+(t<=e)),ue=[],de=[],fe=H.map((e,t)=>{let[n,r]=oe[t],i=(e,t,n,r)=>ue[ue.push({g:e,group:t,lo:Math.min(n,r),hi:Math.max(n,r),t:0})-1],a=(n,r,i,a)=>de[de.push({id:n?e.from:e.to,other:n?e.to:e.from,side:r,lean:i,run:a,arc:t,from:n,y:0})-1];if(n.lane<0&&r.lane<0)return{};if(n.lane<0||r.lane<0){let e=n.lane<0?r:n,t=ce[e.lane],o=a(n.lane>=0,t,-1,i(e.lane+t,t?0:2,-1,e.k));return n.lane<0?{to:o}:{from:o}}if(n.lane===r.lane){let e=le[n.lane],t=i(n.lane+e,e?0:2,n.k,r.k);return{from:a(!0,e,Math.sign(r.k-n.k),t),to:a(!1,e,Math.sign(n.k-r.k),t)}}let o=+(n.lane<r.lane);if(Math.abs(n.lane-r.lane)===1){let e=i(Math.max(n.lane,r.lane),1,0,0);return{from:a(!0,o,0,e),to:a(!1,1-o,0,e)}}return{from:a(!0,o,-1,i(n.lane+o,o?0:2,-1,n.k)),to:a(!1,1-o,-1,i(r.lane+1-o,o?2:0,-1,r.k))}}),pe=Array.from({length:B+1},()=>[0,0,0]);for(let e=0;e<=B;e++)for(let t of[0,2]){let n=ue.filter(n=>n.g===e&&n.group===t),{tracks:r,count:i}=C(n.map(e=>({from:e.lo,to:e.hi})));n.forEach((e,t)=>e.t=r[t]),pe[e][t]=i}for(let e of ue)e.group===1&&(e.t=pe[e.g][1]++);let me=pe.map(e=>e[0]+e[1]+e[2]),he=me.reduce((e,t)=>e+Math.max(0,t-1),0),ge=e=>e===0&&V.length?l:c,_e=e=>me[e]?ge(e)+(e===B&&V.length?l:c):e>0&&e<B?u:0,ve=2*i+B*2*y+me.reduce((e,t,n)=>e+_e(n),0),ye=x,K=o,be=n.width;if(be!==void 0&&Number.isFinite(be)&&B>0){let e=e=>(be-ve-he*e)/B;e(x)<s&&he&&(ye=_((be-ve-B*s)/he,S,x)),K=_(e(ye),s,o)}let xe=[],q=[],J=i;for(let e=0;e<=B;e++)xe.push(J),J+=_e(e)+Math.max(0,me[e]-1)*ye,e<B&&(q.push(J),J+=K+2*y);let Y=Math.max(J+i,g,V.length?2*(i+y)+V.length*h+(V.length-1)*8:0),Se=(Y-J-i)/2;q.forEach((e,t)=>q[t]=e+Se);let X=e=>Se+xe[e.g]+ge(e.g)+(e.group===0?e.t:e.group===1?pe[e.g][0]+e.t:me[e.g]-1-e.t)*ye,Z=[],Ce=[],Q=k(t,Y,n,R,Z),we=new Map,Te=Q;if(V.length>0){let e=Q,t=(Y-2*i-2*y-(V.length-1)*8)/V.length,n=V.map(e=>te(e,t,0,R,p)),r=Math.max(...n.map(e=>e.height));V.forEach((a,o)=>{let s=i+y+o*(t+8);we.set(a.id,[s,s+t]),Ce.push(n[o].draw(s,e+y+21.5,r))}),Te=e+y+21.5+r,Q=Te+y,Z.push(`<g data-people="">${N(i,e,Y-2*i,Q-e,{fill:R(`surface-2`),stroke:R(`line`),rx:12,dash:`5 4`})}${I(i+y+2,e+y+12,V.length===1?`Person`:`People`,{size:12.5,fill:R(`ink`),weight:`bold`})}</g>`)}let Ee=V.map(()=>[]),De=e=>(we.get(V[e].id)[0]+we.get(V[e].id)[1])/2;H.forEach((e,t)=>{let[n,r]=oe[t],{from:i,to:a}=fe[t];n.lane<0&&Ee[n.k].push({arc:t,end:0,toward:a?X(a.run):n.k===r.k?NaN:De(r.k)}),r.lane<0&&Ee[r.k].push({arc:t,end:1,toward:i?X(i.run):n.k===r.k?NaN:De(n.k)})});let Oe=H.map(()=>[0,0]),ke=ue.map(X);V.forEach((e,t)=>{let[n,r]=we.get(e.id),i=e=>e>=n+9.5&&e<=r-9.5,a=_((r-n-16)/(Ee[t].filter(e=>!i(e.toward)).length+1),3,b),o=[],s=(e,t)=>{let i=_(e,n+8,r-8);for(let e=a;e>=1.5;e/=2)for(let a=i;a>=n+8&&a<=r-8;a+=t)if(ke.every(t=>Math.abs(t-a)>=Math.min(5,e))&&o.every(t=>Math.abs(t-a)>=e-.01))return o.push(a),a;return o.push(i),i};for(let e of Ee[t]){let a=e.toward;Oe[e.arc][e.end]=i(a)?a:Number.isNaN(a)?s(De(t)+(e.end?7:-7),e.end?1:-1):a<n+9.5?s(n+12,1):s(r-12,-1)}});let Ae=H.map((e,t)=>{let{from:n,to:r}=fe[t];if(!(n&&r&&n.run===r.run))return[n?X(n.run):Oe[t][0],r?X(r.run):Oe[t][1]]}),je=Ae.flatMap((e,t)=>e&&e[0]!==e[1]?[{arc:t,from:e[0],to:e[1]}]:[]),Me=C(je,6),$=Q+(Me.count?20+(Me.count-1)*d:V.length?10:0),Ne=new Map(je.map((e,t)=>[e.arc,$-10-Me.tracks[t]*d])),Pe=z.map((e,t)=>ee(e,q[t]+y,K,$+y+12,R,p)),Fe=Math.max($+y,...Pe.map(e=>e.cardsTop)),Ie=new Map;for(let e of de)(Ie.get(e.id)??Ie.set(e.id,[[],[]]).get(e.id))[e.side].push(e);let Le=new Map,Re=Fe;ae.forEach((e,r)=>{let i=Fe;for(let a of e){let e=Ie.get(a.id)??[[],[]],o=P(t,a,K,Math.max(e[0].length,e[1].length),R,n,p);Le.set(a.id,{x:q[r]+y,y:i,h:o.height}),Ce.push(o.draw(q[r]+y,i)),i+=o.height+(o.family?14:8)}e.length===0&&(Pe[r].svg.push(I(q[r]+y+2,Fe+12,`no sessions`,{size:10.5,fill:R(`ink-3`)})),i+=20),Re=Math.max(Re,i+y-8)}),z.forEach((e,t)=>Z.push(`<g data-lane="${e.id}">${N(q[t],$,K+2*y,Re-$,{fill:R(`surface-2`),stroke:R(`line`),rx:12})}${Pe[t].svg.join(``)}</g>`)),Z.push(...Ce),Q=B>0?Re+10:$;let ze=e=>Le.get(e).y+Le.get(e).h/2,Be=e=>e.lean?-e.lean*e.run.t:e.run.group===1?ze(e.other):-1/0;for(let[e,t]of Ie)for(let n of t)n.sort((e,t)=>e.lean-t.lean||Be(e)-Be(t)||e.arc-t.arc||(e.from?-1:1)),n.forEach((t,r)=>t.y=ze(e)+(r-(n.length-1)/2)*b+(t.side?-2.5:m));for(let e=1;e<B;e++){let t=fe.flatMap(({from:t,to:n})=>t&&n&&t.run===n.run&&t.run.g===e&&t.run.group===1?[t.side?{run:t.run,left:t.y,right:n.y}:{run:t.run,left:n.y,right:t.y}]:[]),n=e=>e.right<e.left;t.sort((e,t)=>Number(n(t))-Number(n(e))||(n(e)?e.left-t.left:t.left-e.left));let r=(e,t)=>Math.abs(e.left-t.right)<2;for(let e=0;e<t.length;e++)for(let n=e+1;n<t.length;n++)r(t[n],t[e])&&!r(t[e],t[n])&&([t[e],t[n]]=[t[n],t[e]]);t.forEach((e,t)=>e.run.t=t)}let Ve=e=>[Le.get(e.id).x+(e.side?K:0),e.y],He=H.map((e,t)=>{let{from:n,to:r}=fe[t];if(n&&r&&n.run===r.run)return v([Ve(n),[X(n.run),n.y],[X(r.run),r.y],Ve(r)]);let[i,a]=Ae[t],o=Ne.get(t)??$,s=(e,t)=>e?[Ve(e),[t,e.y]]:[[t,Te]];return v([...s(n,i),[i,o],[a,o],...s(r,a).reverse()])}),Ue=He.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[1]===e[r][1]?[{y:n[1],from:Math.min(n[0],e[r][0]),to:Math.max(n[0],e[r][0]),of:t}]:[])),We=He.flatMap((e,t)=>e.slice(1).flatMap((n,r)=>n[0]===e[r][0]?[{y:n[0],from:Math.min(n[1],e[r][1]),to:Math.max(n[1],e[r][1]),of:t}]:[])),Ge=[],Ke=[],qe=[],Je=[],Ye=[];if(H.forEach((e,t)=>{let n=He[t],i=F(e),a=R(i.color),o=String(U.get(e.id)),s=n.length-2;if(s<0)return;let c=e=>Math.abs(n[e+1][0]-n[e][0])+Math.abs(n[e+1][1]-n[e][1]),l=e=>n[e][0]===n[e+1][0],u=n.map((e,t)=>t===0||t>s?0:Math.min(6,c(t-1)/2,c(t)/2)),d=e=>{let t=-1;for(let n=0;n<=s;n++)l(n)===e&&(t<0||c(n)>c(t))&&(t=n);return t},p=d(!1),m=d(!0);p>=0&&(m<0||c(m)<24&&c(p)>=40)&&(m=-1);let h=w(o),[g,_,v]=[0,0,!1];if(m>=0){let[e,i]=[n[m][1],n[m+1][1]],a=Math.sign(i-e);g=n[m][0],_=ne(g,e,i,h,t,Ge,Ue),Ke.push({x:_,y:g,half:r}),v=(_-a*r-(e+a*u[m]))*a>=0&&(i-a*(m===s?f:u[m+1])-(_+a*r))*a>=0}else p>=0&&(_=n[p][1],g=ne(_,n[p][0],n[p+1][0],r,t,Ke,We),Ge.push({x:g,y:_,half:h}));let y=`M${E(n[0][0])},${E(n[0][1])}`,b=0,x=0;for(let e=0;e<=s;e++){let[t,i]=n[e+1];b=Math.sign(t-n[e][0]),x=Math.sign(i-n[e][1]);let a=e===s?f:u[e+1];v&&e===m&&(y+=` L${E(g)},${E(_-x*r)} M${E(g)},${E(_+x*r)}`),y+=` L${E(t-b*a)},${E(i-x*a)}`,e<s&&(y+=` Q${E(t)},${E(i)} ${E(t+Math.sign(n[e+2][0]-t)*a)},${E(i+Math.sign(n[e+2][1]-i)*a)}`)}let[S,C]=[n[s+1][0]-.5*b,n[s+1][1]-.5*x],T=`<path d="M${E(S)},${E(C)} L${E(S-6.5*b-3.6*x)},${E(C-6.5*x-3.6*b)} L${E(S-6.5*b+3.6*x)},${E(C-6.5*x+3.6*b)} z" style="fill:${a}"/>`,D=`<circle cx="${E(n[0][0])}" cy="${E(n[0][1])}" r="2.2" style="fill:${a}"/>`,O=`<g data-plate="${e.id}">${j(g,_,o,a,R)}</g>`;v&&qe.push(O),Je.push(`<g data-handoff="${e.id}"><path d="${y}" ${re(i,a)}/>${D}${T}</g>${v?``:O}`),Ye.push(`<g data-number="${e.id}">${M(g,_,o,R)}</g>`)}),Z.push(...qe,...Je,...Ye),t.handoffs.length>0){Q+=6,Z.push(I(i,Q+11,`Handoffs`,{size:12.5,fill:R(`ink`),weight:`bold`})),Q+=20;let e=_(Math.floor((Y-2*i+16)/306),1,t.handoffs.length),n=(Y-2*i-(e-1)*16)/e,r=(e,r,i)=>O(t,e,U.get(e.id),r,i,n,R,p),a=t.handoffs.map(e=>r(e,0,0).bottom),o=a.reduce((e,t)=>e+t,0),s=0,c=Q,l=0,u=Q;t.handoffs.forEach((t,d)=>{let f=Math.min(e-1,Math.floor((l+a[d]/2)*e/o));f!==s&&(c=Q),s=f;let p=r(t,i+s*(n+16),c);Z.push(p.svg),c=p.bottom,l+=a[d],u=Math.max(u,c)}),Q=u}return D(Y,Q+i-6,t.name||t.id,L,R,Z.join(``),`map`)}var b=104,x=62,S=270,C=190,w=360,T=30,E=`Read down: the order the map lists its handoffs in. An order, not a clock: a map records no times.`;function D(e,t,n={}){let{M:r,PICTURE_WIDTH:i,carriedBy:o,drawn:s,fmt:c,frame:l,heading:u,inkFor:d,numberBadge:f,rect:p,stroke:m,styleOf:h,text:g,textWidth:_,wrap:v}=a(e),y=n.theme??`auto`,D=d(y),{sessions:O,people:k,handoffs:A,numberOf:ee}=s(t),j=[...k.length?[{id:``,name:k.length===1?`Person`:`People`,person:!0,of:k.map(e=>({id:e.id,name:e.name||e.id}))}]:[],...t.lanes.map(e=>({id:e.id,name:e.name||e.id,person:!1,of:O.filter(t=>t.lane===e.id).map(e=>({id:e.id,name:`${e.name||e.id}${(e.count??1)>1?` ×${e.count}`:``}`}))}))].filter(e=>e.of.length>0),M=j.flatMap(e=>e.of),te=Math.max(1,M.length),ne=Math.max(0,...M.flatMap(e=>e.name.split(/\s+/).map(e=>_(e,10,`bold`)))),N=Math.min(b,Math.max(x,ne+14)),P=r+te*N+14,re=Number.isFinite(n.width)?Math.min(w,Math.max(C,n.width-r-P)):S,F=P+re+r,I=new Map(M.map((e,t)=>[e.id,r+(t+.5)*N])),L=[],R=Math.min(F,i),z=u(t,R,n,D,L)-12;for(let e of v(E,R-2*r,11,3))z+=14,L.push(g(r,z,e,{size:11,fill:D(`ink-2`)}));z+=12;let B=z,ie=j.map(e=>v(e.name,e.of.length*N-14,9.5,3,`bold`)),V=M.map(e=>v(e.name,N-12,10,6,`bold`)),H=B+8+Math.max(0,...ie.map(e=>e.length))*12+3,U=9+Math.max(1,...V.map(e=>e.length))*12.5,ae=[],W=[],oe=0;j.forEach((e,t)=>{let n=r+oe*N,i=e.of.length*N,a=ie[t].map((e,t)=>g(n+i/2,B+16+t*12,e,{size:9.5,fill:D(`ink-2`),weight:`bold`,anchor:`middle`})).join(``);ae.push(t=>`<g data-${e.person?`people=""`:`lane="${e.id}"`}>${p(n+1.5,B,i-3,t-B,{fill:D(`surface-2`),stroke:D(`line`),rx:12,...e.person?{dash:`5 4`}:{}})}${a}</g>`);for(let t of e.of){let n=I.get(t.id),r=V[oe++];W.push(`<g data-${e.person?`person`:`session`}="${t.id}">${p(n-N/2+4,H,N-8,U,e.person?{fill:D(`gate-soft`),stroke:D(`gate`),rx:12,width:1.4,mark:`card`}:{fill:D(`surface`),stroke:D(`line-strong`),rx:8,mark:`card`})}${r.map((e,t)=>g(n,H+(U-r.length*12.5)/2+9.5+t*12.5,e,{size:10,fill:D(`ink`),weight:`bold`,anchor:`middle`})).join(``)}</g>`)}}),L.push(g(P,H+U/2+3.5,`Carried by, and what is handed`,{size:10,fill:D(`ink-3`)})),z=H+U+8;let G=[],se=[];A.forEach((e,n)=>{let i=h(e),a=D(i.color),s=v(o(t,e),re,10.5,3,`bold`),l=e.what?v(e.what,re,10.5,8):[],u=Math.max(T,(s.length+l.length)*13+12),d=z+u/2;n>0&&se.push(`<path d="M${c(r)},${c(z)} H${c(F-r)}" stroke-width="1" style="stroke:${D(`line`)}"/>`);let _=I.get(e.from),y=I.get(e.to),b=Math.sign(y-_),x=b===0?`M${c(_)},${c(d-6)} h20 v12 H${c(_+5.5)}`:`M${c(_)},${c(d)} H${c(y-b*5.5)}`,[S,C,w]=b===0?[_+.5,d+6,-1]:[y-b*.5,d,b],E=d-(s.length+l.length)*13/2-3;G.push(`<g data-handoff="${e.id}">${p(r-4,z+1.5,F-2*r+8,u-3,{fill:`transparent`,rx:8,mark:`row`})}<path d="${x}" ${m(i,a)}/><circle cx="${c(_)}" cy="${c(b===0?d-6:d)}" r="2.2" style="fill:${a}"/><path d="M${c(S)},${c(C)} l${c(-6.5*w)},-3.6 v7.2 z" style="fill:${a}"/>`+f(b===0?_+20:_+b*Math.min(19,Math.abs(y-_)*.42),d,String(ee.get(e.id)),a,D)+s.map(e=>g(P,E+=13,e,{size:10.5,fill:a,weight:`bold`})).join(``)+l.map(e=>g(P,E+=13,e,{size:10.5,fill:D(`ink-2`)})).join(``)+`</g>`),z+=u}),A.length===0&&(z+=T);let ce=z+6,le=M.map(e=>`<path d="M${c(I.get(e.id))},${c(H+U)} V${c(ce-6)}" stroke-width="1" style="stroke:${D(`line-strong`)}"/>`);return L.push(...ae.map(e=>e(ce)),...se,...le,...W,...G),l(F,ce+r,t.name||t.id,y,D,L.join(``),`sequence`)}var O=t(e(),1),k=`.map-views{width:-moz-fit-content;width:fit-content;margin:10px auto 12px}.map-views .seg{min-width:min(104px,27vw)}.map-views-note{text-align:center;max-width:44ch;color:var(--ink-3);margin:-4px auto 12px;font-size:13px}.map-picture.is-sequence{max-width:min(100%, calc(var(--map-units) * 1.25));overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;overflow-x:auto}.map-picture.is-sequence svg{min-width:var(--map-units)}.map-picture [data-picture=sequence] [data-handoff]:is(.is-on,.is-hot,:focus-visible)>rect[data-row]{fill-opacity:.6;fill:var(--accent-soft)!important}@media (min-width:1100px){.is-wide .map-stage{scrollbar-gutter:stable}.is-wide .map-picture.is-sequence{max-width:min(100%, calc(var(--map-units) * 1.25));overflow-x:auto}.is-wide .map-picture.is-sequence svg{min-width:calc(var(--map-units) * .85)}.is-wide .map-picture [data-picture=sequence] :is([data-handoff],[data-plate],[data-number]){opacity:1!important}.map-side .map-list{align-content:start}}`,A=i(),ee=document.createElement(`style`);ee.textContent=k,document.head.append(ee);var j,M=[[`picture`,`Picture`],[`sequence`,`Sequence`],[`space`,`3D`]],te=1.3,ne=(e,t)=>{let n=Number(/viewBox="0 0 ([\d.]+)/.exec(e)?.[1]??0);return{svg:e,sequence:t,style:t?{"--map-units":`${n}px`}:{maxWidth:`${Math.round(n*te)}px`}}};function N({map:e,kit:t,wide:i,stage:a,onDrawn:o,live:s,at:c}){let[l,u]=(0,O.useState)(`picture`),[d,f]=(0,O.useState)(`picture`),[p,m]=(0,O.useState)(j),[h,g]=(0,O.useState)(),_=d===`sequence`,v=l===`space`&&p?p:void 0,b=(0,O.useRef)(d);b.current=d;let x=e=>{if(u(e),e!==`space`)return f(e);p||n(`space`,()=>r(()=>import(`./space-Cuy4YqyZ.js`),__vite__mapDeps([0,1]))).then(e=>m(j=e),()=>(m(null),u(e=>e===`space`?b.current:e)))};F(a.current),(0,O.useEffect)(()=>I(a.current)),(0,O.useLayoutEffect)(()=>{let e=a.current;if(!e)return;let t=()=>{let t=getComputedStyle(e);g(Math.max(0,Math.floor((e.clientWidth-parseFloat(t.paddingLeft)-parseFloat(t.paddingRight))/20)*20))};if(t(),typeof ResizeObserver!=`function`)return;let n=new ResizeObserver(t);return n.observe(e),()=>n.disconnect()},[]);let S=(0,O.useMemo)(()=>v?``:(_?D:y)(t,e,i&&h?{width:h}:{}),[e,i,_,h,v]),C=!h||h<640?3:h<900?4:6,w=(0,O.useMemo)(()=>v?.plan(t,e,{per:C,...s?{live:s}:{},...c?{at:c}:{}}),[e,v,C,s,c]);(0,O.useLayoutEffect)(()=>o(w?{svg:w.html,sequence:!1,style:{}}:i||_?ne(S,_):void 0),[S,i,_,w]);let T=(0,O.useRef)(void 0),E=(0,O.useRef)(void 0);return(0,O.useEffect)(()=>{let e=w&&a.current?.querySelector(`.space`)||void 0;(e!==E.current?.el||e&&w!==E.current?.made)&&(E.current?.off(),E.current=e&&v&&w?{el:e,made:w,off:v.attach(e,w,T.current??=v.held(),x)}:void 0)}),(0,O.useEffect)(()=>()=>E.current?.off(),[]),(0,A.jsxs)(A.Fragment,{children:[(0,A.jsx)(`div`,{className:`segmented map-views`,role:`radiogroup`,"aria-label":`View of the map`,children:M.map(([e,t])=>(0,A.jsx)(`button`,{type:`button`,role:`radio`,"aria-checked":l===e,className:l===e?`seg seg-on`:`seg`,onClick:()=>x(e),children:t},e))}),p===null?(0,A.jsx)(`p`,{className:`map-views-note`,role:`status`,children:`The view in three dimensions could not be fetched. The picture and the sequence show the same map.`}):null]})}var P,re=[`session`,`person`,`handoff`,`handoff-row`];function F(e){let t=e?.contains(document.activeElement)?document.activeElement:null,n=re.find(e=>t?.hasAttribute(`data-${e}`));P=n?`[data-${n}="${CSS.escape(t.getAttribute(`data-${n}`))}"]`:t?.closest(`.space`)?t.dataset.do?`.space [data-do="${t.dataset.do}"]`:t.matches(`input`)?`.space input`:t.matches(`.space-scene`)?`.space-scene`:void 0:void 0}function I(e){if(!P||document.activeElement!==document.body)return;let t=e?.querySelector(P);P.startsWith(`[`)&&t?.setAttribute(`tabindex`,`0`),t?.focus({preventScroll:!0})}export{N as Views,ne as drawn};
@@ -1 +1 @@
1
- {"app":"grooph","version":"0.4.1"}
1
+ {"app":"grooph","version":"0.5.0"}
@@ -6,19 +6,19 @@
6
6
  <meta name="color-scheme" content="light dark" />
7
7
  <meta name="theme-color" content="#f6f5f1" media="(prefers-color-scheme: light)" />
8
8
  <meta name="theme-color" content="#16171a" media="(prefers-color-scheme: dark)" />
9
- <meta name="description" content="Loop graphs for coding agents. Draw who builds, who checks, where a person decides and when the work stops; grooph checks that every loop can end and compiles the graph into a package Claude Code runs." />
9
+ <meta name="description" content="Lightweight workflow diagrams in 2D and 3D. Draw who does the work, who checks it, where a person decides, and when it stops, yourself or with an AI agent." />
10
10
  <meta property="og:type" content="website" />
11
11
  <meta property="og:site_name" content="grooph" />
12
- <meta property="og:title" content="grooph: loop graphs for coding agents" />
13
- <meta property="og:description" content="Draw the loop, check that it can end, and compile it into a package Claude Code runs. Free, open source, and nothing leaves your device." />
12
+ <meta property="og:title" content="grooph: workflow diagrams in 2D and 3D" />
13
+ <meta property="og:description" content="Draw a workflow yourself or with an AI agent, check it, and see it in 2D and 3D. Free, open source, and nothing leaves your device." />
14
14
  <meta property="og:url" content="https://ryanjosephkamp.github.io/grooph/" />
15
15
  <meta property="og:image" content="https://ryanjosephkamp.github.io/grooph/og.png" />
16
16
  <meta property="og:image:width" content="1200" />
17
17
  <meta property="og:image:height" content="630" />
18
- <meta property="og:image:alt" content="The grooph wordmark beside a review-gate loop graph: a builder, a critic, a human merge approval and a stop." />
18
+ <meta property="og:image:alt" content="The grooph wordmark beside a review-gate diagram: a builder, a critic, a human merge approval, and a stop." />
19
19
  <meta name="twitter:card" content="summary_large_image" />
20
- <meta name="twitter:title" content="grooph: loop graphs for coding agents" />
21
- <meta name="twitter:description" content="Draw the loop, check that it can end, and compile it into a package Claude Code runs." />
20
+ <meta name="twitter:title" content="grooph: workflow diagrams in 2D and 3D" />
21
+ <meta name="twitter:description" content="Draw a workflow yourself or with an AI agent, check it, and see it in 2D and 3D." />
22
22
  <meta name="twitter:image" content="https://ryanjosephkamp.github.io/grooph/og.png" />
23
23
  <link rel="icon" href="/grooph/favicon.svg" type="image/svg+xml" />
24
24
  <link rel="manifest" href="/grooph/manifest.webmanifest" />
@@ -28,13 +28,16 @@
28
28
  <link rel="preload" as="font" type="font/woff2" crossorigin media="not all" href="/grooph/assets/fonts/atkinson-hyperlegible-next-italic.v1.woff2" />
29
29
  <link rel="preload" as="font" type="font/woff2" crossorigin media="not all" href="/grooph/assets/fonts/atkinson-hyperlegible-mono.v1.woff2" />
30
30
  <link rel="preload" as="image" media="not all" href="/grooph/assets/site-icons.v1.svg" />
31
- <title>grooph: loop graphs for coding agents</title>
32
- <script>if(!/^#\/embed(\?|$)/.test(location.hash)){for(const h of ["/grooph/assets/base-CeJeskZg.css","/grooph/assets/styles-BA1aVO9R.css","/grooph/assets/App-Cv1auMeh.css","/grooph/assets/screens-DWbqIw6l.css"]){const l=document.createElement("link");l.rel="stylesheet";l.href=h;document.head.appendChild(l)}const r=document.createElement("link").relList,m=r&&r.supports&&r.supports("modulepreload");for(const h of ["/grooph/assets/App-48y1Ec5B.js","/grooph/assets/share-BzIzB4EY.js","/grooph/assets/templates-CoNTzuuz.js","/grooph/assets/runs-DcjRi7S6.js"].concat(/^#\/(g\/|open\?|run|live|templates\/)/.test(location.hash)?["/grooph/assets/screens-aIjMSzZg.js"]:[],/^#\/templates(?:$|\/built-in\/[^/?]+(?:\/use)?$)/.test(location.hash)?["/grooph/assets/builtins-D_22fKRF.js"]:[],/^(?!#\/(?:run\?live$|live$|run\/[^?]+$|templates$|embed(?:\?|$)|templates\/(?:built-in|yours|plan)\/[^/?]+(?:\/use)?$|g\/[^/?]+(?:\?new)?$|open\?))/.test(location.hash)?["/grooph/assets/front-BRl7rl-u.js"]:[])){const l=document.createElement("link");if(m)l.rel="modulepreload";else{l.rel="preload";l.as="script";l.crossOrigin=""}l.href=h;document.head.appendChild(l)}}void ["/grooph/assets/compile-BAvi-rd0.js","/grooph/assets/groups-CjEPiwfv.js","/grooph/assets/views-CLwg5VNv.js","/grooph/assets/space-DWgrlnfB.js","/grooph/assets/units-DOIUgOIU.js","/grooph/assets/Import-ByMI7Uz9.js","/grooph/assets/graph-views-COQF_QTQ.js","/grooph/assets/themes-DtOBrLk0.js","/grooph/assets/brakes-BJPDrrJT.js","/grooph/assets/EmbedApp-390Z2d4x.js","/grooph/assets/EmbedApp-CWb_HGpW.css","/grooph/assets/graph-stage-BkrQGQ-z.js","/grooph/assets/graph-more-393HTgQE.js","/grooph/assets/builtins-D_22fKRF.js","/grooph/assets/front-BRl7rl-u.js","/grooph/assets/offline-Byh4d-Wf.js","/grooph/assets/ExportPanel-Ca3wBB38.js","/grooph/assets/plan-templates-BQu8G2sX.js"]</script>
33
- <!-- The theme chosen in the header, before the first paint: ?theme= wins and is kept. An embed has its own colors. -->
31
+ <!-- The looks after the first, linked below when one is kept. -->
32
+ <link id="site-looks" rel="preload" as="style" media="not all" href="/grooph/assets/site-looks.v1.css" />
33
+ <title>grooph: workflow diagrams in 2D and 3D</title>
34
+ <script>if(!/^#\/embed(\?|$)/.test(location.hash)){for(const h of ["/grooph/assets/base-CeJeskZg.css","/grooph/assets/styles-Dlp-yYlE.css","/grooph/assets/App-CT9KxzfQ.css","/grooph/assets/screens-DWbqIw6l.css"]){const l=document.createElement("link");l.rel="stylesheet";l.href=h;document.head.appendChild(l)}const r=document.createElement("link").relList,m=r&&r.supports&&r.supports("modulepreload");for(const h of ["/grooph/assets/App-D1pDFbEY.js","/grooph/assets/share-DV3wsAsJ.js","/grooph/assets/templates-DbAhWvP6.js","/grooph/assets/runs-BA5HKtsx.js"].concat(/^#\/(g\/|open\?|run|live|templates\/)/.test(location.hash)?["/grooph/assets/screens-CMMuexid.js"]:[],/^#\/templates(?:$|\/built-in\/[^/?]+(?:\/use)?$)/.test(location.hash)?["/grooph/assets/builtins-DzyPaYdd.js"]:[],/^(?!#\/(?:run\?live$|live$|run\/[^?]+$|templates$|embed(?:\?|$)|templates\/(?:built-in|yours|plan)\/[^/?]+(?:\/use)?$|g\/[^/?]+(?:\?new|\?sketch)?$|open\?))/.test(location.hash)?["/grooph/assets/front-OxfL-OaD.js"]:[])){const l=document.createElement("link");if(m)l.rel="modulepreload";else{l.rel="preload";l.as="script";l.crossOrigin=""}l.href=h;document.head.appendChild(l)}}void ["/grooph/assets/compile-DL2budwP.js","/grooph/assets/groups-CjEPiwfv.js","/grooph/assets/views-CFqRShXD.js","/grooph/assets/space-Cuy4YqyZ.js","/grooph/assets/full-C0asYORc.js","/grooph/assets/units-DlniUjfH.js","/grooph/assets/Import-DF0XLxRI.js","/grooph/assets/mermaid-read-cyqJ32v-.js","/grooph/assets/graph-views-CmkQ41zC.js","/grooph/assets/themes-C34TrvOJ.js","/grooph/assets/brakes-B9b3hDX8.js","/grooph/assets/EmbedApp-CTausQWY.js","/grooph/assets/EmbedApp-CWb_HGpW.css","/grooph/assets/graph-stage-CwNePnN4.js","/grooph/assets/graph-more-Dn_hNa20.js","/grooph/assets/builtins-DzyPaYdd.js","/grooph/assets/front-OxfL-OaD.js","/grooph/assets/offline-Byh4d-Wf.js","/grooph/assets/ExportPanel-CbRH4C69.js","/grooph/assets/plan-templates-u2fF3GnS.js","/grooph/assets/SketchView-BjeUHG4X.js"]</script>
35
+ <!-- The look chosen in the header, before the first paint: ?theme= wins and is kept. Its stylesheet is written in
36
+ single quotes: the worker keeps every double-quoted address here. An embed has its own colors. -->
34
37
  <script>
35
- (() => { if (/^#\/embed(\?|$)/.test(location.hash)) return; const ids = ["grooph", "meteor"]; let id = new URLSearchParams(location.search).get("theme"); try { if (ids.includes(id)) localStorage.setItem("groophTheme", id); else id = localStorage.getItem("groophTheme"); } catch {} if (ids.indexOf(id) > 0) document.documentElement.dataset.theme = id; })();
38
+ (() => { if (/^#\/embed(\?|$)/.test(location.hash)) return; const ids = ["grooph", "meteor", "harbor", "plum", "ember", "graphite"]; let id = new URLSearchParams(location.search).get("theme"); try { if (ids.includes(id)) localStorage.setItem("groophTheme", id); else id = localStorage.getItem("groophTheme"); } catch {} if (ids.indexOf(id) > 0) { document.documentElement.dataset.theme = id; document.write('<link rel=stylesheet data-site-looks href=' + document.getElementById("site-looks").href + '>'); } })();
36
39
  </script>
37
- <script type="module" crossorigin src="/grooph/assets/index-CeaKwKuU.js"></script>
40
+ <script type="module" crossorigin src="/grooph/assets/index-B5ZkSF4L.js"></script>
38
41
  </head>
39
42
  <body>
40
43
  <div id="root"></div>
package/dist/app/llms.txt CHANGED
@@ -1,26 +1,25 @@
1
1
  # grooph
2
2
 
3
- > grooph is an authoring and checking surface for multi-agent loop graphs: one small JSON document that says which agent builds, which checks, where a person decides and what stops each loop. It validates the document against rules with stable codes, draws it, and compiles it into a prompt package for a coding harness (Claude Code). grooph never runs an agent and never calls a model.
3
+ > grooph draws lightweight workflow diagrams in 2D and 3D. A diagram is one small JSON document that says who does the work, who checks it, where a person decides, and what stops each loop. grooph checks the document against rules with stable codes, draws it, and makes a link that opens it in the app on any device. A person can draw one, an agent can draw one, or both can take turns. grooph never runs an agent and never calls a model.
4
4
 
5
- If you are an agent asked for a grooph graph, a loop graph, or a team of agents for a task, read the page for agents first. It has the shortest path (name a template, fill it, check it, share it), every operation by example, what to do about each rule, and when no graph is the right answer.
5
+ If you are an agent asked for a grooph diagram, a loop graph, or a diagram of a team of agents, read the page for agents first. It has the shortest path (name a template, fill it, check it, share it), every operation by example, and what to do about each rule.
6
6
 
7
7
  ## For agents
8
8
 
9
- - [grooph for agents](https://ryanjosephkamp.github.io/grooph/docs/agents/): the page to read first
9
+ - [Drawing with an agent](https://ryanjosephkamp.github.io/grooph/docs/agents/): the page to read first, including what works in a chat app
10
10
  - [The same page as Markdown](https://raw.githubusercontent.com/ryanjosephkamp/grooph/main/docs/agents.md)
11
- - [From a chat](https://ryanjosephkamp.github.io/grooph/docs/chat/): what works in Claude's desktop app, in claude.ai and in ChatGPT; with no tools, write the document and have the person paste it into the app
12
- - [The graph document](https://ryanjosephkamp.github.io/grooph/docs/graph-ir/): every field, what a package must make the harness do, and the rules
11
+ - [The document](https://ryanjosephkamp.github.io/grooph/docs/graph-ir/): every field, what it means, and the rules
13
12
  - [Every rule by its code](https://ryanjosephkamp.github.io/grooph/docs/rules/): each with a document that fires it
14
13
 
15
14
  ## Reaching grooph
16
15
 
17
16
  - The command line: `npx grooph --help` (Node 22 or later)
18
- - An MCP server over standard input and output: `npx -y grooph mcp` (in a chat app: `npx -y grooph mcp --chat`)
19
17
  - The app, which opens a pasted document or a link and checks it: https://ryanjosephkamp.github.io/grooph/
18
+ - An MCP server over standard input and output, experimental: `npx -y grooph mcp` (in a chat app: `npx -y grooph mcp --chat`)
20
19
 
21
20
  ## Reference
22
21
 
23
22
  - [Templates](https://ryanjosephkamp.github.io/grooph/docs/templates/): the pattern library and its index, [patterns/index.json](https://ryanjosephkamp.github.io/grooph/patterns/index.json)
24
23
  - [The JSON Schema of a graph document](https://raw.githubusercontent.com/ryanjosephkamp/grooph/main/packages/core/schema/grooph-0.schema.json)
25
- - [The field guide](https://ryanjosephkamp.github.io/grooph/docs/field-guide/): every template as a shape, with what its recorded run showed
24
+ - [The field guide](https://ryanjosephkamp.github.io/grooph/docs/field-guide/): every template as a shape, with when to use it
26
25
  - [Source](https://github.com/ryanjosephkamp/grooph)
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "grooph",
3
3
  "short_name": "grooph",
4
- "description": "Loop graphs for coding agents: draw, validate, export. Works with no network; your graphs stay on this device.",
4
+ "description": "Workflow diagrams in 2D and 3D: draw, check, and share. Works with no network; your graphs stay on this device.",
5
5
  "start_url": "./",
6
6
  "scope": "./",
7
7
  "display": "standalone",
package/dist/app/og.png CHANGED
Binary file