flowfig 0.10.0 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -23
- package/dist/atlas.js +6 -2
- package/dist/auto.js +104 -9
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +9 -4
- package/dist/check.d.ts +4 -3
- package/dist/check.js +143 -8
- package/dist/cli.js +180 -70
- package/dist/diff.d.ts +2 -0
- package/dist/diff.js +79 -24
- package/dist/element-looks.js +4 -0
- package/dist/element-world.js +6 -0
- package/dist/element.d.ts +27 -0
- package/dist/element.js +67 -0
- package/dist/explain.d.ts +45 -0
- package/dist/explain.js +161 -0
- package/dist/frames.d.ts +34 -0
- package/dist/frames.js +117 -0
- package/dist/index.js +328 -152
- package/dist/load.js +9 -4
- package/dist/looks.d.ts +15 -0
- package/dist/looks.js +32 -0
- package/dist/mcp.d.ts +4 -0
- package/dist/mcp.js +14 -6
- package/dist/model.d.ts +105 -3
- package/dist/model.js +221 -21
- package/dist/scene.d.ts +2 -0
- package/dist/source.d.ts +4 -2
- package/dist/source.js +15 -9
- package/dist/svg.d.ts +12 -0
- package/dist/svg.js +245 -81
- package/dist/verify.d.ts +6 -0
- package/dist/verify.js +104 -56
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/world-art.d.ts +59 -0
- package/dist/world-art.js +854 -0
- package/dist/world.d.ts +233 -0
- package/dist/world.js +1577 -0
- package/package.json +9 -3
package/dist/element.js
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,M as p,N as m,O as h,P as g,Q as _,R as v,S as y,T as b,U as x,V as S,W as C,X as w,Y as T,Z as E,_ as D,b as O,d as k,et as A,f as j,g as M,h as N,j as P,k as F,l as I,m as L,n as R,nt as z,p as ee,q as te,rt as ne,s as re,t as B,tt as ie,u as ae,v as oe,w as se,x as ce,y as le,z as ue}from"./element-looks.js";var de=(e,t,n)=>[...t,...e.map(e=>n?e:{...e,box:!0})],fe=4,V=e=>e.x+e.w/2,pe=e=>e.y+e.h/2,me=([e,t,n,r],i)=>{let a=1-i,[o,s,c,l]=[a*a*a,3*a*a*i,3*a*i*i,i*i*i];return{x:o*e.x+s*t.x+c*n.x+l*r.x,y:o*e.y+s*t.y+c*n.y+l*r.y}},he=(e,t)=>e.x===t.x&&e.y===t.y&&e.w===t.w&&e.h===t.h,H=(e,t)=>t===`l`?{x:e.x,y:pe(e)}:t===`r`?{x:e.x+e.w,y:pe(e)}:t===`t`?{x:V(e),y:e.y}:{x:V(e),y:e.y+e.h},ge=(e,t,n)=>t===`l`||t===`r`?{x:e.x+(t===`r`?e.w:0),y:e.y+e.h*n}:{x:e.x+e.w*n,y:e.y+(t===`b`?e.h:0)},_e=(e,t,n)=>{let r=n===`l`||n===`r`,i=Math.abs(r?t.x-e.x:t.y-e.y)/2,a=n===`r`||n===`b`?1:-1;return[e,r?{x:e.x+a*i,y:e.y}:{x:e.x,y:e.y+a*i},r?{x:t.x-a*i,y:t.y}:{x:t.x,y:t.y-a*i},t]},ve=(e,t,n,r)=>n===`above`||n===`below`?[e,{x:e.x,y:r},{x:t.x,y:r},t]:[e,{x:r,y:e.y},{x:r,y:t.y},t],ye=50,be=16,xe=24,Se=e=>e===`left`||e===`right`,Ce=(e,t,n,r,i=0)=>{let a=[e,t,...r],o=Se(n)?Math.max(ye,(i/2+12)/.75):ye;return n===`above`?Math.min(...a.map(e=>e.y))-o:n===`below`?Math.max(...a.map(e=>e.y+e.h))+o:n===`left`?Math.min(...a.map(e=>e.x))-o:Math.max(...a.map(e=>e.x+e.w))+o},we=(e,t,n)=>{let[r,i]=Se(n)?[pe(e),pe(t)]:[V(e),V(t)];return[Math.min(r,i),Math.max(r,i)]},U={above:[`t`,`t`],below:[`b`,`b`],left:[`l`,`l`],right:[`r`,`r`]},Te=e=>{let t=e.slice(1).reduce((t,n,r)=>t+Math.hypot(n.x-e[r].x,n.y-e[r].y),0),n=Math.max(32,Math.ceil(t/4));return Array.from({length:n+1},(t,r)=>me(e,r/n))},W=(e,t,n)=>{let r=e.map(e=>e.x),i=e.map(e=>e.y),a=t.filter(e=>e.x+e.w+n>Math.min(...r)&&e.x-n<Math.max(...r)&&e.y+e.h+n>Math.min(...i)&&e.y-n<Math.max(...i));if(!a.length)return[];let o=Te(e);return a.filter(e=>o.some(t=>t.x>e.x-n&&t.x<e.x+e.w+n&&t.y>e.y-n&&t.y<e.y+e.h+n))};function Ee(e,t,n=/* @__PURE__ */ new Set,r=[],i,a,o=24){let s=[],c=[];for(let n of e){let e=t[n.from],i=t[n.to];if(!e||!i)continue;let a=e.x<i.x+i.w&&i.x<e.x+e.w,o=r.filter(t=>t.box&&!he(t,e)&&!he(t,i)),l=a?e.y<i.y?[`b`,`t`]:[`t`,`b`]:e.x<i.x?[`r`,`l`]:[`l`,`r`],u=W(_e(H(e,l[0]),H(i,l[1]),l[0]),o,-2),d=(t,n)=>[.2,.5,.8].filter(r=>W(ve(ge(e,U[t][0],r),ge(i,U[t][1],r),t,n),o,-6).length>0).length,f=(e,t)=>d(e,t)===3,p=n.around,m=n.elbow,h=p&&Ce(e,i,p,u,n.labelW),g=(t,n)=>Ce(e,i,t,u)+(t===`above`||t===`left`?-1:1)*n*be;p&&f(p,h)&&(h=Array.from({length:25},(e,t)=>[p,g(p,t)]).find(([e,t])=>!f(e,t))?.[1]??h,f(p,h)&&(p=void 0));let _=n.drop&&!W(_e(H(e,`b`),H(i,`t`),`b`),o,-2).length;if(n.drop&&!p)m=!_;else if(!p&&!n.sides&&!n.stub&&!n.elbow&&u.length){let t=a?[`left`,`right`]:[`above`,`below`],r=[];for(let a of[!1,!0])for(let o of t){let[t,s]=we(e,i,o),l=c.filter(e=>e.way===o&&e.lo<s&&t<e.hi).map(e=>e.at);if(l.length&&!a)continue;let d=o===`above`||o===`left`?-1:1;r.push([o,d*Math.max(d*Ce(e,i,o,u,n.labelW),...l.map(e=>d*e+be))])}for(let e=0;e<=xe;e++)for(let n of t)r.push([n,g(n,e)]);let o=r.reduce((e,t)=>{let n=d(...t);return n<e[0]?[n,t]:e},[3,void 0])[1];[p,h]=o??[],m=n.elbow||!p}if(p){let[t,n]=we(e,i,p);c.push({way:p,lo:t,hi:n,at:h})}let[v,y]=n.sides??(n.stub?[`r`,`l`]:_?[`b`,`t`]:p?U[p]:l);s.push({...n,plain:l,a:e,b:i,sa:v,sb:y,around:p,arc:h,elbow:m})}let l=/* @__PURE__ */ new Map,u=()=>{l=/* @__PURE__ */ new Map;let e=/* @__PURE__ */ new Map;for(let t of s)for(let n of[!0,!1]){let r=(n?t.from:t.to)+`:`+(n?t.sa:t.sb);e.has(r)||e.set(r,[]),e.get(r).push({pick:t,start:n})}for(let[t,r]of e){let e=n.has(t.slice(0,t.lastIndexOf(`:`))),i=r[0].start?r[0].pick.sa:r[0].pick.sb,a=i===`t`||i===`b`,o=e=>{let t=e.start?e.pick.b:e.pick.a;return a?V(t):pe(t)};r.sort((e,t)=>o(e)-o(t)),r.forEach((t,n)=>{let a=t.start?t.pick.a:t.pick.b,o=e?.5:(n+1)/(r.length+1),s=i===`l`?{x:a.x,y:a.y+a.h*o}:i===`r`?{x:a.x+a.w,y:a.y+a.h*o}:i===`t`?{x:a.x+a.w*o,y:a.y}:{x:a.x+a.w*o,y:a.y+a.h};l.set(t.pick.id+(t.start?`:s`:`:e`),s)})}};u();let d=!1;for(let e of s){let[t,n]=[l.get(e.id+`:s`),l.get(e.id+`:e`)];if(!e.around||!t||!n)continue;let i=r.filter(t=>t.box&&!he(t,e.a)&&!he(t,e.b));if(!W(ve(t,n,e.around,e.arc),i,-6).length)continue;let[a,o]=e.plain,s=W(_e(H(e.a,a),H(e.b,o),a),i,-6).length>0;[e.sa,e.sb,e.around,e.arc,e.elbow,d]=[a,o,void 0,void 0,e.elbow||s,!0]}d&&u();let f=(e,t,n)=>{let[r,i,a,o]=t;return{id:e,d:`M ${r.x} ${r.y} C ${i.x} ${i.y}, ${a.x} ${a.y}, ${o.x} ${o.y}`,mid:n,curve:t}},p=[],m=[],h=[],g=e=>{m.push(...e),e.slice(1).forEach((t,n)=>h.push([e[n],t]))},_=(e,t)=>!t||e.x>=t.x+4&&e.x+e.w<=t.x+t.w-4&&e.y>=t.y+4&&e.y+e.h<=t.y+t.h-4,v=(e,t)=>_(e,t)&&(!i||e.x>=i.x&&e.x+e.w<=i.x+i.w&&e.y>=i.y&&e.y+e.h<=i.y+i.h)&&![...r,...p].some(t=>e.x<t.x+t.w+2&&t.x<e.x+e.w+2&&e.y<t.y+t.h+2&&t.y<e.y+e.h+2)&&!m.some(t=>t.x>e.x-2&&t.x<e.x+e.w+2&&t.y>e.y-2&&t.y<e.y+e.h+2),y=Object.values(t),[b,x]=[Math.min(...y.map(e=>e.x)),Math.min(...y.map(e=>e.y))],[S,C]=[Math.max(...y.map(e=>e.x+e.w)),Math.max(...y.map(e=>e.y+e.h))],w=e=>e>0?e+1:0,T=(e,{x:t,y:n})=>e===`above`?x-n:e===`below`?n-C:e===`left`?b-t:t-S,E=(e,t,n,r)=>Math.max(44,a||!r?T(e,{x:t,y:t})-6:T(e,me(n,.5))+(Se(e)?r/2:9)),D=e=>{let t=!e.stub&&e.elbow&&e.sa===`l`,[i,a]=[l.get(e.id+(t?`:e`:`:s`)),l.get(e.id+(t?`:s`:`:e`))],o=e=>{if(!t)return e;let n=[...e.elbow].reverse(),r=n.slice(1).reduce((e,t,r)=>e+(t.y===n[r].y?` H ${t.x}`:` V ${t.y}`),`M ${n[0].x} ${n[0].y}`);return{...e,d:r,curve:[...e.curve].reverse(),elbow:n}};if(e.stub){let[t,o,s]=e.stub,[c,l]=e.bands??[],u=(e,t,n)=>[t,...(n?Array.from({length:Math.max(0,Math.floor((n.h-26)/4))+1},(e,t)=>n.y+4+t*4):[e.y+e.h+2,e.y-20]).filter(e=>e!==t)],d=(e,t,n,r,i,a)=>{let o,s;if(i)[o,s]=[t,{x:n>0?r.x:r.x+r.w,y:r.y+9}];else{let t=a?V(e):Math.min(Math.max(r.x+r.w/2,e.x+8,r.x+8),e.x+e.w-8,r.x+r.w-8),n=r.y>=e.y+e.h;[o,s]=[{x:t,y:n?e.y+e.h:e.y},{x:t,y:n?r.y:r.y+r.h}]}return n>0?[r,o,s]:[r,s,o]};function*f(t,r,i,a,o){let s=n.has(a>0?e.from:e.to),c=u(r,i.y-9,o).map((e,t)=>({y:e,d:Math.abs(e+9-i.y),i:t})).sort((e,t)=>e.d-t.d||e.i-t.i),l=[];for(let e=12-8*Math.ceil((r.w+t)/8);e<=252;e+=8){let n=a>0?i.x+e:i.x-e-t;e<12&&s&&!(n+8<=V(r)&&V(r)<=n+t-8)||c.length&&l.push({dx:e,x:n,k:0,key:Math.abs(e-12)+c[0].d,i:l.length})}let f=(e,t)=>e.key<t.key||e.key===t.key&&e.i<t.i;for(l.sort((e,t)=>e.key-t.key||e.i-t.i);l.length;){let e=l[0],{y:n}=c[e.k++];if(e.k<c.length)e.key=Math.abs(e.dx-12)+c[e.k].d;else{let e=l.pop();l.length&&(l[0]=e)}for(let e=0;;){let t=2*e+1,n=e;if(t<l.length&&f(l[t],l[n])&&(n=t),t+1<l.length&&f(l[t+1],l[n])&&(n=t+1),n===e)break;[l[e],l[n]]=[l[n],l[e]],e=n}e.dx<12&&!(n>=r.y+r.h+6||n+18<=r.y-6)||(yield d(r,i,a,{x:e.x,y:n,w:t,h:18},e.dx>=12,s))}}let m=(t,r,i,a,o)=>{if(!n.has(a>0?e.from:e.to))return[];let s=[];for(let e of u(r,i.y+12,o))for(let n=i.x-t+8;n<=i.x-8;n+=8){let r=e>=i.y+12;if(!r&&e+18>i.y-12)continue;let o={x:n,y:e,w:t,h:18},[c,l]=[i,{x:i.x,y:r?e:e+18}];s.push([o,...a>0?[c,l]:[l,c],Math.abs(e+9-i.y)+Math.abs(n+t/2-i.x)])}return s.sort((e,t)=>e[3]-t[3]).map(([e,t,n])=>[e,t,n])};function*_(t){yield*f(t,e.a,i,1,c),yield[{x:V(e.a)-t/2,y:e.a.y+e.a.h+12,w:t,h:18},{x:V(e.a),y:e.a.y+e.a.h},{x:V(e.a),y:e.a.y+e.a.h+12}],yield[{x:V(e.a)-t/2,y:e.a.y-12-18,w:t,h:18},{x:V(e.a),y:e.a.y},{x:V(e.a),y:e.a.y-12}],yield*m(t,e.a,i,1,c)}function*y(){yield*f(o,e.b,a,-1,l),yield[{x:V(e.b)-o/2,y:e.b.y-12-18,w:o,h:18},{x:V(e.b),y:e.b.y-12},{x:V(e.b),y:e.b.y}],yield[{x:V(e.b)-o/2,y:e.b.y+e.b.h+12,w:o,h:18},{x:V(e.b),y:e.b.y+e.b.h+12},{x:V(e.b),y:e.b.y+e.b.h}],yield*m(o,e.b,a,-1,l)}let b=(e,t)=>Array.from({length:9},(n,r)=>({x:e.x+(t.x-e.x)*r/8,y:e.y+(t.y-e.y)*r/8})),x=(e,t,n)=>b(e,t).every(e=>![...r,...p].some(t=>t!==n&&e.x>t.x+2&&e.x<t.x+t.w-2&&e.y>t.y+2&&e.y<t.y+t.h-2)),S=(e,t)=>!h.some(([n,r])=>Pe(e,t,n,r)),C=(e,t,n)=>([r,i,a])=>v(r,t)&&x(i,a,e)&&(!n||S(i,a)),w=(e,t,n)=>{for(let r of[!0,!1]){let i=C(e,t,r);for(let[e,t]of n.entries())for(let n of t())if(i(n))return[n,e,!r]}},T=w(e.a,c,[()=>_(t),...s==null?[]:[()=>_(s)]]),E=T?.[1]===1,[D,O,k]=T?.[0]??_(t).next().value;p.push(D),g(b(O,k));let A=w(e.b,l,[y]),[j,M,N]=A?.[0]??y().next().value;p.push(j),g(b(M,N));let P=(e,t)=>`M ${e.x} ${e.y} L ${t.x} ${t.y}`,F=[P(O,k),P(M,N)];return{id:e.id,d:F.join(` `),mid:{x:D.x+D.w/2,y:D.y+9},curve:[O,O,N,N],stub:{parts:F,pills:[D,j],pts:[[O,k],[M,N]],tight:[T?.[2]!==!1,A?.[2]!==!1],...E&&{short:!0}}}}if(e.elbow){if(a.x-i.x<16&&i.y===a.y)return o({id:e.id,d:`M ${i.x} ${i.y} H ${a.x}`,mid:{x:(i.x+a.x)/2,y:i.y},curve:[i,i,a,a],elbow:[i,a]});let t=t=>[e.a,e.b].some(e=>he(e,t)),n=r.filter(e=>!t(e)),s=n.filter(e=>e.box),c=(e,t,r,i=2)=>!n.some(n=>e>n.x-i&&e<n.x+n.w+i&&Math.max(t,r)>n.y&&Math.min(t,r)<n.y+n.h),l=(e,t,n,r=s,i=2)=>!r.some(r=>e>r.y-i&&e<r.y+r.h+i&&Math.max(t,n)>r.x&&Math.min(t,n)<r.x+r.w);if(a.x-i.x<16){let t=i.x+8,r=a.x-8,s=(i.y+a.y)/2,u=Array.from({length:Math.floor((C-x+24)/4)+1},(e,t)=>x-12+t*4).sort((e,t)=>Math.abs(e-s)-Math.abs(t-s)).find(e=>c(t,i.y,e)&&l(e,r,t,n)&&c(r,e,a.y))??s;return o({id:e.id,d:`M ${i.x} ${i.y} H ${t} V ${u} H ${r} V ${a.y} H ${a.x}`,mid:{x:(t+r)/2,y:u},curve:[i,{x:t,y:u},{x:r,y:u},a],elbow:[i,{x:t,y:i.y},{x:t,y:u},{x:r,y:u},{x:r,y:a.y},a],bleed:{above:w(x-u),below:w(u-C)}})}let u=(i.x+a.x)/2,d=Array.from({length:Math.floor((a.x-i.x-16)/4)+1},(e,t)=>i.x+8+t*4).sort((e,t)=>Math.abs(e-u)-Math.abs(t-u)),f=[u,a.x-8,i.x+8,...d].find(e=>c(e,i.y,a.y)&&l(i.y,i.x,e)&&l(a.y,e,a.x));if(f==null&&s.length){let t=Math.max(...s.map(e=>e.x+e.w))+12,r=Math.min(...s.map(e=>e.x)),[u,d]=[Math.min(...s.map(e=>e.y))-12,Math.max(...s.map(e=>e.y+e.h))+12],f;for(let e=i.x+8;e<=t;e+=4)if(l(i.y,i.x,e)){for(let t=a.x-8;t>=r;t-=4)if(l(a.y,t,a.x))for(let r=u;r<=d;r+=4){let o=e-i.x+Math.abs(r-i.y)+Math.abs(e-t)+Math.abs(a.y-r)+a.x-t,s=Math.abs(r-(i.y+a.y)/2);f&&(o>f.len||o===f.len&&s>=f.off)||c(e,i.y,r,8)&&l(r,e,t,n,8)&&c(t,r,a.y)&&(f={len:o,off:s,x:e,y:r,ex:t})}}if(f){let{x:t,y:n,ex:r}=f;return o({id:e.id,d:`M ${i.x} ${i.y} H ${t} V ${n} H ${r} V ${a.y} H ${a.x}`,mid:{x:(t+r)/2,y:n},curve:[i,{x:t,y:n},{x:r,y:n},a],elbow:[i,{x:t,y:i.y},{x:t,y:n},{x:r,y:n},{x:r,y:a.y},a],bleed:{left:w(b-Math.min(t,r)),right:w(Math.max(t,r)-S),above:w(x-n),below:w(n-C)}})}}let p=f??u,m={x:p,y:i.y},h={x:p,y:a.y};return o({id:e.id,d:`M ${i.x} ${i.y} H ${p} V ${a.y} H ${a.x}`,mid:{x:p,y:(i.y+a.y)/2},curve:[i,m,h,a],elbow:[i,m,h,a]})}if(e.around){let t=ve(i,a,e.around,e.arc);return{...f(e.id,t,me(t,.5)),around:e.around,room:E(e.around,e.arc,t,e.labelW)}}return f(e.id,_e(i,a,e.sa),{x:(i.x+a.x)/2,y:(i.y+a.y)/2})},O=/* @__PURE__ */ new Map;for(let e of s)e.stub||O.set(e,D(e));let k=[...O.values()],A=e=>{let t=t=>Math.max(e,Oe(k,t)),[n,r]=[t(`left`),t(`above`)];return{x:b-n,y:x-r,w:S-b+n+t(`right`),h:C-x+r+t(`below`)}},[j,M]=[A(Math.min(o,ke)),A(o)],N=e=>e.elbow?e.elbow.slice(1).flatMap((t,n)=>Array.from({length:17},(r,i)=>G(e.elbow[n],t,i/16))):Array.from({length:33},(t,n)=>me(e.curve,n/32)),P=r.filter(e=>e.box),F=(e,t)=>({x:e.x-t/2,y:e.y-9,w:t,h:18}),I=e=>{let t=[],n=[],r=0;for(let[i,o]of O){if(!i.labelW)continue;let s=a?Ne(o,i.labelW,a,t):e?Me(o,i.labelW,P,t,j,k.filter(e=>e!==o).flatMap(N)):Me(o,i.labelW,P,t),c=F(s,i.labelW);(!Ae(c,M)||[...P,...t].some(e=>je(c,e,1)))&&r++,t.push(c),n.push(s)}return{out:t,mids:n,bad:r}},L=I(!0),R=L.bad&&!a?I(!1):L,z=R.bad<L.bad?R:L;p.push(...z.out);let ee=0;for(let[e,t]of O){if(e.labelW){t.mid=z.mids[ee++];let[n,r]=[b-t.mid.x+e.labelW/2,t.mid.x+e.labelW/2-S];t.bleed={...t.bleed,left:Math.max(t.bleed?.left??0,n,0),right:Math.max(t.bleed?.right??0,r,0)}}g(Array.from({length:33},(e,n)=>me(t.curve,n/32)))}for(let e of s)e.stub&&O.set(e,D(e));return s.map(e=>({...O.get(e),ends:[`${e.from}:${e.sa}`,`${e.to}:${e.sb}`]}))}var De=(e,t,n)=>{let r=new Set(n.flatMap(e=>e.ends??[])),i=t===`start`?[`l`,`t`,`b`,`r`]:[`r`,`b`,`t`,`l`];return i.find(t=>!r.has(`${e}:${t}`))??i[0]},Oe=(e,t)=>Math.max(0,...e.map(e=>e.around===t?e.room:e.bleed?.[t]??0)),ke=4,Ae=(e,t)=>e.x>=t.x-.5&&e.x+e.w<=t.x+t.w+.5&&e.y>=t.y-.5&&e.y+e.h<=t.y+t.h+.5,je=(e,t,n)=>e.x<t.x+t.w+n&&t.x<e.x+e.w+n&&e.y<t.y+t.h+n&&t.y<e.y+e.h+n,G=(e,t,n)=>({x:e.x+(t.x-e.x)*n,y:e.y+(t.y-e.y)*n});function Me(e,t,n,r,i,a=[]){let[o,s,c,l]=e.curve,u=[],d=e.elbow,f=d?.slice(1).map((e,t)=>Math.hypot(e.x-d[t].x,e.y-d[t].y)),p=f?.reduce((e,t)=>e+t,0)??0;for(let t of[.5,.45,.55,.4,.6,.35,.65,.3,.7,.25,.75,.2,.8]){let n,r,i;if(d&&f&&p>0){let e=0,a=t*p;for(;e<f.length-1&&a>f[e];)a-=f[e++];let o=f[e]?a/f[e]:0;n=G(d[e],d[e+1],o),[r,i]=[d[e+1].x-d[e].x,d[e+1].y-d[e].y]}else{let a=1-t;r=3*(a*a*(s.x-o.x)+2*a*t*(c.x-s.x)+t*t*(l.x-c.x)),i=3*(a*a*(s.y-o.y)+2*a*t*(c.y-s.y)+t*t*(l.y-c.y)),n=t===.5?e.mid:me(e.curve,t)}let a=Math.hypot(r,i)||1;for(let e of[0,11,-11])u.push({x:n.x-i/a*e,y:n.y+r/a*e})}let m=e=>!i||Ae({x:e.x-t/2,y:e.y-9,w:t,h:18},i),h=e=>i?{x:Math.max(i.x+t/2,Math.min(e.x,i.x+i.w-t/2)),y:Math.max(i.y+9,Math.min(e.y,i.y+i.h-9))}:e,g=(e,i,o=1)=>{let s={x:e.x-t/2,y:e.y-9,w:t,h:18};return m(e)&&!n.some(e=>je(s,e,o))&&!r.some(e=>je(s,e,1))&&(!i||!a.some(e=>e.x>s.x-2&&e.x<s.x+t+2&&e.y>s.y-2&&e.y<s.y+20))};for(let e of u)if(g(e,!0,6))return e;for(let e of[!0,!1])for(let t of u)if(g(t,e))return t;for(let e of u.map(h))if(g(e,!1))return e;return i?Me(e,t,n,r):e.mid}function Ne(e,t,{bands:n,boxes:r},i){let a=Array.from({length:65},(e,t)=>t/64).sort((e,t)=>Math.abs(e-.5)-Math.abs(t-.5)).map(t=>me(e.curve,t)),o=e=>!r.some(t=>je(e,t,1))&&!i.some(t=>je(e,t,1)),s=(e,n)=>e-t/2>=n.x+fe&&e+t/2<=n.x+n.w-fe;for(let e of a){let r={x:e.x-t/2,y:e.y-9,w:t,h:18};if(n.some(t=>s(e.x,t)&&r.y>=t.y+fe&&r.y+18<=t.y+t.h-fe)&&o(r))return e}for(let e of a)for(let r of n){if(!s(e.x,r)||r.h<26)continue;let n=Math.min(Math.max(e.y,r.y+fe+9),r.y+r.h-fe-9),i={x:e.x-t/2,y:n-9,w:t,h:18};if(o(i)&&a.some(e=>e.x>=i.x&&e.x<=i.x+t&&e.y>=i.y&&e.y<=i.y+18))return{x:e.x,y:n}}return e.mid}function Pe(e,t,n,r){let i=Math.hypot(t.x-e.x,t.y-e.y);if(i<4)return!1;let a=1.5/i,[o,s]=[{x:e.x+(t.x-e.x)*a,y:e.y+(t.y-e.y)*a},{x:t.x-(t.x-e.x)*a,y:t.y-(t.y-e.y)*a}],c=(e,t,n)=>Math.sign((t.x-e.x)*(n.y-e.y)-(t.y-e.y)*(n.x-e.x));return c(o,s,n)*c(o,s,r)<0&&c(n,r,o)*c(n,r,s)<0}var K={gap:24,band:20,cols:28,phase:30,row:34,minCol:120,pad:24,bandInset:8,clear:12,inset:6,maxOpen:10},Fe=e=>`▸ ${e.label} · ${e.messages} messages`,Ie=e=>P(e)?[...e.id?[{id:e.id,label:u(e.label)}]:[],...e.children.flatMap(Ie)]:[{id:e.id,label:u(e.label)}];function Le(e,t){return e.states[Math.min(t,e.states.length-1)]??e.states[0]}function Re(e,t){let n=e.steps??[],r=new Map(e.edges.map(e=>[b(e),e])),i=new Set(Ie(e.layout).map(e=>e.id)),a=n.map((e,t)=>e.flow.map(_).map((e,n)=>e.hops.filter(e=>{if(!r.has(e.edge))return!1;let t=r.get(e.edge);return i.has(t.from)&&i.has(t.to)}).map(e=>({step:t,beat:n,edge:e.edge,back:e.back,text:u(e.data)||u(r.get(e.edge).label),async:e.async===!0,tone:e.tone})))),o=a.flat(2);if(!o.length)return null;let s=new Set(o.flatMap(e=>[r.get(e.edge).from,r.get(e.edge).to])),c=Ie(e.layout).filter(e=>s.has(e.id)),d=new Map(c.map((e,t)=>[e.id,t])),f=K.minCol;for(let e of c)f=Math.max(f,z(e.label,12)+16+K.bandInset*2);for(let e of o)e.text&&(f=Math.max(f,l(e.text)+16));let p=o.length>K.maxOpen,m=e=>z(e,13,!0),h=(()=>{let e=`${o.length} of ${o.length}`;return z(e,11)+.44*e.length})(),g=Math.max(...a.map((e,t)=>{let r=u(n[t].label);return m(p?Fe({label:r,messages:e.flat().length}):r)})),v=(t,n,r)=>{let i=t+r*c.length+n,a=c.map((e,n)=>({id:e.id,label:e.label,x:t+r*(n+.5),w:r})),o=[],s=(e,t)=>{let n=new Set(Ie(e).map(e=>e.id)),r=a.filter(e=>n.has(e.id));if(e.label!=null&&r.length){let n=Math.min(...r.map(e=>e.x-e.w/2))+K.bandInset+t*4,i=Math.max(...r.map(e=>e.x+e.w/2))-K.bandInset-t*4;o.push({id:e.id??u(e.label),label:u(e.label),rect:{x:n,y:t*K.band,w:i-n,h:0}})}for(let n of e.children)P(n)&&s(n,t+(e.label==null?0:1))};s(e.layout,0);let l=o.flatMap(e=>[e.rect.x,e.rect.x+e.rect.w]);return{width:i,columns:a,bands:o,dl:Math.max(0,K.pad+g+K.clear-Math.min(1/0,...l)),dr:Math.max(0,Math.max(-1/0,...l)-(i-K.pad-h-K.clear))}},y=(e,n)=>Math.max(f,(t-e-n)/c.length),[x,S]=[K.pad,K.pad],C=y(x,S),w=v(x,S,C);for(let e=0;w.dl>.01||w.dr>.01;e++)x+=w.dl,S+=w.dr,e<8&&(C=y(x,S)),w=v(x,S,C);let{width:T,columns:E,bands:D}=w,O=(D.length?Math.max(...D.map(e=>e.rect.y))+K.band:0)+K.cols,k=[],A=[],j=0;a.forEach((e,t)=>{let i=u(n[t].label),a=e.flat().length,o=e=>K.pad+m(e)+K.clear,s={open:o(i),folded:o(Fe({label:i,messages:a})),end:T-K.pad-h-K.clear};k.push({kind:`phase`,step:t,label:i,messages:a,line:s});for(let n of e){let e=n.length>1?A.push({step:t,rows:[]})-1:void 0;for(let i of n){let n=r.get(i.edge),[a,o]=i.back?[n.to,n.from]:[n.from,n.to],s=d.get(a),c=d.get(o),u=(E[s].x+E[c].x)/2,f=i.text?{x:u-l(i.text)/2,w:l(i.text)}:void 0;e!=null&&A[e].rows.push(k.length),k.push({kind:`message`,step:t,beat:i.beat,n:++j,edge:i.edge,from:s,to:c,text:i.text,async:i.async,tone:i.tone,pill:f,group:e})}}});let M=n.map((e,t)=>{let n=O;return k.map(e=>{let r=!p||e.kind===`phase`||e.step===t,i={y:n,shown:r};return r&&(n+=e.kind===`phase`?K.phase:K.row),i})}),N=Math.max(...M.map(e=>e.reduce((e,t,n)=>t.shown?Math.max(e,t.y+(k[n].kind===`phase`?K.phase:K.row)):e,0)))+8;for(let e of D)e.rect.h=N-e.rect.y-e.rect.y/K.band*4;return{width:T,head:O,height:N,columns:E,bands:D,rows:k,groups:A,total:j,folds:p,states:M}}function ze(e,t){let n=t.rows.flatMap(t=>{let n=e.rows[t];return n.kind===`message`?[e.columns[n.from].x,e.columns[n.to].x,...n.pill?[n.pill.x,n.pill.x+n.pill.w]:[]]:[]}),r=Math.min(...n)-K.inset,i=(K.row-18)/2-K.inset;return{x:r,y:i,w:Math.max(...n)+K.inset-r,h:t.rows.length*K.row-i*2}}function Be(e,t){if(e.timeline||!e.lanes||!p(e.layout))return null;let n=e.rail?Re(e,560)?.width??0:0;return S(e,{width:t.width,minText:t.minText,padding:t.padding??24,floor:n})}var Ve=830,q=8,He=2.5,J=105,Y=10,Ue=e=>P(e)&&e.label==null&&e.id==null?e.children.flatMap(Ue):[e],We=/* @__PURE__ */ new WeakSet,Ge=(e,t)=>{let n=e.findIndex((e,n)=>e!==t[n]);return n>=0&&e[n]<t[n]};function Ke(e,n,r,i,a){let o=e.length,s=n.map(e=>[r.get(e.from),r.get(e.to)].sort((e,t)=>e-t)),c=/* @__PURE__ */ new Map,l=(t,n)=>c.get(t*o+n)??c.set(t*o+n,g({direction:`row`,children:e.slice(t,n)},i,a)).get(t*o+n),u;for(let e=0;n.length<=6&&e<3**n.length;e++){let t=s.map((t,n)=>Math.floor(e/3**n)%3),n=/* @__PURE__ */ new Set,r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set;s.forEach(([e,a],o)=>{if(t[o])for(let i of t[o]===1?[e+1,a+1]:[e,a])n.add(i),t[o]===1&&r.add(i);else for(let t=e+1;t<=a;t++)i.add(t)});let a=[{cost:[0,0],from:-1}];for(let e=1;e<=o;e++)for(let t=e-1;t>=Math.max(0,e-4)&&!(t<e-1&&n.has(t+1)||l(t,e)>782);t--){let n=a[t];if(!n||t&&i.has(t)||r.has(e)&&e-t<4)continue;let o=[n.cost[0]+1,Math.max(n.cost[1],l(t,e))];(!a[e]||Ge(o,a[e].cost))&&(a[e]={cost:o,from:t})}if(!a[o]||u&&!Ge(a[o].cost,u.cost))continue;let c=[];for(let e=o;e>0;e=a[e].from)c.unshift(a[e].from);let d=e=>c.findLastIndex(t=>t<=e),f=e=>l(c[e],c[e+1]??o);s.some(([e,n],r)=>{let[i,a]=[d(e),d(n)],o=Array.from({length:a-i+1},(e,t)=>f(i+t));return!t[r]&&i>0&&i<c.length-1||t[r]===1&&Math.min(f(i),f(a))<Math.max(...o)||s.some(([i,a],o)=>o>r&&t[r]&&t[r]===t[o]&&e<a&&i<n)})||(u={cost:a[o].cost,cuts:c,sides:t})}if(!u)return;let d=u.cuts[1]??o;n.forEach((e,t)=>e.around=[r.get(e.from)<d?`above`:`below`,`right`,`left`][u.sides[t]]);let f=u.cuts.map((t,n)=>({direction:`row`,children:e.slice(t,u.cuts[n+1]??o)})),p=e=>f.findIndex(n=>t(n).includes(e));for(let e of a)!n.includes(e)&&p(e.from)>=0&&p(e.from)<p(e.to)&&We.add(e);return{direction:`column`,align:`start`,children:f}}function qe(e){let t=/* @__PURE__ */ new Map,n=new Map(e.edges.map(e=>[b(e),e]));for(let r of e.steps??[])for(let e of r.flow)for(let r of _(e).hops){let e=n.get(r.edge);if(e)for(let n of r.back?[e.to,e.from]:[e.from,e.to])t.has(n)||t.set(n,t.size)}for(let n of C(e.layout))t.has(n.id)||t.set(n.id,t.size);return t}function Je(e,n,r){let i=e.length,a=/* @__PURE__ */ new Map;e.forEach((e,n)=>t(e).forEach(e=>a.set(e,n)));let o=e.map(e=>Math.min(...t(e).map(e=>r.at.get(e)??1/0))),s=r.edges.flatMap(e=>{let t=a.get(e.from),n=a.get(e.to);return t==null||n==null||t===n?[]:[[t,n,e]]}),c=[...e.keys()].sort((e,t)=>o[e]-o[t]),l=Array.from({length:i},()=>0),u=/* @__PURE__ */ new Set,d=e=>{l[e]=1;let t=[...s.keys()].filter(t=>s[t][0]===e).sort((e,t)=>o[s[e][1]]-o[s[t][1]]);for(let e of t){let t=s[e][1];l[t]===1?u.add(e):l[t]===0&&d(t)}l[e]=2};for(let e of c)l[e]||d(e);let f=s.map(([e,t],n)=>u.has(n)?[t,e]:[e,t]),p=Array.from({length:i},()=>0);for(let e=0;e<i;e++)for(let[e,t]of f)p[t]=Math.max(p[t],p[e]+1);let m=Math.max(0,...p)+1,h=Array.from({length:m},()=>[]),_=[...p];for(let e of c)h[p[e]].push(e);let v=[],y=f.map(()=>[]);for(let[e,[t,n]]of f.entries()){let r=t;for(let i=p[t]+1;i<p[n];i++){let t=_.length;_.push(i),h[i].push(t),y[e].push(t),v.push([r,t]),r=t}v.push([r,n])}let b=[],x=()=>h.forEach(e=>e.forEach((e,t)=>b[e]=t)),S=()=>{x();let e=0;for(let t=0;t<v.length;t++)for(let n=t+1;n<v.length;n++){let[r,i]=v[t],[a,o]=v[n];_[r]===_[a]&&(b[r]-b[a])*(b[i]-b[o])<0&&e++}return e},C=h.map(e=>[...e]),w=S();for(let e=0;e<q;e++){let t=e%2==0,n=[...h.keys()].slice(1).map(e=>t?e:m-1-e);for(let e of n){x();let n=e=>{let n=v.filter(([n,r])=>(t?r:n)===e).map(([e,n])=>b[t?e:n]);return n.length?n.reduce((e,t)=>e+t,0)/n.length:b[e]},r=new Map(h[e].map(e=>[e,n(e)]));h[e].sort((e,t)=>r.get(e)-r.get(t))}let r=S();r<w&&([w,C]=[r,h.map(e=>[...e])])}let T=n===`row`?`column`:`row`,E=e.map(e=>P(e)?{...e,direction:n,children:Je(e.children.flatMap(Ue),n,r)}:e),D=/* @__PURE__ */ new Map,O=e=>{let t=D.get(e);if(t==null)return E[e];let n=C.find(t=>t.includes(e)).filter(e=>e<i),r=[E[e],E[t]];return{direction:`row`,children:n.indexOf(e)<(n.length-1)/2?r.reverse():r}},k=e=>{let t=e.filter(e=>e<i);return t.length===1?O(t[0]):{direction:T,children:t.map(O)}};if(n===`column`){let e=e=>g(k(e),r.carded,r.edges,190)<=782;for(let t of C){let n=t.filter(e=>e<i&&!f.some(([t])=>t===e)&&f.filter(([,t])=>t===e).length===1).sort((e,t)=>o[t]-o[e]);for(let r of n){if(e(t))break;let n=f.find(([,e])=>e===r)[0];if(D.has(n))continue;let i=C.find(e=>e.includes(n)),a=t.indexOf(r);t.splice(a,1),D.set(n,r),e(i)||(D.delete(n),t.splice(a,0,r))}}}let A=(e,t)=>e.every(e=>{let n=C[_[e]],r=n.indexOf(e);return(t>0?n.slice(r+1):n.slice(0,r)).every(e=>e>=i)}),j=()=>y.map((e,t)=>{let[n,r]=f[t],a=[n,r].every(e=>C[p[e]].filter(e=>e<i).length===1);return!u.has(t)&&(!e.length||a)?0:A([n,...e,r],1)?1:A([n,...e,r],-1)?-1:0}),M=(e,t,n)=>Math.sign((t[0]-e[0])*(n[1]-e[1])-(t[1]-e[1])*(n[0]-e[0])),N=e=>{let t=[];C.forEach((e,n)=>e.filter(e=>e<i).forEach((e,r,i)=>t[e]=[n,r-(i.length-1)/2]));let n=0;for(let r=0;r<f.length;r++)for(let i=r+1;i<f.length;i++){let[a,o]=f[r],[s,c]=f[i];a!==s&&a!==c&&o!==s&&o!==c&&[a,o,s,c].every(e=>t[e])&&(e[r]||e[i]?n+=+(e[r]===e[i]&&p[a]<p[c]&&p[s]<p[o]):n+=+(M(t[a],t[o],t[s])*M(t[a],t[o],t[c])<0&&M(t[s],t[c],t[a])*M(t[s],t[c],t[o])<0))}return n},F=j();for(let e of F.keys())for(let t of F.keys()){let n=F[e],[r,i]=f[e],[a,o]=f[t];if(!(t<=e||!n||n!==F[t]||p[r]>=p[o]||p[a]>=p[i]))for(let r of y[e].length<=y[t].length?[e,t]:[t,e]){let i=[f[r][0],...y[r],f[r][1]];if(i.some(e=>!C[_[e]].includes(e)))continue;let a=C.map(e=>[...e]),o=N(F);for(let e of i){let t=C[_[e]];t.splice(t.indexOf(e),1),n>0?t.unshift(e):t.push(e)}let s=j();if(s[r]===-n&&s[e+t-r]===n&&N(s)<o){F=s;break}C=a}}F.forEach((e,t)=>{e&&(s[t][2].around=n===`column`?e>0?`right`:`left`:e>0?`below`:`above`)});let I=C.filter(e=>e.some(e=>e<i)),L=I.map(k);if(n===`row`||I.length*J<=He*Ve)return L;let R=[],z=[],ee=[],te=new Map(y.flatMap((e,t)=>e.map(e=>[e,s[t][2]]))),ne=(e,t)=>{let n=Math.ceil(e.length/t),r=Math.ceil(e.length/n);return Array.from({length:n},(t,n)=>({direction:`row`,children:e.slice(n*r,(n+1)*r)}))},re=e=>{let t=e.length<4?void 0:[4,3].map(t=>ne(e,t)).find(e=>e.every(e=>g(e,r.carded,r.edges)<=782));R.push(...t??e)},B=()=>{let e=new Map(z.map((e,t)=>[e.id,t])),t=r.edges.filter(t=>e.has(t.from)&&e.has(t.to)&&Math.abs(e.get(t.from)-e.get(t.to))>1),n=ee.every(e=>I[e].every(e=>e<i||t.includes(te.get(e)))),a=z.length>=4&&t.length&&n?Ke(z,t,e,r.carded,r.edges):void 0;if(a)R.push(a);else{let e=[];z.forEach((t,n)=>{I[ee[n]].length===1?e.push(t):(re(e),e=[],R.push(t))}),re(e)}z=[],ee=[]};return L.forEach((e,t)=>{I[t].filter(e=>e<i).length===1&&!P(e)?(z.push(e),ee.push(t)):(B(),R.push(e))}),B(),R}var Ye=e=>({...e,children:e.children.map(e=>P(e)?Ye(e):e).filter(e=>!P(e)||e.children.length)}),Xe=e=>P(e)&&(e.label!=null||e.children.some(Xe));function Ze(e,t){return(e.steps??[]).flatMap(e=>e.flow.flatMap(e=>Object.values(_(e).show??{}))).some(e=>m(e)&&e.some(e=>e.mono))?10.5:t.size||e.edges.some(e=>e.label!=null)||Xe(e.layout)?11:(e.steps??[]).some(e=>e.flow.some(e=>_(e).hops.some(e=>e.data!=null)))?11.5:C(e.layout).some(e=>e.sub!=null)?12:e.steps?.length?13.5:14}function Qe(e,n){let r=Ve*Ze(e,n)/Y-48;if(e.rail||g(e.layout,n,e.edges,i(e,Ve))<=r)return e;let a=e.layout.children,o=a.length,s=new Map(a.flatMap((e,n)=>t(e).map(e=>[e,n]))),c=e.edges.filter(e=>s.has(e.from)&&s.has(e.to)).map(e=>[s.get(e.from),s.get(e.to)]),l=e=>c.filter(([t,n])=>t<e!=n<e).length,u=Math.min(o-1,...e.edges.filter(e=>e.around).flatMap(e=>[e.from,e.to].map(e=>s.get(e)??o))),d=(e,t)=>e[0]-t[0]||e[1]-t[1]||e[2]-t[2],f=[{cost:[0,0,0],from:-1}];for(let t=1;t<=o;t++)for(let i=t-1;i>=0;i--){let s=g({direction:`row`,children:a.slice(i,t)},n,e.edges);if(s>r)break;let c=f[i];if(!c||t===o&&i>u)continue;let p=[c.cost[0]+1,c.cost[1]+(i?l(i):0),Math.max(c.cost[2],s)];(!f[t]||d(p,f[t].cost)<0)&&(f[t]={cost:p,from:i})}if(!f[o]||f[o].cost[0]<2){let t=e.edges.filter(e=>s.has(e.from)&&s.has(e.to)&&(e.around||Math.abs(s.get(e.from)-s.get(e.to))>1)),r=o>=4&&t.some(e=>e.around)&&!a.some(P)?Ke(a,t,s,n,e.edges):void 0;return r?{...e,layout:r}:e}let p=[];for(let e=o;e>0;e=f[e].from)p.unshift(f[e].from);let m=p.map((e,t)=>a.slice(e,p[t+1]??o));for(let t of e.edges)p.some(e=>e&&s.get(t.from)<e&&s.get(t.to)>=e)&&We.add(t);let h=m.map(e=>e.length===1?e[0]:{direction:`row`,children:e});return{...e,layout:{direction:`column`,children:h}}}function $e(e){if(e.lanes||e.timeline)return e;let t={...e,layout:Ye(e.layout)};if(!t.layout.auto)return t;let n=new Set((t.steps??[]).flatMap(e=>e.flow.flatMap(e=>Object.keys(_(e).show??{})))),r=qe(t),a=t.layout.children.flatMap(Ue),o=e=>{let i=t.edges.map(e=>({...e,around:void 0}));return{...t,edges:i,layout:{direction:e,children:Je(a,e,{edges:i,at:r,carded:n})}}};if(t.layout.direction===`row`)return Qe(o(`row`),n);if(t.layout.direction)return o(t.layout.direction);let s=o(`row`);return g(s.layout,n,s.edges,i(s,Ve))+48<=Ve?s:o(`column`)}var et=e=>e==null?`(none)`:`"${u(e)}"`,tt=(e,t,n)=>n.filter(n=>u(e[n])!==u(t[n])).map(n=>`${String(n)} ${et(e[n])} -> ${et(t[n])}`);function nt(e,t,n,r){let i=(t,n)=>({kind:e,op:`added`,id:n.id??t,...n.path&&{path:n.path}}),a=[];for(let[e,o]of t){let t=n.get(e);if(!t)continue;let s=r(o,t);s.length&&a.push({...i(e,t),op:`changed`,detail:s.join(`; `)})}for(let[e,r]of t)n.has(e)||a.push({...i(e,r),op:`removed`});for(let[e,r]of n)t.has(e)||a.push(i(e,r));return a}var rt=e=>{let t=/* @__PURE__ */ new Map;return new Map(te(e).flatMap(e=>(e.props.steps??[]).flatMap(n=>n.flow.flatMap(r=>_(r).hops.map(r=>{let i=`${u(n.label)}: ${r.edge}${r.back?` back`:``}${r.data==null?``:` "${u(r.data)}"`}${r.tone?` [${r.tone}]`:``}${r.source?` <${r.source}>`:``}${r.via?` via ${r.via}`:``}`,a=`${e.path.join(`>`)}\n${i}`,o=(t.get(a)??0)+1;t.set(a,o);let s=o>1?`${i} #${o}`:i;return[`${e.path.join(`>`)}\n${s}`,{id:s,path:e.line}]})))))},it=e=>{let t=/* @__PURE__ */ new Map;for(let n of te(e)){let e=new Set(n.ports.map(e=>e.id)),r=(i,a)=>i.children.forEach(i=>P(i)?r(i,i.label==null?i.id:u(i.label)):e.has(i.id)||t.set(i.id,{...i,group:a,path:n.line,owner:n.path.at(-1),top:n.path[0]}));r(n.props.layout)}return t},at=[`label`,`sub`,`shape`,`tone`,`mark`,`from`,`to`,`source`,`group`],ot=(e,t)=>!e||!t||e.owner!==t.owner||tt(e,t,at).length>0;function st(e,t){let n=e=>new Map(te(e).flatMap(e=>e.props.edges.map(t=>[b(t),{...t,path:e.line}]))),r=e=>new Map(te(e).flatMap(e=>(e.props.steps??[]).map(t=>[`${e.path.join(`>`)}\n${u(t.label)}`,{...t,id:u(t.label),path:e.line}]))),i=it(e),a=it(t),o=[...nt(`box`,i,a,(e,t)=>[...e.owner===t.owner?[]:[`moved from ${e.path||`the root`} to ${t.path||`the root`}`],...tt(e,t,at)]),...nt(`edge`,n(e),n(t),(e,t)=>tt(e,t,[`from`,`to`,`label`,`source`,`via`])),...nt(`step`,r(e),r(t),(e,t)=>tt(e,t,[`caption`])),...nt(`message`,rt(e),rt(t),()=>[])],s=/* @__PURE__ */ new Map,c=(e,t)=>{e&&s.set(e,{added:0,removed:0,changed:0,...s.get(e),[t]:(s.get(e)?.[t]??0)+1})};for(let e of/* @__PURE__ */ new Set([...i.keys(),...a.keys()])){let t=i.get(e),n=a.get(e);ot(t,n)&&(t?n?(c(n.owner,`changed`),t.owner!==n.owner&&c(t.owner,`removed`)):c(t.owner,`removed`):c(n.owner,`added`))}for(let[e,t]of s){if(!i.has(e)||!a.has(e))continue;let n=`parts: ${t.added} added, ${t.removed} removed, ${t.changed} changed`,r=o.find(t=>t.kind===`box`&&t.id===e),s=a.get(e).path;r?r.detail=r.detail?`${r.detail}; ${n}`:n:o.push({kind:`box`,op:`changed`,id:e,detail:n,...s&&{path:s}})}return(e.rail??!1)!==(t.rail??!1)&&o.push({kind:`rail`,op:`changed`,id:`rail`,detail:`${e.rail??`(none)`} -> ${t.rail??`(none)`}`}),o}function ct(e,t){return e.length?e.map(e=>{let n=t===`md`?`\`${e.id}\``:e.id,r=`${e.path?`[${e.path}] `:``}${e.kind} ${e.op}: ${n}${e.detail?` (${e.detail})`:``}`;return t===`md`?`- ${r}`:r}).join(`
|
|
2
|
+
`):t===`md`?`- no change in the spec`:`no change in the spec`}var lt=15,ut=8,dt=4,ft=15,pt=320,mt=37,ht=(e,t)=>{let n=String(e[t]),r=[...n].reduce((e,t)=>e<0?e:e+(t===`(`?1:t===`)`?-1:0),0);return/^[#a-zA-Z0-9 ,.%()/+-]+$/.test(n)&&!/url\(/i.test(n)&&r===0?n:L[t]},gt=(e,t)=>`--accent:${ht(e,`accent`)}; --fg:${ht(e,`fg`)}; --muted:${ht(e,`muted`)}; --bg:${ht(e,`bg`)}; --surface:${ht(e,`surface`)}; --border:${ht(e,`border`)}; --card-on:${t}; --tint:color-mix(in srgb, var(--accent) 10%, var(--surface));`,_t=e=>m(e)?e:u(e),X=e=>e.replace(/[<>&"]/g,e=>({"<":`<`,">":`>`,"&":`&`,'"':`"`})[e]),vt=e=>Math.round(e*1e4)/1e4,Z=e=>Math.round(e*1e4)/100+`%`,yt=e=>z(e.toUpperCase(),9)+e.length*.27+8;function bt(e,t){let n=t-16;if(e==null)return{rows:[],height:lt+12};let r=_t(e);if(!Array.isArray(r)){let e=ne(r||` `,n,11);return{rows:[{row:{text:r},heads:!1,lines:e,room:n}],height:e.length*lt+12}}let i=r.map(e=>{let t=(e.tag?.length??0)>2,r=e.tag&&!t?yt(e.tag)+5:0,i=e.mark&&!t?z(u(e.mark),11)+6:0,a=u(e.text)+(e.meta==null?``:` · `+u(e.meta)),o=n-r-i;return{row:e,heads:t,lines:ne(a,o,e.mono?10.5:11,e.mono),room:o}});return{rows:i,height:i.reduce((e,t)=>e+(t.heads?lt:0)+t.lines.length*lt,0)+dt*Math.max(0,i.length-1)+12}}function xt(e,t){if(!P(e)){let n=t.cards.get(e.id),i=g(e,t.cards,t.fig.edges,t.cap),a=e.shape===`store`?24:10,s=n?8+t.cardH.get(e.id):0,c=o(e,i).length*18,l=Math.max(a+c+(e.sub?ft:0)+s+10,t.minH(e.id));return e.shape===`decision`?{w:i,h:n?l+24:Math.max(r(e,i).h,t.minH(e.id)+24)}:{w:i,h:l}}let n=e.children.map(e=>xt(e,t)),i=e.direction===`column`?n.reduce((e,t)=>e+t.h,0)+t.gap(e)*(n.length-1):Math.max(...n.map(e=>e.h));return{w:g(e,t.cards,t.fig.edges,t.cap),h:i+(e.label==null?0:55)}}function St(e,t,r,i,a){let o=e.layout.children,{cols:s,starts:c,gaps:l,lead:u,blocks:d}=i.plan,f=Array.from({length:Math.max(-1,...s.values())+1},()=>0);for(let e of o)for(let t of e.children)f[s.get(t.id)]=Math.max(f[s.get(t.id)],xt(t,i).w);let p=n(o),m=e=>f.slice(c[e],c[e+1]),h=f.map((e,t)=>{let n=v(c,t);return p+u[n]+m(n).slice(0,t-c[n]).reduce((e,t,r)=>e+t+l[c[n]+r],0)}),g=Math.max(...d.map(e=>{let t=m(e);return p+u[e]+t.reduce((e,t)=>e+t,0)+l.slice(c[e],c[e]+t.length-1).reduce((e,t)=>e+t,0)+(l[c[e]+t.length-1]??18)})),_=a.length;a.push({x:t,y:r,w:g,h:0,item:e.layout});let y=r;d.forEach((e,n)=>{n&&(y+=20);for(let n of o){let r=n.children.filter(t=>v(c,s.get(t.id))===e).map(e=>({b:e,...xt(e,i)}));if(d.length>1&&!r.length)continue;let l=Math.max(38,...r.map(e=>e.h)),u=l+48+(i.tall.has(`${o.indexOf(n)}@${e}`)?30:0);a.push({x:t,y,w:g,h:u,item:n,lane:!0,block:e});for(let e of r)a.push({x:t+h[s.get(e.b.id)],y:y+24+(l-e.h)/2,w:e.w,h:e.h,item:e.b});y+=u+20}}),a[_].h=y-20-r}function Q(e,t,r,i){let a=e.layout.children,o=n(a),s=E(e,640),c=o+640+18,l=i.length;i.push({x:t,y:r,w:c,h:0,item:e.layout});let u=r+28;a.forEach((e,n)=>{let r=s.rows[n],a=r*28+(r-1)*8+48;i.push({x:t,y:u,w:c,h:a,item:e,lane:!0});for(let r of s.items){if(r.track!==n)continue;let a=e.children.find(e=>!P(e)&&e.id===r.id),s=u+24+r.row*36,c=r.milestone?r.w:28;i.push({x:t+o+r.x,y:s+(28-c)/2,w:r.w,h:c,item:a,tl:{milestone:r.milestone,labelInside:r.labelInside}})}u+=a+20}),i[l].h=u-20-r}function Ct(e,t,n,r,i){if(e===r.fig.layout&&r.fig.timeline&&p(r.fig.layout))return Q(r.fig,t,n,i);if(e===r.fig.layout&&r.fig.lanes&&p(r.fig.layout))return St(r.fig,t,n,r,i);let{w:a,h:o}=xt(e,r);if(i.push({x:t,y:n,w:a,h:o,item:e}),!P(e))return;let s=e.label!=null,c=t+(s?18:0),l=n+(s?mt:0),u=a-(s?36:0),d=o-(s?55:0),f=r.gap(e);for(let t of e.children){let n=xt(t,r),a=e.align??`center`,o=(e,t)=>a===`start`?0:a===`end`?e-t:(e-t)/2;e.direction===`column`?(Ct(t,c+o(u,n.w),l,r,i),l+=n.h+f):(Ct(t,c,l+o(d,n.h),r,i),c+=n.w+f)}}var wt={added:oe.green,removed:oe.red,changed:oe.orange},Tt=(e,t,n)=>e?`<g data-diff="${e}" data-id="${X(t)}">${n}</g>`:n,Et=(e,t)=>e===`removed`?`<g opacity="0.5" stroke-dasharray="5 4">${t}</g>`:e?`<g stroke-width="2">${t}</g>`:t;function Dt(e){let t=t=>Object.values(e.boxes).filter(e=>e===t).length+Object.values(e.edges).filter(e=>e===t).length,n=[`added`,`removed`,`changed`].filter(t).map(e=>({color:wt[e],text:`${e} ${t(e)}`}));return e.steps&&n.push({color:`none`,text:`steps: see the text diff`}),n.length?n:[{color:`none`,text:`no change in boxes and edges`}]}var Ot=e=>e.map(e=>z(e.text,12)+(e.color===`none`?0:16)),kt=e=>Ot(e).reduce((e,t)=>e+t+20,-20);function At(e,t,n){if(!e.length)return``;let r=Ot(e),i=(t-kt(e))/2;return e.map((e,t)=>{let a=`${e.color===`none`?``:`<rect x="${x(i)}" y="${x(n-24)}" width="10" height="10" rx="2" fill="${e.color}" data-diff="${e.text.split(` `)[0]}"/>`}<text x="${x(i+(e.color===`none`?0:16))}" y="${x(n-15)}" font-size="12" fill="var(--muted)">${X(e.text)}</text>\n`;return i+=r[t]+20,a}).join(``)}var jt=`-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif`;function Mt(t,m,h){let g=$e(t),v=m.scope??``,S=h?.prefix??v,C=m.padding??24,O=g.timeline&&p(g.layout)?E(g,640):null,j=O!=null&&!g.steps?.length&&!m.marks,M=j?w(g):g.steps??[],I=M.map(e=>e.flow.map(_)),L=/* @__PURE__ */ new Map;for(let e of I.flat())for(let[t,n]of Object.entries(e.show??{}))L.set(t,[...L.get(t)??[],n]);let R={},te={};for(let e of g.edges)R[e.from]=(R[e.from]??0)+1,te[e.to]=(te[e.to]??0)+1;let re=e=>{let t=Math.max(R[e]??0,te[e]??0);return t>2?t*30:0},B=/* @__PURE__ */ new Map,ie=!O&&g.lanes&&p(g.layout),le=ie?Be(g,m):null,fe={cards:L,cardH:B,minH:re,gap:e=>F(e,g.edges),fig:g,plan:le,tall:new Set(le?.tall),cap:i(g,m.width??830,C)};for(let[e,t]of L){let n=[166];B.set(e,Math.max(lt+12,...t.map(e=>bt(e,Math.min(...n)-20).height)))}let V=[];Ct(g.layout,C,C,fe,V);let pe=V.filter(e=>!P(e.item));for(let e of pe){if(!L.has(e.item.id))continue;let t=e.w-20;B.set(e.item.id,Math.max(...L.get(e.item.id).map(e=>bt(e,t).height),lt+12))}let me={},he=new Set(V.filter(e=>!P(e.item)&&(e.item.shape===`decision`||e.tl?.milestone)).map(e=>e.item.id)),H=g.edges.map(b),ge=le?.stubs??/* @__PURE__ */ new Map,_e=le?n(g.layout.children):0,ve=(e,t)=>V.find(n=>n.lane&&n.item.id===e&&n.block===t),ye=g.layout.children,be=(e,t,n)=>{let r=le?.ends.get(e)?.[n],i=ye.find(e=>e.id===t||e.children.some(e=>e.id===t));return V.find(e=>e.lane&&e.item===i&&e.block===r)},xe=(e,t,n)=>le?ue(le,e,t,n,ve,me):t,Se=()=>{V.length=0,Ct(g.layout,C,C,fe,V);for(let e of V)e.item.id&&(me[e.item.id]=e);return Ee(g.edges.map((e,t)=>({id:H[t],from:xe(H[t],e.from,!0),to:xe(H[t],e.to,!1),around:e.around??(le?.around.has(H[t])?`below`:void 0),...O&&{sides:[`r`,`l`],elbow:!0},...We.has(e)&&{drop:!0},...ge.has(H[t])&&{stub:ge.get(H[t]).map(l),bands:[be(H[t],e.from,0),be(H[t],e.to,1)]},...!O&&e.label!=null&&{labelW:l(u(e.label))}})),me,he,de(V.filter(e=>!P(e.item)),ge.size?V.filter(e=>e.lane).map(e=>({x:e.x,y:e.y,w:_e,h:e.h})):V.filter(e=>e.tl&&!e.tl.labelInside).map(e=>s(e,u(e.item.label))),ge.size>0),ge.size?{x:V[0].x+_e,y:V[0].y,w:V[0].w-_e,h:V[0].h}:void 0,ie?{bands:V.filter(e=>e.lane),boxes:V.filter(e=>!P(e.item))}:void 0,C)},Ce=Se();for(let e=0;le&&e<3;e++){let e=[...T(ye,le.ends,g.edges,Ce)].filter(e=>!fe.tall.has(e));if(!e.length)break;e.forEach(e=>fe.tall.add(e)),Ce=Se()}pe=V.filter(e=>!P(e.item));let we=Object.fromEntries(Ce.map(e=>[e.id,e])),U=[14,...M.length?[13.5]:[]],Te=pe.map(e=>{if(e.tl){let t=u(e.item.label),n=O.items.find(t=>t.id===e.item.id),r=O.items.filter(e=>e.track===n.track&&e.row===n.row&&e.x>n.x).map(t=>e.x-n.x+t.x-8),i=Math.min(V[0].x+V[0].w-18,...r),a=e.tl.labelInside?e.w-16:i-(e.x+e.w)-6;return U.push(13),{id:e.item.id,rect:{x:e.x,y:e.y,w:e.w,h:e.h},texts:[{text:t,fontSize:13,room:a}]}}let t=e.item.shape===`decision`&&!L.has(e.item.id)?r(e.item,e.w):null,n=t=>se(e.w,e.h,t),i=(e.item.shape===`decision`?e.w-70:e.w)-16,a=o(e.item,e.w).map((e,r)=>({text:e,fontSize:14,room:t?n(t.label[r].far):i}));if(t)for(let e of t.subs)a.push({text:e.text,fontSize:12,room:n(e.far)});else e.item.sub&&a.push({text:u(e.item.sub),fontSize:12,room:i});e.item.sub&&U.push(12);for(let t of L.get(e.item.id)??[])for(let n of bt(t,e.w-20).rows){let e=n.row.mono?10.5:11;U.push(e);for(let t of n.lines)a.push({text:t,fontSize:e,room:n.room,mono:n.row.mono})}return{id:e.item.id,rect:{x:e.x,y:e.y,w:e.w,h:e.h},texts:a}});V.some(e=>P(e.item)&&e.item.label!=null)&&U.push(11);let W=[],ke=[],Ae=Object.fromEntries(g.edges.map((e,t)=>[H[t],e])),je=h?.times??ce(I,m.speed??g.speed??900);I.forEach((e,t)=>{e.forEach((n,r)=>{let{t0:i,t1:a,tEnd:o}=je.beats[t][r];n.hops.forEach((e,n)=>{we[e.edge]&&ke.push({si:t,bi:r,lane:n,edge:e.edge,dest:e.back?Ae[e.edge].from:Ae[e.edge].to,back:e.back,data:e.data,tone:e.tone&&oe[e.tone],t0:i,t1:a,tEnd:o})}),W.push({t0:i,t1:r===e.length-1?je.ends[t]:o,si:t,bi:r})})});let G=h?.total??(je.ends.at(-1)||1),Me=W.map(({si:e,bi:t})=>Object.assign({},...I[e].slice(0,t+1).map(e=>e.show))),Ne=W.map(({si:e,bi:t})=>new Set(I[e].slice(0,t+1).flatMap(e=>e.hops.map(e=>e.edge)))),Pe=W.map((e,t)=>{let n=/* @__PURE__ */ new Set([...M[e.si].nodes??[],...Object.keys(Me[t]),...I[e.si][e.bi].light??[],...I[e.si][e.bi].focus??[]]);return g.edges.forEach((e,r)=>{Ne[t].has(H[r])&&n.add(e.from).add(e.to)}),n}),Ie=W.map(({si:e,bi:t})=>{let n=I[e].slice(0,t+1).findLastIndex(e=>e.say!=null);return u(n===-1?M[e].caption:I[e][n].say)}),Ve=[],q=/* @__PURE__ */ new Map,He=e=>{let t=[];for(let n=0;n<W.length;){let r=n;for(;r+1<W.length&&e[r+1]===e[n];)r++;t.push(`${Z(W[n].t0/G)},${Z(W[r].t1/G-1e-4)} { ${e[n]} }`),n=r+1}return t.join(` `)},J=(e,t,n,r)=>{if(!W.length||e.every(e=>!e))return``;let i=r+e.map(e=>+!!e).join(``);if(!q.has(i)){let r=`${S}a${q.size}`;q.set(i,r);let a=He(e.map(e=>e?t:n));Ve.push(`@keyframes ${r} { ${a} }\n.${r} { animation: ${r} ${x(G)}s infinite step-end; }`)}return q.get(i)},Y=(...e)=>{let t=e.filter(Boolean).join(` `);return t?` class="${t}"`:``},Ue=(e,t,n=e[0])=>{if(!W.length||e.every(e=>e===n))return``;let r=t+e.join(`|`);if(!q.has(r)){let t=`${S}a${q.size}`;q.set(r,t);let n=He(e);Ve.push(`@keyframes ${t} { ${n} }\n.${t} { animation: ${t} ${x(G)}s infinite step-end; }`)}return q.get(r)},Ge=.4,Ke=.4,qe=(e,t,n)=>{let r=t?A(t,`var(--bg)`):`var(--bg)`;if(e===`off`)return[r,t??`var(--border)`,1,`drop-shadow(0 0 0 transparent)`];if(e===`trail`)return[r,t??`var(--accent)`,1,`drop-shadow(0 0 0 transparent)`];let i=n??t;return i?[A(i,`var(--surface)`,10),i,2,`drop-shadow(0 0 4px ${i})`]:[`var(--tint)`,`var(--accent)`,2,`drop-shadow(0 0 4px var(--accent))`]},Je=/* @__PURE__ */ new Map;for(let e of ke){let t=`${e.si}:${e.bi}:${e.dest}`,n=Je.get(t);n?n.push(e):Je.set(t,[e])}let Ye=(e,t,n)=>{let r=[];if(W.forEach((t,n)=>{if(!Pe[n].has(e))return void r.push({a:t.t0,b:t.t1,look:`off`});let i=Je.get(`${t.si}:${t.bi}:${e}`)??[],a=I[t.si][t.bi].focus?.includes(e),o=Math.min(...i.map(e=>e.t1),a?Math.min(t.t0+(O?Ke:0),t.t1):t.t1,t.t1);o>t.t0&&r.push({a:t.t0,b:o,look:`trail`}),o<t.t1&&r.push({a:o,b:t.t1,look:`active`,hop:i.find(e=>e.tone)?.tone})}),!r.length||r.every(e=>e.look===`off`))return``;let i=r.at(-1);i.look===`active`&&(i.b-=Ge,r.push({a:i.b,b:i.b+Ge,look:r[0].look,hop:r[0].hop,ramp:Ge-2e-4*G}));let a=[];r.forEach((e,i)=>{let o=e.ramp??(e.look!==`active`&&r[i-1]?.look===`active`?Math.min(Ge,(e.b-e.a)/2):0),[s,c,l,u]=qe(e.look,n,e.hop),d=`${t?`fill: ${s}; `:``}stroke: ${c}; stroke-width: ${l}${t?`; filter: ${u}`:``}`,f=a.at(-1);f?.css===d?f.b=e.b:a.push({a:e.a+o,b:e.b,css:d})});let o=a.map(e=>`${Z(e.a/G)},${Z(e.b/G-1e-4)} { ${e.css} }`),s=(t?`B`:`R`)+o.join(` `);if(!q.has(s)){let e=`${S}a${q.size}`;q.set(s,e),Ve.push(`@keyframes ${e} { ${o.join(` `)} }\n.${e} { animation: ${e} ${x(G)}s infinite linear; }`)}return q.get(s)},Xe=V.map(e=>{let{item:t}=e;if(P(t)){if(t.label==null)return``;let n=t.id?W.map((e,n)=>Pe[n].has(t.id)):[];return`<rect x="${x(e.x)}" y="${x(e.y)}" width="${x(e.w)}" height="${x(e.h)}" rx="14" fill="var(--surface)" stroke="var(--border)"`+Y(e.lane&&`lane`,J(n,`stroke: var(--accent)`,`stroke: var(--border)`,`n`))+`/><text x="${x(e.x+18)}" y="${x(e.lane?e.y+e.h/2+4:e.y+20)}" class="frame">${X(u(t.label).toUpperCase())}</text>`}let n=m.marks?.boxes[t.id],i=m.links?.[t.id],a=h?.fades?.get(t.id),s=e=>{let r=Tt(n,t.id,Et(n,t.source?`<g><title>${X(t.source)}</title>${e}</g>`:e)),o=i==null?r:`<a href="${X(i)}" tabindex="-1">${r}</a>`;return a?`<g class="${a}">${o}</g>`:o},c=n?wt[n]:t.tone&&oe[t.tone],l=Y(Ye(t.id,!0,c));if(e.tl){let n=c?A(c,`var(--bg)`):`var(--bg)`,r=c??`var(--border)`,i=u(t.label),a=e.tl.labelInside,o=e.x+e.w/2,d=e.y+e.h/2,f=e.tl.milestone?`<polygon points="${x(o)},${x(e.y)} ${x(e.x+e.w)},${x(d)} ${x(o)},${x(e.y+e.h)} ${x(e.x)},${x(d)}" fill="${n}" stroke="${r}"${l}/>`:`<rect x="${x(e.x)}" y="${x(e.y)}" width="${x(e.w)}" height="${x(e.h)}" rx="6" fill="${n}" stroke="${r}"${l}/>`,p=a?e.x+8:e.x+e.w+6;return s(f+`<text x="${x(p)}" y="${x(d+4.5)}" class="bar">${X(i)}</text>`)}let d=t.shape===`store`?Y(Ye(t.id,!1,c)):``,f=h?.ports.has(t.id),p=c?A(c,`var(--bg)`):`var(--bg)`,g=c??`var(--border)`,_=e.x+e.w/2,v=L.get(t.id),y=e.y+e.h-10-(v?B.get(t.id):0),b=t.shape===`decision`&&!v?r(t,e.w):null,S=t.shape===`store`?e.y+24+13:v?e.y+10+13:e.y+e.h/2+(b?b.label[0].dy:t.sub?-2:5),C=t.shape===`decision`?`<polygon points="${x(_)},${x(e.y)} ${x(e.x+e.w)},${x(e.y+e.h/2)} ${x(_)},${x(e.y+e.h)} ${x(e.x)},${x(e.y+e.h/2)}" fill="${p}" stroke="${g}"${l}/>`:t.shape===`store`?`<path d="M${x(e.x)} ${x(e.y+12)} a ${x(e.w/2)} 12 0 0 1 ${x(e.w)} 0 v ${x(e.h-24)} a ${x(e.w/2)} 12 0 0 1 ${x(-e.w)} 0 z" fill="${p}" stroke="${g}"${l}/><path d="M${x(e.x)} ${x(e.y+12)} a ${x(e.w/2)} 12 0 0 0 ${x(e.w)} 0" fill="none" stroke="${g}"${d}/>`:`<rect x="${x(e.x)}" y="${x(e.y)}" width="${x(e.w)}" height="${x(e.h)}" rx="10" fill="${p}" stroke="${g}"${f?` stroke-dasharray="4 3"`:``}${l}/>`,w=h?.owners.has(t.id)&&t.shape!==`decision`?`<rect x="${x(e.x+3)}" y="${x(e.y+3)}" width="${x(e.w)}" height="${x(e.h)}" rx="10" fill="var(--bg)" stroke="var(--border)"/>`:``,T=o(t,e.w),E=(T.length-1)*18,D=t.shape===`store`||v||b?S:S-E/2,O=T.map((e,t)=>`<text x="${x(_)}" y="${x(D+t*18)}"${Y(`label`,f&&`muted`)}>${X(e)}</text>`).join(``),k=b?b.subs.map(t=>`<text x="${x(_)}" y="${x(e.y+e.h/2+t.dy)}" class="sub">${X(t.text)}</text>`).join(``):t.sub?`<text x="${x(_)}" y="${x(D+E+ft)}" class="sub">${X(u(t.sub))}</text>`:``,j=c??`var(--accent)`,M=t.mark&&De(t.id,t.mark,Ce),N=x(M===`l`?e.x-12:M===`r`?e.x+e.w+12:_),F=x(M===`t`?e.y-12:M===`b`?e.y+e.h+12:e.y+e.h/2),I=t.mark===`start`?`<circle cx="${N}" cy="${F}" r="5" fill="${j}"/>`:t.mark===`end`?`<circle cx="${N}" cy="${F}" r="6.25" fill="none" stroke="${j}" stroke-width="1.5"/><circle cx="${N}" cy="${F}" r="4" fill="${j}"/>`:``;return s(w+C+O+k+I+(v?Ze(e,y,v):``))});function Ze(e,t,n){let r=e.item.id,i=e.x+10,a=e.w-20,o=B.get(r),s=W.map((e,t)=>Me[t][r]!=null),c=`<rect x="${x(i)}" y="${x(t)}" width="${x(a)}" height="${x(o)}" rx="6" fill="var(--surface)" stroke="var(--border)" stroke-dasharray="3 3"`+Y(J(s,`stroke: var(--accent); fill: var(--card-on)`,`stroke: var(--border); fill: var(--surface)`,`c`))+`/>`,l=n.map((e,o)=>{let s=W.map((e,t)=>n.indexOf(Me[t][r])===o);return s.every(e=>!e)?``:`<g opacity="0"${Y(J(s,`opacity: 1`,`opacity: 0`,`v`))}>${Qe(e,i,t,a)}</g>`}).join(``),u=W.map((e,t)=>Me[t][r]==null),d=u.some(Boolean)?`<text x="${x(i+ut)}" y="${x(t+6+11)}" opacity="0"${Y(`row`,`muted`,J(u,`opacity: 1`,`opacity: 0`,`v`))}>—</text>`:``;return c+l+d}function Qe(e,t,n,r){let{rows:i}=bt(e,r),a=n+6;return i.map(({row:e,heads:n,lines:i})=>{let o=oe[e.tone??`blue`],s=t+ut,c=[],l=e.tag?yt(e.tag):0,d=(t,n)=>e.tag?`<rect x="${x(t)}" y="${x(n)}" width="${x(l)}" height="14" rx="4" fill="${o}" fill-opacity="0.15"/><text x="${x(t+l/2)}" y="${x(n+10.5)}" class="tag" fill="${o}">${X(e.tag.toUpperCase())}</text>`:``,f=e.mark?`<text x="${x(t+r-ut)}" y="${x(a+11)}" class="mark">${X(u(e.mark))}</text>`:``;n&&(c.push(d(s,a+1),f),a+=lt);let p=n?0:l?l+5:0;return n||c.push(d(s,a+1),f),i.forEach((t,n)=>{c.push(`<text x="${x(s+(n===0?p:0))}" y="${x(a+11)}"${Y(`row`,e.mono&&`mono`)}>${X(t)}</text>`),a+=lt}),a+=dt,c.join(``)}).join(``)}let et={},tt=Ce.map(t=>{let n=g.edges[H.indexOf(t.id)],r=W.map((e,n)=>Ne[n].has(t.id)),i=n.quiet&&!r.every(Boolean),o=i?Y(J(r,`opacity: 1`,`opacity: 0`,`q`)):``,s=W.map(({si:e,bi:n})=>I[e][n].hops.find(e=>e.edge===t.id&&e.tone)?.tone??void 0),c=s.map(e=>e?oe[e]:`var(--accent)`),d=`stroke: var(--muted); stroke-width: ${ee}`,f=s.some(Boolean),p=Y(f?Ue(r.map((e,t)=>e?`stroke: ${c[t]}; stroke-width: 2`:d),`e`,d):J(r,`stroke: var(--accent); stroke-width: 2`,d,`e`)),h=m.marks?.edges[t.id],_=h&&(h!==`changed`||n.label==null)?wt[h]:`var(--muted)`,y=a(t.id,n.source,I.flat()),b=t.stub?t.stub.parts.map(e=>`<path d="${e}" fill="none" stroke="${_}" stroke-width="${ee}" marker-end="url(#${v}arrow)"${p}/>`).join(``)+`<path id="${S}p-${X(t.id)}" d="${t.d}" fill="none" stroke="none"/>`:`<path id="${S}p-${X(t.id)}" d="${t.d}" fill="none" stroke="${_}" stroke-width="${ee}" marker-end="url(#${v}arrow)"${p}/>`,C=y?`<g><title>${X(y)}</title>${b}</g>`:b,w=h?wt[h]:void 0,T=(t,n,i,a)=>`<rect x="${x(t-i/2)}" y="${x(n-9)}" width="${x(i)}" height="18" rx="9" fill="${w?A(w,`var(--bg)`,14):`var(--bg)`}" stroke="${w??`var(--border)`}"`+Y(f?Ue(r.map((t,n)=>t?`fill: ${s[n]?e(c[n]):c[n]}; stroke: ${c[n]}`:`fill: var(--bg); stroke: var(--border)`),`l`,`fill: var(--bg); stroke: var(--border)`):J(r,`fill: var(--accent); stroke: var(--accent)`,`fill: var(--bg); stroke: var(--border)`,`l`))+`/><text x="${x(t)}" y="${x(n+4)}"${Y(`edgelabel`,J(r,`fill: ${N}`,`fill: var(--muted)`,`x`))}${w?` style="fill: var(--fg)"`:``}>${X(a)}</text>`,E=``;if(t.stub){U.push(11);let e=ge.get(t.id);E=t.stub.pills.map((n,r)=>T(n.x+n.w/2,n.y+9,n.w,r===0&&t.stub.short?e[2]:e[r])).join(``)}else if(n.label!=null&&!O){let e=l(u(n.label));et[t.id]={x:t.mid.x-e/2,y:t.mid.y-9,w:e,h:18},U.push(11),E=T(t.mid.x,t.mid.y,e,u(n.label))}return Tt(h,t.id,Et(h===`removed`?h:void 0,i?`<g opacity="0"${o}>${C}${E}</g>`:C+E))}),nt=ke.map((t,n)=>{let r=t.t0/G,i=Math.min(t.t1/G,1),a=t.tEnd/G,o=vt((i-r)/(t.t1/G-r)),s=`${S}p${n}`;Ve.push(`@keyframes ${s} { 0%,${Z(r)} { opacity: 0 } ${Z(r+1e-4)},${Z(a-1e-4)} { opacity: 1 } ${Z(a)},100% { opacity: 0 } }\n.${s} { animation: ${s} ${x(G)}s infinite step-end; }`);let c=(()=>{let n=u(t.data);if(!n)return``;U.push(11.5);let r=ne(n,210,11.5),i=Math.max(...r.map(e=>z(e,11.5)))+18,a=r.length*15+8;return`<rect x="${x(-i/2)}" y="${x(-a-12)}" width="${x(i)}" height="${x(a)}" rx="8" fill="${t.tone?e(t.tone):`var(--accent)`}"/>`+r.map((e,t)=>`<text x="0" y="${x(-a-12+15*t+15)}" class="chip">${X(e)}</text>`).join(``)})();return`<g${Y(s)} opacity="0"><circle r="10" fill="${t.tone??`var(--accent)`}" opacity="0.2"/><circle r="4.5" fill="${t.tone??`var(--accent)`}"/>${c}<animateMotion dur="${x(G)}s" repeatCount="indefinite" keyTimes="0;${vt(r)};${vt(i)};1" keyPoints="${t.back?`1;1;${vt(1-o)};${vt(1-o)}`:`0;0;${o};${o}`}" calcMode="linear"><mpath href="#${S}p-${X(t.edge)}" xlink:href="#${S}p-${X(t.edge)}"/></animateMotion></g>`}),rt=``,it=``,at=``;if(O){let e=V[0],t=e.x+n(g.layout.children),r=e.y+28;U.push(11),rt=`<path d="M ${x(t)} ${x(r-1)} H ${x(t+640)}" stroke="var(--border)"/>`+O.ticks.map(n=>`<path d="M ${x(t+n.x)} ${x(r-5)} V ${x(r-1)}" stroke="var(--border)"/><text x="${x(t+n.x+3)}" y="${x(e.y+10)}" class="tick">${X(n.label)}</text>`).join(``);let i=x(e.y+e.h);if(O.today!=null){let n=t+O.today;it=`<path d="M ${x(n)} ${x(e.y+12)} V ${i}" stroke="var(--accent)" stroke-opacity="0.6" stroke-width="1" stroke-dasharray="3 3"/>`,at=`<text x="${x(n-3)}" y="${x(e.y+22)}" text-anchor="end" class="today">today</text>`}if(O.last!=null&&W.length){let n=O.last,r=new Map(O.items.map(e=>[e.id,e.x+(e.milestone?e.w/2:0)])),a=new Map(O.items.map(e=>[e.id,e.date])),o=D/1e3/k,s=c(O.items,M),l=s?r.get(s.id):n,u=[[0,l]],p=[],m=l;W.forEach((e,t)=>{let i=d(O.items,I[e.si],e.bi),s=i?r.get(i.id):n,c=i?a.get(i.id):O.lastDate,h=t===W.length-1||W[t+1].si!==e.si,g=h?e.t1-o:e.t1;u.push([e.t0,m],[Math.min(e.t0+Ke,g),s],[g,s]);let[_,v]=t===0&&s===l?[e.t0,g]:f(e.t0,g,Ke);if(_<v&&p.push({a:_,b:v,d:c,x:s}),m=s,h){let r=t===W.length-1?Math.max(g+Ke,e.t1-Ke):e.t1;u.push([Math.min(g+Ke,e.t1),n],[r,n]);let[i,a]=f(g,r,Ke);i<a&&p.push({a:i,b:a,d:O.lastDate,x:n}),r<e.t1&&u.push([e.t1,l]),m=n}});let h=`${S}a${q.size}`;q.set(`playhead`,h);let g=u.map(([e,t])=>`${Z(e/G)} { transform: translateX(${x(t-n)}px) }`).join(` `);Ve.push(`@keyframes ${h} { ${g} }\n.${h} { animation: ${h} ${x(G)}s infinite linear; }`);let _=t+n,v=[...new Set(p.map(e=>e.d))].map(t=>{let n=`d${t}${p.map(e=>e.d===t).map(e=>+!!e).join(``)}`;if(!q.has(n)){let e=`${S}a${q.size}`;q.set(n,e);let r=p.map(e=>`${Z(e.a/G)},${Z(e.b/G-1e-4)} { opacity: ${+(e.d===t)} } ${Z(e.b/G)} { opacity: 0 }`).join(` `);Ve.push(`@keyframes ${e} { ${r} }\n.${e} { animation: ${e} ${x(G)}s infinite step-end; }`)}let r=y(p.find(e=>e.d===t).x,O.today,z(t,11),z(`today`,11));return`<text x="${x(_+3)}" y="${x(e.y+(r?10:22))}" opacity="0"${Y(`today`,q.get(n))}>${X(t)}</text>`});it+=`<g${Y(h)}><path d="M ${x(_)} ${x(e.y+12)} V ${i}" stroke="var(--accent)" stroke-width="1.5"/></g>`,at+=`<g${Y(h)}>${v.join(``)}</g>`}}let ot=V[0],[st,ct,mt,ht]=[`above`,`below`,`left`,`right`].map(e=>Oe(Ce,e)),gt=m.marks?Dt(m.marks):[],_t=g.rail||j?[]:M.map(e=>z(u(e.label),13,!0)),xt=Math.max(pt,...[..._t,gt.length?kt(gt):0].map(e=>e+16)),St=Math.max(ot.w+C*2+mt+ht,xt),Q=g.rail?Re(g,g.rail===`only`?560:St):null,Ot=g.rail===`only`&&Q!=null,jt=Math.max(Ot?560:pt,ot.w),Mt=[...new Set(Ie)].flatMap(e=>ne(e,jt,13.5).length),Nt=Q?20:26,Pt=M.length?Nt+4+Math.max(0,...Mt)*20:0,Ft=Ot?Math.max(560,xt,Q.width):Math.max(St,Q?.width??0),It=Ot?0:ot.h+C*2+st+ct,Lt=Ot?C:It+K.gap,Rt=m.marks?34:0,zt=(Ot?C+Q.height+Pt:It+(Q?K.gap+Q.height:0)+Pt)+Rt,Bt=(Ft-(ot.w+C*2+mt+ht))/2+mt,Vt=Q?(Ft-Q.width)/2:0,Ht=e=>!!h?.fades&&e.every(Boolean),Ut=Q||j?[]:M.map((e,t)=>{let n=W.map(e=>e.si===t);return`<text x="${x(Ft/2)}" y="${x(zt-Rt-Pt+16)}"${Ht(n)?``:` opacity="0"`}${Y(`steplabel`,!Ht(n)&&J(n,`opacity: 1`,`opacity: 0`,`s`))}>${X(u(M[t].label))}</text>`}),Wt=[...new Set(Ie)].map(e=>{let t=Ie.map(t=>t===e),n=ne(e,jt,13.5);return`<g${Ht(t)?``:` opacity="0"${Y(J(t,`opacity: 1`,`opacity: 0`,`y`))}`}>`+n.map((e,t)=>`<text x="${x(Ft/2)}" y="${x(zt-Rt-Pt+Nt+16+t*20)}" class="caption">${X(e)}</text>`).join(``)+`</g>`}),Gt=Q?(()=>{let t=[],n=Q.head-K.cols/2+4;for(let e of Q.bands)t.push(`<rect x="${x(e.rect.x)}" y="${x(Lt+e.rect.y)}" width="${x(e.rect.w)}" height="${x(e.rect.h)}" rx="10" fill="var(--surface)" stroke="var(--border)"/><text x="${x(e.rect.x+10)}" y="${x(Lt+e.rect.y+14)}" class="frame">${X(e.label.toUpperCase())}</text>`);for(let e of Q.columns)t.push(`<text x="${x(e.x)}" y="${x(Lt+n)}" class="railcol">${X(e.label)}</text>`);let r=e=>W.map(t=>Le(Q,t.si)[e]),i=e=>Le(Q,0)[e].y,o=e=>Ue(r(e).map(t=>`transform: translateY(${x(t.y-i(e))}px); opacity: ${+!!t.shown}`),`m`);return Q.rows.forEach((e,n)=>{if(e.kind!==`message`)return;let r=Lt+i(n),a=Q.columns.map(e=>`M ${x(e.x)} ${x(r)} V ${x(r+K.row)}`).join(` `);t.push(`<g${Y(o(n))}><path d="${a}" stroke="var(--border)" stroke-dasharray="2 3"/></g>`)}),Q.groups.forEach(e=>{let n=ze(Q,e),r=Lt+i(e.rows[0]);t.push(`<g${Y(o(e.rows[0]))}><rect x="${x(n.x)}" y="${x(r+n.y)}" width="${x(n.w)}" height="${x(n.h)}" rx="6" fill="var(--card-on)" stroke="var(--accent)" stroke-dasharray="3 3"/></g>`)}),Q.rows.forEach((n,r)=>{let s=Lt+i(r);if(n.kind===`phase`){let e=W.map(e=>Q.folds&&e.si!==n.step),i=e=>`<path d="M ${x(e)} ${x(s+15)} H ${x(n.line.end)}" stroke="var(--border)"/>`,a=/* @__PURE__ */ new Map;for(let e of Q.rows)e.kind===`message`&&e.step===n.step&&!a.has(e.beat)&&a.set(e.beat,e.n);let c=[...a].map(([e,t])=>{let r=W.map(t=>t.si===n.step&&t.bi===e);return`<text x="${x(Q.width-K.pad)}" y="${x(s+19)}" opacity="0"${Y(`frame`,`end`,J(r,`opacity: 1`,`opacity: 0`,`c`))}>${t} of ${Q.total}</text>`});t.push(`<g${Y(o(r))}><g${Y(J(e,`opacity: 0`,`opacity: 1`,`o`))}><text x="${x(K.pad)}" y="${x(s+19)}" class="railphase">${X(n.label)}</text>${i(n.line.open)}</g>`+(Q.folds?`<g opacity="0"${Y(J(e,`opacity: 1`,`opacity: 0`,`f`))}><text x="${x(K.pad)}" y="${x(s+19)}" class="railphase muted">${X(Fe(n))}</text>${i(n.line.folded)}</g>`:``)+c.join(``)+`</g>`);return}let c=W.map(e=>e.si===n.step&&e.bi===n.beat),l=W.map(e=>e.si<n.step||e.si===n.step&&e.bi<n.beat),[u,d]=[Q.columns[n.from].x,Q.columns[n.to].x],f=s+K.row/2,p=n.tone?oe[n.tone]:`var(--accent)`,m=J(c,`stroke: ${p}; stroke-width: 2`,`stroke: var(--muted); stroke-width: ${ee}`,n.tone?`e`+p:`e`),h=ae,_=n.pill?d>u?n.pill.x-h-4:n.pill.x+n.pill.w+4:(u+d)/2-h/2,y=n.async?`<rect x="${x(_)}" y="${x(f-6)}" width="${x(h)}" height="12" rx="4" fill="var(--bg)"/><rect x="${x(_)}" y="${x(f-6)}" width="${x(h)}" height="12" rx="4" fill="${oe.gray}" fill-opacity="0.15"/><text x="${x(_+h/2)}" y="${x(f+3)}" class="tag" fill="${oe.gray}">ASYNC</text>`:``,b=n.pill?`<rect x="${x(n.pill.x)}" y="${x(f-9)}" width="${x(n.pill.w)}" height="18" rx="9" fill="var(--bg)" stroke="var(--border)"${Y(J(c,`fill: ${n.tone?e(p):p}; stroke: ${p}`,`fill: var(--bg); stroke: var(--border)`,n.tone?`l`+p:`l`))}/><text x="${x(n.pill.x+n.pill.w/2)}" y="${x(f+4)}"${Y(`edgelabel`,J(c,`fill: ${N}`,`fill: var(--muted)`,`x`))}>${X(n.text)}</text>`:``,S=a(n.edge,g.edges[H.indexOf(n.edge)].source,I.flat());t.push(`<g${Y(`railrow`,o(r))}>${S?`<title>${X(S)}</title>`:``}<g${Y(J(l,`opacity: .45`,`opacity: 1`,`r`))}><path d="M ${x(u)} ${x(f)} H ${x(d)}" fill="none" stroke="var(--muted)" stroke-width="${ee}"${n.async?` stroke-dasharray="4 3"`:``} marker-end="url(#${v}arrow)"${Y(m)}/>`+y+b+`</g></g>`)}),`<g transform="translate(${x(Vt)} 0)">${t.join(``)}</g>`})():``,Kt=I[0]?.length?x(W[I[0].length-1].t1-.1):0,qt=`${Ot?``:`<g transform="translate(${x(Bt)} ${st})">
|
|
3
|
+
${rt}
|
|
4
|
+
${O?Xe.filter((e,t)=>e&&P(V[t].item)).join(`
|
|
5
|
+
`):``}${it&&`\n${it}`}
|
|
6
|
+
${O?tt.join(`
|
|
7
|
+
`):``}
|
|
8
|
+
${Xe.filter((e,t)=>e&&!(O&&P(V[t].item))).join(`
|
|
9
|
+
`)}
|
|
10
|
+
${O?``:tt.join(`
|
|
11
|
+
`)}
|
|
12
|
+
${nt.join(`
|
|
13
|
+
`)}
|
|
14
|
+
${at}
|
|
15
|
+
</g>
|
|
16
|
+
`}${Gt}
|
|
17
|
+
${Ut.join(`
|
|
18
|
+
`)}
|
|
19
|
+
${Wt.join(`
|
|
20
|
+
`)}
|
|
21
|
+
${At(gt,Ft,zt)}`;Q&&U.push(12,13),gt.length&&U.push(12);let Jt={width:x(Ft),...!Ot&&{area:{x:-Bt,y:-st,w:Ft,h:It}},boxes:Ot?[]:Te,edges:[...(Ot?[]:Ce).flatMap(e=>{let t=g.edges[H.indexOf(e.id)];return e.stub?e.stub.pts.map((n,r)=>({id:e.id,from:t.from,to:t.to,curve:e.curve,pts:n,label:e.stub.pills[r]})):[{id:e.id,from:t.from,to:t.to,curve:e.curve,label:et[e.id],...O&&{behind:!0},...e.elbow&&{elbow:e.elbow}}]}),...(Q?.rows??[]).flatMap((e,t)=>{if(e.kind!==`message`)return[];let n=Ot?Vt:Vt-Bt,r=(Ot?Lt:Lt-st)+Le(Q,e.step)[t].y+K.row/2,[i,a]=[n+Q.columns[e.from].x,n+Q.columns[e.to].x],o={x:i,y:r},s={x:a,y:r};return[{id:`rail:${e.n}`,step:e.step,from:Q.columns[e.from].id,to:Q.columns[e.to].id,curve:[o,o,s,s],label:e.pill&&{x:n+e.pill.x,y:r-9,w:e.pill.w,h:18}}]})],minFont:Math.min(...U),...ie&&{lanes:V.filter(e=>e.lane).map(e=>({id:u(e.item.label),rect:{x:e.x,y:e.y,w:e.w,h:e.h}}))}},Yt={x:Bt-mt,w:ot.w+C*2+mt+ht,h:It};return{W:Ft,H:zt,css:Ve.join(`
|
|
22
|
+
`),body:qt,holdAt:Kt,scene:Jt,fig:g,frame:Yt}}var Nt=(e,t,n,r,i,a,o)=>{let{font:s,...c}={...L,...e.theme,...t.theme},l=le(e);return`<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="${x(n)}" height="${x(r)}" viewBox="0 0 ${x(n)} ${x(r)}" font-family="${X(s??jt)}" role="img">
|
|
23
|
+
<title>${X(l.title)}</title>
|
|
24
|
+
<desc>${X(l.desc)}</desc>
|
|
25
|
+
<style>
|
|
26
|
+
svg { ${gt(c,`#eef5fd`)} }
|
|
27
|
+
@media (prefers-color-scheme: dark) { svg { ${gt(j,`#1d2733`)} } }
|
|
28
|
+
.label { fill: var(--fg); font-size: 14px; font-weight: 500; text-anchor: middle; }
|
|
29
|
+
.sub { fill: var(--muted); font-size: 12px; text-anchor: middle; }
|
|
30
|
+
.frame { fill: var(--muted); font-size: 11px; font-weight: 600; letter-spacing: .04em; }
|
|
31
|
+
.edgelabel { fill: var(--muted); font-size: 11px; text-anchor: middle; font-family: ui-monospace, Menlo, monospace; }
|
|
32
|
+
.row { fill: var(--fg); font-size: 11px; }
|
|
33
|
+
.row.mono { font-size: 10.5px; font-family: ui-monospace, Menlo, monospace; }
|
|
34
|
+
.muted { fill: var(--muted); }
|
|
35
|
+
.bar { fill: var(--fg); font-size: 13px; font-weight: 500; }
|
|
36
|
+
.tick { fill: var(--muted); font-size: 11px; }
|
|
37
|
+
.today { fill: var(--accent); font-size: 11px; font-weight: 600; }
|
|
38
|
+
.tag { font-size: 9px; font-weight: 600; letter-spacing: .03em; text-anchor: middle; }
|
|
39
|
+
.mark { fill: var(--accent); font-size: 11px; font-weight: 600; text-anchor: end; }
|
|
40
|
+
.chip { fill: ${N}; font-size: 11.5px; text-anchor: middle; }
|
|
41
|
+
.steplabel { fill: var(--fg); font-size: 13px; font-weight: 600; text-anchor: middle; font-family: ui-monospace, Menlo, monospace; }
|
|
42
|
+
.caption { fill: var(--muted); font-size: 13.5px; text-anchor: middle; }
|
|
43
|
+
.railcol { fill: var(--fg); font-size: 12px; font-weight: 500; text-anchor: middle; }
|
|
44
|
+
.railphase { fill: var(--fg); font-size: 13px; font-weight: 600; font-family: ui-monospace, Menlo, monospace; }
|
|
45
|
+
.railphase.muted { fill: var(--muted); }
|
|
46
|
+
.end { text-anchor: end; }
|
|
47
|
+
${i}
|
|
48
|
+
@media (prefers-reduced-motion: reduce) { * { animation-play-state: paused !important; animation-delay: -${a}s !important; } }
|
|
49
|
+
</style>
|
|
50
|
+
<defs><marker id="${t.scope??``}arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse"><path d="M 0 1 L 9 5 L 0 9 z" fill="context-stroke"/></marker></defs>
|
|
51
|
+
<rect width="100%" height="100%" fill="var(--bg)"/>
|
|
52
|
+
${o}</svg>
|
|
53
|
+
`},Pt=`(()=>{const s=document.currentScript.closest('svg'),G=[...s.querySelectorAll('.scene')],S=[G[0]],R=matchMedia('(prefers-reduced-motion: reduce)').matches,
|
|
54
|
+
W=(g,k)=>g.dataset[k].split(' ').map(p=>p.split(',').map(Number));let q=[],L=W(G[0],'loop'),w=[0,-1],o,t=0,p=performance.now();
|
|
55
|
+
const seek=t=>{s.pauseAnimations();s.setCurrentTime(t);for(const a of s.getAnimations({subtree:true}))a.pause(),a.currentTime=t*1e3+a.effect.getTiming().delay},
|
|
56
|
+
tick=n=>{if(t>=w[1]){o=q.length>0;if(!o)q=L.slice();w=q.shift();t=w[0]}seek(R?w[1]:Math.min(t,w[1]));t+=R?(o?1e9:0):(n-p)/1e3;p=n;requestAnimationFrame(tick)},
|
|
57
|
+
show=()=>{const c=S.at(-1);for(const g of G){g.style.pointerEvents=g==c?'':'none';for(const x of g.querySelectorAll('.hit,.back'))x.setAttribute('role','button'),x.setAttribute('tabindex',g==c?0:-1)}},
|
|
58
|
+
go=(a,b)=>{q=a;L=b;w=[0,-1];t=0;show()},
|
|
59
|
+
back=()=>{if(S.length>1){const g=S.pop();go(W(g,'back'),W(S.at(-1),'loop'))}},
|
|
60
|
+
act=e=>{const x=e.target.closest('.hit,.back');if(!x||x.closest('.scene')!=S.at(-1))return;if(x.classList.contains('back'))back();else{const g=G.find(g=>g.id=='s-'+x.dataset.open);S.push(g);go(W(g,'open'),W(g,'loop'))}return 1};
|
|
61
|
+
s.setAttribute('role','group');s.addEventListener('click',act);
|
|
62
|
+
s.addEventListener('keydown',e=>{const k=e.key;if(k=='Escape'||k=='Backspace')back();else if(!((k=='Enter'||k==' ')&&act(e)))return;e.preventDefault()});
|
|
63
|
+
show();requestAnimationFrame(tick)})()`,Ft=28;function It(e,t={}){let{scene:n,script:r,...i}=t,a=te(e),o=e=>e.join(`>`),s=(e,t)=>e.filter(e=>e.path.length===t.length+1&&o(e.path.slice(0,-1))===o(t)),c=e=>({ports:new Set(e.ports.map(e=>e.id)),owners:new Map(s(a,e.path).map(e=>[e.path.at(-1),e.parts]))});if(n!=null){let e=a.find(e=>e.path.at(-1)===n);if(!e)throw Error(`box "${n}" has no level to open`);let t=e=>({...e,children:e.children.map(e=>P(e)?t(e):{...e,inside:void 0})}),r=Mt({...e.props,layout:t(e.props.layout)},i,c(e));return{svg:Nt(r.fig,i,r.W,r.H,r.css,r.holdAt,r.body),scene:r.scene}}if(a.length<2){let t=Mt(e,i);return{svg:Nt(t.fig,i,t.W,t.H,t.css,t.holdAt,t.body),scene:t.scene}}let l=ie(e,t.speed??e.speed),u=l.ms/1e3,d=l.ms/1e4,{fade:f,grow:p,stagger:m,hide:g,shrink:_}=M,v=[],y=`${t.scope??``}f${([...JSON.stringify(e)].reduce((e,t)=>e*31+t.charCodeAt(0)|0,7)>>>0).toString(36)}`,b=e=>{let t=`${y}t${v.length}`,n=e.map(([e,t,n])=>`${Z(e/l.ms)} { ${t}${n?`; animation-timing-function: ${n}`:``} }`).join(` `);return v.push(`@keyframes ${t} { ${n} }\n.${t} { animation: ${t} ${x(u)}s infinite linear; }`),t},S=e=>e.grown-p-f,C=e=>s(l.opens,e).flatMap(e=>[[S(e),1],[S(e)+f,0],[e.back[1]-f,0],[e.back[1],1]]),w=a.map((t,n)=>{let r=l.opens.find(e=>o(e.path)===o(t.path)),a=r?{...t.props,steps:r.step===-1?[]:[t.props.steps[r.step]]}:e,s=r&&new Map(h(t).map((e,t)=>{let n=r.grown+m*t;return[e,b([[0,`opacity: 0`],[n,`opacity: 0`],[n+f,`opacity: 1`],[l.ms,`opacity: 1`]])]})),d=r?r.times:l.times;return{s:t,o:r,props:a,d:Mt(a,i,{prefix:`${y}s${n}`,...c(t),fades:s,times:d,total:u})}}),T=Math.max(...w.map(e=>e.d.W)),E=Math.max(...w.map(e=>e.d.H))+Ft,D=e=>[(T-e.W)/2,(E+Ft-e.H)/2],O=(e,t)=>(e.length?e:[[t,t]]).map(([e,t])=>`${x(e/1e3)},${x(t/1e3)}`).join(` `),k=w.map(({s:e,o:t,d:n})=>{let i=t?[[0,0],[t.grown,0],[t.grown+d,1],...C(e.path),[t.back[1]-f-_-g,1],[t.back[1]-f-_,0],[l.ms,0]]:[[0,1],...C(e.path),[l.ms,1]],o=t?`<text class="back ${y}back" x="16" y="19">Back</text><text class="${y}path" x="${x(16+z(`Back`,14)+12)}" y="19">${X(e.line)}</text>`:``,c=n.scene.area,u=r?s(a,e.path).map(e=>{let t=n.scene.boxes.find(t=>t.id===e.path.at(-1)).rect;return`<rect class="hit" x="${x(t.x-c.x)}" y="${x(t.y-c.y)}" width="${x(t.w)}" height="${x(t.h)}" fill="transparent" tabindex="0" role="button" aria-label="Open ${X(e.name)}, ${e.parts} parts" data-open="${X(e.path.at(-1))}"/>`}).join(``):``,p=r?t?` data-open="${O([t.open],0)}" data-loop="${O(t.loop,t.open[1])}" data-back="${O([t.back],0)}"`:` data-loop="${O(l.loop,0)}"`:``;return`<g class="${b(i.map(([e,t])=>[e,`opacity: ${t}`]))}"><g class="scene"${t?` id="s-${X(e.path.at(-1))}"`:``}${p}>${o}<g transform="translate(${x(D(n)[0])} ${x(D(n)[1])})">\n${n.body}${u}</g></g></g>`}),A=w.slice(1).map(({s:e,o:t,d:n})=>{let r=w.find(t=>o(t.s.path)===o(e.path.slice(0,-1))).d,i=r.scene.boxes.find(t=>t.id===e.path.at(-1)).rect,[a,s]=D(r),c=D(n)[0]+n.frame.x,u=D(n)[1],p=a+i.x-r.scene.area.x-c,m=s+i.y-r.scene.area.y-u,h=`transform: translate(${x(p)}px, ${x(m)}px) scale(${vt(i.w/n.frame.w)}, ${vt(i.h/n.frame.h)})`,g=`transform: translate(0px, 0px) scale(1, 1)`,v=S(t),y=t.back[1]-f;return`<rect class="open-frame ${b([[0,`opacity: 0; ${h}`],[v,`opacity: 0; ${h}`],[v+d,`opacity: 1; ${h}`],[v+f,`opacity: 1; ${h}`,`cubic-bezier(0.2, 0, 0, 1)`],[t.grown,`opacity: 1; ${g}`],...C(e.path).map(([e,t])=>[e,`opacity: ${t}; ${g}`]),[y-_,`opacity: 1; ${g}`,`cubic-bezier(0.4, 0, 1, 1)`],[y,`opacity: 1; ${h}`],[y+d,`opacity: 0; ${h}`],[l.ms,`opacity: 0; ${h}`]])}" data-for="${X(e.path.at(-1))}" x="${x(c)}" y="${x(u)}" width="${x(n.frame.w)}" height="${x(n.frame.h)}" rx="10" fill="none" stroke="var(--border)" vector-effect="non-scaling-stroke" style="transform-box: view-box; transform-origin: ${x(c)}px ${x(u)}px"/>`}),j=w[0].d,N=[...w.map(e=>e.d.css),`.${y}back { fill: var(--accent); font-size: 14px; }\n.${y}path { fill: var(--fg); font-size: 14px; }`,...v],F=`${k.join(`
|
|
64
|
+
`)}\n<g pointer-events="none">${A.join(``)}</g>\n${r?`<script><![CDATA[${Pt}]]><\/script>\n`:``}`;return{svg:Nt(j.fig,i,T,E,N.join(`
|
|
65
|
+
`),j.holdAt,F),scene:j.scene,levels:w.map(({s:e,props:t,d:n})=>({line:e.line,props:t,scene:n.scene}))}}var Lt={data:`Data through the air`,thing:`Things on the road or by hand`,check:`A check`},Rt={data:`<path d="M2 14C3 5 13 5 14 14" fill="none" stroke="#2456D6" stroke-width="1.6"/><circle cx="8" cy="7.3" r="2.6" fill="#2456D6"/>`,thing:`<rect x="4" y="2" width="8" height="12" rx="2" fill="#D9822B"/><path d="M4 6h8M4 10h8" stroke="#A35F1C"/>`,check:`<path d="M3 3v11" stroke="#2e3440" stroke-width="2.4"/><path d="M3 6h11" stroke="#2e3440" stroke-width="2.6" stroke-dasharray="3 2"/>`},zt=[`diagram`,`guide`,`change`],Bt=e=>Object.entries(e).map(([e,t])=>`--flowfig-${e}:${t};`).join(``),Vt=e=>Object.entries(e).map(([e,t])=>`--${e}:${t};`).join(``),Ht=[`:host{display:block;container:ff-host/inline-size;${Bt(R.light)}}`,`:host([theme=dark]){${Bt(R.dark)}}`,`@media (prefers-color-scheme:dark){:host(:not([theme=light])){${Bt(R.dark)}}}`,`:host{color:var(--flowfig-ink)!important;font-size:15px!important;font-family:var(--flowfig-font)!important;line-height:1.5!important;letter-spacing:normal!important}`,`:host([theme=light]) svg[role=img]{${Vt(L)}}`,`:host([theme=dark]) svg[role=img]{${Vt(j)}}`,`:host(:focus-visible),:focus-visible{outline:2px solid var(--flowfig-accent);outline-offset:2px}`,`[hidden]{display:none!important}`,`.ff-root{display:grid;gap:12px;padding:16px;background:var(--flowfig-bg);border:1px solid var(--flowfig-border);border-radius:12px}`,`.ff-title{margin:0;font-size:18px;font-weight:600}`,`.ff-row{display:flex;flex-wrap:wrap;gap:6px}`,`button{font:inherit;font-size:13px;color:inherit;background:var(--flowfig-surface);border:1px solid var(--flowfig-border);border-radius:999px;padding:4px 12px;cursor:pointer}`,`button[aria-pressed=true]{background:var(--flowfig-accent);border-color:var(--flowfig-accent);color:var(--flowfig-on-accent)}`,`button:disabled{cursor:default;opacity:.5}`,`.ff-pane{overflow-x:auto}`,`.ff-pane>svg{display:block;width:100%;height:auto;min-width:var(--ff-min);max-width:var(--ff-max);margin:0 auto}`,`.ff-live{position:absolute;width:1px;height:1px;overflow:hidden;clip-path:inset(50%)}`,`.ff-alert{margin:0;color:var(--flowfig-bad)}`,`.ff-g{position:relative;box-sizing:border-box;width:100%;height:100%;aspect-ratio:16/10;max-height:100vh;display:flex;flex-direction:column;gap:0;padding:0;border:0;overflow:hidden}`,`.ff-row:empty{display:none}`,`.ff-g>.ff-view{position:relative;flex:1;min-height:0}`,`.ff-guide{position:relative;height:100%;overflow:hidden;container:ff-guide/size;--ff-well:#EDEFE9;--flowfig-border:#D7DAD3;--flowfig-muted:#5B6370}`,`:host([theme=dark]) .ff-guide{${Bt(R.dark)}--ff-well:#2a313c}`,`@media (prefers-color-scheme:dark){:host(:not([theme=light])) .ff-guide{${Bt(R.dark)}--ff-well:#2a313c}}`,`.ff-stage{position:absolute;inset:0}`,`.ff-stage[data-stage=world]{background:#E8ECE3}`,`.ff-stage[data-stage=diagram]{background:var(--flowfig-bg)}`,`.ff-stage>.ff-pane{position:absolute;inset:0;overflow:auto}`,`.ff-chips{position:absolute;top:${B.pad}px;left:${B.pad*2+B.panel}px;max-width:calc(100% - ${B.pad*3+B.panel}px);box-sizing:border-box;display:flex;gap:2px;padding:4px;overflow-x:auto;background:var(--flowfig-surface);border:1px solid var(--flowfig-border);border-radius:10px}`,`.ff-cut{mask-image:linear-gradient(90deg,#000 calc(100% - 40px),transparent)}`,`.ff-chip,.ff-hd .ff-btn{flex:none;border:0;border-radius:7px;padding:6px 12px;font:500 14px/20px var(--flowfig-font);color:var(--flowfig-muted);background:none}`,`.ff-chip[aria-pressed=true],.ff-hd .ff-btn[aria-pressed=true]{background:var(--ff-well);color:var(--flowfig-ink);font-weight:600}`,`.ff-hd{display:flex;flex-wrap:wrap;align-items:center;gap:8px}`,`.ff-hd>.ff-row{gap:2px;padding:2px;border:1px solid var(--flowfig-border);border-radius:8px}`,`.ff-hd .ff-btn{padding:2px 10px;border-radius:6px;font-size:13px;line-height:18px}`,`.ff-hud{position:absolute;top:${B.pad}px;left:${B.pad}px;max-height:calc(100% - ${B.pad*2}px);width:${B.panel}px;box-sizing:border-box;display:flex;flex-direction:column;gap:12px;padding:20px;overflow:auto;background:var(--flowfig-surface);color:var(--flowfig-ink);border:1px solid var(--flowfig-border);border-radius:8px}`,`.ff-ht{margin:0;font-size:15px;font-weight:600}`,`.ff-kick{margin:0;font-size:13px;color:var(--flowfig-muted)}`,`.ff-say{margin:0;font-size:26px;line-height:1.18;font-weight:600;letter-spacing:-0.01em}`,`.ff-note{margin:0;font-size:15px;line-height:1.4;color:var(--flowfig-muted)}`,`.ff-note.ff-bad{color:var(--flowfig-bad)}`,`.ff-code{margin:0;padding:8px 12px;max-height:160px;overflow:auto;font:13px/1.45 ui-monospace,Menlo,monospace;white-space:pre;background:var(--flowfig-bg);border:1px solid var(--flowfig-border);border-radius:6px}`,`.ff-lbl{margin:0;font-size:13px;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--flowfig-muted)}`,`.ff-hud .ff-lbl{letter-spacing:0;text-transform:none}`,`.ff-skip ul{margin:6px 0 0;padding:0;list-style:none;display:flex;flex-direction:column;font-size:14px;line-height:22px;color:var(--flowfig-muted)}`,`.ff-moments{margin:0;padding:0;list-style:none;display:flex;flex-direction:column;gap:2px}`,`.ff-skip,.ff-moments{padding-top:16px;border-top:1px solid var(--flowfig-border)}`,`.ff-moments button{display:flex;align-items:center;gap:10px;width:100%;box-sizing:border-box;padding:7px 8px;border:0;border-radius:6px;background:none;font-size:14px;text-align:left}`,`.ff-moments button[aria-current=true]{background:var(--ff-well);font-weight:600}`,`.ff-moments .ff-fail{color:var(--flowfig-bad)}`,`.ff-mk{display:inline-grid;place-items:center;flex:none;width:18px;height:18px;border-radius:4px;font:600 11px/1 var(--flowfig-font);background:var(--ff-well);color:var(--flowfig-ink)}`,`[data-s=no]>.ff-mk{background:#FCEBE8;color:#B8322A}`,`[data-s=now]>.ff-mk{background:var(--flowfig-ink);color:var(--flowfig-surface)}`,`[data-s=next]>.ff-mk{background:none;color:var(--flowfig-muted);box-shadow:inset 0 0 0 1px var(--flowfig-border)}`,`.ff-ctl{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:4px}`,`.ff-b{padding:9px 16px;font-size:14px;font-weight:600;border-radius:8px}`,`.ff-b:disabled{opacity:1;color:#8A919C;background:var(--flowfig-surface)}`,`.ff-play{background:var(--flowfig-ink);border-color:var(--flowfig-ink);color:var(--flowfig-surface)}`,`.ff-ft{display:flex;gap:16px}`,`.ff-txt,.ff-txt[aria-pressed]{border:0;background:none;padding:4px 0;font:500 13px var(--flowfig-font);color:var(--flowfig-muted);text-decoration:underline 1px;text-underline-offset:3px}`,`.ff-back::before{content:"\\2190 "/""}`,`.ff-next::after{content:" \\2192"/""}`,`.ff-more{display:none}`,`.ff-key{margin:0;padding:12px 0 0;list-style:none;display:flex;flex-direction:column;gap:4px;border-top:1px solid var(--flowfig-border);font-size:13px;color:var(--flowfig-muted)}`,`.ff-key li{display:flex;align-items:center;gap:10px}`,`@container ff-host (width < ${B.wide}px){.ff-g{aspect-ratio:auto;height:min(100svh,${B.tall}px);max-height:none}.ff-chips{top:8px;left:8px;max-width:calc(100% - 16px)}.ff-hud{top:auto;left:0;right:0;bottom:0;width:auto;height:${B.sheet}px;max-height:none;gap:8px;padding:12px 16px;border-radius:12px 12px 0 0;font-size:13px}.ff-say{font-size:16px}.ff-note{font-size:13px}.ff-moments button,.ff-key{font-size:11px}.ff-ht,.ff-kick,.ff-code,.ff-ft,.ff-key,.ff-moments:not(.ff-open),.ff-skip:not(.ff-open){display:none}.ff-hd{order:-3}.ff-say,.ff-note{order:-2}.ff-ctl{order:-1}.ff-more{display:inline-block}}`,`@container ff-guide (${B.slim*2}px <= width < ${B.wide}px) and (height < ${B.short}px){.ff-chips{top:${B.pad}px;left:${B.pad*2+B.slim}px;max-width:calc(100% - ${B.pad*3+B.slim}px)}.ff-hud{top:${B.pad}px;left:${B.pad}px;right:auto;bottom:auto;width:${B.slim}px;height:auto;max-height:calc(100% - ${B.pad*2}px);border-radius:8px}}`,`.ff-verdict{padding:12px 16px;background:var(--flowfig-surface);border:1px solid var(--flowfig-border);border-radius:10px;font-size:16px;font-weight:500}`,`.ff-list{margin:6px 0 0;padding-left:20px;font-size:15px;font-weight:400}`,`.ff-all{margin-top:8px;font-size:13px;font-weight:400;color:var(--flowfig-muted)}`,`.ff-all summary{cursor:pointer}`,`.ff-all pre{margin:6px 0 0;max-height:12em;overflow:auto;font:13px/1.45 ui-monospace,Menlo,monospace;color:var(--flowfig-ink);white-space:pre-wrap}`,`.ff-tiles{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:12px}`,`.ff-tile{padding:8px 14px;background:var(--flowfig-surface);border:1px solid var(--flowfig-border);border-radius:10px}`,`.ff-out{margin:2px 0 0;min-height:1.5em;font-size:16px;font-weight:600}`,`.ff-out:empty::before{content:"Press a step to compare";color:var(--flowfig-muted);font-weight:400}`,`.ff-wait .ff-out:empty::before{content:"Playing…"}`,`.ff-none .ff-out{color:var(--flowfig-muted);font-weight:400}`,`.ff-tile.ff-bad{border-color:var(--flowfig-bad)}`,`.ff-bad .ff-out{color:var(--flowfig-bad)}`,`.ff-tile.ff-good{border-color:var(--flowfig-good)}`,`.ff-good .ff-out{color:var(--flowfig-good)}`,`.ff-sides{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:16px}`,`.ff-sides.ff-big{grid-template-columns:minmax(0,1fr)}`,`@container ff-host (width < 700px){.ff-sides{grid-template-columns:minmax(0,1fr)}}`,`.ff-side{display:flex;flex-direction:column;gap:8px;min-width:0;padding:12px 14px;background:var(--flowfig-surface);border:1px solid var(--flowfig-border);border-radius:12px}`,`.ff-sh{display:flex;align-items:center;justify-content:space-between;gap:8px}`,`.ff-sh h3{margin:0;font-size:15px;font-weight:600}`,`.ff-sides:not(.ff-big) .ff-pane{cursor:zoom-in}`,`.ff-sides:not(.ff-big) .ff-pane>svg{min-width:0}`,`.ff-big .ff-pane{max-height:80vh;overflow:auto}`,`.ff-side svg[role=img]{--accent:var(--flowfig-play)!important}`,`[data-diff] :is(rect,path:not([stroke=none]),polygon){stroke:var(--flowfig-accent)!important;filter:none!important}`,`[data-diff] :is(rect,polygon,path:not([fill=none])){fill:color-mix(in srgb,var(--flowfig-accent) 8%,var(--bg))!important}`,`rect[data-diff]{fill:var(--flowfig-accent)}`,`[data-diff] text{fill:var(--fg)!important}`,`@media (prefers-reduced-motion:reduce){.ff-guide *{animation:none!important;transition:none!important;scroll-behavior:auto!important}}`].join(`
|
|
66
|
+
`),Ut,Wt=(e,t)=>{let n=e.speed??900,r=0;for(let i of e.steps??[]){let e=i.flow.reduce((e,t)=>e+O(_(t),n),0);if(u(i.label)===t)return[r,e];r+=e+(i.flow.length?D:0)}return[r,0]},Gt=(e,t)=>{let[n,r]=Wt(e,t);return n+r+D/2},Kt=e=>e?.classList.toggle(`ff-cut`,e.scrollLeft+e.clientWidth<e.scrollWidth-1),qt=()=>matchMedia(`(prefers-reduced-motion: reduce)`).matches,Jt=(e,t,n=!1)=>{let r=t/k;n?e.unpauseAnimations():e.pauseAnimations(),e.setCurrentTime(r/1e3);for(let t of e.getAnimations({subtree:!0}))t.effect?.updateTiming({delay:0}),n?t.play():t.pause(),t.currentTime=r},Yt=(e,t)=>{let{svg:n,scene:r}=It(e,t),i=$(`div`,`ff-pane`);return i.innerHTML=n,i.style.setProperty(`--ff-min`,`${r.width*11/r.minFont}px`),i.style.setProperty(`--ff-max`,`${r.width}px`),i},$=(e,t,...n)=>{let r=document.createElement(e);return r.className=t,r.append(...n),r},Xt=(e,t,n)=>{let r=$(`button`,`ff-btn`,e);return r.type=`button`,n!==void 0&&r.setAttribute(`aria-pressed`,String(n)),r.addEventListener(`click`,t),r};async function Zt(e){try{let t=await fetch(e);if(!t.ok)throw Error(`HTTP ${t.status}`);let n=await t.text(),r;if(n.trimStart().startsWith(`<`)){let e=new DOMParser().parseFromString(n,`image/svg+xml`).querySelector(`metadata#figure-spec`);if(!e)throw Error(`no figure spec inside this SVG`);r=JSON.parse(e.textContent??``)}else r=JSON.parse(n);let i=r?.props??r;if(!i?.layout)throw Error(`no figure props (expected { props: { layout, edges, steps } })`);return{props:i,title:u(r.title)}}catch(t){throw Error(`${e}: ${t.message}`)}}var Qt=globalThis.HTMLElement??class{},$t=class extends Qt{static observedAttributes=[`src`,`before`,`form`,`step`,`theme`,`code`,`forms`];#e;#t;#n=``;#r=`spec`;#i=[];#a=0;#o={src:0,before:0};#s;#c;#l;#u;#d;#f;#p;#m=0;#h=0;#g;#_;#v=[];#y=[];#b={};#x=$(`h2`,`ff-title`);#S=$(`div`,`ff-row`);#C=$(`div`,`ff-view`);#w=$(`p`,`ff-live`);#T=$(`div`,`ff-root`);constructor(){super();let e=this.attachShadow({mode:`open`});Ut||(Ut=new CSSStyleSheet,Ut.replaceSync(Ht)),e.adoptedStyleSheets=[Ut],this.#w.setAttribute(`aria-live`,`polite`);let t=document.createElement(`slot`);t.name=`title`,t.append(this.#x);let n=document.createElement(`slot`);n.name=`caption`,this.#T.append(t,this.#S,this.#C,this.#w,n),e.append(this.#T),this.addEventListener(`keydown`,this.#A)}connectedCallback(){this.hasAttribute(`tabindex`)||this.setAttribute(`tabindex`,`0`);for(let e of[`spec`,`beforeSpec`,`moment`]){if(!Object.hasOwn(this,e))continue;let t=this[e];delete this[e],this[e]=t}this.#e&&this.#f&&!this.#p&&this.#f.ready&&this.#N()}disconnectedCallback(){this.pause(),clearTimeout(this.#g),this.#p?.stop(),this.#p=void 0}attributeChangedCallback(e,t,n){t!==n&&(e===`src`||e===`before`?this.#j(e):e===`step`?n&&this.show(n):e===`code`&&this.#f?(this.#f.tog.setAttribute(`aria-pressed`,String(n!==null)),this.#P()):e!==`theme`&&this.#N())}get spec(){return this.#e}set spec(e){this.#o.src++,this.#e=e,this.#n=``,this.#r=`spec`,this.#N(!0)}get beforeSpec(){return this.#t}set beforeSpec(e){this.#o.before++,this.#t=e,this.#N()}get moment(){return this.#a}set moment(e){let t=Math.min(Math.max(0,Math.trunc(e)||0),Math.max(0,this.#i.length-1));t!==this.#a&&(this.#a=t,this.#P(),this.#R())}next(){this.moment=this.#a+1}back(){this.moment=this.#a-1}play(){this.pause();let e=()=>{if(this.#a>=this.#i.length-1)return this.pause();this.#s=setTimeout(()=>{this.next(),e()},this.#h+this.#i[this.#a].ms),this.#P()};e()}pause(){clearTimeout(this.#s),this.#s=void 0,this.#b.play&&this.#P()}show(e){let t=this.#i.findIndex(t=>t.step===e);t>=0&&(this.moment=t)}#E(){let e=e=>(e?.steps??[]).map(e=>u(e.label));return this.#_?[.../* @__PURE__ */ new Set([...e(this.#e),...e(this.#t)])]:e(this.#e)}#D(e){if(this.#_&&!this.#i.some(t=>t.step===e))return this.#O(e);this.#l=void 0,this.show(e),this.#P()}#O(e){this.#v.forEach(clearTimeout),this.#u=e;for(let t of this.#y)t.setAttribute(`aria-pressed`,String(t.textContent===e));let t=qt();this.#v=(this.#_??[]).map(n=>{let r=n.spec.steps?.find(t=>u(t.label)===e);if(n.out.textContent=r?``:`This step is not in ${n.name}`,n.tile.className=`ff-tile ${r?`ff-wait`:`ff-none`}`,!r)return void Jt(n.svg,0);let i=Wt(n.spec,e)[0],a=Gt(n.spec,e),o=r.flow.flatMap(e=>_(e).hops).at(-1),s=n.spec.edges.find(e=>b(e)===o?.edge),c=C(n.spec.layout).find(e=>e.id===(o?.back?s?.from:s?.to))?.tone;return Jt(n.svg,t?a:i,!t),setTimeout(()=>{Jt(n.svg,a),n.out.textContent=re(n.spec,e).at(-1)?.summary?.outcome??``,n.tile.className=`ff-tile${c===`red`||c===`gray`?` ff-bad`:c===`green`?` ff-good`:``}`},t?0:(a-i)/k)})}#k(e){let t=this.#E(),n=t.indexOf((this.#_?this.#u:this.#i[this.#a]?.step)??``),r=t[Math.min(Math.max(0,n+e),t.length-1)];r!==void 0&&(this.#_?this.#D(r):this.show(r))}#A=e=>{if(e.altKey||e.ctrlKey||e.metaKey)return;e.key!==` `&&this.pause();let t=this.#c===`guide`;if(e.key===`ArrowRight`)t?this.next():this.#k(1);else if(e.key===`ArrowLeft`)t?this.back():this.#k(-1);else if(e.key===` `&&e.composedPath()[0]===this)this.#s?this.pause():this.play();else if(/^[1-9]$/.test(e.key)){let t=this.#E()[Number(e.key)-1];t!==void 0&&this.#D(t)}else return;e.preventDefault()};async#j(e){let t=++this.#o[e],n=this.getAttribute(e);if(n)try{let{props:r,title:i}=await Zt(n);if(t!==this.#o[e])return;if(e===`before`)return this.#t=r,this.#N();this.#e=r,this.#n=i,this.#r=n,this.#N(!0)}catch(n){t===this.#o[e]&&this.#M(n.message)}}#M(e){this.pause(),clearTimeout(this.#g),this.#p?.stop(),this.#p=void 0,this.#m++,this.#i=[],this.#a=0,this.#d=void 0,this.#y=[],this.#b={},this.#S.replaceChildren(),this.#w.textContent=``;let t=$(`p`,`ff-alert`,e);t.setAttribute(`role`,`alert`),this.#C.replaceChildren(t)}#N(e=!1){let t=this.#e;if(t)try{if(e){this.pause();let e=t.speed??900,n=new Map(t.edges.map(e=>[b(e),e])),r=new Map(C(t.layout).map(e=>[e.id,e]));this.#i=(t.steps??[]).flatMap(i=>{let a=u(i.label),o=i.flow.map(_);return re(t,a).map((t,i)=>{let s=o[i]?.hops??[],c=s.flatMap(e=>{let t=n.get(e.edge);return[e.source,e.via,t?.source,t?.via,r.get(t?.from??``)?.source,r.get(t?.to??``)?.source]}),l=s[0],d=n.get(l?.edge??``);return{...t,step:a,title:t.summary?t.summary.outcome:t.stamp?t.question:u(r.get((l?.back?d?.to:d?.from)??``)?.label)||t.say,ms:i<o.length?O(o[i],e):D,code:[...new Set(c.filter(e=>!!e))]}})});let i=this.getAttribute(`step`);this.#a=Math.max(0,i?this.#i.findIndex(e=>e.step===i):0)}let n=zt.filter(e=>e===`guide`?!!t.steps?.length:e!==`change`||!!this.#t),r=this.getAttribute(`forms`)?.split(/\s+/),i=r?n.filter(e=>r.includes(e)):n,a=this.getAttribute(`form`),o=a&&i.includes(a)?a:i.includes(`guide`)?`guide`:i[0]??`diagram`;if(this.#C.before(this.#S),this.#S.replaceChildren(...i.length>1?i.map(e=>Xt(e,()=>this.setAttribute(`form`,e),e===o)):[]),clearTimeout(this.#g),this.#p?.stop(),this.#p=void 0,this.#m++,this.#h=0,this.#x.textContent=this.#n,this.#x.hidden=!this.#n||o===`guide`,this.#d=void 0,this.#f=void 0,this.#_=void 0,this.#u=void 0,this.#T.classList.toggle(`ff-g`,o===`guide`),this.#l=void 0,this.#y=[],this.#b={},this.#C.replaceChildren(),a===`change`&&!this.#t&&!this.hasAttribute(`before`)){let e=$(`p`,`ff-alert`,`${this.#r}: the change form needs a before spec`);e.setAttribute(`role`,`alert`),this.#C.append(e)}if(o===`diagram`){let e=Yt(t);this.#d=e.querySelector(`svg`)??void 0,this.#y=this.#E().map(e=>Xt(e,()=>this.show(e),!1)),this.#C.append(e,$(`div`,`ff-row`,...this.#y))}else if(o===`change`&&this.#t){let e=st(this.#t,t),n=e=>{i.classList.toggle(`ff-big`,!!e);for(let t of i.children){t.hidden=!!e&&t!==e;let n=t.querySelector(`button`);n.textContent=e?`Back to both`:`Enlarge`,n.setAttribute(`aria-label`,e?`Back to both`:`Enlarge ${t.querySelector(`h3`).textContent}`)}let t=this.#u;for(let e of this.#_)Jt(e.svg,t&&e.spec.steps?.some(e=>u(e.label)===t)?Gt(e.spec,t):0)},r=(t,r,a,o)=>{let s={boxes:{},edges:{},steps:0};for(let t of e)a.includes(t.op)&&(t.kind===`box`||t.kind===`edge`)&&(s[t.kind===`box`?`boxes`:`edges`][t.id]=t.op);let c=Yt(r,{marks:s,scope:o}),l=Xt(`Enlarge`,()=>n(i.classList.contains(`ff-big`)?void 0:u));l.setAttribute(`aria-label`,`Enlarge ${t}`);let u=$(`section`,`ff-side`,$(`div`,`ff-sh`,$(`h3`,``,t),l),c);c.addEventListener(`click`,()=>i.classList.contains(`ff-big`)||n(u));let d=$(`p`,`ff-out`);d.dataset.outcome=``,d.setAttribute(`aria-live`,`polite`);let f=$(`div`,`ff-tile`,$(`span`,`ff-lbl`,t),d);return f.dataset.side=t.toLowerCase(),i.append(u),{name:t,spec:r,svg:c.querySelector(`svg`),out:d,tile:f}},i=$(`div`,`ff-sides`);this.#_=[r(`Before`,this.#t,[`removed`,`changed`],`b`),r(`After`,t,[`added`,`changed`],`a`)];let a=(e,t,n)=>{for(let r of e.children)P(r)?a(r,r.label==null?t:u(r.label),n):n.set(r.id,[u(r.label)||r.id,t]);return n},o=a(this.#t.layout,``,/* @__PURE__ */ new Map),s=a(t.layout,``,/* @__PURE__ */ new Map),c=e=>(s.get(e)??o.get(e))?.[0]??e,l={box:0,step:1,edge:2},d=e.filter(e=>e.kind in l).sort((e,t)=>l[e.kind]-l[t.kind]).map(e=>{let t=e.op===`added`?`Added`:e.op===`removed`?`Removed`:`Changed`;if(e.kind===`step`)return`${t} step: ${e.id}`;if(e.kind===`edge`)return`${t} link: ${e.id.split(`->`).map(c).join(` → `)}`;let[n,r]=[o.get(e.id)?.[1],s.get(e.id)?.[1]];return e.op===`changed`&&n!==r?`Moved: ${c(e.id)}, ${[n&&`from ${n}`,r&&`to ${r}`].filter(Boolean).join(` `)}`:`${t}: ${c(e.id)}`}),f=document.createElement(`slot`);f.name=`verdict`,f.append($(`p`,`ff-lbl`,`What changed`),$(`ul`,`ff-list`,...[...d.slice(0,6),...d.length>6?[`and ${d.length-6} more`]:[]].map(e=>$(`li`,``,e)))),this.#y=this.#E().map(e=>Xt(e,()=>this.#D(e),!1)),this.#C.append($(`div`,`ff-verdict`,f,$(`details`,`ff-all`,$(`summary`,``,`Show all changes`),$(`pre`,``,ct(e,`text`)))),$(`div`,`ff-row`,...this.#y),$(`div`,`ff-tiles`,...this.#_.map(e=>e.tile)),i);for(let e of this.#_)Jt(e.svg,0);this.#l=this.#i[this.#a]?.step}else if(o===`guide`){this.#b={back:Xt(`Back`,()=>this.back()),play:Xt(`Play`,()=>this.#s?this.pause():this.play()),next:Xt(`Next`,()=>this.next())},this.#b.back.className=`ff-btn ff-b ff-back`,this.#b.play.className=`ff-btn ff-b ff-play`,this.#b.next.className=`ff-btn ff-b ff-next`;let e=(e,t,n)=>{let r=Xt(e,t,n);return r.className=`ff-btn ff-chip`,r},n=I(t),r={ht:$(`h2`,`ff-ht`,this.#n),kick:$(`p`,`ff-kick`),say:$(`h3`,`ff-say`),note:$(`p`,`ff-note`),code:$(`pre`,`ff-code`),skip:$(`div`,`ff-skip`),list:$(`ol`,`ff-moments`),key:$(`ul`,`ff-key`),items:[],chips:this.#E().map(t=>e(t,()=>this.show(t),!1)),tog:e(`Show the code`,()=>this.toggleAttribute(`code`),this.hasAttribute(`code`)),more:Xt(`Moments`,()=>{let e=r.list.classList.toggle(`ff-open`);r.skip.classList.toggle(`ff-open`,e),r.more.setAttribute(`aria-expanded`,String(e))}),stage:$(`div`,`ff-stage`),ready:n,step:``,last:-1,lastStep:``,drawn:``,sheets:/* @__PURE__ */ new Map};r.ht.hidden=!this.#n,r.tog.className=`ff-btn ff-txt ff-tog`,r.more.className=`ff-btn ff-b ff-more`,r.more.setAttribute(`aria-expanded`,`false`);let i=Xt(`Full screen`,()=>void this.requestFullscreen?.());if(i.className=`ff-btn ff-txt`,i.hidden=!document.fullscreenEnabled,r.key.hidden=!0,n){r.stage.dataset.stage=`world`;let e=++this.#m;import(`./element-world.js`).then(n=>{if(e!==this.#m||this.#f!==r)return;let i=n.scene(t);r.key.replaceChildren(...i.keys.map(e=>{let t=$(`li`,``,Lt[e]);return t.insertAdjacentHTML(`afterbegin`,`<svg width="16" height="16" viewBox="0 0 16 16" aria-hidden="true">${Rt[e]}</svg>`),t.dataset.k=e,t})),this.#p=n.mountWorld(r.stage,t,()=>{let e=this.#i[this.#a];this.#f===r&&e&&(r.drawn=``,this.#F(r,e))},e=>this.#I(r,this.#E()[e])),r.drawn=``,this.#P()}).catch(()=>{e===this.#m&&this.#f===r&&(this.#p?.stop(),this.#p=void 0,r.ready=!1,this.#P())})}else r.stage.dataset.stage=`diagram`,r.stage.append(Yt(t)),r.diagram=r.stage;let a=$(`div`,`ff-guide`,r.stage,$(`div`,`ff-chips`,...r.chips),$(`section`,`ff-hud`,r.ht,$(`div`,`ff-hd`,this.#S,r.kick),r.say,r.note,r.code,r.skip,r.list,$(`div`,`ff-ctl`,this.#b.back,this.#b.play,this.#b.next,r.more,i),r.key,$(`div`,`ff-ft`,r.tog)));a.querySelector(`.ff-chips`).addEventListener(`scroll`,e=>Kt(e.currentTarget)),a.addEventListener(`click`,e=>{e.composedPath()[0]!==this.#b.play&&this.pause()}),this.#f=r,this.#C.append(a)}o!==this.#c&&(this.pause(),this.#c=o,this.dispatchEvent(new CustomEvent(`flowfig-form`,{detail:{form:o},bubbles:!0,composed:!0}))),this.#P(),e&&this.#R()}catch(e){this.#M(`${this.#r}: ${e.message}`)}}#P(){let e=this.#i[this.#a];if(this.#w.textContent=e?this.#f?[e.say,e.note].filter(Boolean).join(` `):this.#d?e.step:``:``,!this.#_)for(let t of this.#y)t.setAttribute(`aria-pressed`,String(t.textContent===e?.step));this.#b.back&&(this.#b.back.disabled=this.#a===0,this.#b.next.disabled=this.#a>=this.#i.length-1,this.#b.play.textContent=this.#s?`Pause`:`Play`),this.#f&&e&&this.#F(this.#f,e),e&&e.step!==this.#l&&(this.#d||this.#_)&&(this.#l=e.step,this.#d?qt()?Jt(this.#d,Gt(this.#e,e.step)):Jt(this.#d,Wt(this.#e,e.step)[0],!0):this.#O(e.step))}#F(e,t){let n=this.#i.filter(e=>e.step===t.step),r=this.#i.indexOf(n[0]),i=this.#a-r,a=!!t.summary,o=n.slice(0,i+1).reverse().find(e=>e.stamp)?.stamp;e.kick.textContent=a?``:`Moment ${i+1} of ${n.length-1} · ${t.step}`,e.say.textContent=t.say,e.note.textContent=t.note,e.note.classList.toggle(`ff-bad`,o?.mark===`✗`&&(a||t.stamp===o)),e.code.hidden=a||!this.hasAttribute(`code`),e.code.textContent=t.code.length?t.code.join(`
|
|
67
|
+
`):`No source in the spec.`;for(let n of e.chips)n.setAttribute(`aria-pressed`,String(n.textContent===t.step));Kt(e.chips[0]?.parentElement);let s=t.summary?.notReached??[];e.skip.hidden=!s.length,e.skip.replaceChildren(...s.length?[$(`p`,`ff-lbl`,`Skipped, because of the refusal`),$(`ul`,``,...s.map(e=>$(`li`,``,e)))]:[]),e.step!==t.step&&(e.step=t.step,e.items=n.map((e,t)=>{let n=Xt(``,()=>this.moment=r+t);return n.className=``,n.append($(`span`,`ff-mk`),$(`span`,``,e.title)),e.stamp?.mark===`✗`&&(n.classList.add(`ff-fail`),n.setAttribute(`aria-label`,`${e.title}, failed`)),n}),e.list.replaceChildren(...e.items.map(e=>$(`li`,``,e)))),e.items.forEach((e,t)=>{let r=t<i?n[t].stamp?.mark:void 0;e.dataset.s=t===i?`now`:t>i?`next`:r===`✗`?`no`:`past`,e.querySelector(`.ff-mk`).textContent=r??String(t+1),t===i?e.setAttribute(`aria-current`,`true`):e.removeAttribute(`aria-current`)}),this.#I(e,t.step),this.#L(e,t,i)}#I(e,t){let n=e.say.parentElement,{width:r,height:i}=n.parentElement.getBoundingClientRect();if(r>=B.wide||i<B.short&&r>=B.slim*2)return n.style.height=``,B.sheet;let a=`${t}/${r}x${i}`,o=e.sheets.get(a);if(o===void 0){let r=[e.say.textContent,e.note.textContent],s=e.list.classList.contains(`ff-open`);e.list.classList.remove(`ff-open`),e.skip.classList.remove(`ff-open`),n.style.height=`auto`,o=B.sheet;for(let r of this.#i.filter(e=>e.step===t))e.say.textContent=r.say,e.note.textContent=r.note,o=Math.max(o,n.offsetHeight);[e.say.textContent,e.note.textContent]=r,e.list.classList.toggle(`ff-open`,s),e.skip.classList.toggle(`ff-open`,s),e.sheets.set(a,o=Math.max(B.sheet,Math.min(o,Math.round(i*.42))))}return n.style.height=`${o}px`,o}#L(e,t,n){let r=this.#p;if(e.ready&&!r)return;let i=`${r?`w`:`d`}/${this.#a}`;if(e.drawn===i)return;let a=!qt()&&e.lastStep===t.step&&e.last===this.#a-1;[e.drawn,e.last,e.lastStep]=[i,this.#a,t.step],clearTimeout(this.#g);let o=this.#E().indexOf(t.step);if(r?.fits(o)){e.diagram&&(e.diagram.hidden=!0),e.key.hidden=!1,this.#h=r.show(o,n,a,t.say);return}this.#h=0,e.key.hidden=!0,e.diagram||(e.diagram=$(`div`,`ff-stage`,Yt(this.#e)),e.diagram.dataset.stage=`diagram`,e.stage.after(e.diagram)),e.diagram.hidden=!1;let s=e.diagram.querySelector(`svg`),c=this.#e,l=(c.steps?.find(e=>u(e.label)===t.step)?.flow??[]).map(_);if(t.summary||n>=l.length)return Jt(s,Gt(c,t.step));let d=Wt(c,t.step)[0]+l.slice(0,n).reduce((e,t)=>e+O(t,c.speed??900),0),f=d+O(l[n],c.speed??900);if(qt())return Jt(s,f);Jt(s,d,!0),this.#g=setTimeout(()=>Jt(s,f),(f-d)/k)}#R(){let e=this.#i[this.#a];this.dispatchEvent(new CustomEvent(`flowfig-moment`,{detail:{step:e?.step??``,moment:this.#a,total:this.#i.length},bubbles:!0,composed:!0}))}};globalThis.customElements&&!customElements.get(`flowfig-explain`)&&customElements.define(`flowfig-explain`,$t);export{$t as FlowfigExplain};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { toBeat } from './model.ts';
|
|
2
|
+
import type { FigLook, FigNode, FigTone, FlowProps } from './model.ts';
|
|
3
|
+
export type Actor = {
|
|
4
|
+
name: string;
|
|
5
|
+
look?: FigLook;
|
|
6
|
+
boxes: string[];
|
|
7
|
+
};
|
|
8
|
+
export type Moment = {
|
|
9
|
+
actor: string;
|
|
10
|
+
say: string;
|
|
11
|
+
note: string;
|
|
12
|
+
stamp?: {
|
|
13
|
+
mark: '✓' | '✗';
|
|
14
|
+
label: string;
|
|
15
|
+
};
|
|
16
|
+
question?: string;
|
|
17
|
+
records: string[];
|
|
18
|
+
summary?: {
|
|
19
|
+
outcome: string;
|
|
20
|
+
notReached: string[];
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
type Hop = ReturnType<typeof hopsOf>[number]['hops'][number];
|
|
24
|
+
export declare const isCheck: (n?: FigNode) => boolean;
|
|
25
|
+
export declare const question: (n: FigNode) => string;
|
|
26
|
+
export declare const failed: (byId: Map<string, FigNode>, h: Hop) => boolean;
|
|
27
|
+
export declare const hopsOf: (fig: FlowProps, step: {
|
|
28
|
+
flow: Parameters<typeof toBeat>[0][];
|
|
29
|
+
}) => {
|
|
30
|
+
beat: import("./model.ts").Beat;
|
|
31
|
+
hops: {
|
|
32
|
+
back: boolean;
|
|
33
|
+
data?: import("react").ReactNode;
|
|
34
|
+
tone?: FigTone;
|
|
35
|
+
async?: boolean;
|
|
36
|
+
via?: string;
|
|
37
|
+
edge: import("./model.ts").FigEdge;
|
|
38
|
+
source: string;
|
|
39
|
+
target: string;
|
|
40
|
+
}[];
|
|
41
|
+
}[];
|
|
42
|
+
export declare function cast(fig: FlowProps): Actor[];
|
|
43
|
+
export declare function moments(fig: FlowProps, step: string): Moment[];
|
|
44
|
+
export declare const worldReady: (fig: FlowProps) => boolean;
|
|
45
|
+
export {};
|
package/dist/explain.js
ADDED
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { edgeId, isGroup, isLanesLayout, nodes, str, toBeat } from './model.js';
|
|
2
|
+
const CAST_MAX = 6;
|
|
3
|
+
const isStore = (n) => n.shape === 'store';
|
|
4
|
+
const isDecision = (n) => n?.shape === 'decision';
|
|
5
|
+
const dead = (t) => t === 'red' || t === 'gray';
|
|
6
|
+
export const isCheck = (n) => !!n && (n.shape === 'decision' || !!n.check);
|
|
7
|
+
export const question = (n) => n.check || (n.shape === 'decision' ? str(n.label) : '');
|
|
8
|
+
export const failed = (byId, h) => isCheck(byId.get(h.source)) && (dead(byId.get(h.target)?.tone) || h.tone === 'red');
|
|
9
|
+
const labeledTop = (g) => g.children.flatMap((c) => (!isGroup(c) ? [] : c.label != null ? [c] : labeledTop(c)));
|
|
10
|
+
export const hopsOf = (fig, step) => {
|
|
11
|
+
const byId = new Map(fig.edges.map((e) => [edgeId(e), e]));
|
|
12
|
+
return step.flow.map((b) => {
|
|
13
|
+
const beat = toBeat(b);
|
|
14
|
+
const hops = beat.hops.flatMap((h) => {
|
|
15
|
+
const edge = byId.get(h.edge);
|
|
16
|
+
return edge ? [{ ...h, edge, source: h.back ? edge.to : edge.from, target: h.back ? edge.from : edge.to }] : [];
|
|
17
|
+
});
|
|
18
|
+
return { beat, hops };
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
export function cast(fig) {
|
|
22
|
+
const all = nodes(fig.layout);
|
|
23
|
+
const stores = all.filter(isStore);
|
|
24
|
+
const byId = new Map(all.map((n) => [n.id, n]));
|
|
25
|
+
const groups = fig.lanes && isLanesLayout(fig.layout) ? fig.layout.children.filter(isGroup) : labeledTop(fig.layout);
|
|
26
|
+
let actors = [];
|
|
27
|
+
for (const g of groups) {
|
|
28
|
+
const boxes = nodes(g).filter((n) => !isStore(n));
|
|
29
|
+
if (boxes.length)
|
|
30
|
+
actors.push({ name: str(g.label), look: g.look, boxes: boxes.map((n) => n.id) });
|
|
31
|
+
}
|
|
32
|
+
if (actors.length) {
|
|
33
|
+
const owned = new Set(actors.flatMap((a) => a.boxes));
|
|
34
|
+
for (const step of fig.steps ?? [])
|
|
35
|
+
for (const { hops } of hopsOf(fig, step))
|
|
36
|
+
for (const id of hops.flatMap((h) => [h.source, h.target])) {
|
|
37
|
+
const n = byId.get(id);
|
|
38
|
+
if (!n || owned.has(id) || isStore(n) || isDecision(n))
|
|
39
|
+
continue;
|
|
40
|
+
owned.add(id);
|
|
41
|
+
actors.push({ name: str(n.label), look: n.look, boxes: [id] });
|
|
42
|
+
}
|
|
43
|
+
const rank = new Map(all.map((n, i) => [n.id, i]));
|
|
44
|
+
actors.sort((a, b) => rank.get(a.boxes[0]) - rank.get(b.boxes[0]));
|
|
45
|
+
}
|
|
46
|
+
if (!actors.length) {
|
|
47
|
+
const seen = new Set();
|
|
48
|
+
for (const step of fig.steps ?? [])
|
|
49
|
+
for (const { hops } of hopsOf(fig, step))
|
|
50
|
+
for (const h of hops)
|
|
51
|
+
for (const id of [h.source, h.target])
|
|
52
|
+
if (byId.has(id) && !isStore(byId.get(id)) && !isDecision(byId.get(id)))
|
|
53
|
+
seen.add(id);
|
|
54
|
+
actors = [...seen].slice(0, stores.length ? CAST_MAX - 1 : CAST_MAX).map((id) => {
|
|
55
|
+
const n = byId.get(id);
|
|
56
|
+
return { name: str(n.label), look: n.look, boxes: [id] };
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
if (stores.length)
|
|
60
|
+
actors.push({ name: 'Records', look: stores.find((s) => s.look)?.look, boxes: stores.map((s) => s.id) });
|
|
61
|
+
return actors;
|
|
62
|
+
}
|
|
63
|
+
export function moments(fig, step) {
|
|
64
|
+
const s = fig.steps?.find((x) => str(x.label) === step);
|
|
65
|
+
if (!s)
|
|
66
|
+
return [];
|
|
67
|
+
const actors = cast(fig);
|
|
68
|
+
const byId = new Map(nodes(fig.layout).map((n) => [n.id, n]));
|
|
69
|
+
const actorOf = new Map(actors.flatMap((a) => a.boxes.map((id) => [id, a.name])));
|
|
70
|
+
const groupLabels = new Map();
|
|
71
|
+
const walk = (g) => {
|
|
72
|
+
for (const c of g.children) {
|
|
73
|
+
if (!isGroup(c))
|
|
74
|
+
continue;
|
|
75
|
+
if (c.id)
|
|
76
|
+
groupLabels.set(c.id, c.label);
|
|
77
|
+
walk(c);
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
walk(fig.layout);
|
|
81
|
+
const labelOf = (id) => str(byId.get(id)?.label ?? groupLabels.get(id));
|
|
82
|
+
const beats = hopsOf(fig, s);
|
|
83
|
+
if (!beats.length)
|
|
84
|
+
return [];
|
|
85
|
+
const last = beats.flatMap((b) => b.hops).at(-1);
|
|
86
|
+
const outcome = last ? labelOf(last.target) : '';
|
|
87
|
+
let prev = actors[0]?.name ?? '';
|
|
88
|
+
const out = beats.map(({ beat, hops }, i) => {
|
|
89
|
+
const end = hops.at(-1);
|
|
90
|
+
const own = (id) => actorOf.get(id) ?? labelOf(id);
|
|
91
|
+
const actor = !end ? prev : actorOf.has(end.target) || !isDecision(byId.get(end.target)) ? own(end.target) : i ? prev : own(end.source);
|
|
92
|
+
prev = actor;
|
|
93
|
+
const labels = hops.map((h) => str(h.edge.label)).filter(Boolean);
|
|
94
|
+
const say = str(beat.say) || (end ? (labels.length ? `${labels.join(', ')}: ${labelOf(end.target)}` : labelOf(end.target)) : '');
|
|
95
|
+
const moment = { actor, say, note: str(beat.note), records: [] };
|
|
96
|
+
const asks = hops.filter((h) => isCheck(byId.get(h.source)));
|
|
97
|
+
const ask = asks.find((h) => failed(byId, h)) ?? asks.at(-1);
|
|
98
|
+
if (ask) {
|
|
99
|
+
moment.stamp = { mark: failed(byId, ask) ? '✗' : '✓', label: str(ask.edge.label) };
|
|
100
|
+
moment.question = question(byId.get(ask.source));
|
|
101
|
+
}
|
|
102
|
+
for (const h of hops) {
|
|
103
|
+
const store = byId.get(h.target);
|
|
104
|
+
if (store && isStore(store))
|
|
105
|
+
moment.records.push(str(h.data) || str(h.edge.label) || str(store.label));
|
|
106
|
+
}
|
|
107
|
+
return moment;
|
|
108
|
+
});
|
|
109
|
+
const mine = new Set(beats.flatMap((b) => b.hops.flatMap((h) => [h.source, h.target])));
|
|
110
|
+
const refusal = beats.flatMap((b) => b.hops).find((h) => failed(byId, h));
|
|
111
|
+
const order = [];
|
|
112
|
+
if (refusal) {
|
|
113
|
+
const live = fig.edges.filter((e) => e !== refusal.edge && byId.has(e.to) && !dead(byId.get(e.to).tone));
|
|
114
|
+
const reach = new Set([refusal.source]);
|
|
115
|
+
for (let grew = true; grew;) {
|
|
116
|
+
grew = false;
|
|
117
|
+
for (const e of live)
|
|
118
|
+
if (reach.has(e.from) && !reach.has(e.to)) {
|
|
119
|
+
reach.add(e.to);
|
|
120
|
+
grew = true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const inner = live.filter((e) => reach.has(e.from) && reach.has(e.to) && e.to !== refusal.source);
|
|
124
|
+
const need = new Map();
|
|
125
|
+
for (const e of inner)
|
|
126
|
+
need.set(e.to, (need.get(e.to) ?? 0) + 1);
|
|
127
|
+
for (const queue = [refusal.source]; queue.length;) {
|
|
128
|
+
const id = queue.shift();
|
|
129
|
+
order.push(id);
|
|
130
|
+
for (const e of inner) {
|
|
131
|
+
if (e.from !== id)
|
|
132
|
+
continue;
|
|
133
|
+
need.set(e.to, need.get(e.to) - 1);
|
|
134
|
+
if (!need.get(e.to))
|
|
135
|
+
queue.push(e.to);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
for (const id of reach)
|
|
139
|
+
if (!order.includes(id))
|
|
140
|
+
order.push(id);
|
|
141
|
+
}
|
|
142
|
+
const notReached = order
|
|
143
|
+
.slice(1)
|
|
144
|
+
.filter((id) => !mine.has(id))
|
|
145
|
+
.map(labelOf);
|
|
146
|
+
out.forEach((m, i) => {
|
|
147
|
+
const next = out.slice(i + 1).find((o) => o.actor !== m.actor);
|
|
148
|
+
if (!m.note && next)
|
|
149
|
+
m.note = `${next.actor} acts next.`;
|
|
150
|
+
});
|
|
151
|
+
out.push({
|
|
152
|
+
actor: out.at(-1).actor,
|
|
153
|
+
say: s.outcome || (/[.?!]$/.test(outcome) ? outcome : `${outcome}.`),
|
|
154
|
+
note: '',
|
|
155
|
+
records: [],
|
|
156
|
+
summary: { outcome, notReached },
|
|
157
|
+
});
|
|
158
|
+
return out;
|
|
159
|
+
}
|
|
160
|
+
const PLACES = ['person', 'shop', 'truck'];
|
|
161
|
+
export const worldReady = (fig) => fig.edges.some((e) => !!e.carries && typeof e.carries === 'object') || cast(fig).some((a) => PLACES.includes(a.look));
|
package/dist/frames.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type FlowProps } from './model.ts';
|
|
2
|
+
export type Tile = {
|
|
3
|
+
frame: number;
|
|
4
|
+
kinds: string[];
|
|
5
|
+
step: number;
|
|
6
|
+
beat: number;
|
|
7
|
+
text: string;
|
|
8
|
+
say: string;
|
|
9
|
+
};
|
|
10
|
+
type Grid = {
|
|
11
|
+
cols: number;
|
|
12
|
+
rows: number;
|
|
13
|
+
tile: number;
|
|
14
|
+
tileH: number;
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
warning?: string;
|
|
18
|
+
};
|
|
19
|
+
export declare function keyFrames(fig: FlowProps, o: {
|
|
20
|
+
fps: number;
|
|
21
|
+
every?: number;
|
|
22
|
+
step?: number;
|
|
23
|
+
}): {
|
|
24
|
+
tiles: Tile[];
|
|
25
|
+
frames: number;
|
|
26
|
+
};
|
|
27
|
+
export declare function sheetGrid(count: number, width: number, height: number, scale?: number): Grid;
|
|
28
|
+
export declare function sheetSvg(tiles: Tile[], pngs: Buffer[], grid: Grid, o: {
|
|
29
|
+
header: string;
|
|
30
|
+
fps: number;
|
|
31
|
+
dark: boolean;
|
|
32
|
+
scale: number;
|
|
33
|
+
}): string;
|
|
34
|
+
export {};
|