@miadi/stateloom-web 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/package.json +1 -1
  2. package/server/.next/BUILD_ID +1 -1
  3. package/server/.next/build-manifest.json +2 -2
  4. package/server/.next/prerender-manifest.json +3 -3
  5. package/server/.next/server/app/_global-error.html +2 -2
  6. package/server/.next/server/app/_global-error.rsc +1 -1
  7. package/server/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  8. package/server/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  9. package/server/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  10. package/server/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  11. package/server/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/server/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  13. package/server/.next/server/app/_not-found.html +1 -1
  14. package/server/.next/server/app/_not-found.rsc +2 -2
  15. package/server/.next/server/app/_not-found.segments/_full.segment.rsc +2 -2
  16. package/server/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  17. package/server/.next/server/app/_not-found.segments/_index.segment.rsc +2 -2
  18. package/server/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  19. package/server/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  20. package/server/.next/server/app/_not-found.segments/_tree.segment.rsc +2 -2
  21. package/server/.next/server/app/api/docs/route.js.nft.json +1 -1
  22. package/server/.next/server/app/api/file/route.js.nft.json +1 -1
  23. package/server/.next/server/app/api/rispec/route.js.nft.json +1 -1
  24. package/server/.next/server/app/api/watch/route.js.nft.json +1 -1
  25. package/server/.next/server/app/index.html +1 -1
  26. package/server/.next/server/app/index.rsc +3 -3
  27. package/server/.next/server/app/index.segments/__PAGE__.segment.rsc +2 -2
  28. package/server/.next/server/app/index.segments/_full.segment.rsc +3 -3
  29. package/server/.next/server/app/index.segments/_head.segment.rsc +1 -1
  30. package/server/.next/server/app/index.segments/_index.segment.rsc +2 -2
  31. package/server/.next/server/app/index.segments/_tree.segment.rsc +2 -2
  32. package/server/.next/server/app/page.js.nft.json +1 -1
  33. package/server/.next/server/app/page_client-reference-manifest.js +1 -1
  34. package/server/.next/server/chunks/[root-of-the-server]__13c3d2a8._.js +1 -1
  35. package/server/.next/server/chunks/[root-of-the-server]__2046b812._.js +2 -2
  36. package/server/.next/server/chunks/[root-of-the-server]__87bf4b91._.js +1 -1
  37. package/server/.next/server/chunks/[root-of-the-server]__95b05635._.js +2 -2
  38. package/server/.next/server/chunks/ssr/{[root-of-the-server]__2b35b711._.js → [root-of-the-server]__df915e74._.js} +1 -1
  39. package/server/.next/server/chunks/ssr/[root-of-the-server]__edbb995c._.js +3 -3
  40. package/server/.next/server/pages/404.html +1 -1
  41. package/server/.next/server/pages/500.html +2 -2
  42. package/server/.next/server/server-reference-manifest.js +1 -1
  43. package/server/.next/server/server-reference-manifest.json +1 -1
  44. package/server/.next/static/chunks/3dc2436b75e43174.css +2 -0
  45. package/server/.next/static/chunks/e7adb06692216348.js +10 -0
  46. package/server/package-lock.json +2 -2
  47. package/server/package.json +1 -1
  48. package/server/src/app/page.tsx +31 -1
  49. package/server/src/components/DocSwitcher.tsx +8 -2
  50. package/server/src/components/erd/ErdWorkspace.tsx +502 -0
  51. package/server/src/lib/projectFile.ts +5 -7
  52. package/server/stateloom-web.json +2 -2
  53. package/server/tsconfig.tsbuildinfo +1 -1
  54. package/server/.next/static/chunks/1cbe108679f9af04.css +0 -2
  55. package/server/.next/static/chunks/c8da5c76cf5bb070.js +0 -10
  56. /package/server/.next/static/{yHDbm89IPqExJUSbiWtnD → 6GrzDGxArqw_jZoajUQwk}/_buildManifest.js +0 -0
  57. /package/server/.next/static/{yHDbm89IPqExJUSbiWtnD → 6GrzDGxArqw_jZoajUQwk}/_clientMiddlewareManifest.json +0 -0
  58. /package/server/.next/static/{yHDbm89IPqExJUSbiWtnD → 6GrzDGxArqw_jZoajUQwk}/_ssgManifest.js +0 -0
@@ -0,0 +1,10 @@
1
+ (globalThis.TURBOPACK||(globalThis.TURBOPACK=[])).push(["object"==typeof document?document.currentScript:void 0,63052,e=>{"use strict";let t,n,r,s;var i,a,o=e.i(14294),l=e.i(30878);function c(e){return JSON.parse(JSON.stringify(e))}function d(e,t){for(let n of e.states??[]){if(n.name===t)return e;let r=d(n,t);if(r)return r}return null}function h(e,t,n){let r=function e(t,n){if(t.name===n)return t;for(let r of t.states??[]){let t=e(r,n);if(t)return t}return null}(e,t);if(!r)throw Error(`applyPatchOps: ${n} references missing state "${t}"`);return r}function u(e,t,n){let r=function(e,t){for(let n of e.events){let e=n.events??[];for(let r=0;r<e.length;r++)if(e[r].id===t)return{source:n,event:e[r],index:r}}return null}(e,t);if(!r)throw Error(`applyPatchOps: ${n} references missing event "${t}"`);return r}function p(e,t){let n=c(e);for(let e of t)switch(e.op){case"settings.update":n.settings={...n.settings,...e.patch};break;case"state.add":{let t=null===e.parent?n.state:h(n.state,e.parent,"state.add");t.states||(t.states=[]);let r=e.index??t.states.length;t.states.splice(r,0,c(e.state));break}case"state.update":Object.assign(h(n.state,e.name,"state.update"),e.patch);break;case"state.remove":{if(n.state.name===e.name)throw Error(`applyPatchOps: cannot remove root state "${e.name}"`);let t=d(n.state,e.name);if(!t||!t.states)throw Error(`applyPatchOps: state.remove references missing state "${e.name}"`);let r=t.states.findIndex(t=>t.name===e.name);if(r<0)throw Error(`applyPatchOps: state.remove references missing state "${e.name}"`);t.states.splice(r,1),0===t.states.length&&delete t.states;break}case"state.nest":{let t=h(n.state,e.child,"state.nest"),r=h(n.state,e.newParent,"state.nest"),s=d(n.state,e.child);if(!s||!s.states)throw Error(`applyPatchOps: state.nest cannot detach root or missing state "${e.child}"`);let i=s.states.findIndex(t=>t.name===e.child),[a]=s.states.splice(i,1);0===s.states.length&&delete s.states,r.states||(r.states=[]),r.states.push(a??c(t));break}case"eventSource.add":{let t=e.index??n.events.length;n.events.splice(t,0,c(e.source));break}case"eventSource.update":{let t=n.events[e.index];if(!t)throw Error(`applyPatchOps: eventSource.update index ${e.index} out of range`);n.events[e.index]={...t,...e.patch};break}case"eventSource.remove":if(!n.events[e.index])throw Error(`applyPatchOps: eventSource.remove index ${e.index} out of range`);n.events.splice(e.index,1);break;case"event.add":{let t=n.events[e.sourceIndex];if(!t)throw Error(`applyPatchOps: event.add sourceIndex ${e.sourceIndex} out of range`);t.events||(t.events=[]);let r=e.index??t.events.length;t.events.splice(r,0,c(e.event));break}case"event.update":Object.assign(u(n,e.id,"event.update").event,e.patch);break;case"event.remove":{let t=u(n,e.id,"event.remove");t.source.events.splice(t.index,1),0===t.source.events.length&&delete t.source.events;break}case"parameter.add":{let t=u(n,e.eventId,"parameter.add");t.event.parameters||(t.event.parameters=[]);let r=e.index??t.event.parameters.length;t.event.parameters.splice(r,0,c(e.parameter));break}case"parameter.update":{let t=u(n,e.eventId,"parameter.update").event.parameters??[];if(!t[e.index])throw Error(`applyPatchOps: parameter.update index ${e.index} out of range for event "${e.eventId}"`);t[e.index]={...t[e.index],...e.patch};break}case"parameter.remove":{let t=u(n,e.eventId,"parameter.remove"),r=t.event.parameters;if(!r||!r[e.index])throw Error(`applyPatchOps: parameter.remove index ${e.index} out of range for event "${e.eventId}"`);r.splice(e.index,1),0===r.length&&delete t.event.parameters;break}case"transition.add":{let t=h(n.state,e.state,"transition.add");t.transitions||(t.transitions=[]);let r=e.index??t.transitions.length;t.transitions.splice(r,0,c(e.transition));break}case"transition.update":{let t=h(n.state,e.state,"transition.update").transitions??[];if(!t[e.index])throw Error(`applyPatchOps: transition.update index ${e.index} out of range for state "${e.state}"`);t[e.index]={...t[e.index],...e.patch};break}case"transition.remove":{let t=h(n.state,e.state,"transition.remove"),r=t.transitions;if(!r||!r[e.index])throw Error(`applyPatchOps: transition.remove index ${e.index} out of range for state "${e.state}"`);r.splice(e.index,1),0===r.length&&delete t.transitions;break}case"action.add":{let t=h(n.state,e.state,"action.add"),r=t[e.hook]??(t[e.hook]={actions:[]}),s=e.index??r.actions.length;r.actions.splice(s,0,c(e.action));break}case"action.update":{let t=h(n.state,e.state,"action.update")[e.hook];if(!t||!t.actions[e.index])throw Error(`applyPatchOps: action.update index ${e.index} out of range for state "${e.state}" ${e.hook}`);t.actions[e.index]=c(e.action);break}case"action.remove":{let t=h(n.state,e.state,"action.remove"),r=t[e.hook];if(!r||!r.actions[e.index])throw Error(`applyPatchOps: action.remove index ${e.index} out of range for state "${e.state}" ${e.hook}`);r.actions.splice(e.index,1),0===r.actions.length&&delete t[e.hook];break}case"runtime.enter":case"runtime.exit":break;default:throw Error(`applyPatchOps: unknown op ${JSON.stringify(e)}`)}return n}function m(e){let t=[e];for(let n of e.states??[])t.push(...m(n));return t}function f(e){let t=new Map;t.set(e.name,null);let n=e=>{for(let r of e.states??[])t.set(r.name,e.name),n(r)};return n(e),t}function g(e,t){return JSON.stringify(e)===JSON.stringify(t)}function x(e,t,n,r,s){let i=Math.min(n.length,r.length);for(let a=0;a<i;a++)g(n[a],r[a])||s.push({op:"action.update",state:e,hook:t,index:a,action:r[a]});for(let n=i;n<r.length;n++)s.push({op:"action.add",state:e,hook:t,action:r[n],index:n});for(let i=n.length-1;i>=r.length;i--)s.push({op:"action.remove",state:e,hook:t,index:i})}function y(e){let t=0;for(let n=0;n<e.length;n++)t=Math.imul(t,31)+e.charCodeAt(n)|0;let n=(t%360+360)%360;return`hsl(${n}, 65%, 55%)`}var b=e.i(50382);let v={hSpacing:220,vSpacing:140,nodeWidth:160,nodeHeight:60,compositeWidth:300,compositeHeight:200,originX:100,originY:120,sweeps:2,includeRoot:!0},w=(e,t)=>`${e}\u0000${t}`;function j(e){let t=new Set,n=[];for(let r of e.states??[])t.has(r.name)||(t.add(r.name),n.push(r));return n}function k(e,t){let n=new Map(e.map(e=>[e,[]]));for(let e of t)n.get(e.from).push(e.to);return n}function N(e,t={}){let n={...v,...t},r="state"in e?e.state:e,s={};if(!r)return s;if(!function e(t,n,r,s,i){let a=j(t);if(0===a.length)return;let o=a.map(e=>e.name),l=new Map(a.map(e=>[e.name,e])),c=function(e){let t=new Set(e.map(e=>e.name)),n=new Set,r=[];for(let s of e)for(let e of s.transitions??[]){let i=e.nextState;if(!i||i===s.name||!t.has(i))continue;let a=w(s.name,i);n.has(a)||(n.add(a),r.push({from:s.name,to:i}))}return r}(a),d=function(e,t){let n=k(e,t),r=new Map(e.map(e=>[e,0])),s=new Set;for(let t of e){if(0!==r.get(t))continue;r.set(t,1);let e=[{node:t,i:0}];for(;e.length>0;){let t=e[e.length-1],i=n.get(t.node);if(t.i<i.length){let n=i[t.i++],a=r.get(n);1===a?s.add(w(t.node,n)):0===a&&(r.set(n,1),e.push({node:n,i:0}))}else r.set(t.node,2),e.pop()}}return s}(o,c),h=c.filter(e=>!d.has(w(e.from,e.to))),u=function(e,t){let n=k(e,t),r=new Map(e.map(e=>[e,0]));for(let e of t)r.set(e.to,(r.get(e.to)??0)+1);let s=new Map(e.map(e=>[e,0])),i=e.filter(e=>0===r.get(e));for(let e=0;e<i.length;e++){let t=i[e];for(let e of n.get(t)){s.set(e,Math.max(s.get(e),s.get(t)+1));let n=r.get(e)-1;r.set(e,n),0===n&&i.push(e)}}return s}(o,h),p=function(e,t,n){let r=new Map(e.map(e=>[e,[]]));for(let e of t)r.get(e.from).push(e.to),r.get(e.to).push(e.from);let s=new Set([n]),i=[n];for(;i.length>0;){let e=i.pop();for(let t of r.get(e)??[])s.has(t)||(s.add(t),i.push(t))}return s}(o,c,o[0]),m=0;for(let e of o)p.has(e)&&(m=Math.max(m,u.get(e)));for(let e of o)p.has(e)||u.set(e,u.get(e)+m+1);let f=Array.from({length:Math.max(...o.map(e=>u.get(e)))+1},()=>[]);for(let e of o)f[u.get(e)].push(e);!function(e,t,n){let r=new Map,s=new Map,i=(e,t,n)=>{let r=e.get(t);r?r.push(n):e.set(t,[n])};for(let e of t)i(r,e.to,e.from),i(s,e.from,e.to);let a=new Map,o=()=>{e.forEach(e=>e.forEach((e,t)=>a.set(e,t)))};o();let l=(e,t)=>{let n=e.map((e,n)=>{let r=(t.get(e)??[]).filter(e=>a.has(e));return{name:e,key:r.length?r.reduce((e,t)=>e+a.get(t),0)/r.length:n,i:n}});n.sort((e,t)=>e.key===t.key?e.i-t.i:e.key-t.key);for(let t=0;t<n.length;t++)e[t]=n[t].name};for(let t=0;t<n;t++){for(let t=1;t<e.length;t++)l(e[t],r),o();for(let t=e.length-2;t>=0;t--)l(e[t],s),o()}}(f,h,s.sweeps);let g=s.hSpacing-s.nodeWidth,x=s.vSpacing-s.nodeHeight,y=e=>Math.max(s.hSpacing,e+g),b=new Map(o.map(e=>{var t;return[e,(t=l.get(e),(t.states?.length??0)>0?{width:s.compositeWidth,height:s.compositeHeight}:{width:s.nodeWidth,height:s.nodeHeight})]})),v=f.map(e=>e.reduce((e,t)=>e+y(b.get(t).width),0)),N=n+Math.max(...v,0)/2,S=r;for(let t of(f.forEach((e,t)=>{let n=N-v[t]/2,r=s.nodeHeight;for(let t of e){let e=b.get(t),s=y(e.width);i[t]={x:Math.round(n+(s-e.width)/2),y:Math.round(S),width:e.width,height:e.height},n+=s,r=Math.max(r,e.height)}S+=r+x}),a)){if((t.states?.length??0)===0)continue;let n=i[t.name];e(t,n.x+20,n.y+40,s,i)}}(r,n.originX,n.originY,n,s),n.includeRoot){let e=j(r).map(e=>s[e.name]).filter(Boolean);if(0===e.length)s[r.name]={x:20,y:20,width:400,height:350};else{let t=Math.min(...e.map(e=>e.x)),n=Math.min(...e.map(e=>e.y)),i=Math.max(...e.map(e=>e.x+e.width)),a=Math.max(...e.map(e=>e.y+e.height));s[r.name]={x:Math.round(t-40),y:Math.round(n-40),width:Math.round(i-t+80),height:Math.round(a-n+80)}}}return s}let S=(e,t)=>e.length*t*.55,_=e=>`[${e.length>32?`${e.slice(0,31).trimEnd()}…`:e}]`,C=e=>({width:Math.max(56,Math.max(S(e.event,11),e.condition?S(_(e.condition),9):0)+16)+16*!!e.glyph,height:e.condition?28:18}),E=e=>({x:e.x+5,y:e.cy-12-3}),$=(e,t)=>e.x<t.x+t.width&&t.x<e.x+e.width&&e.y<t.y+t.height&&t.y<e.y+e.height,M={along:[.5,.36,.64,.24,.76,.14,.86],aside:[0,.6,-.6],across:[0,-1.3,1.3,-2.6,2.6]};function O(e,t,n={}){let{along:r,aside:s,across:i}={...M,...n},a=e.map((e,t)=>({label:e,i:t,width:C(e).width})).sort((e,t)=>e.width===t.width?e.i-t.i:t.width-e.width),o=[];for(let{label:e}of a){let{width:n,height:a}=C(e),l=8*!!e.glyph,c=null,d=1/0;e:for(let h of i)for(let i of s)for(let s of r){let r=e.at(s),u=r.x+i*n,p=r.y+h*a,m={x:u-n/2,y:p-18,width:n,height:a},f=[...o,...t].filter(e=>$(m,e)).length,g={...m,cx:u+l,cy:p,label:e};if(0===f){c=g;break e}f<d&&(d=f,c=g)}c&&o.push(c)}return o}let R=(e,t,n=2.2,r)=>({id:e,paths:t,strokeWidth:n,circles:r}),A=R("signal",["M3 12h10","m13 6 6 6-6 6Z"]),T=[{glyph:R("confirm",["m4 13 5.5 5.5L20 6"],2.4),words:["confirm","approve","accept","commit"]},{glyph:R("complete",["m8 12 3 3 5-6"],2.2,[{cx:12,cy:12,r:8.5}]),words:["complete","finish","done","close"]},{glyph:R("skip",["M4 17c0-6 4.5-9 9-9h6","m15 4 4.5 4-4.5 4"]),words:["skip","ignore","bypass"]},{glyph:R("flag",["M6 21V4","M6 4h12l-3 4.5 3 4.5H6Z"]),words:["flag","mark","revisit","review"]},{glyph:R("advance",["M4 6l8 6-8 6Z","M13 6l7 6-7 6Z"]),words:["advance","next","forward","step"]},{glyph:R("pause",["M9 5v14M15 5v14"],2.6),words:["pause","hold","suspend","stop"]},{glyph:R("play",["M7 4.5 19 12 7 19.5Z"]),words:["resume","start","begin","play","run"]},{glyph:R("clock",["M12 7.5V12l3.5 2.5"],2.2,[{cx:12,cy:12,r:8.5}]),words:["timeout","expire","tick","delay","after","elapse"]},{glyph:R("change",["M3 14c3-6 6-6 9 0s6 6 9 0"]),words:["change","update","edit","modify","set"]}];[...T.map(e=>e.glyph)];let P=e=>Math.round(100*e)/100;function I(e,t,n,r){return{p0:e,p1:t,p2:n,p3:r,path:`M ${P(e.x)} ${P(e.y)} C ${P(t.x)} ${P(t.y)}, ${P(n.x)} ${P(n.y)}, ${P(r.x)} ${P(r.y)}`,at:s=>{let i=1-s,a=i*i*i,o=3*i*i*s,l=3*i*s*s,c=s*s*s;return{x:a*e.x+o*t.x+l*n.x+c*r.x,y:a*e.y+o*t.y+l*n.y+c*r.y}}}}function L(e,t){let n=e.map(({from:e,to:n})=>{var r,s;return e===n?null:(r=t(e),(s=t(n)).y>=r.y+r.height?["bottom","top"]:s.y+s.height<=r.y?["top","bottom"]:s.x>=r.x+r.width?["right","left"]:s.x+s.width<=r.x?["left","right"]:["bottom","top"])}),r=new Map,s=(e,t,n)=>{let s=`${e}\0${t}`,i=r.get(s);i?i.push(n):r.set(s,[n])},i=(e,t)=>"top"===t||"bottom"===t?e.x+e.width/2:e.y+e.height/2;e.forEach((e,r)=>{let a=n[r];if(!a)return;let[o,l]=a;s(e.from,o,{edge:r,toward:i(t(e.to),o),role:"out"}),s(e.to,l,{edge:r,toward:i(t(e.from),l),role:"in"})});let a=new Map;for(let[e,n]of r){let[r,s]=e.split("\0"),i=t(r),o=[...n].sort((e,t)=>e.toward===t.toward?e.edge-t.edge:e.toward-t.toward);o.forEach((e,t)=>{a.set(`${e.edge}\0${e.role}`,function(e,t,n,r){let s="top"===t||"bottom"===t,i=s?e.width:e.height,a=s?e.x+e.width/2:e.y+e.height/2,o=r>1?Math.min(.72*i,40*(r-1)):0,l=r>1?a-o/2+o*n/(r-1):a;return"top"===t?{x:l,y:e.y}:"bottom"===t?{x:l,y:e.y+e.height}:"left"===t?{x:e.x,y:l}:{x:e.x+e.width,y:l}}(i,s,t,o.length))})}return e.map((e,r)=>{let s=n[r];if(!s){var i;let n,r,s;return n=(i=t(e.from)).x+i.width,r=i.y+.35*i.height,I({x:n,y:r},{x:n+44,y:r-12},{x:n+44,y:(s=i.y+.65*i.height)+12},{x:n,y:s})}let o=a.get(`${r}\0out`),l=a.get(`${r}\0in`);var c=s[0];if("top"===c||"bottom"===c){let e=(o.y+l.y)/2;return I(o,{x:o.x,y:e},{x:l.x,y:e},l)}let d=(o.x+l.x)/2;return I(o,{x:d,y:o.y},{x:d,y:l.y},l)})}let D={min:.2,max:2.5},B={x:0,y:0,scale:1};function F(e,t=D){return Number.isFinite(e)?Math.min(t.max,Math.max(t.min,e)):1}function U(e,t,n){return{x:e.x+t,y:e.y+n,scale:e.scale}}function q(e,t,n,r=D){return Y(e,e.scale*t,n,r)}function Y(e,t,n,r=D){let s=F(t,r);if(s===e.scale)return e;let i={x:(n.x-e.x)/e.scale,y:(n.y-e.y)/e.scale};return{x:n.x-i.x*s,y:n.y-i.y*s,scale:s}}function H(e,t,n,r={}){let s=r.padding??48,i=r.maxScale??1,a=r.limits??D;if(0===e.length||t<=0||n<=0)return{...B};let o=1/0,l=1/0,c=-1/0,d=-1/0;for(let t of e)o=Math.min(o,t.x),l=Math.min(l,t.y),c=Math.max(c,t.x+t.width),d=Math.max(d,t.y+t.height);let h=Math.max(1,c-o),u=Math.max(1,d-l),p=F(Math.min(i,Math.min(Math.max(1,t-2*s)/h,Math.max(1,n-2*s)/u)),a);return{x:(t-h*p)/2-o*p,y:(n-u*p)/2-l*p,scale:p}}function X(e){return`translate(${e.x} ${e.y}) scale(${e.scale})`}function J(e){let t=new Set,n=[];for(let r of e.states??[])t.has(r.name)||(t.add(r.name),n.push(r));return n}function V(e){return e.stateOf?Array.isArray(e.stateOf)?e.stateOf:[e.stateOf]:[]}let z=["1:1","1:N","N:1","N:M"];function K(e){return e.toLowerCase().endsWith(".erdf.json")}function W(e){return!!e&&"object"==typeof e&&Array.isArray(e.entities)&&!("state"in e)}function G(e,t){let n=RegExp(`(?<![\\w.])${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}\\.([A-Za-z_]\\w*)\\b(?!\\s*\\()`,"g"),r=[];for(let t of e.matchAll(n))r.includes(t[1])||r.push(t[1]);return r}let Q=e=>({settings:{...e.settings},entities:(e.entities??[]).map(e=>({...e,attributes:(e.attributes??[]).map(e=>({...e}))})),relationships:(e.relationships??[]).map(e=>({...e}))});function Z(e,t){let n=e.entities.find(e=>e.name===t);if(!n){let n=e.entities.map(e=>e.name).join(", ")||"none";throw Error(`Entity '${t}' not found. Entities: ${n}.`)}return n}function ee(e){return Object.fromEntries(Object.entries(e).filter(([,e])=>void 0!==e))}let et={"1:1":"||--||","1:N":"||--o{","N:1":"}o--||","N:M":"}o--o{"},en=/^[A-Za-z_][A-Za-z0-9_-]*$/,er=e=>en.test(e)?e:`"${e.replace(/"/g,"'")}"`,es=(e,t)=>{let n=e.trim().replace(/[^A-Za-z0-9_()[\]-]+/g,"_").replace(/^_+|_+$/g,"");return/^[A-Za-z_]/.test(n)?n:n?`_${n}`:t},ei=e=>`"${e.replace(/"/g,"'")}"`,ea={hSpacing:70,vSpacing:90};function eo(e){return`${e.name} : ${e.type}`}function el(e){return e.trim().replace(/[\s_]+/g,"-").replace(/[^A-Za-z0-9.-]/g,"").replace(/-{2,}/g,"-").replace(/^[-.]+|[-.]+$/g,"").slice(0,60)}function ec(e){return e.parallel?e.parallel.states:e.states??[]}function ed(e,t){return ec(e).find(e=>e.name===t)??null}let eh={surface:"--slc-surface",nodeFill:"--slc-node-fill",nodeStroke:"--slc-node-stroke",compositeFill:"--slc-composite-fill",finalFill:"--slc-final-fill",accent:"--slc-accent",accentFill:"--slc-accent-fill",accentInk:"--slc-accent-ink",danger:"--slc-danger",drawSource:"--slc-draw-source",edge:"--slc-edge",chipFill:"--slc-chip-fill",chipStroke:"--slc-chip-stroke",label:"--slc-label",muted:"--slc-muted",faint:"--slc-faint",entry:"--slc-entry",exit:"--slc-exit",composite:"--slc-composite",active:"--slc-active",panelBg:"--slc-panel-bg",panelBorder:"--slc-panel-border",panelHover:"--slc-panel-hover"};function eu(e){let t={};if(!e)return t;for(let[n,r]of Object.entries(e)){let e=eh[n];e&&"string"==typeof r&&(t[e]=r)}return t}let ep={x:100,y:100,width:160,height:60};function em(e,t){return 1===t?16*e:2===t?400*e:e}function ef(e){return!!e&&"string"==typeof e.tagName&&(!!e.isContentEditable||["INPUT","TEXTAREA","SELECT","BUTTON","OPTION"].includes(e.tagName))}function eg(e){return(e.states?.length??0)>0||(e.parallel?.states.length??0)>0}function ex({mark:e,x:t,y:n,selected:r}){return(0,o.jsxs)("g",{transform:`translate(${t} ${n}) scale(0.5)`,strokeWidth:e.strokeWidth,className:`slc-glyph${r?" slc-glyph--selected":""}`,children:[(e.circles??[]).map((e,t)=>(0,o.jsx)("circle",{cx:e.cx,cy:e.cy,r:e.r,className:e.filled?"slc-glyph-dot":void 0},`c${t}`)),e.paths.map((e,t)=>(0,o.jsx)("path",{d:e},`p${t}`))]})}let ey={kind:null,id:null},eb=(0,l.forwardRef)(function(e,t){let{definition:n,positions:r,path:s=[],rootLabel:i,viewport:a,onViewportChange:c,selection:d=ey,activeStates:h,errorElements:u,drawMode:p="select",drawSource:m=null,readOnly:f=!1,showBreadcrumb:g=!0,showHud:x=!0,fitKey:y,onSelect:b,onClearSelection:v,onStateMove:w,onNavigateInto:j,onNavigateTo:k,onContextMenu:N,onCreateTransition:S,onCancelDraw:C,onDeleteState:$,onUndo:M,onRedo:R,hudExtras:P,emptyHint:I,theme:F,className:J,style:V,svgId:z,pinchOwner:K="canvas"}=e,W=(0,l.useRef)(null),G=(0,l.useId)().replace(/:/g,""),Q=(0,l.useRef)(a);Q.current=a;let[Z,ee]=(0,l.useState)(null),et=(0,l.useRef)(null),en=(0,l.useCallback)(e=>{et.current=e,ee(e)},[]),[er,es]=(0,l.useState)(null),ei=(0,l.useRef)(!1),[ea,eo]=(0,l.useState)(!1),el=(0,l.useRef)(null),[eh,eb]=(0,l.useState)(!1),ev=(0,l.useRef)(!1),ew=(0,l.useRef)(new Map),ej=(0,l.useRef)(new Map),ek=(0,l.useRef)(null),[eN,eS]=(0,l.useState)(!1),e_=(0,l.useRef)(null),eC=(0,l.useRef)(!1),[eE,e$]=(0,l.useState)(!1),eM=n.state,eO=(0,l.useMemo)(()=>{let e=function(e,t){let n=[],r=e;for(let e of t){let t=ed(r,e);if(!t)break;n.push(e),r=t}return n}(eM,s);return[i??eM?.name??"Root",...e]},[eM,s,i]),eR=(0,l.useMemo)(()=>eM?ec(function(e,t){let n=e;for(let e of t){let t=ed(n,e);if(!t)break;n=t}return n}(eM,s)):[],[eM,s]),eA=eO[eO.length-1],eT=(0,l.useMemo)(()=>(function(e){let t=new Set,n=[];for(let r of e.events??[])for(let e of r.events??[])t.has(e.id)||(t.add(e.id),n.push(e.id));return n})(n),[n]),eP=(0,l.useMemo)(()=>new Set(h??[]),[h]),eI=(0,l.useMemo)(()=>new Set(u??[]),[u]),eL=(0,l.useCallback)((e,t)=>{let n=W.current?.getBoundingClientRect();return{x:e-(n?.left??0),y:t-(n?.top??0)}},[]),eD=(0,l.useCallback)(e=>{let t=ew.current.get(e);ew.current.delete(e),t?.hasPointerCapture?.(e)&&t.releasePointerCapture?.(e)},[]),eB=(0,l.useCallback)(e=>{let t=e_.current;t&&(void 0===e||t.pointerId===e)&&(clearTimeout(t.timer),e_.current=null)},[]),eF=(0,l.useCallback)((e,t)=>{if("touch"!==e.pointerType||!N)return;eB();let{pointerId:n,clientX:r,clientY:s}=e,i=setTimeout(()=>{e_.current=null,en(null),el.current=null,eb(!1),eC.current=!0,navigator.vibrate?.(10),N(r,s,t)},500);e_.current={pointerId:n,x:r,y:s,target:t,timer:i}},[eB,N,en]);(0,l.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia("(pointer: coarse)"),t=()=>e$(e.matches);return t(),e.addEventListener("change",t),()=>e.removeEventListener("change",t)},[]),(0,l.useEffect)(()=>{let e=e=>{ej.current.delete(e.pointerId)};return window.addEventListener("pointerup",e),window.addEventListener("pointercancel",e),()=>{window.removeEventListener("pointerup",e),window.removeEventListener("pointercancel",e)}},[]),(0,l.useEffect)(()=>()=>eB(),[eB]);let eU=(0,l.useRef)(new Set),eq=(0,l.useRef)(new Map),eY=(0,l.useRef)(eA),eH=(0,l.useRef)(new Set),[eX,eJ]=(0,l.useState)(new Set),[eV,ez]=(0,l.useState)(new Set),[eK,eW]=(0,l.useState)(new Map),eG=eE?10/a.scale:0,eQ=eE?28/a.scale:0,eZ=(0,l.useCallback)(e=>r[e]??ep,[r]);(0,l.useEffect)(()=>{let e=e=>{(e.ctrlKey||e.metaKey)&&"z"===e.key&&M&&(e.preventDefault(),M()),(e.ctrlKey||e.metaKey)&&("y"===e.key||e.shiftKey&&"z"===e.key)&&R&&(e.preventDefault(),R()),"Escape"===e.key&&(es(null),C?.()),"Delete"===e.key&&"state"===d.kind&&d.id&&$&&$(d.id)};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[M,R,C,$,d]);let e0=(0,l.useCallback)(e=>{let t=Q.current;el.current={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,origX:t.x,origY:t.y},ev.current=!1,eb(!0);let n=W.current;n&&(ew.current.set(e.pointerId,n),n.setPointerCapture(e.pointerId))},[]),e1=(0,l.useCallback)(()=>{let e=[...ej.current.entries()];if(e.length<2)return;let[[t,n],[r,s]]=e;eB(),en(null),el.current=null;let i=Math.max(1,Math.hypot(s.x-n.x,s.y-n.y)),a=eL((n.x+s.x)/2,(n.y+s.y)/2);ek.current={a:t,b:r,startDist:i,startMidX:a.x,startMidY:a.y,start:Q.current},ev.current=!0,eS(!0);let o=W.current;if(o){for(let e of[t,r])if(!ew.current.has(e))try{o.setPointerCapture(e),ew.current.set(e,o)}catch{}}},[eB,eL,en]),e2=(0,l.useCallback)(e=>{if(eC.current=!1,"touch"!==e.pointerType)return;e$(!0),ej.current.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=ej.current.size;t<2||(e.stopPropagation(),2===t&&e1())},[e1]),e5=(0,l.useCallback)((e,t)=>{if(0!==e.button||ei.current)return;if(e.stopPropagation(),eF(e,{kind:"state",id:t}),!f&&"transition"===p)return void(m?m!==t&&es({stateName:m,targetName:t,x:e.clientX,y:e.clientY}):b?.("state",t));if(b?.("state",t),f||!w)return;let n=eZ(t);en({name:t,pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,origX:n.x,origY:n.y});let r=e.currentTarget;ew.current.set(e.pointerId,r),r.setPointerCapture?.(e.pointerId)},[b,eZ,p,m,eF,en,f,w]),e4=(0,l.useCallback)(e=>{if("touch"===e.pointerType){eF(e,{kind:"canvas"}),e0(e);return}(1===e.button||0===e.button&&ei.current)&&(e.preventDefault(),e0(e))},[eF,e0]),e3=(0,l.useCallback)(e=>{ej.current.has(e.pointerId)&&ej.current.set(e.pointerId,{x:e.clientX,y:e.clientY});let t=e_.current;t&&t.pointerId===e.pointerId&&Math.hypot(e.clientX-t.x,e.clientY-t.y)>8&&eB(e.pointerId);let n=ek.current;if(n){if(e.pointerId!==n.a&&e.pointerId!==n.b)return;let t=ej.current.get(n.a),r=ej.current.get(n.b);if(!t||!r)return;let s=Math.hypot(r.x-t.x,r.y-t.y),i=eL((t.x+r.x)/2,(t.y+r.y)/2);c(U(Y(n.start,n.start.scale*(s/n.startDist),{x:n.startMidX,y:n.startMidY}),i.x-n.startMidX,i.y-n.startMidY));return}let r=el.current;if(r){if(r.pointerId!==e.pointerId)return;let t=e.clientX-r.startX,n=e.clientY-r.startY,s=8*("touch"===e.pointerType);(Math.abs(t)>s||Math.abs(n)>s)&&(ev.current=!0),c({x:r.origX+t,y:r.origY+n,scale:Q.current.scale});return}if(!Z||Z.pointerId!==e.pointerId||!w)return;let s=Q.current.scale,i=(e.clientX-Z.startX)/s,a=(e.clientY-Z.startY)/s,o=eZ(Z.name);w(Z.name,{...o,x:Math.max(0,Z.origX+i),y:Math.max(0,Z.origY+a)})},[Z,eZ,w,c,eB,eL]),e6=(0,l.useCallback)(e=>{ej.current.delete(e.pointerId),eB(e.pointerId),eD(e.pointerId);let t=ek.current;if(t&&(t.a===e.pointerId||t.b===e.pointerId)){ek.current=null,eS(!1);let n=t.a===e.pointerId?t.b:t.a,r=ej.current.get(n);if(r){let e=Q.current;el.current={pointerId:n,startX:r.x,startY:r.y,origX:e.x,origY:e.y},ev.current=!0,eb(!0)}}el.current?.pointerId===e.pointerId&&(el.current=null),et.current?.pointerId===e.pointerId&&en(null),el.current||eb(!1),ek.current||eS(!1)},[eB,eD,en]);(0,l.useEffect)(()=>{let e=W.current;if(!e)return;let t=e=>{e.preventDefault();let t=Q.current,n=em(e.deltaX,e.deltaMode),r=em(e.deltaY,e.deltaMode);if(e.ctrlKey||e.metaKey){let n=q(t,Math.exp(-(.0025*r)),eL(e.clientX,e.clientY));n!==t&&c(n);return}let s=e.shiftKey?-(n||r):-n,i=e.shiftKey?0:-r;(0!==s||0!==i)&&c(U(t,s,i))};return e.addEventListener("wheel",t,{passive:!1}),()=>e.removeEventListener("wheel",t)},[c,eL]),(0,l.useEffect)(()=>{let e=e=>{"Space"!==e.code||e.repeat||ef(e.target)||ef(document.activeElement)||(e.preventDefault(),ei.current=!0,eo(!0))},t=e=>{"Space"===e.code&&(ei.current=!1,eo(!1))},n=()=>{ei.current=!1,eo(!1)};return window.addEventListener("keydown",e),window.addEventListener("keyup",t),window.addEventListener("blur",n),()=>{window.removeEventListener("keydown",e),window.removeEventListener("keyup",t),window.removeEventListener("blur",n)}},[]);let e8=(0,l.useCallback)(e=>{let t=W.current?.getBoundingClientRect(),n={x:(t?.width??0)/2,y:(t?.height??0)/2},r=Q.current,s=q(r,e,n);s!==r&&c(s)},[c]),e7=(0,l.useCallback)(()=>{let e=W.current?.getBoundingClientRect(),t={x:(e?.width??0)/2,y:(e?.height??0)/2};c(Y(Q.current,1,t))},[c]),e9=(0,l.useCallback)(()=>{let e=W.current?.getBoundingClientRect();if(!e)return;let t=eR.map(e=>eZ(e.name));c(t.length?H(t,e.width,e.height):{...B})},[eR,eZ,c]);(0,l.useImperativeHandle)(t,()=>({fit:e9,zoomIn:()=>e8(1.25),zoomOut:()=>e8(.8),resetZoom:e7,element:()=>W.current}),[e9,e8,e7]);let te=(0,l.useRef)(e9);te.current=e9,(0,l.useEffect)(()=>{if(void 0===y)return;let e=requestAnimationFrame(()=>te.current());return()=>cancelAnimationFrame(e)},[y]);let tt=(0,l.useCallback)((e,t)=>{N&&(e.preventDefault(),e.stopPropagation(),N(e.clientX,e.clientY,t?{kind:"state",id:t}:{kind:"canvas"}))},[N]),tn=(0,l.useMemo)(()=>{let e=new Set(eR.map(e=>e.name)),t=[];for(let n of eR)for(let[r,s]of(n.transitions??[]).entries())s.nextState&&e.has(s.nextState)&&t.push({from:n.name,to:s.nextState,event:s.event,stateName:n.name,index:r,condition:s.condition});return t},[eR]),tr=(0,l.useMemo)(()=>{let e=L(tn,eZ),t=new Map(O(tn.map((t,n)=>{let r=eZ(t.from);return{id:`${t.stateName}:${t.index}`,event:t.event,condition:t.condition,glyph:!0,at:t.from===t.to?()=>({x:r.x+r.width+44+30,y:r.y+r.height/2+4}):e[n].at}}),eR.map(e=>eZ(e.name))).map(e=>[e.label.id,e]));return tn.flatMap((n,r)=>{let s=`${n.stateName}:${n.index}`,i=t.get(s);return i?[{arrow:n,id:s,curve:e[r],spot:i}]:[]})},[tn,eR,eZ]);(0,l.useEffect)(()=>{let e=new Set(eR.map(e=>e.name)),t=new Set(tn.map(e=>`${e.stateName}:${e.index}`)),n=eY.current===eA,r=[...e].filter(e=>!eU.current.has(e));r.length&&eJ(e=>{let t=new Set(e);return r.forEach(e=>t.add(e)),t});let s=[...t].filter(e=>!eH.current.has(e));s.length&&ez(e=>{let t=new Set(e);return s.forEach(e=>t.add(e)),t}),eJ(t=>{let n=!1,r=new Set(t);return t.forEach(t=>{e.has(t)||(r.delete(t),n=!0)}),n?r:t}),ez(e=>{let n=!1,r=new Set(e);return e.forEach(e=>{t.has(e)||(r.delete(e),n=!0)}),n?r:e}),n?eW(t=>{let n=new Map(t),r=!1;return eq.current.forEach((t,s)=>{e.has(s)||n.has(s)||(n.set(s,t),r=!0)}),e.forEach(e=>{n.delete(e)&&(r=!0)}),r?n:t}):eW(e=>e.size?new Map:e),eU.current=e,eq.current=new Map(eR.map(e=>[e.name,{state:e,pos:eZ(e.name)}])),eH.current=t,eY.current=eA},[eR,eA,tn,eZ]);let ts={...eu(F),...V},ti=eE?" slc-hud--coarse":"";return(0,o.jsxs)("div",{className:`slc-pane${J?` ${J}`:""}`,style:ts,"data-pinch-owner":K,children:[g&&eO.length>1&&(0,o.jsx)("div",{className:"slc-crumbs",children:eO.map((e,t)=>(0,o.jsxs)("span",{className:"slc-crumb-item",children:[t>0&&(0,o.jsx)("span",{className:"slc-crumb-sep",children:"›"}),(0,o.jsx)("button",{type:"button",className:`slc-crumb${t===eO.length-1?" slc-crumb--current":""}`,onClick:()=>k?.(t),children:e})]},`${e}-${t}`))}),(0,o.jsxs)("svg",{ref:W,id:z,className:"slc-surface",style:{cursor:eh?"grabbing":ea?"grab":void 0,touchAction:"none",...eE?{WebkitUserSelect:"none",userSelect:"none",WebkitTouchCallout:"none"}:{}},onPointerDownCapture:e2,onPointerDown:e4,onPointerMove:e3,onPointerUp:e6,onPointerCancel:e6,onAuxClick:e=>e.preventDefault(),onClick:e=>{if(eC.current){eC.current=!1,e.stopPropagation();return}if(ev.current){ev.current=!1;return}e.target?.tagName==="svg"&&(v?.(),es(null))},onContextMenu:e=>tt(e),children:[(0,o.jsxs)("defs",{children:[(0,o.jsx)("marker",{id:`slc-arrow-${G}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,o.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead"})}),(0,o.jsx)("marker",{id:`slc-arrow-sel-${G}`,markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",children:(0,o.jsx)("polygon",{points:"0 0, 10 3.5, 0 7",className:"slc-arrowhead slc-arrowhead--selected"})})]}),"transition"===p&&m&&(0,o.jsxs)("text",{x:"50%",y:"30",textAnchor:"middle",className:"slc-draw-hint",children:['Click target state to create transition from "',m,'"']}),(0,o.jsxs)("g",{transform:X(a),style:eh||eN?{pointerEvents:"none"}:void 0,children:[tr.map(({arrow:e,id:t,curve:n,spot:r})=>{let s="transition"===d.kind&&d.id===t,i=eV.has(t),a=n.at(.5),l=Math.hypot(a.x-r.cx,a.y-r.cy)>4;return(0,o.jsxs)("g",{children:[eE&&(0,o.jsx)("path",{d:n.path,fill:"none",stroke:"transparent",strokeWidth:eQ,strokeLinecap:"round",pointerEvents:"stroke",onClick:e=>{e.stopPropagation(),b?.("transition",t)}}),(0,o.jsx)("path",{d:n.path,pathLength:1,markerEnd:`url(#slc-arrow${s?"-sel":""}-${G})`,className:`slc-edge${s?" slc-edge--selected":""}${i?" slc-edge-enter":""}`,onClick:e=>{e.stopPropagation(),b?.("transition",t)}}),(0,o.jsxs)("g",{className:"slc-chip",onClick:e=>{e.stopPropagation(),b?.("transition",t)},children:[l&&(0,o.jsx)("line",{x1:a.x,y1:a.y,x2:r.cx,y2:r.cy-5,className:`slc-chip-leader${s?" slc-chip-leader--selected":""}`}),eE&&(0,o.jsx)("rect",{x:r.x-eG,y:r.y-eG,width:r.width+2*eG,height:r.height+2*eG,fill:"transparent",pointerEvents:"all"}),(0,o.jsx)("rect",{x:r.x,y:r.y,width:r.width,height:r.height,rx:4,className:`slc-chip-plate${s?" slc-chip-plate--selected":""}`}),(0,o.jsx)(ex,{mark:function(e){let t=e.toLowerCase();for(let{glyph:e,words:n}of T)if(n.some(e=>t.includes(e)))return e;return A}(e.event),x:E(r).x,y:E(r).y,selected:s}),(0,o.jsx)("text",{x:r.cx,y:r.cy-5,textAnchor:"middle",className:`slc-chip-text${s?" slc-chip-text--selected":""}`,children:e.event}),e.condition&&(0,o.jsxs)("text",{x:r.cx,y:r.cy+7,textAnchor:"middle",className:"slc-chip-guard",children:[(0,o.jsx)("title",{children:e.condition}),_(e.condition)]})]})]},`arrow-${t}`)}),eR.map(e=>{let t=eZ(e.name),n="state"===d.kind&&d.id===e.name,r="final"===e.kind,s="history"===e.kind,i=eg(e),a=m===e.name,l=eI.has(e.name),c=(e.onEntry?.actions?.length??0)>0,h=(e.onExit?.actions?.length??0)>0,u=eP.has(e.name),g=eX.has(e.name),x=ea?void 0:"transition"!==p||f?i?"slc-node--drillable":f||!w?"slc-node--static":"slc-node--draggable":"slc-node--drawing";return(0,o.jsxs)("g",{className:x,onPointerDown:t=>e5(t,e.name),onDoubleClick:t=>{t.stopPropagation(),i&&j?.(e.name)},onContextMenu:t=>tt(t,e.name),children:[eE&&(0,o.jsx)("rect",{x:t.x-eG,y:t.y-eG,width:t.width+2*eG,height:t.height+2*eG,rx:12,fill:"transparent",pointerEvents:"all"}),(0,o.jsxs)("g",{className:g?"slc-node-enter":void 0,children:[(0,o.jsx)("rect",{x:t.x,y:t.y,width:t.width,height:t.height,rx:s?30:r?4:8,strokeDasharray:r?"6 3":i?"4 2":void 0,className:["slc-node",r?"slc-node--final":i?"slc-node--composite":"",a?"slc-node--source":"",l?"slc-node--error":"",n?"slc-node--selected":"",u?"slc-node--active":""].filter(Boolean).join(" ")}),(0,o.jsx)("text",{x:t.x+t.width/2,y:t.y+(c||h?t.height/2:t.height/2+5),textAnchor:"middle",className:"slc-node-name",children:e.name}),e.kind&&"normal"!==e.kind&&(0,o.jsx)("text",{x:t.x+t.width-8,y:t.y+14,textAnchor:"end",className:"slc-node-kind",children:e.kind}),c&&(0,o.jsx)("text",{x:t.x+6,y:t.y+t.height-6,className:"slc-node-entry",children:"▸entry"}),h&&(0,o.jsx)("text",{x:t.x+t.width-6,y:t.y+t.height-6,textAnchor:"end",className:"slc-node-exit",children:"exit◂"}),l&&(0,o.jsx)("text",{x:t.x+6,y:t.y+14,className:"slc-node-warn",children:"⚠"}),i&&(0,o.jsxs)("text",{x:t.x+t.width/2,y:t.y+t.height-6,textAnchor:"middle",className:"slc-node-drill",children:["▼ ",(e.states?.length??0)+(e.parallel?.states.length??0)," children — ",eE?"double-tap":"double-click"," to enter"]})]})]},e.name)}),Array.from(eK.entries()).map(([e,{state:t,pos:n}])=>{let r="final"===t.kind,s=eg(t);return(0,o.jsxs)("g",{className:"slc-node-exit-group",onAnimationEnd:t=>{"slc-node-out"===t.animationName&&eW(t=>{if(!t.has(e))return t;let n=new Map(t);return n.delete(e),n})},children:[(0,o.jsx)("rect",{x:n.x,y:n.y,width:n.width,height:n.height,rx:"history"===t.kind?30:r?4:8,strokeDasharray:r?"6 3":s?"4 2":void 0,className:`slc-node${r?" slc-node--final":s?" slc-node--composite":""}`}),(0,o.jsx)("text",{x:n.x+n.width/2,y:n.y+n.height/2+5,textAnchor:"middle",className:"slc-node-name",children:e})]},`exit-${e}`)})]}),0===eR.length&&(0,o.jsx)("text",{x:"50%",y:"50%",textAnchor:"middle",className:"slc-empty",children:I??"This level has no states."})]}),x&&(0,o.jsxs)("div",{className:`slc-hud${ti}`,children:[(0,o.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom out (Ctrl + wheel down, or pinch in)",disabled:a.scale<=D.min,onClick:()=>e8(.8),children:"−"}),(0,o.jsxs)("button",{type:"button",className:"slc-hud-btn slc-hud-btn--scale",title:"Reset zoom to 100%",onClick:e7,children:[Math.round(100*a.scale),"%"]}),(0,o.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Zoom in (Ctrl + wheel up, or pinch out)",disabled:a.scale>=D.max,onClick:()=>e8(1.25),children:"+"}),(0,o.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,o.jsx)("button",{type:"button",className:"slc-hud-btn",title:"Fit the whole machine in view",onClick:e9,children:"⤢ Fit"}),P&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("span",{className:"slc-hud-sep",children:"|"}),P]}),(0,o.jsx)("span",{className:"slc-hud-sep",children:"|"}),(0,o.jsx)("span",{className:"slc-hud-hint",title:eE?"Drag to pan · pinch with two fingers to zoom · press and hold for the menu · double-tap a composite to enter it":"Wheel scrolls · Shift+wheel scrolls sideways · Ctrl+wheel zooms at the cursor · middle-drag or Space+drag pans",children:eN?"pinching":eh?"panning":eE?"drag · pinch · hold":ea?"space to pan":"wheel · ⌃wheel · space"})]}),er&&(0,o.jsxs)("div",{className:"slc-picker",style:{left:er.x,top:er.y-80},onClick:e=>e.stopPropagation(),children:[(0,o.jsxs)("div",{className:"slc-picker-title",children:[er.stateName," → ",er.targetName]}),(0,o.jsx)("div",{className:"slc-picker-sub",children:"Select event:"}),0===eT.length?(0,o.jsx)("div",{className:"slc-picker-empty",children:"No events defined. Add events first."}):eT.map(e=>(0,o.jsx)("button",{type:"button",className:"slc-picker-item",onClick:()=>{er&&(S?.(er.stateName,er.targetName,e),es(null),C?.())},children:e},e)),(0,o.jsx)("button",{type:"button",className:"slc-picker-cancel",onClick:()=>{es(null),C?.()},children:"Cancel"})]})]})});function ev(e,t){return 1===t?16*e:2===t?400*e:e}let ew={"1:1":["one","one"],"1:N":["one","many"],"N:1":["many","one"],"N:M":["many","many"]};function ej(e,t,n){let r=t.x-e.x,s=t.y-e.y,i=Math.hypot(r,s)||1,a=r/i,o=s/i,l=-o,c=(t,n)=>`${(e.x+a*t+l*n).toFixed(1)} ${(e.y+o*t+a*n).toFixed(1)}`;return"one"===n?`M ${c(9,6)} L ${c(9,-6)}`:`M ${c(13,0)} L ${c(0,7)} M ${c(13,0)} L ${c(0,-7)} M ${c(13,0)} L ${c(0,0)}`}function ek({definition:e,positions:t,viewport:n,onViewportChange:r,selection:s=null,errorElements:i,readOnly:a=!1,fitKey:c,onSelect:d,onClearSelection:h,onEntityMove:u,onOpenMachine:p,onContextMenu:m,emptyHint:f,theme:g,className:x,style:y,svgId:b}){let v=(0,l.useRef)(null),w=(0,l.useRef)(n);w.current=n;let j=(0,l.useRef)(null),k=(0,l.useRef)(new Map),N=(0,l.useRef)(null),S=(0,l.useMemo)(()=>{let n=new Set;return(e.entities??[]).filter(e=>!(!e?.name||n.has(e.name))&&!!t[e.name]&&(n.add(e.name),!0))},[e.entities,t]),_=(0,l.useMemo)(()=>{let n=new Map(S.map((e,t)=>[e.name,`e${t}`])),r=(e.relationships??[]).filter(e=>e&&n.has(e.from)&&n.has(e.to)),s=L(r.map(e=>({from:n.get(e.from),to:n.get(e.to)})),e=>t[S[Number(e.slice(1))].name]);return r.map((e,t)=>({rel:e,curve:s[t]}))},[e.relationships,S,t]),C=(0,l.useMemo)(()=>O(_.filter(({rel:e})=>e.label).map(({rel:e,curve:t})=>({event:e.label,at:t.at})),S.map(e=>t[e.name])),[_,S,t]),E=(0,l.useCallback)((e,t)=>{let n=v.current?.getBoundingClientRect();return{x:e-(n?.left??0),y:t-(n?.top??0)}},[]);(0,l.useEffect)(()=>{if(void 0===c)return;let e=v.current?.getBoundingClientRect(),n=Object.values(t);e&&0!==n.length&&r(H(n,e.width,e.height))},[c]),(0,l.useEffect)(()=>{let e=v.current;if(!e)return;let t=e=>{e.preventDefault();let t=w.current,n=ev(e.deltaX,e.deltaMode),s=ev(e.deltaY,e.deltaMode);if(e.ctrlKey||e.metaKey)return void r(q(t,Math.exp(-(.0025*s)),E(e.clientX,e.clientY)));let i=e.shiftKey?-(n||s):-n,a=e.shiftKey?0:-s;(0!==i||0!==a)&&r(U(t,i,a))};return e.addEventListener("wheel",t,{passive:!1}),()=>e.removeEventListener("wheel",t)},[r,E]);let $=()=>{let e=[...k.current.values()];if(e.length<2)return null;let[t,n]=e;return{distance:Math.hypot(n.x-t.x,n.y-t.y)||1,mid:{x:(t.x+n.x)/2,y:(t.y+n.y)/2}}},M=(e,n)=>{if(0!==e.button&&"mouse"===e.pointerType)return;if(e.stopPropagation(),v.current?.setPointerCapture(e.pointerId),k.current.set(e.pointerId,E(e.clientX,e.clientY)),k.current.size>=2){j.current=null,N.current=$();return}let r=void 0!==n&&!a;j.current={kind:r?"move":"pan",pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,lastX:e.clientX,lastY:e.clientY,name:n,origin:r?t[n]:void 0,moved:!1}},R=e=>{if(k.current.delete(e.pointerId),N.current){k.current.size<2&&(N.current=null);return}let t=j.current;!t||t.pointerId!==e.pointerId||(j.current=null,t.moved||(t.name?d?.(t.name):h?.()))},A=new Set(i??[]);return(0,o.jsxs)("div",{className:`slc-pane${x?` ${x}`:""}`,style:{...eu(g),...y},children:[(0,o.jsx)("svg",{ref:v,id:b,className:"slc-surface",onPointerDown:e=>M(e),onPointerMove:e=>{if(k.current.has(e.pointerId)&&k.current.set(e.pointerId,E(e.clientX,e.clientY)),N.current){let e=$();if(!e)return;let t=N.current;r(q(U(w.current,e.mid.x-t.mid.x,e.mid.y-t.mid.y),e.distance/t.distance,e.mid)),N.current=e;return}let t=j.current;if(t&&t.pointerId===e.pointerId&&!(!t.moved&&4>Math.hypot(e.clientX-t.startX,e.clientY-t.startY))){if(t.moved=!0,"pan"===t.kind)r(U(w.current,e.clientX-t.lastX,e.clientY-t.lastY));else if(t.name&&t.origin){var n,s,i;let r=(n=w.current,s=e.clientX-t.startX,i=e.clientY-t.startY,{x:s/n.scale,y:i/n.scale});u?.(t.name,{...t.origin,x:t.origin.x+r.x,y:t.origin.y+r.y})}t.lastX=e.clientX,t.lastY=e.clientY}},onPointerUp:R,onPointerCancel:R,onContextMenu:e=>{m&&(e.preventDefault(),m(e.clientX,e.clientY,{kind:"canvas"}))},children:(0,o.jsxs)("g",{transform:X(n),children:[_.map(({rel:e,curve:t},n)=>{let[r,s]=ew[e.cardinality]??ew["1:N"];return(0,o.jsxs)("g",{className:"slc-erd-rel",children:[(0,o.jsx)("path",{d:t.path,className:"slc-erd-line"}),(0,o.jsx)("path",{d:ej(t.p0,t.p1,r),className:"slc-erd-mark"}),(0,o.jsx)("path",{d:ej(t.p3,t.p2,s),className:"slc-erd-mark"})]},`r${n}`)}),S.map(e=>{let n=t[e.name],r=(e.attributes??[]).filter(e=>e?.name),i=["slc-node",s===e.name?"slc-node--selected":"",A.has(e.name)?"slc-node--error":""].filter(Boolean).join(" ");return(0,o.jsxs)("g",{className:a?"slc-node--static":"slc-node--draggable",onPointerDown:t=>M(t,e.name),onContextMenu:t=>{m&&(t.preventDefault(),t.stopPropagation(),m(t.clientX,t.clientY,{kind:"entity",id:e.name}))},children:[e.description&&(0,o.jsx)("title",{children:e.description}),(0,o.jsx)("rect",{x:n.x,y:n.y,width:n.width,height:n.height,rx:6,className:i}),(0,o.jsx)("path",{d:`M ${n.x} ${n.y+30} h ${n.width}`,className:"slc-erd-rule"}),(0,o.jsx)("text",{x:n.x+n.width/2,y:n.y+15+5,textAnchor:"middle",className:"slc-node-name",children:e.name}),0===r.length&&(0,o.jsx)("text",{x:n.x+14,y:n.y+30+15,className:"slc-erd-row slc-erd-row--empty",children:"no attributes"}),r.map((e,t)=>{let r=n.y+30+20*t+15,s=V(e),i=["pk"===e.key?"PK":"uk"===e.key?"UK":"",e.references?"FK":""].filter(Boolean).join(" ");return(0,o.jsxs)("g",{className:s.length&&p?"slc-erd-state":void 0,onPointerDown:s.length&&p?e=>e.stopPropagation():void 0,onClick:s.length&&p?()=>p(s[0]):void 0,children:[(s.length>0||e.description)&&(0,o.jsx)("title",{children:[s.length?`stores the state of ${s.join(", ")}`:"",e.description??""].filter(Boolean).join(" — ")}),(0,o.jsxs)("text",{x:n.x+14,y:r,className:`slc-erd-row${s.length?" slc-erd-row--state":""}${"pk"===e.key?" slc-erd-row--pk":""}`,children:[s.length?"◉ ":"",eo(e),e.nullable?" ?":""]}),i&&(0,o.jsx)("text",{x:n.x+n.width-14,y:r,textAnchor:"end",className:"slc-erd-badge",children:i})]},e.name)})]},e.name)}),C.map((e,t)=>(0,o.jsxs)("g",{pointerEvents:"none",children:[(0,o.jsx)("rect",{x:e.x,y:e.y,width:e.width,height:e.height,rx:4,className:"slc-chip-plate"}),(0,o.jsx)("text",{x:e.cx,y:e.cy-5,textAnchor:"middle",className:"slc-erd-rel-label",children:e.label.event})]},`l${t}`))]})}),0===S.length&&f&&(0,o.jsx)("div",{className:"slc-erd-empty",children:f})]})}let eN=e=>{let t,n=new Set,r=(e,r)=>{let s="function"==typeof e?e(t):e;if(!Object.is(s,t)){let e=t;t=(null!=r?r:"object"!=typeof s||null===s)?s:Object.assign({},t,s),n.forEach(n=>n(t,e))}},s=()=>t,i={setState:r,getState:s,getInitialState:()=>a,subscribe:e=>(n.add(e),()=>n.delete(e))},a=t=e(r,s,i);return i},eS=e=>{let t=e?eN(e):eN,n=e=>(function(e,t=e=>e){let n=l.default.useSyncExternalStore(e.subscribe,l.default.useCallback(()=>t(e.getState()),[e,t]),l.default.useCallback(()=>t(e.getInitialState()),[e,t]));return l.default.useDebugValue(n),n})(t,e);return Object.assign(n,t),n},e_=Object.create(null);e_.open="0",e_.close="1",e_.ping="2",e_.pong="3",e_.message="4",e_.upgrade="5",e_.noop="6";let eC=Object.create(null);Object.keys(e_).forEach(e=>{eC[e_[e]]=e});let eE={type:"error",data:"parser error"},e$="function"==typeof Blob||"u">typeof Blob&&"[object BlobConstructor]"===Object.prototype.toString.call(Blob),eM="function"==typeof ArrayBuffer,eO=e=>"function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(e):e&&e.buffer instanceof ArrayBuffer,eR=({type:e,data:t},n,r)=>{if(e$&&t instanceof Blob)if(n)return r(t);else return eA(t,r);if(eM&&(t instanceof ArrayBuffer||eO(t)))if(n)return r(t);else return eA(new Blob([t]),r);return r(e_[e]+(t||""))},eA=(e,t)=>{let n=new FileReader;return n.onload=function(){t("b"+(n.result.split(",")[1]||""))},n.readAsDataURL(e)};function eT(e){return e instanceof Uint8Array?e:e instanceof ArrayBuffer?new Uint8Array(e):new Uint8Array(e.buffer,e.byteOffset,e.byteLength)}let eP="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",eI="u"<typeof Uint8Array?[]:new Uint8Array(256);for(let e=0;e<eP.length;e++)eI[eP.charCodeAt(e)]=e;let eL="function"==typeof ArrayBuffer,eD=(e,t)=>{if("string"!=typeof e)return{type:"message",data:eF(e,t)};let n=e.charAt(0);return"b"===n?{type:"message",data:eB(e.substring(1),t)}:eC[n]?e.length>1?{type:eC[n],data:e.substring(1)}:{type:eC[n]}:eE},eB=(e,t)=>eL?eF((e=>{let t=.75*e.length,n=e.length,r,s=0,i,a,o,l;"="===e[e.length-1]&&(t--,"="===e[e.length-2]&&t--);let c=new ArrayBuffer(t),d=new Uint8Array(c);for(r=0;r<n;r+=4)i=eI[e.charCodeAt(r)],a=eI[e.charCodeAt(r+1)],o=eI[e.charCodeAt(r+2)],l=eI[e.charCodeAt(r+3)],d[s++]=i<<2|a>>4,d[s++]=(15&a)<<4|o>>2,d[s++]=(3&o)<<6|63&l;return c})(e),t):{base64:!0,data:e},eF=(e,t)=>"blob"===t?e instanceof Blob?e:new Blob([e]):e instanceof ArrayBuffer?e:e.buffer;function eU(e){return e.reduce((e,t)=>e+t.length,0)}function eq(e,t){if(e[0].length===t)return e.shift();let n=new Uint8Array(t),r=0;for(let s=0;s<t;s++)n[s]=e[0][r++],r===e[0].length&&(e.shift(),r=0);return e.length&&r<e[0].length&&(e[0]=e[0].slice(r)),n}function eY(e){if(e){var t=e;for(var n in eY.prototype)t[n]=eY.prototype[n];return t}}eY.prototype.on=eY.prototype.addEventListener=function(e,t){return this._callbacks=this._callbacks||{},(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t),this},eY.prototype.once=function(e,t){function n(){this.off(e,n),t.apply(this,arguments)}return n.fn=t,this.on(e,n),this},eY.prototype.off=eY.prototype.removeListener=eY.prototype.removeAllListeners=eY.prototype.removeEventListener=function(e,t){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var n,r=this._callbacks["$"+e];if(!r)return this;if(1==arguments.length)return delete this._callbacks["$"+e],this;for(var s=0;s<r.length;s++)if((n=r[s])===t||n.fn===t){r.splice(s,1);break}return 0===r.length&&delete this._callbacks["$"+e],this},eY.prototype.emit=function(e){this._callbacks=this._callbacks||{};for(var t=Array(arguments.length-1),n=this._callbacks["$"+e],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(n){n=n.slice(0);for(var r=0,s=n.length;r<s;++r)n[r].apply(this,t)}return this},eY.prototype.emitReserved=eY.prototype.emit,eY.prototype.listeners=function(e){return this._callbacks=this._callbacks||{},this._callbacks["$"+e]||[]},eY.prototype.hasListeners=function(e){return!!this.listeners(e).length};let eH="function"==typeof Promise&&"function"==typeof Promise.resolve?e=>Promise.resolve().then(e):(e,t)=>t(e,0),eX="u">typeof self?self:"u">typeof window?window:Function("return this")();function eJ(e,...t){return t.reduce((t,n)=>(e.hasOwnProperty(n)&&(t[n]=e[n]),t),{})}let eV=eX.setTimeout,ez=eX.clearTimeout;function eK(e,t){t.useNativeTimers?(e.setTimeoutFn=eV.bind(eX),e.clearTimeoutFn=ez.bind(eX)):(e.setTimeoutFn=eX.setTimeout.bind(eX),e.clearTimeoutFn=eX.clearTimeout.bind(eX))}function eW(){return Date.now().toString(36).substring(3)+Math.random().toString(36).substring(2,5)}class eG extends Error{constructor(e,t,n){super(e),this.description=t,this.context=n,this.type="TransportError"}}class eQ extends eY{constructor(e){super(),this.writable=!1,eK(this,e),this.opts=e,this.query=e.query,this.socket=e.socket,this.supportsBinary=!e.forceBase64}onError(e,t,n){return super.emitReserved("error",new eG(e,t,n)),this}open(){return this.readyState="opening",this.doOpen(),this}close(){return("opening"===this.readyState||"open"===this.readyState)&&(this.doClose(),this.onClose()),this}send(e){"open"===this.readyState&&this.write(e)}onOpen(){this.readyState="open",this.writable=!0,super.emitReserved("open")}onData(e){let t=eD(e,this.socket.binaryType);this.onPacket(t)}onPacket(e){super.emitReserved("packet",e)}onClose(e){this.readyState="closed",super.emitReserved("close",e)}pause(e){}createUri(e,t={}){return e+"://"+this._hostname()+this._port()+this.opts.path+this._query(t)}_hostname(){let e=this.opts.hostname;return -1===e.indexOf(":")?e:"["+e+"]"}_port(){return this.opts.port&&(this.opts.secure&&443!==Number(this.opts.port)||!this.opts.secure&&80!==Number(this.opts.port))?":"+this.opts.port:""}_query(e){let t=function(e){let t="";for(let n in e)e.hasOwnProperty(n)&&(t.length&&(t+="&"),t+=encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t}(e);return t.length?"?"+t:""}}class eZ extends eQ{constructor(){super(...arguments),this._polling=!1}get name(){return"polling"}doOpen(){this._poll()}pause(e){this.readyState="pausing";let t=()=>{this.readyState="paused",e()};if(this._polling||!this.writable){let e=0;this._polling&&(e++,this.once("pollComplete",function(){--e||t()})),this.writable||(e++,this.once("drain",function(){--e||t()}))}else t()}_poll(){this._polling=!0,this.doPoll(),this.emitReserved("poll")}onData(e){let t=e=>{if("opening"===this.readyState&&"open"===e.type&&this.onOpen(),"close"===e.type)return this.onClose({description:"transport closed by the server"}),!1;this.onPacket(e)};((e,t)=>{let n=e.split("\x1e"),r=[];for(let e=0;e<n.length;e++){let s=eD(n[e],t);if(r.push(s),"error"===s.type)break}return r})(e,this.socket.binaryType).forEach(t),"closed"!==this.readyState&&(this._polling=!1,this.emitReserved("pollComplete"),"open"===this.readyState&&this._poll())}doClose(){let e=()=>{this.write([{type:"close"}])};"open"===this.readyState?e():this.once("open",e)}write(e){var t;let n,r,s;this.writable=!1,t=e=>{this.doWrite(e,()=>{this.writable=!0,this.emitReserved("drain")})},r=Array(n=e.length),s=0,e.forEach((e,i)=>{eR(e,!1,e=>{r[i]=e,++s===n&&t(r.join("\x1e"))})})}uri(){let e=this.opts.secure?"https":"http",t=this.query||{};return!1!==this.opts.timestampRequests&&(t[this.opts.timestampParam]=eW()),this.supportsBinary||t.sid||(t.b64=1),this.createUri(e,t)}}let e0=!1;try{e0="u">typeof XMLHttpRequest&&"withCredentials"in new XMLHttpRequest}catch(e){}let e1=e0;function e2(){}class e5 extends eZ{constructor(e){if(super(e),"u">typeof location){const t="https:"===location.protocol;let n=location.port;n||(n=t?"443":"80"),this.xd="u">typeof location&&e.hostname!==location.hostname||n!==e.port}}doWrite(e,t){let n=this.request({method:"POST",data:e});n.on("success",t),n.on("error",(e,t)=>{this.onError("xhr post error",e,t)})}doPoll(){let e=this.request();e.on("data",this.onData.bind(this)),e.on("error",(e,t)=>{this.onError("xhr poll error",e,t)}),this.pollXhr=e}}class e4 extends eY{constructor(e,t,n){super(),this.createRequest=e,eK(this,n),this._opts=n,this._method=n.method||"GET",this._uri=t,this._data=void 0!==n.data?n.data:null,this._create()}_create(){var e;let t=eJ(this._opts,"agent","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","autoUnref");t.xdomain=!!this._opts.xd;let n=this._xhr=this.createRequest(t);try{n.open(this._method,this._uri,!0);try{if(this._opts.extraHeaders)for(let e in n.setDisableHeaderCheck&&n.setDisableHeaderCheck(!0),this._opts.extraHeaders)this._opts.extraHeaders.hasOwnProperty(e)&&n.setRequestHeader(e,this._opts.extraHeaders[e])}catch(e){}if("POST"===this._method)try{n.setRequestHeader("Content-type","text/plain;charset=UTF-8")}catch(e){}try{n.setRequestHeader("Accept","*/*")}catch(e){}null==(e=this._opts.cookieJar)||e.addCookies(n),"withCredentials"in n&&(n.withCredentials=this._opts.withCredentials),this._opts.requestTimeout&&(n.timeout=this._opts.requestTimeout),n.onreadystatechange=()=>{var e;3===n.readyState&&(null==(e=this._opts.cookieJar)||e.parseCookies(n.getResponseHeader("set-cookie"))),4===n.readyState&&(200===n.status||1223===n.status?this._onLoad():this.setTimeoutFn(()=>{this._onError("number"==typeof n.status?n.status:0)},0))},n.send(this._data)}catch(e){this.setTimeoutFn(()=>{this._onError(e)},0);return}"u">typeof document&&(this._index=e4.requestsCount++,e4.requests[this._index]=this)}_onError(e){this.emitReserved("error",e,this._xhr),this._cleanup(!0)}_cleanup(e){if(void 0!==this._xhr&&null!==this._xhr){if(this._xhr.onreadystatechange=e2,e)try{this._xhr.abort()}catch(e){}"u">typeof document&&delete e4.requests[this._index],this._xhr=null}}_onLoad(){let e=this._xhr.responseText;null!==e&&(this.emitReserved("data",e),this.emitReserved("success"),this._cleanup())}abort(){this._cleanup()}}function e3(){for(let e in e4.requests)e4.requests.hasOwnProperty(e)&&e4.requests[e].abort()}e4.requestsCount=0,e4.requests={},"u">typeof document&&("function"==typeof attachEvent?attachEvent("onunload",e3):"function"==typeof addEventListener&&addEventListener("onpagehide"in eX?"pagehide":"unload",e3,!1));let e6=(r=e8({xdomain:!1}))&&null!==r.responseType;function e8(e){let t=e.xdomain;try{if("u">typeof XMLHttpRequest&&(!t||e1))return new XMLHttpRequest}catch(e){}if(!t)try{return new eX[["Active"].concat("Object").join("X")]("Microsoft.XMLHTTP")}catch(e){}}let e7="u">typeof navigator&&"string"==typeof navigator.product&&"reactnative"===navigator.product.toLowerCase();class e9 extends eQ{get name(){return"websocket"}doOpen(){let e=this.uri(),t=this.opts.protocols,n=e7?{}:eJ(this.opts,"agent","perMessageDeflate","pfx","key","passphrase","cert","ca","ciphers","rejectUnauthorized","localAddress","protocolVersion","origin","maxPayload","family","checkServerIdentity");this.opts.extraHeaders&&(n.headers=this.opts.extraHeaders);try{this.ws=this.createSocket(e,t,n)}catch(e){return this.emitReserved("error",e)}this.ws.binaryType=this.socket.binaryType,this.addEventListeners()}addEventListeners(){this.ws.onopen=()=>{this.opts.autoUnref&&this.ws._socket.unref(),this.onOpen()},this.ws.onclose=e=>this.onClose({description:"websocket connection closed",context:e}),this.ws.onmessage=e=>this.onData(e.data),this.ws.onerror=e=>this.onError("websocket error",e)}write(e){this.writable=!1;for(let t=0;t<e.length;t++){let n=e[t],r=t===e.length-1;eR(n,this.supportsBinary,e=>{try{this.doWrite(n,e)}catch(e){}r&&eH(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){void 0!==this.ws&&(this.ws.onerror=()=>{},this.ws.close(),this.ws=null)}uri(){let e=this.opts.secure?"wss":"ws",t=this.query||{};return this.opts.timestampRequests&&(t[this.opts.timestampParam]=eW()),this.supportsBinary||(t.b64=1),this.createUri(e,t)}}let te=eX.WebSocket||eX.MozWebSocket,tt={websocket:class extends e9{createSocket(e,t,n){return e7?new te(e,t,n):t?new te(e,t):new te(e)}doWrite(e,t){this.ws.send(t)}},webtransport:class extends eQ{get name(){return"webtransport"}doOpen(){try{this._transport=new WebTransport(this.createUri("https"),this.opts.transportOptions[this.name])}catch(e){return this.emitReserved("error",e)}this._transport.closed.then(()=>{this.onClose()}).catch(e=>{this.onError("webtransport error",e)}),this._transport.ready.then(()=>{this._transport.createBidirectionalStream().then(e=>{var r,s;let i,a,o,l,c=(r=Number.MAX_SAFE_INTEGER,s=this.socket.binaryType,n||(n=new TextDecoder),i=[],a=0,o=-1,l=!1,new TransformStream({transform(e,t){for(i.push(e);;){if(0===a){if(1>eU(i))break;let e=eq(i,1);l=(128&e[0])==128,a=(o=127&e[0])<126?3:126===o?1:2}else if(1===a){if(2>eU(i))break;let e=eq(i,2);o=new DataView(e.buffer,e.byteOffset,e.length).getUint16(0),a=3}else if(2===a){if(8>eU(i))break;let e=eq(i,8),n=new DataView(e.buffer,e.byteOffset,e.length),r=n.getUint32(0);if(r>2097151){t.enqueue(eE);break}o=0x100000000*r+n.getUint32(4),a=3}else{if(eU(i)<o)break;let e=eq(i,o);t.enqueue(eD(l?e:n.decode(e),s)),a=0}if(0===o||o>r){t.enqueue(eE);break}}}})),d=e.readable.pipeThrough(c).getReader(),h=new TransformStream({transform(e,n){var r;r=t=>{let r,s=t.length;if(s<126)new DataView((r=new Uint8Array(1)).buffer).setUint8(0,s);else if(s<65536){let e=new DataView((r=new Uint8Array(3)).buffer);e.setUint8(0,126),e.setUint16(1,s)}else{let e=new DataView((r=new Uint8Array(9)).buffer);e.setUint8(0,127),e.setBigUint64(1,BigInt(s))}e.data&&"string"!=typeof e.data&&(r[0]|=128),n.enqueue(r),n.enqueue(t)},e$&&e.data instanceof Blob?e.data.arrayBuffer().then(eT).then(r):eM&&(e.data instanceof ArrayBuffer||eO(e.data))?r(eT(e.data)):eR(e,!1,e=>{t||(t=new TextEncoder),r(t.encode(e))})}});h.readable.pipeTo(e.writable),this._writer=h.writable.getWriter();let u=()=>{d.read().then(({done:e,value:t})=>{e||(this.onPacket(t),u())}).catch(e=>{})};u();let p={type:"open"};this.query.sid&&(p.data=`{"sid":"${this.query.sid}"}`),this._writer.write(p).then(()=>this.onOpen())})})}write(e){this.writable=!1;for(let t=0;t<e.length;t++){let n=e[t],r=t===e.length-1;this._writer.write(n).then(()=>{r&&eH(()=>{this.writable=!0,this.emitReserved("drain")},this.setTimeoutFn)})}}doClose(){var e;null==(e=this._transport)||e.close()}},polling:class extends e5{constructor(e){super(e);const t=e&&e.forceBase64;this.supportsBinary=e6&&!t}request(e={}){return Object.assign(e,{xd:this.xd},this.opts),new e4(e8,this.uri(),e)}}},tn=/^(?:(?![^:@\/?#]+:[^:@\/]*@)(http|https|ws|wss):\/\/)?((?:(([^:@\/?#]*)(?::([^:@\/?#]*))?)?@)?((?:[a-f0-9]{0,4}:){2,7}[a-f0-9]{0,4}|[^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/,tr=["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"];function ts(e){var t,n;let r,s;if(e.length>8e3)throw"URI too long";let i=e,a=e.indexOf("["),o=e.indexOf("]");-1!=a&&-1!=o&&(e=e.substring(0,a)+e.substring(a,o).replace(/:/g,";")+e.substring(o,e.length));let l=tn.exec(e||""),c={},d=14;for(;d--;)c[tr[d]]=l[d]||"";return -1!=a&&-1!=o&&(c.source=i,c.host=c.host.substring(1,c.host.length-1).replace(/;/g,":"),c.authority=c.authority.replace("[","").replace("]","").replace(/;/g,":"),c.ipv6uri=!0),r=(t=c.path).replace(/\/{2,9}/g,"/").split("/"),("/"==t.slice(0,1)||0===t.length)&&r.splice(0,1),"/"==t.slice(-1)&&r.splice(r.length-1,1),c.pathNames=r,n=c.query,s={},n.replace(/(?:^|&)([^&=]*)=?([^&]*)/g,function(e,t,n){t&&(s[t]=n)}),c.queryKey=s,c}let ti="function"==typeof addEventListener&&"function"==typeof removeEventListener,ta=[];ti&&addEventListener("offline",()=>{ta.forEach(e=>e())},!1);class to extends eY{constructor(e,t){if(super(),this.binaryType="arraybuffer",this.writeBuffer=[],this._prevBufferLen=0,this._pingInterval=-1,this._pingTimeout=-1,this._maxPayload=-1,this._pingTimeoutTime=1/0,e&&"object"==typeof e&&(t=e,e=null),e){const n=ts(e);t.hostname=n.host,t.secure="https"===n.protocol||"wss"===n.protocol,t.port=n.port,n.query&&(t.query=n.query)}else t.host&&(t.hostname=ts(t.host).host);eK(this,t),this.secure=null!=t.secure?t.secure:"u">typeof location&&"https:"===location.protocol,t.hostname&&!t.port&&(t.port=this.secure?"443":"80"),this.hostname=t.hostname||("u">typeof location?location.hostname:"localhost"),this.port=t.port||("u">typeof location&&location.port?location.port:this.secure?"443":"80"),this.transports=[],this._transportsByName={},t.transports.forEach(e=>{let t=e.prototype.name;this.transports.push(t),this._transportsByName[t]=e}),this.opts=Object.assign({path:"/engine.io",agent:!1,withCredentials:!1,upgrade:!0,timestampParam:"t",rememberUpgrade:!1,addTrailingSlash:!0,rejectUnauthorized:!0,perMessageDeflate:{threshold:1024},transportOptions:{},closeOnBeforeunload:!1},t),this.opts.path=this.opts.path.replace(/\/$/,"")+(this.opts.addTrailingSlash?"/":""),"string"==typeof this.opts.query&&(this.opts.query=function(e){let t={},n=e.split("&");for(let e=0,r=n.length;e<r;e++){let r=n[e].split("=");t[decodeURIComponent(r[0])]=decodeURIComponent(r[1])}return t}(this.opts.query)),ti&&(this.opts.closeOnBeforeunload&&(this._beforeunloadEventListener=()=>{this.transport&&(this.transport.removeAllListeners(),this.transport.close())},addEventListener("beforeunload",this._beforeunloadEventListener,!1)),"localhost"!==this.hostname&&(this._offlineEventListener=()=>{this._onClose("transport close",{description:"network connection lost"})},ta.push(this._offlineEventListener))),this.opts.withCredentials&&(this._cookieJar=void 0),this._open()}createTransport(e){let t=Object.assign({},this.opts.query);t.EIO=4,t.transport=e,this.id&&(t.sid=this.id);let n=Object.assign({},this.opts,{query:t,socket:this,hostname:this.hostname,secure:this.secure,port:this.port},this.opts.transportOptions[e]);return new this._transportsByName[e](n)}_open(){if(0===this.transports.length)return void this.setTimeoutFn(()=>{this.emitReserved("error","No transports available")},0);let e=this.opts.rememberUpgrade&&to.priorWebsocketSuccess&&-1!==this.transports.indexOf("websocket")?"websocket":this.transports[0];this.readyState="opening";let t=this.createTransport(e);t.open(),this.setTransport(t)}setTransport(e){this.transport&&this.transport.removeAllListeners(),this.transport=e,e.on("drain",this._onDrain.bind(this)).on("packet",this._onPacket.bind(this)).on("error",this._onError.bind(this)).on("close",e=>this._onClose("transport close",e))}onOpen(){this.readyState="open",to.priorWebsocketSuccess="websocket"===this.transport.name,this.emitReserved("open"),this.flush()}_onPacket(e){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState)switch(this.emitReserved("packet",e),this.emitReserved("heartbeat"),e.type){case"open":this.onHandshake(JSON.parse(e.data));break;case"ping":this._sendPacket("pong"),this.emitReserved("ping"),this.emitReserved("pong"),this._resetPingTimeout();break;case"error":let t=Error("server error");t.code=e.data,this._onError(t);break;case"message":this.emitReserved("data",e.data),this.emitReserved("message",e.data)}}onHandshake(e){this.emitReserved("handshake",e),this.id=e.sid,this.transport.query.sid=e.sid,this._pingInterval=e.pingInterval,this._pingTimeout=e.pingTimeout,this._maxPayload=e.maxPayload,this.onOpen(),"closed"!==this.readyState&&this._resetPingTimeout()}_resetPingTimeout(){this.clearTimeoutFn(this._pingTimeoutTimer);let e=this._pingInterval+this._pingTimeout;this._pingTimeoutTime=Date.now()+e,this._pingTimeoutTimer=this.setTimeoutFn(()=>{this._onClose("ping timeout")},e),this.opts.autoUnref&&this._pingTimeoutTimer.unref()}_onDrain(){this.writeBuffer.splice(0,this._prevBufferLen),this._prevBufferLen=0,0===this.writeBuffer.length?this.emitReserved("drain"):this.flush()}flush(){if("closed"!==this.readyState&&this.transport.writable&&!this.upgrading&&this.writeBuffer.length){let e=this._getWritablePackets();this.transport.send(e),this._prevBufferLen=e.length,this.emitReserved("flush")}}_getWritablePackets(){if(!(this._maxPayload&&"polling"===this.transport.name&&this.writeBuffer.length>1))return this.writeBuffer;let e=1;for(let t=0;t<this.writeBuffer.length;t++){let n=this.writeBuffer[t].data;if(n&&(e+="string"==typeof n?function(e){let t=0,n=0;for(let r=0,s=e.length;r<s;r++)(t=e.charCodeAt(r))<128?n+=1:t<2048?n+=2:t<55296||t>=57344?n+=3:(r++,n+=4);return n}(n):Math.ceil(1.33*(n.byteLength||n.size))),t>0&&e>this._maxPayload)return this.writeBuffer.slice(0,t);e+=2}return this.writeBuffer}_hasPingExpired(){if(!this._pingTimeoutTime)return!0;let e=Date.now()>this._pingTimeoutTime;return e&&(this._pingTimeoutTime=0,eH(()=>{this._onClose("ping timeout")},this.setTimeoutFn)),e}write(e,t,n){return this._sendPacket("message",e,t,n),this}send(e,t,n){return this._sendPacket("message",e,t,n),this}_sendPacket(e,t,n,r){if("function"==typeof t&&(r=t,t=void 0),"function"==typeof n&&(r=n,n=null),"closing"===this.readyState||"closed"===this.readyState)return;(n=n||{}).compress=!1!==n.compress;let s={type:e,data:t,options:n};this.emitReserved("packetCreate",s),this.writeBuffer.push(s),r&&this.once("flush",r),this.flush()}close(){let e=()=>{this._onClose("forced close"),this.transport.close()},t=()=>{this.off("upgrade",t),this.off("upgradeError",t),e()},n=()=>{this.once("upgrade",t),this.once("upgradeError",t)};return("opening"===this.readyState||"open"===this.readyState)&&(this.readyState="closing",this.writeBuffer.length?this.once("drain",()=>{this.upgrading?n():e()}):this.upgrading?n():e()),this}_onError(e){if(to.priorWebsocketSuccess=!1,this.opts.tryAllTransports&&this.transports.length>1&&"opening"===this.readyState)return this.transports.shift(),this._open();this.emitReserved("error",e),this._onClose("transport error",e)}_onClose(e,t){if("opening"===this.readyState||"open"===this.readyState||"closing"===this.readyState){if(this.clearTimeoutFn(this._pingTimeoutTimer),this.transport.removeAllListeners("close"),this.transport.close(),this.transport.removeAllListeners(),ti&&(this._beforeunloadEventListener&&removeEventListener("beforeunload",this._beforeunloadEventListener,!1),this._offlineEventListener)){let e=ta.indexOf(this._offlineEventListener);-1!==e&&ta.splice(e,1)}this.readyState="closed",this.id=null,this.emitReserved("close",e,t),this.writeBuffer=[],this._prevBufferLen=0}}}to.protocol=4;class tl extends to{constructor(){super(...arguments),this._upgrades=[]}onOpen(){if(super.onOpen(),"open"===this.readyState&&this.opts.upgrade)for(let e=0;e<this._upgrades.length;e++)this._probe(this._upgrades[e])}_probe(e){let t=this.createTransport(e),n=!1;to.priorWebsocketSuccess=!1;let r=()=>{n||(t.send([{type:"ping",data:"probe"}]),t.once("packet",e=>{if(!n)if("pong"===e.type&&"probe"===e.data){if(this.upgrading=!0,this.emitReserved("upgrading",t),!t)return;to.priorWebsocketSuccess="websocket"===t.name,this.transport.pause(()=>{n||"closed"!==this.readyState&&(c(),this.setTransport(t),t.send([{type:"upgrade"}]),this.emitReserved("upgrade",t),t=null,this.upgrading=!1,this.flush())})}else{let e=Error("probe error");e.transport=t.name,this.emitReserved("upgradeError",e)}}))};function s(){n||(n=!0,c(),t.close(),t=null)}let i=e=>{let n=Error("probe error: "+e);n.transport=t.name,s(),this.emitReserved("upgradeError",n)};function a(){i("transport closed")}function o(){i("socket closed")}function l(e){t&&e.name!==t.name&&s()}let c=()=>{t.removeListener("open",r),t.removeListener("error",i),t.removeListener("close",a),this.off("close",o),this.off("upgrading",l)};t.once("open",r),t.once("error",i),t.once("close",a),this.once("close",o),this.once("upgrading",l),-1!==this._upgrades.indexOf("webtransport")&&"webtransport"!==e?this.setTimeoutFn(()=>{n||t.open()},200):t.open()}onHandshake(e){this._upgrades=this._filterUpgrades(e.upgrades),super.onHandshake(e)}_filterUpgrades(e){let t=[];for(let n=0;n<e.length;n++)~this.transports.indexOf(e[n])&&t.push(e[n]);return t}}class tc extends tl{constructor(e,t={}){const n="object"==typeof e,r=n?{...e}:{...t};(!r.transports||r.transports&&"string"==typeof r.transports[0])&&(r.transports=(r.transports||["polling","websocket","webtransport"]).map(e=>tt[e]).filter(e=>!!e)),super(n?r:e,r)}}tc.protocol;let td="function"==typeof ArrayBuffer,th=Object.prototype.toString,tu="function"==typeof Blob||"u">typeof Blob&&"[object BlobConstructor]"===th.call(Blob),tp="function"==typeof File||"u">typeof File&&"[object FileConstructor]"===th.call(File);function tm(e){return td&&(e instanceof ArrayBuffer||("function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(e):e.buffer instanceof ArrayBuffer))||tu&&e instanceof Blob||tp&&e instanceof File}let tf=["connect","connect_error","disconnect","disconnecting","newListener","removeListener"];(i=a||(a={}))[i.CONNECT=0]="CONNECT",i[i.DISCONNECT=1]="DISCONNECT",i[i.EVENT=2]="EVENT",i[i.ACK=3]="ACK",i[i.CONNECT_ERROR=4]="CONNECT_ERROR",i[i.BINARY_EVENT=5]="BINARY_EVENT",i[i.BINARY_ACK=6]="BINARY_ACK";class tg{constructor(e){this.replacer=e}encode(e){return(e.type===a.EVENT||e.type===a.ACK)&&function e(t,n){if(!t||"object"!=typeof t)return!1;if(Array.isArray(t)){for(let n=0,r=t.length;n<r;n++)if(e(t[n]))return!0;return!1}if(tm(t))return!0;if(t.toJSON&&"function"==typeof t.toJSON&&1==arguments.length)return e(t.toJSON(),!0);for(let n in t)if(Object.prototype.hasOwnProperty.call(t,n)&&e(t[n]))return!0;return!1}(e)?this.encodeAsBinary({type:e.type===a.EVENT?a.BINARY_EVENT:a.BINARY_ACK,nsp:e.nsp,data:e.data,id:e.id}):[this.encodeAsString(e)]}encodeAsString(e){let t=""+e.type;return(e.type===a.BINARY_EVENT||e.type===a.BINARY_ACK)&&(t+=e.attachments+"-"),e.nsp&&"/"!==e.nsp&&(t+=e.nsp+","),null!=e.id&&(t+=e.id),null!=e.data&&(t+=JSON.stringify(e.data,this.replacer)),t}encodeAsBinary(e){let t,n,r=(t=[],n=e.data,e.data=function e(t,n,r){if(!t)return t;if(tm(t)){let e={_placeholder:!0,num:n.length};return n.push(t),e}if(Array.isArray(t)){let r=Array(t.length);for(let s=0;s<t.length;s++)r[s]=e(t[s],n);return r}if("object"==typeof t&&!(t instanceof Date)){if(t.toJSON&&"function"==typeof t.toJSON&&!r)return e(t.toJSON(),n,!0);let s={};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(s[r]=e(t[r],n));return s}return t}(n,t),e.attachments=t.length,{packet:e,buffers:t}),s=this.encodeAsString(r.packet),i=r.buffers;return i.unshift(s),i}}class tx extends eY{constructor(e){super(),this.opts=Object.assign({reviver:void 0,maxAttachments:10},"function"==typeof e?{reviver:e}:e)}add(e){let t;if("string"==typeof e){if(this.reconstructor)throw Error("got plaintext data when reconstructing a packet");let n=(t=this.decodeString(e)).type===a.BINARY_EVENT;n||t.type===a.BINARY_ACK?(t.type=n?a.EVENT:a.ACK,this.reconstructor=new ty(t)):super.emitReserved("decoded",t)}else if(tm(e)||e.base64)if(this.reconstructor)(t=this.reconstructor.takeBinaryData(e))&&(this.reconstructor=null,super.emitReserved("decoded",t));else throw Error("got binary data when not reconstructing a packet");else throw Error("Unknown type: "+e)}decodeString(e){let t=0,n={type:Number(e.charAt(0))};if(void 0===a[n.type])throw Error("unknown packet type "+n.type);if(n.type===a.BINARY_EVENT||n.type===a.BINARY_ACK){let r=t+1;for(;"-"!==e.charAt(++t)&&t!=e.length;);let s=e.substring(r,t);if(s!=Number(s)||"-"!==e.charAt(t))throw Error("Illegal attachments");let i=Number(s);if(!tb(i)||i<1)throw Error("Illegal attachments");if(i>this.opts.maxAttachments)throw Error("too many attachments");n.attachments=i}if("/"===e.charAt(t+1)){let r=t+1;for(;++t&&","!==e.charAt(t)&&t!==e.length;);n.nsp=e.substring(r,t)}else n.nsp="/";let r=e.charAt(t+1);if(""!==r&&Number(r)==r){let r=t+1;for(;++t;){let n=e.charAt(t);if(null==n||Number(n)!=n){--t;break}if(t===e.length)break}n.id=Number(e.substring(r,t+1))}if(e.charAt(++t)){let r=this.tryParse(e.substr(t));if(tx.isPayloadValid(n.type,r))n.data=r;else throw Error("invalid payload")}return n}tryParse(e){try{return JSON.parse(e,this.opts.reviver)}catch(e){return!1}}static isPayloadValid(e,t){switch(e){case a.CONNECT:return tv(t);case a.DISCONNECT:return void 0===t;case a.CONNECT_ERROR:return"string"==typeof t||tv(t);case a.EVENT:case a.BINARY_EVENT:return Array.isArray(t)&&("number"==typeof t[0]||"string"==typeof t[0]&&-1===tf.indexOf(t[0]));case a.ACK:case a.BINARY_ACK:return Array.isArray(t)}}destroy(){this.reconstructor&&(this.reconstructor.finishedReconstruction(),this.reconstructor=null)}}class ty{constructor(e){this.packet=e,this.buffers=[],this.reconPack=e}takeBinaryData(e){if(this.buffers.push(e),this.buffers.length===this.reconPack.attachments){var t,n;let e=(t=this.reconPack,n=this.buffers,t.data=function e(t,n){if(!t)return t;if(t&&!0===t._placeholder){if("number"==typeof t.num&&t.num>=0&&t.num<n.length)return n[t.num];throw Error("illegal attachments")}if(Array.isArray(t))for(let r=0;r<t.length;r++)t[r]=e(t[r],n);else if("object"==typeof t)for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(t[r]=e(t[r],n));return t}(t.data,n),delete t.attachments,t);return this.finishedReconstruction(),e}return null}finishedReconstruction(){this.reconPack=null,this.buffers=[]}}let tb=Number.isInteger||function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e};function tv(e){return"[object Object]"===Object.prototype.toString.call(e)}function tw(e){var t;return"string"==typeof e.nsp&&(void 0===(t=e.id)||tb(t))&&function(e,t){switch(e){case a.CONNECT:return void 0===t||tv(t);case a.DISCONNECT:return void 0===t;case a.EVENT:return Array.isArray(t)&&("number"==typeof t[0]||"string"==typeof t[0]&&-1===tf.indexOf(t[0]));case a.ACK:return Array.isArray(t);case a.CONNECT_ERROR:return"string"==typeof t||tv(t);default:return!1}}(e.type,e.data)}function tj(e,t,n){return e.on(t,n),function(){e.off(t,n)}}e.s(["Decoder",()=>tx,"Encoder",()=>tg,"PacketType",()=>a,"isPacketValid",()=>tw,"protocol",0,5],11014);let tk=Object.freeze({connect:1,connect_error:1,disconnect:1,disconnecting:1,newListener:1,removeListener:1});class tN extends eY{constructor(e,t,n){super(),this.connected=!1,this.recovered=!1,this.receiveBuffer=[],this.sendBuffer=[],this._queue=[],this._queueSeq=0,this.ids=0,this.acks={},this.flags={},this.io=e,this.nsp=t,n&&n.auth&&(this.auth=n.auth),this._opts=Object.assign({},n),this.io._autoConnect&&this.open()}get disconnected(){return!this.connected}subEvents(){if(this.subs)return;let e=this.io;this.subs=[tj(e,"open",this.onopen.bind(this)),tj(e,"packet",this.onpacket.bind(this)),tj(e,"error",this.onerror.bind(this)),tj(e,"close",this.onclose.bind(this))]}get active(){return!!this.subs}connect(){return this.connected||(this.subEvents(),this.io._reconnecting||this.io.open(),"open"===this.io._readyState&&this.onopen()),this}open(){return this.connect()}send(...e){return e.unshift("message"),this.emit.apply(this,e),this}emit(e,...t){var n,r,s;if(tk.hasOwnProperty(e))throw Error('"'+e.toString()+'" is a reserved event name');if(t.unshift(e),this._opts.retries&&!this.flags.fromQueue&&!this.flags.volatile)return this._addToQueue(t),this;let i={type:a.EVENT,data:t};if(i.options={},i.options.compress=!1!==this.flags.compress,"function"==typeof t[t.length-1]){let e=this.ids++,n=t.pop();this._registerAckCallback(e,n),i.id=e}let o=null==(r=null==(n=this.io.engine)?void 0:n.transport)?void 0:r.writable,l=this.connected&&!(null==(s=this.io.engine)?void 0:s._hasPingExpired());return this.flags.volatile&&!o||(l?(this.notifyOutgoingListeners(i),this.packet(i)):this.sendBuffer.push(i)),this.flags={},this}_registerAckCallback(e,t){var n;let r=null!=(n=this.flags.timeout)?n:this._opts.ackTimeout;if(void 0===r){this.acks[e]=t;return}let s=this.io.setTimeoutFn(()=>{delete this.acks[e];for(let t=0;t<this.sendBuffer.length;t++)this.sendBuffer[t].id===e&&this.sendBuffer.splice(t,1);t.call(this,Error("operation has timed out"))},r),i=(...e)=>{this.io.clearTimeoutFn(s),t.apply(this,e)};i.withError=!0,this.acks[e]=i}emitWithAck(e,...t){return new Promise((n,r)=>{let s=(e,t)=>e?r(e):n(t);s.withError=!0,t.push(s),this.emit(e,...t)})}_addToQueue(e){let t;"function"==typeof e[e.length-1]&&(t=e.pop());let n={id:this._queueSeq++,tryCount:0,pending:!1,args:e,flags:Object.assign({fromQueue:!0},this.flags)};e.push((e,...r)=>(this._queue[0],null!==e?n.tryCount>this._opts.retries&&(this._queue.shift(),t&&t(e)):(this._queue.shift(),t&&t(null,...r)),n.pending=!1,this._drainQueue())),this._queue.push(n),this._drainQueue()}_drainQueue(e=!1){if(!this.connected||0===this._queue.length)return;let t=this._queue[0];(!t.pending||e)&&(t.pending=!0,t.tryCount++,this.flags=t.flags,this.emit.apply(this,t.args))}packet(e){e.nsp=this.nsp,this.io._packet(e)}onopen(){"function"==typeof this.auth?this.auth(e=>{this._sendConnectPacket(e)}):this._sendConnectPacket(this.auth)}_sendConnectPacket(e){this.packet({type:a.CONNECT,data:this._pid?Object.assign({pid:this._pid,offset:this._lastOffset},e):e})}onerror(e){this.connected||this.emitReserved("connect_error",e)}onclose(e,t){this.connected=!1,delete this.id,this.emitReserved("disconnect",e,t),this._clearAcks()}_clearAcks(){Object.keys(this.acks).forEach(e=>{if(!this.sendBuffer.some(t=>String(t.id)===e)){let t=this.acks[e];delete this.acks[e],t.withError&&t.call(this,Error("socket has been disconnected"))}})}onpacket(e){if(e.nsp===this.nsp)switch(e.type){case a.CONNECT:e.data&&e.data.sid?this.onconnect(e.data.sid,e.data.pid):this.emitReserved("connect_error",Error("It seems you are trying to reach a Socket.IO server in v2.x with a v3.x client, but they are not compatible (more information here: https://socket.io/docs/v3/migrating-from-2-x-to-3-0/)"));break;case a.EVENT:case a.BINARY_EVENT:this.onevent(e);break;case a.ACK:case a.BINARY_ACK:this.onack(e);break;case a.DISCONNECT:this.ondisconnect();break;case a.CONNECT_ERROR:this.destroy();let t=Error(e.data.message);t.data=e.data.data,this.emitReserved("connect_error",t)}}onevent(e){let t=e.data||[];null!=e.id&&t.push(this.ack(e.id)),this.connected?this.emitEvent(t):this.receiveBuffer.push(Object.freeze(t))}emitEvent(e){if(this._anyListeners&&this._anyListeners.length)for(let t of this._anyListeners.slice())t.apply(this,e);super.emit.apply(this,e),this._pid&&e.length&&"string"==typeof e[e.length-1]&&(this._lastOffset=e[e.length-1])}ack(e){let t=this,n=!1;return function(...r){n||(n=!0,t.packet({type:a.ACK,id:e,data:r}))}}onack(e){let t=this.acks[e.id];"function"==typeof t&&(delete this.acks[e.id],t.withError&&e.data.unshift(null),t.apply(this,e.data))}onconnect(e,t){this.id=e,this.recovered=t&&this._pid===t,this._pid=t,this.connected=!0,this.emitBuffered(),this._drainQueue(!0),this.emitReserved("connect")}emitBuffered(){this.receiveBuffer.forEach(e=>this.emitEvent(e)),this.receiveBuffer=[],this.sendBuffer.forEach(e=>{this.notifyOutgoingListeners(e),this.packet(e)}),this.sendBuffer=[]}ondisconnect(){this.destroy(),this.onclose("io server disconnect")}destroy(){this.subs&&(this.subs.forEach(e=>e()),this.subs=void 0),this.io._destroy(this)}disconnect(){return this.connected&&this.packet({type:a.DISCONNECT}),this.destroy(),this.connected&&this.onclose("io client disconnect"),this}close(){return this.disconnect()}compress(e){return this.flags.compress=e,this}get volatile(){return this.flags.volatile=!0,this}timeout(e){return this.flags.timeout=e,this}onAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.push(e),this}prependAny(e){return this._anyListeners=this._anyListeners||[],this._anyListeners.unshift(e),this}offAny(e){if(!this._anyListeners)return this;if(e){let t=this._anyListeners;for(let n=0;n<t.length;n++)if(e===t[n]){t.splice(n,1);break}}else this._anyListeners=[];return this}listenersAny(){return this._anyListeners||[]}onAnyOutgoing(e){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.push(e),this}prependAnyOutgoing(e){return this._anyOutgoingListeners=this._anyOutgoingListeners||[],this._anyOutgoingListeners.unshift(e),this}offAnyOutgoing(e){if(!this._anyOutgoingListeners)return this;if(e){let t=this._anyOutgoingListeners;for(let n=0;n<t.length;n++)if(e===t[n]){t.splice(n,1);break}}else this._anyOutgoingListeners=[];return this}listenersAnyOutgoing(){return this._anyOutgoingListeners||[]}notifyOutgoingListeners(e){if(this._anyOutgoingListeners&&this._anyOutgoingListeners.length)for(let t of this._anyOutgoingListeners.slice())t.apply(this,e.data)}}var tS=e.i(11014);function t_(e){e=e||{},this.ms=e.min||100,this.max=e.max||1e4,this.factor=e.factor||2,this.jitter=e.jitter>0&&e.jitter<=1?e.jitter:0,this.attempts=0}t_.prototype.duration=function(){var e=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var t=Math.random(),n=Math.floor(t*this.jitter*e);e=(1&Math.floor(10*t))==0?e-n:e+n}return 0|Math.min(e,this.max)},t_.prototype.reset=function(){this.attempts=0},t_.prototype.setMin=function(e){this.ms=e},t_.prototype.setMax=function(e){this.max=e},t_.prototype.setJitter=function(e){this.jitter=e};class tC extends eY{constructor(e,t){var n;super(),this.nsps={},this.subs=[],e&&"object"==typeof e&&(t=e,e=void 0),(t=t||{}).path=t.path||"/socket.io",this.opts=t,eK(this,t),this.reconnection(!1!==t.reconnection),this.reconnectionAttempts(t.reconnectionAttempts||1/0),this.reconnectionDelay(t.reconnectionDelay||1e3),this.reconnectionDelayMax(t.reconnectionDelayMax||5e3),this.randomizationFactor(null!=(n=t.randomizationFactor)?n:.5),this.backoff=new t_({min:this.reconnectionDelay(),max:this.reconnectionDelayMax(),jitter:this.randomizationFactor()}),this.timeout(null==t.timeout?2e4:t.timeout),this._readyState="closed",this.uri=e;const r=t.parser||tS;this.encoder=new r.Encoder,this.decoder=new r.Decoder,this._autoConnect=!1!==t.autoConnect,this._autoConnect&&this.open()}reconnection(e){return arguments.length?(this._reconnection=!!e,e||(this.skipReconnect=!0),this):this._reconnection}reconnectionAttempts(e){return void 0===e?this._reconnectionAttempts:(this._reconnectionAttempts=e,this)}reconnectionDelay(e){var t;return void 0===e?this._reconnectionDelay:(this._reconnectionDelay=e,null==(t=this.backoff)||t.setMin(e),this)}randomizationFactor(e){var t;return void 0===e?this._randomizationFactor:(this._randomizationFactor=e,null==(t=this.backoff)||t.setJitter(e),this)}reconnectionDelayMax(e){var t;return void 0===e?this._reconnectionDelayMax:(this._reconnectionDelayMax=e,null==(t=this.backoff)||t.setMax(e),this)}timeout(e){return arguments.length?(this._timeout=e,this):this._timeout}maybeReconnectOnOpen(){!this._reconnecting&&this._reconnection&&0===this.backoff.attempts&&this.reconnect()}open(e){if(~this._readyState.indexOf("open"))return this;this.engine=new tc(this.uri,this.opts);let t=this.engine,n=this;this._readyState="opening",this.skipReconnect=!1;let r=tj(t,"open",function(){n.onopen(),e&&e()}),s=t=>{this.cleanup(),this._readyState="closed",this.emitReserved("error",t),e?e(t):this.maybeReconnectOnOpen()},i=tj(t,"error",s);if(!1!==this._timeout){let e=this._timeout,n=this.setTimeoutFn(()=>{r(),s(Error("timeout")),t.close()},e);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}return this.subs.push(r),this.subs.push(i),this}connect(e){return this.open(e)}onopen(){this.cleanup(),this._readyState="open",this.emitReserved("open");let e=this.engine;this.subs.push(tj(e,"ping",this.onping.bind(this)),tj(e,"data",this.ondata.bind(this)),tj(e,"error",this.onerror.bind(this)),tj(e,"close",this.onclose.bind(this)),tj(this.decoder,"decoded",this.ondecoded.bind(this)))}onping(){this.emitReserved("ping")}ondata(e){try{this.decoder.add(e)}catch(e){this.onclose("parse error",e)}}ondecoded(e){eH(()=>{this.emitReserved("packet",e)},this.setTimeoutFn)}onerror(e){this.emitReserved("error",e)}socket(e,t){let n=this.nsps[e];return n?this._autoConnect&&!n.active&&n.connect():(n=new tN(this,e,t),this.nsps[e]=n),n}_destroy(e){for(let e of Object.keys(this.nsps))if(this.nsps[e].active)return;this._close()}_packet(e){let t=this.encoder.encode(e);for(let n=0;n<t.length;n++)this.engine.write(t[n],e.options)}cleanup(){this.subs.forEach(e=>e()),this.subs.length=0,this.decoder.destroy()}_close(){this.skipReconnect=!0,this._reconnecting=!1,this.onclose("forced close")}disconnect(){return this._close()}onclose(e,t){var n;this.cleanup(),null==(n=this.engine)||n.close(),this.backoff.reset(),this._readyState="closed",this.emitReserved("close",e,t),this._reconnection&&!this.skipReconnect&&this.reconnect()}reconnect(){if(this._reconnecting||this.skipReconnect)return this;let e=this;if(this.backoff.attempts>=this._reconnectionAttempts)this.backoff.reset(),this.emitReserved("reconnect_failed"),this._reconnecting=!1;else{let t=this.backoff.duration();this._reconnecting=!0;let n=this.setTimeoutFn(()=>{e.skipReconnect||(this.emitReserved("reconnect_attempt",e.backoff.attempts),e.skipReconnect||e.open(t=>{t?(e._reconnecting=!1,e.reconnect(),this.emitReserved("reconnect_error",t)):e.onreconnect()}))},t);this.opts.autoUnref&&n.unref(),this.subs.push(()=>{this.clearTimeoutFn(n)})}}onreconnect(){let e=this.backoff.attempts;this._reconnecting=!1,this.backoff.reset(),this.emitReserved("reconnect",e)}}let tE={};function t$(e,t){let n;"object"==typeof e&&(t=e,e=void 0);let r=function(e,t="",n){let r=e;n=n||"u">typeof location&&location,null==e&&(e=n.protocol+"//"+n.host),"string"==typeof e&&("/"===e.charAt(0)&&(e="/"===e.charAt(1)?n.protocol+e:n.host+e),/^(https?|wss?):\/\//.test(e)||(e=void 0!==n?n.protocol+"//"+e:"https://"+e),r=ts(e)),!r.port&&(/^(http|ws)$/.test(r.protocol)?r.port="80":/^(http|ws)s$/.test(r.protocol)&&(r.port="443")),r.path=r.path||"/";let s=-1!==r.host.indexOf(":")?"["+r.host+"]":r.host;return r.id=r.protocol+"://"+s+":"+r.port+t,r.href=r.protocol+"://"+s+(n&&n.port===r.port?"":":"+r.port),r}(e,(t=t||{}).path||"/socket.io"),s=r.source,i=r.id,a=r.path,o=tE[i]&&a in tE[i].nsps;return t.forceNew||t["force new connection"]||!1===t.multiplex||o?n=new tC(s,t):(tE[i]||(tE[i]=new tC(s,t)),n=tE[i]),r.query&&!t.query&&(t.query=r.queryKey),n.socket(r.path,t)}function tM(e){if(e&&"object"==typeof e&&"clientId"in e){let t=e.clientId;if("string"==typeof t)return t}}function tO(e){return"runtime.enter"===e.op||"runtime.exit"===e.op}function tR(e){let{onFull:t,onPatch:n,onPresence:r,...s}=e,i=function(e){let{url:t,role:n,docId:r,name:s,token:i}=e,a=!1!==e.autoResync,o=t$(t,{auth:{token:i},autoConnect:!1}),l="disconnected",c=0,d="",h=[],u={patch:new Set,full:new Set,ack:new Set,presence:new Set,error:new Set,status:new Set};function p(e,t){for(let n of[...u[e]])n(t)}function m(e){l!==e&&(l=e,p("status",e))}function f(e){o.emit("def:request",{docId:r,sinceSeq:e})}function g(e){"number"==typeof e&&(a&&e>c+1&&f(c),c=Math.max(c,e))}function x(){p("presence",[...h])}function y(){return o.connected?Promise.resolve():new Promise((e,t)=>{m("connecting");let n=()=>{s(),e()},r=e=>{s(),t(e)},s=()=>{o.off("connect",n),o.off("connect_error",r)};o.once("connect",n),o.once("connect_error",r),o.connect()})}async function b(){return await y(),new Promise((e,t)=>{o.emit("bridge:join",{docId:r,role:n,name:s},n=>{if(!n||n.error){let e=n?.error??{code:"join_failed",message:"no join ack"};p("error",e),t(Error(`${e.code}: ${e.message}`));return}d=n.selfId,h=n.presence?[...n.presence]:[],c=n.snapshot?.seq??0,x(),e({selfId:d,snapshot:n.snapshot,presence:[...h]})})})}return o.on("connect",()=>m("connected")),o.on("disconnect",()=>m("disconnected")),o.on("connect_error",e=>{m("error"),p("error",{code:"connect_error",message:e?.message??String(e)})}),o.on("def:patch",e=>{g(e?.seq),e?.origin&&e.origin===d||p("patch",e)}),o.on("def:full",e=>{g(e?.seq),e?.origin&&e.origin===d||p("full",e)}),o.on("def:ack",e=>{p("ack",e)}),o.on("bridge:error",e=>{p("error",{code:e?.code??"error",message:e?.message??""})}),o.on("presence:list",e=>{h=Array.isArray(e)?[...e]:[],x()}),o.on("presence:join",e=>{let t=tM(e);t&&(h=[...h.filter(e=>e.clientId!==t),e],x())}),o.on("presence:leave",e=>{let t=tM(e);t&&(h=h.filter(e=>e.clientId!==t),x())}),o.on("presence:update",e=>{let t=tM(e);if(!t)return;let n=h.findIndex(e=>e.clientId===t);if(-1===n)h=[...h,e];else{let t={...h[n],...e};h=h.map((e,r)=>r===n?t:e)}x()}),{connect:y,join:b,emitPatch:function(e,t,n){o.emit("def:patch",{docId:r,ops:e,origin:d,baseSeq:n,mtime:t})},emitFull:function(e,t){o.emit("def:full",{docId:r,def:e,origin:d,mtime:t})},request:f,updatePresence:function(e){o.emit("presence:update",{docId:r,clientId:d,cursor:e.cursor,selection:e.selection})},on:function(e,t){let n=u[e];return n.add(t),()=>n.delete(t)},disconnect:function(){o.connected&&d&&o.emit("bridge:leave",{docId:r,clientId:d}),o.disconnect(),m("disconnected")},get status(){return l},get lastSeq(){return c},get presence(){return[...h]}}}(s),a=null,o=0,l=[],c=[],d={status:i.status,def:null,seq:0,presence:[],activeStates:[]},h=new Set;function u(){for(let e of(d={status:i.status,def:a,seq:o,presence:l,activeStates:c},[...h]))e()}return i.on("status",()=>u()),i.on("full",e=>{a=e.def,"number"==typeof e.seq&&(o=e.seq),t?.(e),u()}),i.on("patch",e=>{"number"==typeof e.seq&&(o=e.seq);let t=e.ops??[],r=t.filter(tO),s=t.filter(e=>!tO(e));s.length>0&&a&&(a=p(a,s));for(let e of r)"runtime.enter"===e.op?c.includes(e.state)||(c=[...c,e.state]):"runtime.exit"===e.op&&c.includes(e.state)&&(c=c.filter(t=>t!==e.state));n?.(e),u()}),i.on("presence",e=>{l=e,r?.(e),u()}),{getSnapshot:function(){return d},subscribe:function(e){return h.add(e),()=>{h.delete(e)}},emitPatch:function(e){i.emitPatch(e)},emitFull:function(e){i.emitFull(e)},enter:function(e,t,n){let r={op:"runtime.enter",state:e,...void 0!==t?{from:t}:{},...void 0!==n?{eventId:n}:{}};i.emitPatch([r])},exit:function(e){i.emitPatch([{op:"runtime.exit",state:e}])},connect:function(){i.join().then(e=>{a=e.snapshot.def,o=e.snapshot.seq,l=e.presence,null!==a&&t?.({docId:e.snapshot.docId,def:a,seq:o,mtime:e.snapshot.mtime,origin:"join"}),u()}).catch(()=>{u()})},disconnect:function(){i.disconnect()}}}function tA(){return{settings:{namespace:"MyApp",name:"MyStateMachine",asynchronous:!1},events:[{name:"Internal",events:[]}],state:{name:"Root",states:[{name:"Idle",kind:"normal"},{name:"End",kind:"final"}]}}}function tT(){return{positions:{}}}function tP(e,t){if(e.name===t)return e;for(let n of e.states??[]){let e=tP(n,t);if(e)return e}return null}function tI(e,t,n){return e.name===t?n(e)??e:{...e,states:e.states?.map(e=>tI(e,t,n))}}function tL(e,t){return{...e,states:e.states?.filter(e=>e.name!==t).map(e=>tL(e,t))}}function tD(e){let t=[e.name];for(let n of e.states??[])t.push(...tD(n));return t}function tB(e){return e.events.flatMap(e=>(e.events??[]).map(e=>e.id))}function tF(e){let t=[],n=tD(e.state),r=tB(e);0===r.length&&t.push({ruleId:"V001",message:"No events defined"});let s=new Set;for(let e of n)s.has(e)&&t.push({ruleId:"V002",message:`Duplicate state name: ${e}`,element:e}),s.add(e);!function e(s){for(let e of s.transitions??[])r.includes(e.event)||t.push({ruleId:"V003",message:`Transition in '${s.name}' references unknown event '${e.event}'`,element:s.name}),e.nextState&&!n.includes(e.nextState)&&t.push({ruleId:"V004",message:`Transition in '${s.name}' targets unknown state '${e.nextState}'`,element:s.name});for(let n of("final"===s.kind&&(s.transitions?.length??0)>0&&t.push({ruleId:"V007",message:`Final state '${s.name}' must not have outgoing transitions`,element:s.name}),"final"===s.kind&&(s.states?.length??0)>0&&t.push({ruleId:"V008",message:`Final state '${s.name}' must not have child states`,element:s.name}),s.states??[]))e(n)}(e.state),e.state.states&&0!==e.state.states.length||t.push({ruleId:"V005",message:"Root state must have at least one child state",element:e.state.name});let i=new Set;for(let e of r)i.has(e)&&t.push({ruleId:"V003",message:`Duplicate event ID: ${e}`,element:e}),i.add(e);return t}function tU(e,t){return{positions:{...N(e),...t.positions}}}Object.assign(t$,{Manager:tC,Socket:tN,io:t$,connect:t$});let tq=(s=(e,t)=>({definition:tA(),layout:tU(tA(),tT()),viewport:{...B},fileName:null,docPath:null,dirty:!1,remoteMtime:null,remoteStatus:"idle",remoteMessage:null,activeStates:[],presence:[],_applyingRemote:!1,selection:{kind:null,id:null},drawMode:"select",drawSource:null,contextMenu:{visible:!1,x:0,y:0,target:null},undoStack:[],redoStack:[],activeTab:"properties",errors:[],showCodePreview:!1,generatedCode:null,navigationPath:["Root"],currentParent:"Root",_pushHistory:()=>{let{definition:n,layout:r,undoStack:s}=t(),i={definition:JSON.parse(JSON.stringify(n)),layout:JSON.parse(JSON.stringify(r))};e({undoStack:[...s.slice(-50),i],redoStack:[]})},setDefinition:n=>{t()._pushHistory();let r=tU(n,t().layout);e({definition:n,layout:r,dirty:!0,errors:tF(n)})},updateSettings:n=>{t()._pushHistory(),e({definition:{...t().definition,settings:{...t().definition.settings,...n}},dirty:!0})},addState:(n,r)=>{t()._pushHistory();let s={...t().definition},i=n??s.state.name;s.state=tI(s.state,i,e=>({...e,states:[...e.states??[],r]}));let a=tU(s,t().layout);e({definition:s,layout:a,dirty:!0,errors:tF(s)})},updateState:(n,r)=>{t()._pushHistory();let s={...t().definition};s.state=tI(s.state,n,e=>({...e,...r})),e({definition:s,dirty:!0,errors:tF(s)})},removeState:n=>{t()._pushHistory();let r={...t().definition};r.state=tL(r.state,n);let s={positions:{...t().layout.positions}};delete s.positions[n],e({definition:r,layout:s,dirty:!0,errors:tF(r)})},nestState:(n,r)=>{t()._pushHistory();let s={...t().definition},i=tP(s.state,n);if(!i||n===r)return;let a=JSON.parse(JSON.stringify(i));s.state=tL(s.state,n),s.state=tI(s.state,r,e=>({...e,states:[...e.states??[],a]})),e({definition:s,dirty:!0,errors:tF(s)})},addEventSource:n=>{t()._pushHistory(),e({definition:{...t().definition,events:[...t().definition.events,n]},dirty:!0})},updateEventSource:(n,r)=>{t()._pushHistory();let s={...t().definition};s.events=s.events.map((e,t)=>t===n?{...e,...r}:e),e({definition:s,dirty:!0})},removeEventSource:n=>{t()._pushHistory();let r={...t().definition};r.events=r.events.filter((e,t)=>t!==n),e({definition:r,dirty:!0,errors:tF(r)})},addEvent:(n,r=0)=>{t()._pushHistory();let s={...t().definition},i=s.events[r]??{name:"Internal",events:[]};i.events=[...i.events??[],n],s.events=s.events.map((e,t)=>t===r?i:e),e({definition:s,dirty:!0,errors:tF(s)})},updateEvent:(n,r)=>{t()._pushHistory();let s={...t().definition};s.events=s.events.map(e=>({...e,events:e.events?.map(e=>e.id===n?{...e,...r}:e)})),e({definition:s,dirty:!0})},removeEvent:n=>{t()._pushHistory();let r={...t().definition};r.events=r.events.map(e=>({...e,events:e.events?.filter(e=>e.id!==n)})),e({definition:r,dirty:!0,errors:tF(r)})},addParameter:(n,r)=>{t()._pushHistory();let s={...t().definition};s.events=s.events.map(e=>({...e,events:e.events?.map(e=>e.id===n?{...e,parameters:[...e.parameters??[],r]}:e)})),e({definition:s,dirty:!0})},removeParameter:(n,r)=>{t()._pushHistory();let s={...t().definition};s.events=s.events.map(e=>({...e,events:e.events?.map(e=>e.id===n?{...e,parameters:e.parameters?.filter((e,t)=>t!==r)}:e)})),e({definition:s,dirty:!0})},updateParameter:(n,r,s)=>{t()._pushHistory();let i={...t().definition};i.events=i.events.map(e=>({...e,events:e.events?.map(e=>e.id===n?{...e,parameters:e.parameters?.map((e,t)=>t===r?{...e,...s}:e)}:e)})),e({definition:i,dirty:!0})},addAction:(n,r,s)=>{t()._pushHistory();let i={...t().definition};i.state=tI(i.state,n,e=>{let t=e[r]??{actions:[]};return{...e,[r]:{actions:[...t.actions,s]}}}),e({definition:i,dirty:!0})},removeAction:(n,r,s)=>{t()._pushHistory();let i={...t().definition};i.state=tI(i.state,n,e=>{let t=e[r];return t?{...e,[r]:{actions:t.actions.filter((e,t)=>t!==s)}}:e}),e({definition:i,dirty:!0})},updateAction:(n,r,s,i)=>{t()._pushHistory();let a={...t().definition};a.state=tI(a.state,n,e=>{let t=e[r];return t?{...e,[r]:{actions:t.actions.map((e,t)=>t===s?i:e)}}:e}),e({definition:a,dirty:!0})},addTransition:(n,r)=>{t()._pushHistory();let s={...t().definition};s.state=tI(s.state,n,e=>({...e,transitions:[...e.transitions??[],r]})),e({definition:s,dirty:!0,errors:tF(s)})},updateTransition:(n,r,s)=>{t()._pushHistory();let i={...t().definition};i.state=tI(i.state,n,e=>({...e,transitions:e.transitions?.map((e,t)=>t===r?{...e,...s}:e)})),e({definition:i,dirty:!0})},removeTransition:(n,r)=>{t()._pushHistory();let s={...t().definition};s.state=tI(s.state,n,e=>({...e,transitions:e.transitions?.filter((e,t)=>t!==r)})),e({definition:s,dirty:!0,errors:tF(s)})},setStatePosition:(n,r)=>{e({layout:{positions:{...t().layout.positions,[n]:r}}})},arrangeLayout:()=>{t()._pushHistory(),e({layout:{positions:N(t().definition)}})},hydrateLayout:(n,r)=>{e({layout:{positions:{...t().layout.positions,...n}},...r?{viewport:r}:{}})},setViewport:t=>e({viewport:t}),select:(t,n)=>e({selection:{kind:t,id:n}}),clearSelection:()=>e({selection:{kind:null,id:null}}),setDrawMode:t=>e({drawMode:t,drawSource:null}),setDrawSource:t=>e({drawSource:t}),showContextMenu:(t,n,r)=>e({contextMenu:{visible:!0,x:t,y:n,target:r}}),hideContextMenu:()=>e({contextMenu:{visible:!1,x:0,y:0,target:null}}),undo:()=>{let{undoStack:n,definition:r,layout:s}=t();if(0===n.length)return;let i=n[n.length-1],a={definition:JSON.parse(JSON.stringify(r)),layout:JSON.parse(JSON.stringify(s))};e({definition:i.definition,layout:i.layout,undoStack:n.slice(0,-1),redoStack:[...t().redoStack,a],dirty:!0,errors:tF(i.definition)})},redo:()=>{let{redoStack:n,definition:r,layout:s}=t();if(0===n.length)return;let i=n[n.length-1],a={definition:JSON.parse(JSON.stringify(r)),layout:JSON.parse(JSON.stringify(s))};e({definition:i.definition,layout:i.layout,undoStack:[...t().undoStack,a],redoStack:n.slice(0,-1),dirty:!0,errors:tF(i.definition)})},canUndo:()=>t().undoStack.length>0,canRedo:()=>t().redoStack.length>0,setActiveTab:t=>e({activeTab:t}),loadFromJson:(t,n)=>{try{let r=JSON.parse(t),s=r.stateMachine??r.StateMachine??r,i=tU(s,tT()),a=s.state?.name??"Root";e({definition:s,layout:i,fileName:n??null,dirty:!1,errors:tF(s),selection:{kind:null,id:null},undoStack:[],redoStack:[],navigationPath:[a],currentParent:a})}catch(e){console.error("Failed to parse definition:",e)}},exportJson:()=>{let{definition:e}=t();return JSON.stringify({stateMachine:e},null,2)},applyRemote:(n,r,s)=>{try{let i=JSON.parse(n),a=i.stateMachine??i.StateMachine??i,o=tU(a,t().layout),l=a.state?.name??"Root",c=t(),d=new Set(tD(a.state)),h=c.navigationPath.filter(e=>d.has(e)),u=h.length?h:[l],p=u[u.length-1],m=c.selection,f=("state"===m.kind?!!m.id&&d.has(m.id):"transition"===m.kind?!!m.id&&d.has(m.id.split(":")[0]):"event"===m.kind&&!!m.id&&tB(a).includes(m.id))?m:{kind:null,id:null};e({definition:a,layout:o,fileName:s??t().fileName,dirty:!1,remoteMtime:r,remoteStatus:"synced",remoteMessage:null,errors:tF(a),selection:f,navigationPath:u,currentParent:p})}catch(t){e({remoteStatus:"error",remoteMessage:String(t)})}},setRemoteStatus:(t,n=null)=>e({remoteStatus:t,remoteMessage:n}),setRemoteMtime:t=>e({remoteMtime:t}),setDocPath:t=>e({docPath:t||null}),enterState:n=>{let r=t().activeStates;r.includes(n)||e({activeStates:[...r,n]})},exitState:n=>{let r=t().activeStates;r.includes(n)&&e({activeStates:r.filter(e=>e!==n)})},setPresence:t=>e({presence:t}),applyRemoteOps:(n,r,s)=>{e({_applyingRemote:!0});try{let s=t(),i=n.filter(e=>"runtime.enter"!==e.op&&"runtime.exit"!==e.op),a=i.length?p(s.definition,i):s.definition,o=s.activeStates;for(let e of n)"runtime.enter"===e.op?o.includes(e.state)||(o=[...o,e.state]):"runtime.exit"===e.op&&o.includes(e.state)&&(o=o.filter(t=>t!==e.state));let l=tU(a,s.layout),c=a.state?.name??"Root",d=new Set(tD(a.state)),h=s.navigationPath.filter(e=>d.has(e)),u=h.length?h:[c],m=u[u.length-1],f=s.selection,g=("state"===f.kind?!!f.id&&d.has(f.id):"transition"===f.kind?!!f.id&&d.has(f.id.split(":")[0]):"event"===f.kind&&!!f.id&&tB(a).includes(f.id))?f:{kind:null,id:null};e({definition:a,layout:l,activeStates:o,dirty:!1,remoteMtime:r,remoteStatus:"synced",remoteMessage:null,errors:tF(a),selection:g,navigationPath:u,currentParent:m})}catch(t){e({remoteStatus:"error",remoteMessage:String(t)})}finally{e({_applyingRemote:!1})}},validate:()=>{let n=tF(t().definition);return e({errors:n}),n},setGeneratedCode:t=>e({generatedCode:t}),setShowCodePreview:t=>e({showCodePreview:t}),navigateInto:n=>{let{definition:r,navigationPath:s}=t(),i=tP(r.state,n);i&&(i.states?.length??0)>0&&e({navigationPath:[...s,n],currentParent:n,selection:{kind:null,id:null}})},navigateUp:n=>{let{navigationPath:r}=t();if(r.length<=1)return;let s=n??r.length-2,i=r.slice(0,s+1);e({navigationPath:i,currentParent:i[i.length-1],selection:{kind:null,id:null}})},getCurrentChildren:()=>{let{definition:e,currentParent:n}=t(),r=tP(e.state,n);return r?.states??[]}}))?eS(s):eS,tY="canvas",tH=`[data-pinch-owner="${tY}"]`;function tX(e){return!!e&&"function"==typeof e.closest&&null!==e.closest(tH)}let tJ="stateloom-canvas",tV="#030712",tz=["png","jpeg","svg","mermaid","markdown"],tK={png:"PNG",jpeg:"JPEG",svg:"SVG",mermaid:"Mermaid",markdown:"Markdown"},tW={png:"image/png",jpeg:"image/jpeg",svg:"image/svg+xml",mermaid:"text/vnd.mermaid",markdown:"text/markdown"},tG={png:"png",jpeg:"jpg",svg:"svg",mermaid:"mmd",markdown:"md"};async function tQ(e,t,n={}){var r,s,i;let a;if("mermaid"===e||"markdown"===e){let n,i;a=new Blob([(r=t.definition,s="markdown"===e,n=["stateDiagram-v2"],r.state&&function e(t,n,r){let s=J(t);if(0===s.length)return;let i=" ".repeat(n+1),a=new Set;for(let e of s)for(let t of e.transitions??[]){if(!t.nextState)continue;let n=t.condition?`${t.event} [${t.condition}]`:t.event;r.push(`${i}${e.name} --> ${t.nextState} : ${n}`),a.add(e.name),a.add(t.nextState)}for(let e of s)a.has(e.name)||r.push(`${i}${e.name}`);for(let t of s)0!==J(t).length&&(r.push(`${i}state ${t.name} {`),e(t,n+1,r),r.push(`${i}}`))}(r.state,0,n),i=n.join("\n"),s?`\`\`\`mermaid
2
+ ${i}
3
+ \`\`\`
4
+ `:`${i}
5
+ `)],{type:`${tW[e]};charset=utf-8`})}else{let t=function(e={}){let t="u"<typeof document?null:document.getElementById(tJ);if(!t)return null;let n=function(e){let t=e.querySelector(":scope > g");if(!t)return null;try{let e=t.getBBox();return e.width>0&&e.height>0?e:null}catch{return null}}(t);if(!n)return null;let r=e.padding??48,s=e.background??tV,i=Math.round(n.x-r),a=Math.round(n.y-r),o=Math.round(n.width+2*r),l=Math.round(n.height+2*r),c=t.cloneNode(!0);c.removeAttribute("id"),c.removeAttribute("class"),c.removeAttribute("style"),c.setAttribute("xmlns","http://www.w3.org/2000/svg"),c.setAttribute("width",String(o)),c.setAttribute("height",String(l)),c.setAttribute("viewBox",`${i} ${a} ${o} ${l}`),c.setAttribute("font-family","ui-sans-serif, system-ui, -apple-system, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif"),function e(t){for(let n of Array.from(t.children)){if("transparent"===n.getAttribute("fill")||"transparent"===n.getAttribute("stroke")){n.remove();continue}n.removeAttribute("class"),n.removeAttribute("style"),e(n)}}(c);let d=c.querySelector(":scope > g");d?.removeAttribute("transform");let h=document.createElementNS("http://www.w3.org/2000/svg","rect");return h.setAttribute("x",String(i)),h.setAttribute("y",String(a)),h.setAttribute("width",String(o)),h.setAttribute("height",String(l)),h.setAttribute("fill",s),c.insertBefore(h,c.firstChild),new XMLSerializer().serializeToString(c)}(n);if(!t)throw Error("nothing on the board to export yet");a="svg"===e?new Blob([t],{type:`${tW.svg};charset=utf-8`}):await (i=n.scale??2,new Promise((n,r)=>{let s=t.match(/width="(\d+)"\s+height="(\d+)"/),a=s?Number(s[1]):1200,o=s?Number(s[2]):800,l=URL.createObjectURL(new Blob([t],{type:"image/svg+xml;charset=utf-8"})),c=new Image;c.onload=()=>{URL.revokeObjectURL(l);let t=document.createElement("canvas");t.width=Math.max(1,Math.round(a*i)),t.height=Math.max(1,Math.round(o*i));let s=t.getContext("2d");s?(s.fillStyle=tV,s.fillRect(0,0,t.width,t.height),s.drawImage(c,0,0,t.width,t.height),t.toBlob(e=>e?n(e):r(Error("the canvas produced no image")),tW[e],"jpeg"===e?.92:void 0)):r(Error("this browser gave no 2d context to draw into"))},c.onerror=()=>{URL.revokeObjectURL(l),r(Error("the browser could not read the serialized board"))},c.src=l}))}let o=function({doc:e,machine:t,format:n,at:r}){let s,i,a=el(t??"")||el(e?(e.split(/[/\\]/).pop()??e).replace(/\.smdf\.json$/i,"").replace(/\.json$/i,""):"")||"statemachine",o=e&&(s=e.match(/(?:^|[/\\-])ep(?:isode)?-?(\d{2,4})(?:[/\\-]|$)/i))?`ep${s[1]}`:null,l=o?`${o}--`:"";return`${l}${a}--${(i=e=>String(e).padStart(2,"0"))(r.getFullYear()%100)+i(r.getMonth()+1)+i(r.getDate())+i(r.getHours())+i(r.getMinutes())+i(r.getSeconds())}.${n}`}({doc:t.docPath??t.fileName??null,machine:t.definition?.settings?.name??null,format:tG[e]??String(e),at:(void 0)??new Date}),l=URL.createObjectURL(a),c=document.createElement("a");return c.href=l,c.download=o,c.click(),URL.revokeObjectURL(l),o}let tZ="stateloom.layout.v1:";async function t0(){try{let{requestedDoc:t,docQuery:n}=await e.A(32058),r=await fetch(`/api/file${n(t())}`,{cache:"no-store"});if(r.ok){let e=(await r.json())?.path;if("string"==typeof e&&e.length>0)return e}}catch{}return tq.getState().fileName??"untitled"}function t1(){let e,t,n=tq(e=>e.definition),r=tq(e=>e.layout),s=tq(e=>e.selection),i=tq(e=>e.select),a=tq(e=>e.clearSelection),c=tq(e=>e.setStatePosition),d=tq(e=>e.drawMode),h=tq(e=>e.drawSource),u=tq(e=>e.setDrawSource),p=tq(e=>e.setDrawMode),m=tq(e=>e.addTransition),f=tq(e=>e.showContextMenu),g=tq(e=>e.removeState),x=tq(e=>e.undo),y=tq(e=>e.redo),b=tq(e=>e.errors),v=tq(e=>e.navigationPath),w=tq(e=>e.navigateInto),j=tq(e=>e.navigateUp),k=tq(e=>e.activeStates),S=tq(e=>e.viewport),_=tq(e=>e.setViewport);e=(0,l.useRef)(!1),t=(0,l.useRef)(null),(0,l.useEffect)(()=>{let n=!1,r=null;(async()=>{let r=await t0();if(n)return;t.current=r;let s=function(e){try{let t=window.localStorage.getItem(`${tZ}${e}`);if(!t)return null;let n=JSON.parse(t),r={};for(let[e,t]of Object.entries(n?.positions??{}))t&&"object"==typeof t&&Number.isFinite(t.x)&&Number.isFinite(t.y)&&Number.isFinite(t.width)&&Number.isFinite(t.height)&&(r[e]=t);return{positions:r,viewport:function(e,t=D){return e?{x:Number.isFinite(e.x)?e.x:0,y:Number.isFinite(e.y)?e.y:0,scale:F(e.scale??1,t)}:{...B}}(n?.viewport)}}catch{return null}}(r);s&&tq.getState().hydrateLayout(s.positions,s.viewport),e.current=!0})();let s=tq.subscribe((n,s)=>{e.current&&t.current&&(n.layout!==s.layout||n.viewport!==s.viewport)&&(r&&clearTimeout(r),r=setTimeout(()=>{let e=tq.getState();!function(e,t,n){try{window.localStorage.setItem(`${tZ}${e}`,JSON.stringify({positions:t,viewport:n,savedAt:Date.now()}))}catch{}}(t.current,function(e,t){let n={};for(let[r,s]of Object.entries(e)){let e=t[r];e&&(s.x!==e.x||s.y!==e.y||s.width!==e.width||s.height!==e.height)&&(n[r]=s)}return n}(e.layout.positions,N(e.definition)),e.viewport)},300))});return()=>{n=!0,r&&clearTimeout(r),s()}},[]);let C=v.slice(1);return(0,o.jsx)(eb,{definition:n,positions:r.positions,path:C,rootLabel:v[0],viewport:S,onViewportChange:_,selection:{kind:"state"===s.kind||"transition"===s.kind?s.kind:null,id:s.id},activeStates:k,errorElements:b.flatMap(e=>e.element?[e.element]:[]),drawMode:"transition"===d?"transition":"select",drawSource:h,svgId:tJ,pinchOwner:tY,emptyHint:window.matchMedia?.("(pointer: coarse)").matches?"Press and hold to add a state, or load a .smdf.json file":"Right-click to add a state, or load a .smdf.json file",onSelect:(e,t)=>{"state"!==e||"transition"!==d||h?i(e,t):u(t)},onClearSelection:a,onStateMove:c,onNavigateInto:w,onNavigateTo:e=>j(e),onContextMenu:(e,t,n)=>f(e,t,"state"===n.kind?{kind:"state",id:n.id}:{kind:"canvas"}),onCreateTransition:(e,t,n)=>{m(e,{event:n,nextState:t}),u(null),p("select")},onCancelDraw:()=>{p("select"),u(null)},onDeleteState:e=>{g(e),a()},onUndo:x,onRedo:y})}function t2({label:e,actions:t,onChange:n}){let r=(e,r)=>n(t.map((t,n)=>n===e?{...t,...r}:t));return(0,o.jsxs)("div",{children:[(0,o.jsxs)("div",{className:"flex items-center justify-between",children:[(0,o.jsx)("span",{className:"text-xs font-medium text-gray-500",children:e}),(0,o.jsx)("button",{onClick:()=>n([...t,{action:"code",code:""}]),className:"text-xs text-blue-500 hover:text-blue-400",children:"+ action"})]}),t.map((e,s)=>(0,o.jsxs)("div",{className:"flex items-start gap-1 mt-1",children:[(0,o.jsxs)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:e.action,onChange:e=>r(s,{action:e.target.value}),children:[(0,o.jsx)("option",{value:"code",children:"Code"}),(0,o.jsx)("option",{value:"timerStart",children:"Timer Start"}),(0,o.jsx)("option",{value:"timerStop",children:"Timer Stop"})]}),"code"===e.action?(0,o.jsx)("textarea",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200 h-10 font-mono",value:e.code??"",placeholder:"// action code...",onChange:e=>r(s,{code:e.target.value})}):(0,o.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-xs text-gray-200",value:e.name??"",placeholder:"Timer name",onChange:e=>r(s,{name:e.target.value})}),(0,o.jsx)("button",{onClick:()=>n(t.filter((e,t)=>t!==s)),className:"text-red-600 hover:text-red-400 text-xs mt-0.5",children:"✕"})]},s)),0===t.length&&(0,o.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]})}function t5(){let e=tq(e=>e.definition),t=tq(e=>e.selection),n=tq(e=>e.updateState),r=tq(e=>e.removeState);tq(e=>e.addAction),tq(e=>e.removeAction);let s=tq(e=>e.updateTransition),i=tq(e=>e.removeTransition);if(!t.kind||!t.id)return(0,o.jsx)("div",{className:"p-3 text-xs text-gray-500",children:"Select a state or transition to edit its properties."});let a=(e,t)=>{if(e.name===t)return e;for(let n of e.states??[]){let e=a(n,t);if(e)return e}return null};if("state"===t.kind){let s=a(e.state,t.id);if(!s)return(0,o.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"State not found"});let l=s.onEntry?.actions??[],c=s.onExit?.actions??[];return(0,o.jsxs)("div",{className:"p-3 space-y-3 text-sm md:overflow-y-auto md:max-h-[calc(100vh-160px)]",children:[(0,o.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["State: ",s.name]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:s.name,onChange:e=>n(t.id,{name:e.target.value})})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Kind"}),(0,o.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:s.kind??"normal",onChange:e=>n(t.id,{kind:e.target.value}),children:[(0,o.jsx)("option",{value:"normal",children:"Normal"}),(0,o.jsx)("option",{value:"final",children:"Final"}),(0,o.jsx)("option",{value:"history",children:"History"})]})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,o.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:s.description??"",onChange:e=>n(t.id,{description:e.target.value||void 0})})]}),(0,o.jsx)(t2,{label:"▸ onEntry Actions",actions:l,onChange:e=>n(t.id,{onEntry:{actions:e}})}),(0,o.jsx)(t2,{label:"◂ onExit Actions",actions:c,onChange:e=>n(t.id,{onExit:{actions:e}})}),(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"text-xs font-medium text-gray-500",children:"Transitions"}),(s.transitions??[]).map((e,n)=>(0,o.jsxs)("div",{className:"flex items-center gap-1 text-xs text-gray-400 py-1 border-b border-gray-800/50",children:[(0,o.jsxs)("span",{className:"flex-1",children:[e.event," → ",e.nextState??"(internal)"]}),e.condition&&(0,o.jsxs)("span",{className:"text-gray-600",children:["[",e.condition,"]"]}),(0,o.jsx)("button",{onClick:()=>i(t.id,n),className:"text-red-600 hover:text-red-400",children:"✕"})]},n)),(s.transitions?.length??0)===0&&(0,o.jsx)("span",{className:"text-xs text-gray-700 italic",children:"none"})]}),(0,o.jsx)("button",{onClick:()=>r(t.id),className:"text-red-500 hover:text-red-400 text-xs mt-2",children:"🗑 Delete State"})]})}if("transition"===t.kind){let[n,r]=t.id.split(":"),l=parseInt(r,10),c=a(e.state,n),d=c?.transitions?.[l];if(!d)return(0,o.jsx)("div",{className:"p-3 text-gray-500 text-xs",children:"Transition not found"});let h=tB(e),u=(function e(t){let n=[t];for(let r of t.states??[])n.push(...e(r));return n})(e.state).map(e=>e.name).filter(e=>"Root"!==e);return(0,o.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,o.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Transition"}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Event"}),(0,o.jsx)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:d.event,onChange:e=>s(n,l,{event:e.target.value}),children:h.map(e=>(0,o.jsx)("option",{value:e,children:e},e))})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Target State"}),(0,o.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:d.nextState??"",onChange:e=>s(n,l,{nextState:e.target.value||void 0}),children:[(0,o.jsx)("option",{value:"",children:"(internal transition)"}),u.map(e=>(0,o.jsx)("option",{value:e,children:e},e))]})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Condition (guard)"}),(0,o.jsx)("textarea",{rows:3,className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200 resize-y leading-snug",value:d.condition??"",onChange:e=>s(n,l,{condition:e.target.value||void 0})})]}),(0,o.jsx)("button",{onClick:()=>i(n,l),className:"text-red-500 hover:text-red-400 text-xs",children:"🗑 Delete Transition"})]})}return null}let t4=["string","int","float","bool","object"];function t3(){let e=tq(e=>e.definition),t=tq(e=>e.addEvent),n=tq(e=>e.updateEvent),r=tq(e=>e.removeEvent),s=tq(e=>e.addParameter),i=tq(e=>e.removeParameter),a=tq(e=>e.updateParameter),c=tq(e=>e.updateEventSource),d=tq(e=>e.select),h=tq(e=>e.selection),[u,p]=(0,l.useState)(""),[m,f]=(0,l.useState)(null),[g,x]=(0,l.useState)(null);return(0,o.jsxs)("div",{className:"p-3 text-sm",children:[e.events.map((e,t)=>(0,o.jsxs)("div",{className:"mb-3",children:[(0,o.jsxs)("div",{className:"flex items-center gap-2 mb-1",children:[(0,o.jsx)("span",{className:"text-xs font-semibold text-gray-500",children:"Source:"}),(0,o.jsx)("input",{className:"flex-1 bg-transparent border-b border-gray-700 text-xs text-gray-300 px-1 py-0.5 focus:border-blue-500 outline-none",value:e.name,onChange:e=>c(t,{name:e.target.value})}),void 0!==e.feeder&&(0,o.jsx)("input",{className:"w-24 bg-transparent border-b border-gray-700 text-xs text-gray-400 px-1 py-0.5 focus:border-blue-500 outline-none",value:e.feeder??"",placeholder:"Feeder...",onChange:e=>c(t,{feeder:e.target.value||void 0})}),void 0===e.feeder&&(0,o.jsx)("button",{className:"text-xs text-gray-600 hover:text-gray-400",title:"Add feeder class",onClick:()=>c(t,{feeder:`${e.name}Feeder`}),children:"+feeder"})]}),(0,o.jsx)("div",{className:"-mx-1 overflow-x-auto px-1",children:(0,o.jsxs)("table",{className:"w-full text-xs",children:[(0,o.jsx)("thead",{children:(0,o.jsxs)("tr",{className:"text-gray-600 border-b border-gray-800",children:[(0,o.jsx)("th",{className:"text-left py-1 font-medium",children:"ID"}),(0,o.jsx)("th",{className:"text-left py-1 font-medium",children:"Description"}),(0,o.jsx)("th",{className:"text-left py-1 font-medium",children:"Params"}),(0,o.jsx)("th",{className:"w-6"})]})}),(0,o.jsx)("tbody",{children:(e.events??[]).map(e=>(0,o.jsxs)(l.Fragment,{children:[(0,o.jsxs)("tr",{className:`border-b border-gray-800/50 hover:bg-gray-800/30 cursor-pointer ${"event"===h.kind&&h.id===e.id?"bg-blue-900/30":""}`,onClick:()=>{d("event",e.id),f(m===e.id?null:e.id)},children:[(0,o.jsx)("td",{className:"py-1 pr-1",children:g===e.id?(0,o.jsx)("input",{autoFocus:!0,className:"w-full bg-gray-800 border border-gray-700 rounded px-1 text-gray-200",value:e.id,onChange:t=>n(e.id,{id:t.target.value}),onBlur:()=>x(null),onKeyDown:e=>"Enter"===e.key&&x(null),onClick:e=>e.stopPropagation()}):(0,o.jsx)("span",{className:"text-gray-300",onDoubleClick:t=>{t.stopPropagation(),x(e.id)},children:e.id})}),(0,o.jsx)("td",{className:"py-1 pr-1 text-gray-500 truncate max-w-[80px]",children:e.description??"—"}),(0,o.jsx)("td",{className:"py-1 text-gray-500",children:(e.parameters?.length??0)>0?e.parameters.map(e=>`${e.name}:${e.type}`).join(", "):"—"}),(0,o.jsx)("td",{className:"py-1",children:(0,o.jsx)("button",{onClick:t=>{t.stopPropagation(),r(e.id)},className:"text-red-600 hover:text-red-400",children:"✕"})})]}),m===e.id&&(0,o.jsx)("tr",{children:(0,o.jsx)("td",{colSpan:4,className:"py-2 px-1 bg-gray-900/50",children:(0,o.jsxs)("div",{className:"space-y-2",children:[(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-gray-600",children:"Description"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-gray-200 mt-0.5",value:e.description??"",onChange:t=>n(e.id,{description:t.target.value||void 0})})]}),(0,o.jsxs)("div",{children:[(0,o.jsx)("span",{className:"text-gray-600",children:"Parameters"}),(e.parameters??[]).map((t,n)=>(0,o.jsxs)("div",{className:"flex items-center gap-1 mt-1",children:[(0,o.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:t.name,placeholder:"name",onChange:t=>a(e.id,n,{name:t.target.value})}),(0,o.jsx)("select",{className:"bg-gray-800 border border-gray-700 rounded px-1 py-0.5 text-gray-200",value:t.type,onChange:t=>a(e.id,n,{type:t.target.value}),children:t4.map(e=>(0,o.jsx)("option",{value:e,children:e},e))}),(0,o.jsx)("button",{onClick:()=>i(e.id,n),className:"text-red-600 hover:text-red-400",children:"✕"})]},n)),(0,o.jsx)("button",{className:"text-blue-500 hover:text-blue-400 mt-1",onClick:()=>s(e.id,{name:"param",type:"string"}),children:"+ parameter"})]}),(0,o.jsxs)("div",{className:"mt-1",children:[(0,o.jsx)("span",{className:"text-gray-600",children:"Generated method:"}),(0,o.jsxs)("code",{className:"block bg-gray-800 rounded px-2 py-1 text-green-400 mt-0.5 font-mono",children:["on_",e.id.toLowerCase(),"(context",(e.parameters??[]).map(e=>`, ${e.name}: ${e.type}`).join(""),")"]})]})]})})})]},e.id))})]})})]},t)),(0,o.jsxs)("div",{className:"flex gap-1 mt-2",children:[(0,o.jsx)("input",{className:"flex-1 bg-gray-800 border border-gray-700 rounded px-2 py-1 text-gray-200",placeholder:"New event ID...",value:u,onChange:e=>p(e.target.value),onKeyDown:e=>{"Enter"===e.key&&u.trim()&&(t({id:u.trim()}),p(""))}}),(0,o.jsx)("button",{onClick:()=>{u.trim()&&(t({id:u.trim()}),p(""))},className:"bg-blue-600 hover:bg-blue-500 text-white px-2 py-1 rounded",children:"+"})]})]})}function t6(){let e=tq(e=>e.definition.settings),t=tq(e=>e.definition.settings.context),n=tq(e=>e.updateSettings);return(0,o.jsxs)("div",{className:"p-3 space-y-3 text-sm",children:[(0,o.jsx)("h3",{className:"text-xs font-semibold text-gray-400",children:"Machine Settings"}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Namespace"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.namespace,onChange:e=>n({namespace:e.target.value})})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Name"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-sm text-gray-200",value:e.name??"",onChange:e=>n({name:e.target.value||void 0})})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Description"}),(0,o.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12",value:e.description??"",onChange:e=>n({description:e.target.value||void 0})})]}),(0,o.jsxs)("label",{className:"flex items-center gap-2 text-sm text-gray-300",children:[(0,o.jsx)("input",{type:"checkbox",checked:e.asynchronous,onChange:e=>n({asynchronous:e.target.checked}),className:"rounded bg-gray-800 border-gray-600"}),"Asynchronous"]}),(0,o.jsx)("hr",{className:"border-gray-800"}),(0,o.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Context"}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Context Class"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:t?.class??"",placeholder:"e.g. MyStateMachineContext",onChange:e=>n({context:{...t,class:e.target.value||void 0}})})]}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Base Class"}),(0,o.jsx)("input",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:t?.baseClass??"",placeholder:"e.g. Context",onChange:e=>n({context:{...t,baseClass:e.target.value||void 0}})})]}),(0,o.jsx)("hr",{className:"border-gray-800"}),(0,o.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Imports"}),(0,o.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-16 font-mono",value:(e.imports??[]).join("\n"),placeholder:"One import per line",onChange:e=>n({imports:e.target.value?e.target.value.split("\n"):[]})}),(0,o.jsx)("hr",{className:"border-gray-800"}),(0,o.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Object References"}),(0,o.jsx)("textarea",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200 h-12 font-mono",value:(e.objects??[]).map(e=>`${e.instance}: ${e.class}`).join("\n"),placeholder:"instance: Class (one per line)",onChange:e=>{n({objects:e.target.value.split("\n").filter(e=>e.includes(":")).map(e=>{let[t,n]=e.split(":").map(e=>e.trim());return{instance:t,class:n}})})}}),(0,o.jsx)("hr",{className:"border-gray-800"}),(0,o.jsx)("h4",{className:"text-xs font-semibold text-gray-500",children:"Code Generation"}),(0,o.jsxs)("label",{className:"block",children:[(0,o.jsx)("span",{className:"text-xs text-gray-500",children:"Target Language"}),(0,o.jsxs)("select",{className:"w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-xs text-gray-200",value:e.targetLanguage??"python",onChange:e=>n({targetLanguage:e.target.value}),children:[(0,o.jsx)("option",{value:"python",children:"Python"}),(0,o.jsx)("option",{value:"typescript",children:"TypeScript"}),(0,o.jsx)("option",{value:"csharp",children:"C#"})]})]})]})}function t8(){let e=tq(e=>e.errors),t=tq(e=>e.validate),n=tq(e=>e.select);return(0,o.jsxs)("div",{className:"p-3",children:[(0,o.jsxs)("div",{className:"flex items-center justify-between mb-2",children:[(0,o.jsxs)("h3",{className:"text-xs font-semibold text-gray-400",children:["Validation ",e.length>0&&(0,o.jsxs)("span",{className:"text-red-500",children:["(",e.length,")"]})]}),(0,o.jsx)("button",{onClick:()=>t(),className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-2 py-0.5 rounded",children:"Re-check"})]}),0===e.length?(0,o.jsxs)("div",{className:"flex items-center gap-2 text-green-500 text-xs",children:[(0,o.jsx)("span",{children:"✓"}),(0,o.jsx)("span",{children:"Definition is valid"})]}):(0,o.jsx)("div",{className:"space-y-0.5",children:e.map((e,t)=>(0,o.jsxs)("div",{className:`flex items-start gap-1.5 text-[13px] py-2.5 border-b border-gray-800/50 md:text-xs md:py-1 ${e.element?"cursor-pointer hover:bg-gray-800/30":""}`,onClick:()=>{e.element&&n("state",e.element)},title:e.element?`Click to select "${e.element}"`:void 0,children:[(0,o.jsx)("span",{className:`font-mono text-[10px] mt-0.5 ${"error"===e.severity?"text-red-600":"text-yellow-600"}`,children:e.ruleId}),(0,o.jsx)("span",{className:`flex-1 ${"error"===e.severity?"text-red-400":"text-yellow-400"}`,children:e.message}),e.element&&(0,o.jsxs)("span",{className:"text-gray-600 text-[10px]",children:["→ ",e.element]})]},t))})]})}var t7=e.i(76800);function t9(){let e=(0,t7.useRequestedDoc)(),[t,n]=(0,l.useState)(!1),[r,s]=(0,l.useState)(""),[i,a]=(0,l.useState)(null),[c,d]=(0,l.useState)([]),[h,u]=(0,l.useState)(null),[p,m]=(0,l.useState)(null);(0,l.useEffect)(()=>{if(!t)return;let e=!0;return m(null),fetch("/api/docs",{cache:"no-store"}).then(e=>e.ok?e.json():Promise.reject(Error(`HTTP ${e.status}`))).then(t=>{e&&(a(t.docs??[]),d(t.roots??[]),u(t.current??null))}).catch(t=>{e&&(a([]),m(t.message))}),()=>{e=!1}},[t]);let f=e=>{n(!1),s(""),(0,t7.navigateToDoc)(e)},g=new Set((i??[]).map(e=>e.path)),x=t?(function(){try{let e=[];for(let t=0;t<window.localStorage.length;t++){let n=window.localStorage.key(t);n?.startsWith(tZ)&&e.push(n.slice(tZ.length))}return e.sort()}catch{return[]}})().filter(t=>t.startsWith("/")&&t!==e&&!g.has(t)):[],y=e??h,b=(i??[]).filter(e=>e.path!==y),v=r.trim().toLowerCase(),w=v?b.filter(e=>e.path.toLowerCase().includes(v)):b,j="block w-full truncate rounded px-1.5 py-1 text-left text-xs text-gray-300 hover:bg-gray-800";return(0,o.jsxs)("span",{className:"relative inline-flex",children:[(0,o.jsx)("button",{onClick:()=>n(e=>!e),className:"toolbar-btn",title:e?`Document: ${e}`:"Switch document",children:"⇄"}),t&&(0,o.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 w-80 rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,o.jsx)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:"switch document"}),(0,o.jsxs)("form",{onSubmit:e=>{e.preventDefault();let t=r.trim();if(t){if(1===w.length)return f(w[0].path);if(t.startsWith("/"))return f(t)}},className:"mb-1 flex gap-1",children:[(0,o.jsx)("input",{value:r,onChange:e=>s(e.target.value),placeholder:null===i?"loading…":"filter, or /absolute/path.json",className:"min-w-0 flex-1 rounded border border-gray-700 bg-gray-950 px-1.5 py-1 text-xs text-gray-200 placeholder:text-gray-600"}),(0,o.jsx)("button",{type:"submit",className:"toolbar-btn",title:"Open",children:"→"})]}),(0,o.jsxs)("div",{className:"max-h-64 overflow-y-auto",children:[e&&(0,o.jsx)("button",{onClick:()=>f(null),className:j,title:"Return to the default project file",children:"⌂ default document"}),w.map(e=>(0,o.jsxs)("button",{onClick:()=>f(e.path),className:j,title:e.path,children:[e.name,(0,o.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:e.dir})]},e.path)),x.length>0&&(0,o.jsxs)("div",{className:"mt-1 border-t border-gray-800 pt-1",children:[(0,o.jsx)("div",{className:"px-1.5 pb-0.5 text-[10px] uppercase tracking-wide text-gray-600",children:"recent"}),x.map(e=>(0,o.jsxs)("button",{onClick:()=>f(e),className:j,title:e,children:[e.split("/").pop(),(0,o.jsx)("span",{className:"ml-1 text-[10px] text-gray-600",children:e})]},e))]}),null!==i&&0===w.length&&0===x.length&&(0,o.jsx)("div",{className:"px-1.5 py-1 text-[11px] text-gray-500",children:v?"nothing matches":"no other documents here"})]}),c.length>0&&(0,o.jsxs)("div",{className:"mt-1 truncate border-t border-gray-800 pt-1 text-[10px] text-gray-600",children:["paths are as the server sees them: ",c.join(", ")]}),p&&(0,o.jsxs)("div",{className:"mt-1 text-[10px] text-gray-600",children:["this server does not list documents (",p,") — type a path"]})]})]})}function ne(){let e=tq(e=>e.presence),[t,n]=(0,l.useState)(!1);if(0===e.length)return null;let r=new Map;for(let t of e)r.set(t.role,(r.get(t.role)??0)+1);let s=[...r].map(([e,t])=>t>1?`${e} \xd7${t}`:e).join(" · ");return(0,o.jsxs)("span",{className:"relative inline-flex",children:[(0,o.jsxs)("button",{onClick:()=>n(e=>!e),className:"toolbar-btn inline-flex items-center gap-1.5",title:`Connected: ${s}`,"aria-expanded":t,"aria-label":`${e.length} connected: ${s}`,children:[(0,o.jsx)("span",{className:"flex -space-x-1",children:e.slice(0,4).map(e=>(0,o.jsx)("span",{className:"inline-block h-2 w-2 rounded-full ring-1 ring-gray-900",style:{backgroundColor:e.color??y(e.clientId)}},e.clientId))}),(0,o.jsx)("span",{className:"tabular-nums",children:e.length})]}),t&&(0,o.jsxs)("div",{className:"absolute left-0 top-full z-50 mt-1 max-h-64 w-56 overflow-y-auto rounded border border-gray-700 bg-gray-900 p-2 shadow-lg",children:[(0,o.jsxs)("div",{className:"mb-1 text-[10px] uppercase tracking-wide text-gray-500",children:["connected · ",s]}),e.map(e=>(0,o.jsxs)("div",{className:"flex items-center gap-1.5 rounded px-1 py-1 text-xs text-gray-300",title:e.clientId,children:[(0,o.jsx)("span",{className:"inline-block h-2 w-2 shrink-0 rounded-full",style:{backgroundColor:e.color??y(e.clientId)}}),(0,o.jsx)("span",{className:"shrink-0",children:e.role}),e.name&&(0,o.jsx)("span",{className:"truncate text-gray-500",children:e.name})]},e.clientId))]})]})}function nt(){let e=tq(e=>e.definition),t=tq(e=>e.fileName),n=tq(e=>e.docPath),r=tq(e=>e.dirty),s=tq(e=>e.loadFromJson),i=tq(e=>e.exportJson),a=tq(e=>e.addState),c=tq(e=>e.validate),d=tq(e=>e.showCodePreview),h=tq(e=>e.setShowCodePreview),u=tq(e=>e.setGeneratedCode),p=tq(e=>e.drawMode),m=tq(e=>e.setDrawMode),f=tq(e=>e.arrangeLayout),g=tq(e=>e.undo),x=tq(e=>e.redo),y=tq(e=>e.undoStack),b=tq(e=>e.redoStack),v=tq(e=>e.remoteStatus),w=tq(e=>e.remoteMessage),j=tq(e=>e.setRemoteStatus),k=tq(e=>e.setRemoteMtime),N=tq(e=>e.applyRemote),S=(0,t7.useRequestedDoc)(),_=(0,l.useRef)(null),[C,E]=(0,l.useState)(!1),[$,M]=(0,l.useState)(""),[O,R]=(0,l.useState)(!1),[A,T]=(0,l.useState)("png"),[P,I]=(0,l.useState)(!1),[L,D]=(0,l.useState)(null),[B,F]=(0,l.useState)(null),U=async()=>{let e=i();R(!0);try{let t=await fetch(`/api/file${(0,t7.docQuery)(S)}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({content:e})});if(t.ok){let e=await t.json();k(e.mtime),tq.setState({dirty:!1}),j("synced",null)}else{let e=await t.json().catch(()=>({error:"unknown"}));j("error",`Save failed: ${e.error??t.statusText}`)}}catch(e){j("error",`Save failed: ${e}`)}finally{R(!1)}},q=async()=>{I(!0),D(null);try{let r=await tQ(A,{definition:e,docPath:n,fileName:t});F(r)}catch(e){D(e instanceof Error?e.message:String(e))}finally{I(!1)}},Y=async()=>{try{let e=await fetch(`/api/file${(0,t7.docQuery)(S)}`,{cache:"no-store"});if(!e.ok)return void j("error","Reload failed");let t=await e.json();t.exists&&t.content?N(t.content,t.mtime,t.path.split("/").pop()):j("idle",`No file at ${t.path}`)}catch(e){j("error",`Reload failed: ${e}`)}},H=()=>{$.trim()&&(a(null,{name:$.trim(),kind:"normal"}),M(""),E(!1))},[X,J]=(0,l.useState)("python"),V=async()=>{try{let e=await fetch("/api/rispec",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({})});if(e.ok){let t=await e.json();u(t.rispec)}else{let t=await e.json().catch(()=>({error:"Unknown"}));u(`# RISE rispec generation failed
6
+ ${t.error}`)}}catch(e){u(`# RISE rispec generation failed
7
+ ${e}`)}h(!0)},z=async()=>{let e=i();try{let t=await fetch("/api/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({definition:e,language:X})});if(t.ok){let e=await t.json();u(e.code)}else{let n=await t.json().catch(()=>({error:"Unknown error"}));u(`// Code generation failed: ${n.error}
8
+ // Showing definition JSON as fallback:
9
+ ${e}`)}}catch{u(`// Backend unavailable — showing definition JSON
10
+ ${e}`)}h(!0)};return(0,o.jsxs)("div",{className:"flex flex-col gap-1.5 px-2 py-1.5 bg-gray-900 border-b border-gray-800 md:flex-row md:flex-wrap md:items-center md:px-3",children:[(0,o.jsxs)("div",{className:"toolbar-ident",children:[(0,o.jsx)("input",{ref:_,type:"file",accept:".json,.smdf.json",onChange:e=>{let t=e.target.files?.[0];if(!t)return;let n=new FileReader;n.onload=e=>{s(e.target?.result,t.name)},n.readAsText(t),e.target.value=""},className:"hidden"}),(0,o.jsxs)("span",{className:"text-xs text-gray-400 mr-1 truncate max-w-[50vw] md:max-w-none",children:[t??"untitled.smdf.json",r&&(0,o.jsx)("span",{className:"text-yellow-500 ml-0.5",children:"●"})]}),(0,o.jsx)(t9,{}),"synced"===v&&(0,o.jsx)("span",{className:"text-[10px] text-emerald-500",title:"In sync with disk",children:"⌁ synced"}),"remote-changed"===v&&(0,o.jsx)("span",{className:"text-[10px] text-amber-400",title:w??"",children:"↻ remote changed"}),"error"===v&&(0,o.jsx)("span",{className:"text-[10px] text-red-400",title:w??"",children:"⚠ disk error"}),"idle"===v&&(0,o.jsx)("span",{className:"text-[10px] text-gray-600",title:w??"No file bound",children:"○ no disk"}),(0,o.jsx)(ne,{}),(0,o.jsx)("div",{className:"flex-1"})]}),(0,o.jsxs)("div",{className:"toolbar-strip",children:[(0,o.jsx)("button",{onClick:g,disabled:0===y.length,className:"toolbar-btn disabled:opacity-30",title:"Undo (Ctrl+Z)",children:"↩"}),(0,o.jsx)("button",{onClick:x,disabled:0===b.length,className:"toolbar-btn disabled:opacity-30",title:"Redo (Ctrl+Y)",children:"↪"}),(0,o.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,o.jsx)("button",{onClick:f,className:"toolbar-btn",title:"Arrange states into layers (auto-layout)",children:"⤢ Arrange"}),(0,o.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,o.jsx)("button",{onClick:()=>m("select"===p?"transition":"select"),className:`toolbar-btn ${"transition"===p?"!bg-amber-700 !text-white":""}`,title:"transition"===p?"Exit draw mode (Esc)":"Draw transition mode",children:"transition"===p?"✏️ Drawing":"↗ Draw"}),(0,o.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,o.jsx)("button",{onClick:()=>_.current?.click(),className:"toolbar-btn",title:"Open local .smdf.json (browser)",children:"📂"}),(0,o.jsx)("button",{onClick:U,disabled:O,className:"toolbar-btn disabled:opacity-40",title:"Save to disk (STATELOOM_PROJECT_FILE)",children:"💾 Disk"}),(0,o.jsx)("button",{onClick:Y,className:"toolbar-btn",title:"Reload from disk",children:"🔄"}),(0,o.jsx)("button",{onClick:()=>{let e=new Blob([i()],{type:"application/json"}),n=URL.createObjectURL(e),r=document.createElement("a");r.href=n,r.download=t??"statemachine.smdf.json",r.click(),URL.revokeObjectURL(n)},className:"toolbar-btn",title:"Download as file",children:"📥"}),(0,o.jsx)("select",{value:A,onChange:e=>{T(e.target.value),F(null),D(null)},className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",title:"Export format",children:tz.map(e=>(0,o.jsx)("option",{value:e,children:tK[e]},e))}),(0,o.jsx)("button",{onClick:q,disabled:P,className:`toolbar-btn disabled:opacity-40 ${L?"!text-red-400":""}`,title:L??`Export the board as ${tK[A]}`,children:P?"…":"🖼 Export"}),B&&!L&&(0,o.jsxs)("span",{className:"text-[10px] text-emerald-500 truncate max-w-[40vw] md:max-w-[16rem]",title:B,children:["⤓ ",B]}),(0,o.jsx)("div",{className:"w-px h-4 bg-gray-700"}),C?(0,o.jsxs)("div",{className:"flex items-center gap-1",children:[(0,o.jsx)("input",{autoFocus:!0,className:"bg-gray-800 border border-gray-700 rounded px-2 py-0.5 text-xs text-gray-200 w-32 md:w-24",placeholder:"State name...",value:$,onChange:e=>M(e.target.value),onKeyDown:e=>{"Enter"===e.key&&H(),"Escape"===e.key&&E(!1)}}),(0,o.jsx)("button",{onClick:H,className:"toolbar-btn-sm",children:"✓"}),(0,o.jsx)("button",{onClick:()=>E(!1),className:"toolbar-btn-sm",children:"✕"})]}):(0,o.jsx)("button",{onClick:()=>E(!0),className:"toolbar-btn",children:"+State"}),(0,o.jsx)("div",{className:"w-px h-4 bg-gray-700"}),(0,o.jsx)("button",{onClick:()=>c(),className:"toolbar-btn",children:"✓ Validate"}),(0,o.jsxs)("select",{value:X,onChange:e=>J(e.target.value),className:"bg-gray-800 border border-gray-700 rounded text-xs text-gray-300 px-1 py-0.5",children:[(0,o.jsx)("option",{value:"python",children:"Python"}),(0,o.jsx)("option",{value:"typescript",children:"TypeScript"})]}),(0,o.jsx)("button",{onClick:z,className:"toolbar-btn",children:"⚡ Generate"}),(0,o.jsx)("button",{onClick:V,className:"toolbar-btn",title:"Generate RISE rispec markdown",children:"📜 RISE"}),(0,o.jsxs)("button",{onClick:()=>h(!d),className:`toolbar-btn ${d?"text-blue-400":""}`,children:["</>"," Code"]})]})]})}function nn(){let e=tq(e=>e.generatedCode),t=tq(e=>e.showCodePreview),n=tq(e=>e.setShowCodePreview);return t?(0,o.jsx)("div",{className:"absolute inset-0 z-50 flex items-center justify-center bg-black/60 p-2 md:p-0",children:(0,o.jsxs)("div",{className:"bg-gray-900 border border-gray-700 rounded-lg shadow-xl w-full max-h-[85dvh] md:w-[80%] md:max-w-3xl md:max-h-[80dvh] flex flex-col",children:[(0,o.jsxs)("div",{className:"flex items-center justify-between px-4 py-2 border-b border-gray-800",children:[(0,o.jsx)("h3",{className:"text-sm font-semibold text-gray-300",children:"Generated Definition (JSON)"}),(0,o.jsx)("button",{onClick:()=>n(!1),className:"text-gray-500 hover:text-gray-300 text-lg min-h-11 min-w-11 md:min-h-0 md:min-w-0","aria-label":"Close preview",children:"✕"})]}),(0,o.jsx)("pre",{className:"flex-1 overflow-auto overscroll-contain p-4 text-[11px] leading-relaxed text-green-400 font-mono md:text-sm",children:e??"No code generated yet"}),(0,o.jsx)("div",{className:"flex justify-end px-4 py-2 border-t border-gray-800",children:(0,o.jsx)("button",{onClick:()=>{e&&navigator.clipboard.writeText(e)},className:"text-xs bg-gray-700 hover:bg-gray-600 text-gray-300 px-4 py-3 rounded md:px-3 md:py-1",children:"Copy to Clipboard"})})]})}):null}function nr(){let e=tq(e=>e.applyRemote),t=tq(e=>e.setRemoteStatus),n=tq(e=>e.setRemoteMtime),r=(0,t7.useRequestedDoc)();return(0,l.useEffect)(()=>{let s=!1,i=(0,t7.docQuery)(r);async function a(){try{let e=await fetch(`/api/file${i}`,{cache:"no-store"});if(!e.ok)return null;return await e.json()}catch{return null}}(async()=>{let n=await a();s||(n?.path&&tq.getState().setDocPath(n.path),n?.exists&&n.content?e(n.content,n.mtime,n.path.split("/").pop()):t("idle",n?`No file at ${n.path}`:null))})();let o=new EventSource(`/api/watch${i}`);return o.addEventListener("hello",e=>{try{let t=JSON.parse(e.data);"number"==typeof t?.mtime&&n(t.mtime)}catch{}}),o.addEventListener("change",async r=>{let s=0;try{s=JSON.parse(r.data)?.mtime??0}catch{}if(s<=(tq.getState().remoteMtime??0))return;let i=await a();i?.exists&&i.content&&(tq.getState().dirty?(t("remote-changed",`Disk changed at ${new Date(i.mtime).toLocaleTimeString()} — local has unsaved edits`),n(i.mtime)):e(i.content,i.mtime,i.path.split("/").pop()))}),o.addEventListener("error",()=>{t("error","Watch stream disconnected")}),()=>{s=!0,o.close()}},[e,t,n,r]),null}function ns({url:e}){let t=(0,t7.useRequestedDoc)();return(0,l.useEffect)(()=>{if(!e)return;let n=!1,r=null,s=null,i=null,a=null;return(async()=>{let o="";try{let e=await fetch(`/api/file${(0,t7.docQuery)(t)}`,{cache:"no-store"});e.ok&&(o=(await e.json())?.path??"")}catch{}n||(o&&tq.getState().setDocPath(o),(r=tR({url:e,role:"web",docId:o,name:"web-designer",onFull:e=>{tq.getState().applyRemote(JSON.stringify({stateMachine:e.def}),e.mtime??Date.now(),o&&o.split("/").pop()||void 0),a=e.def},onPatch:e=>{tq.getState().applyRemoteOps(e.ops,e.mtime??Date.now(),e.seq),a=tq.getState().definition},onPresence:e=>{tq.getState().setPresence(e)}})).connect(),s=tq.subscribe((e,t)=>{e.definition===t.definition||e._applyingRemote||(i&&clearTimeout(i),i=setTimeout(()=>{var e,t;let n,s;if(!r||"connected"!==r.getSnapshot().status)return;let i=tq.getState().definition;if(null===a){r.emitFull(i),a=i;return}let o=(e=a,t=i,n=e??{settings:{namespace:"",asynchronous:!1},events:[],state:{name:t.state.name,states:[]}},function(e,t,n){let r={},s=!1,i=new Set([...Object.keys(e.settings),...Object.keys(t.settings)]),a=e.settings,o=t.settings;for(let e of i)g(a[e],o[e])||void 0===o[e]||(r[e]=o[e],s=!0);s&&n.push({op:"settings.update",patch:r})}(n,t,s=[]),function(e,t,n){let r=e.events,s=t.events,i=Math.min(r.length,s.length);for(let e=0;e<i;e++)!function(e,t,n,r){let s={},i=!1;for(let e of["name","file","feeder","description","timers"])g(t[e],n[e])||void 0===n[e]||(s[e]=n[e],i=!0);i&&r.push({op:"eventSource.update",index:e,patch:s});let a=t.events??[],o=n.events??[],l=new Set(o.map(e=>e.id));for(let e of a)l.has(e.id)||r.push({op:"event.remove",id:e.id});let c=a.filter(e=>l.has(e.id)),d=0;for(;d<o.length;){let t=o[d];d<c.length&&c[d].id===t.id?(function(e,t,n){let r={},s=!1;for(let n of["name","description","preAction","postAction"])g(e[n],t[n])||void 0===t[n]||(r[n]=t[n],s=!0);s&&n.push({op:"event.update",id:t.id,patch:r})}(c[d],t,r),function(e,t,n,r){let s=Math.min(t.length,n.length);for(let i=0;i<s;i++)if(!g(t[i],n[i])){let s={};t[i].name!==n[i].name&&(s.name=n[i].name),t[i].type!==n[i].type&&(s.type=n[i].type),r.push({op:"parameter.update",eventId:e,index:i,patch:s})}for(let t=s;t<n.length;t++)r.push({op:"parameter.add",eventId:e,parameter:n[t],index:t});for(let s=t.length-1;s>=n.length;s--)r.push({op:"parameter.remove",eventId:e,index:s})}(t.id,c[d].parameters??[],t.parameters??[],r)):(r.push({op:"event.add",sourceIndex:e,event:t,index:d}),c.splice(d,0,t)),d++}}(e,r[e],s[e],n);for(let e=r.length;e<s.length;e++)n.push({op:"eventSource.add",source:s[e]});for(let e=r.length-1;e>=s.length;e--)n.push({op:"eventSource.remove",index:e})}(n,t,s),function(e,t,n){let r=m(e.state),s=m(t.state),i=new Map(r.map(e=>[e.name,e])),a=new Map(s.map(e=>[e.name,e])),o=f(e.state),l=f(t.state),c=[];for(let e of s){if(i.has(e.name))continue;let t=l.get(e.name)??null,{states:r,transitions:s,...a}=e;n.push({op:"state.add",parent:t,state:{...a}}),s&&s.length>0&&c.push({state:e.name,transitions:s})}for(let e of s){if(!i.has(e.name))continue;let t=o.get(e.name)??null,r=l.get(e.name)??null;t!==r&&null!==r&&n.push({op:"state.nest",child:e.name,newParent:r})}for(let e of s){let t=i.get(e.name);if(!t)continue;let r={},s=!1;g(t.kind,e.kind)||void 0===e.kind||(r.kind=e.kind,s=!0),g(t.description,e.description)||void 0===e.description||(r.description=e.description,s=!0),s&&n.push({op:"state.update",name:e.name,patch:r}),x(e.name,"onEntry",t.onEntry?.actions??[],e.onEntry?.actions??[],n),x(e.name,"onExit",t.onExit?.actions??[],e.onExit?.actions??[],n)}for(let e of c)e.transitions.forEach((t,r)=>{n.push({op:"transition.add",state:e.state,transition:t,index:r})});for(let e of s){let t=i.get(e.name);t&&function(e,t,n,r){let s=Math.min(t.length,n.length);for(let i=0;i<s;i++){if(g(t[i],n[i]))continue;let s={};for(let e of["event","nextState","condition","description","actions"])g(t[i][e],n[i][e])||void 0===n[i][e]||(s[e]=n[i][e]);Object.keys(s).length>0&&r.push({op:"transition.update",state:e,index:i,patch:s})}for(let t=s;t<n.length;t++)r.push({op:"transition.add",state:e,transition:n[t],index:t});for(let s=t.length-1;s>=n.length;s--)r.push({op:"transition.remove",state:e,index:s})}(e.name,t.transitions??[],e.transitions??[],n)}for(let e=r.length-1;e>=0;e--){let t=r[e];if(a.has(t.name))continue;let s=t.transitions??[];for(let e=s.length-1;e>=0;e--)n.push({op:"transition.remove",state:t.name,index:e});n.push({op:"state.remove",name:t.name})}}(n,t,s),s);0!==o.length&&(r.emitPatch(o),a=i)},60))}))})(),()=>{n=!0,i&&clearTimeout(i),s&&s(),r&&r.disconnect()}},[e,t]),null}function ni(){let e=b.default.env.NEXT_PUBLIC_STATELOOM_BRIDGE_URL??b.default.env.NEXT_PUBLIC_SMCRAFT_BRIDGE_URL;return"string"==typeof e&&e.length>0?e:void 0}let na=null;function no(){return na||(na=(async()=>{let e=ni()??null;try{let t=await fetch("/api/config",{cache:"no-store"});if(t.ok){let n=await t.json();return{bridgeUrl:n.bridgeUrl||e,projectFile:n.projectFile??null}}}catch{}return{bridgeUrl:e,projectFile:null}})())}function nl(){let e=ni(),[t,n]=(0,l.useState)(e);return((0,l.useEffect)(()=>{let e=!0;return no().then(t=>{e&&t.bridgeUrl&&n(t.bridgeUrl)}),()=>{e=!1}},[]),"string"==typeof t&&t.length>0)?(0,o.jsx)(ns,{url:t}):(0,o.jsx)(nr,{})}let nc="stateloom.uiScale.v1";function nd(e){return Number.isFinite(e)?Math.min(1.75,Math.max(.75,e)):1}function nh(e){"u">typeof document&&(document.documentElement.style.fontSize=`${16*nd(e)}px`)}let nu=1,np=!1,nm=new Set;function nf(){return np||(np=!0,nu=function(){try{let e=window.localStorage.getItem(nc);if(null===e)return 1;return nd(Number.parseFloat(e))}catch{return 1}}()),nu}function ng(){return 1}function nx(e){return nm.add(e),()=>{nm.delete(e)}}function ny(e,t){let n=nd(e);if(nh(n),t&&function(e){try{window.localStorage.setItem(nc,String(nd(e)))}catch{}}(n),np=!0,n!==nu)for(let e of(nu=n,nm))e()}function nb(e,t){return Math.max(1,Math.hypot(t.clientX-e.clientX,t.clientY-e.clientY))}function nv(e,t){for(let n=0;n<e.length;n++)if(e[n].identifier===t)return e[n];return null}function nw(){let e=(0,l.useSyncExternalStore)(nx,nf,ng),t=(0,l.useRef)(null),n=(0,l.useRef)(null),r=(0,l.useRef)(null);(0,l.useEffect)(()=>{nh(e)},[e]);let s=(0,l.useCallback)(e=>{n.current=e,null===r.current&&(r.current=requestAnimationFrame(()=>{r.current=null,null!==n.current&&ny(n.current,!1)}))},[]),i=(0,l.useCallback)(()=>{n.current=null,ny(1,!0)},[]);return((0,l.useEffect)(()=>{let e=()=>{let e=t.current;if(t.current=null,!e?.engaged)return;null!==r.current&&(cancelAnimationFrame(r.current),r.current=null);let s=n.current??nf();n.current=null,ny(nd(s),!0)},i=n=>{if(2!==n.touches.length){t.current&&e();return}let[r,s]=[n.touches[0],n.touches[1]];tX(r.target)||tX(s.target)||(t.current={a:r.identifier,b:s.identifier,startScale:nf(),startDist:nb(r,s),engaged:!1})},a=e=>{let n=t.current;if(!n)return;let r=nv(e.touches,n.a),i=nv(e.touches,n.b);if(!r||!i)return;e.preventDefault();let a=nb(r,i);if(!n.engaged){if(12>Math.abs(a-n.startDist))return;n.engaged=!0,n.startDist=a;return}s(nd(n.startScale*(a/n.startDist)))},o=n=>{let r=t.current;r&&(nv(n.touches,r.a)&&nv(n.touches,r.b)||e())};return document.addEventListener("touchstart",i,{passive:!0,capture:!0}),document.addEventListener("touchmove",a,{passive:!1,capture:!0}),document.addEventListener("touchend",o,{passive:!0,capture:!0}),document.addEventListener("touchcancel",o,{passive:!0,capture:!0}),()=>{document.removeEventListener("touchstart",i,{capture:!0}),document.removeEventListener("touchmove",a,{capture:!0}),document.removeEventListener("touchend",o,{capture:!0}),document.removeEventListener("touchcancel",o,{capture:!0}),null!==r.current&&cancelAnimationFrame(r.current)}},[s]),1===e)?null:(0,o.jsxs)("div",{className:"ui-scale-pill",role:"status","aria-live":"polite",children:[(0,o.jsxs)("span",{children:["UI ",Math.round(100*e),"%"]}),(0,o.jsx)("button",{type:"button",onClick:i,"aria-label":"Reset interface size to 100 percent",children:"Reset"})]})}let nj=e=>`stateloom:erd-layout:${e}`;async function nk(e){let t=e.slice(0,e.lastIndexOf("/")),n=((await (await fetch("/api/docs",{cache:"no-store"})).json()).docs??[]).map(e=>e.path).filter(e=>e.endsWith(".smdf.json")&&e.slice(0,e.lastIndexOf("/"))===t),r=[];for(let e of n)try{let t=await (await fetch(`/api/file${(0,t7.docQuery)(e)}`,{cache:"no-store"})).json(),n=JSON.parse(t.content??"null"),s=n?.stateMachine??n?.StateMachine??n;s?.state&&r.push({path:e,def:s})}catch{}return r}let nN="w-full rounded border border-gray-700 bg-gray-950 px-2 py-1 text-xs text-gray-200 placeholder:text-gray-600",nS="rounded border border-gray-700 bg-gray-800 px-2 py-1 text-xs text-gray-200 hover:bg-gray-700",n_="mb-1 mt-3 text-[11px] font-semibold uppercase tracking-wide text-gray-500";function nC(){let e=(0,t7.useRequestedDoc)(),[t,n]=(0,l.useState)(""),[r,s]=(0,l.useState)(null),[i,a]=(0,l.useState)({}),[c,d]=(0,l.useState)({...B}),[h,u]=(0,l.useState)(0),[p,m]=(0,l.useState)(null),[f,g]=(0,l.useState)("loading…"),[x,y]=(0,l.useState)(0),[b,v]=(0,l.useState)(null),w=(0,l.useRef)(null);(0,l.useEffect)(()=>{let t=!1,r=null;return(async()=>{let i=await (await fetch(`/api/file${(0,t7.docQuery)(e)}`,{cache:"no-store"})).json();if(t)return;if(i.error)return g(i.error);let o=i.path??"",l=null;try{let e=i.content?JSON.parse(i.content):null;W(e)&&(l={...e,relationships:e.relationships??[]})}catch{}if(i.exists&&!l)return g(`${o} is not a readable ERD definition`);let c=(o.split("/").pop()??"Untitled").replace(/\.erdf\.json$/i,"");n(o),s(l??{settings:{namespace:"Default",name:c},entities:[],relationships:[]}),a(function(e){try{return JSON.parse(localStorage.getItem(nj(e))??"{}")}catch{return{}}}(o)),m(null),v(null),u(e=>e+1),g(i.exists?"loaded":"new document — the first edit writes it");let{bridgeUrl:d}=await no();!t&&d&&(w.current=r=tR({url:d,role:"web",docId:o,name:"web-designer",onFull:e=>{let t=e.def;W(t)&&(s({...t,relationships:t.relationships??[]}),g("updated live"))},onPatch:()=>{},onPresence:e=>y(e.length)}),r.connect())})().catch(e=>!t&&g(String(e))),()=>{t=!0,w.current=null,r?.disconnect()}},[e]);let j=(0,l.useMemo)(()=>{if(!r)return{};let e=function(e,t={}){let{hSpacing:n,vSpacing:r}={...ea,...t},s=[],i=new Set;for(let t of e.entities??[])!t?.name||i.has(t.name)||(i.add(t.name),s.push(t));let a=new Map,o=(e,t,n=new Set)=>e===t||!n.has(e)&&(n.add(e),(a.get(e)??[]).some(e=>o(e,t,n)));for(let t of e.relationships??[]){if(!t||!i.has(t.from)||!i.has(t.to)||t.from===t.to)continue;let[e,n]="N:1"===t.cardinality?[t.to,t.from]:[t.from,t.to];if((a.get(e)??[]).includes(n)||o(n,e))continue;let r=a.get(e);r?r.push(n):a.set(e,[n])}let l=new Map,c=(e,t)=>{if(!((l.get(e)??-1)>=t))for(let n of(l.set(e,t),a.get(e)??[]))c(n,t+1)},d=new Set([...a.values()].flat());for(let e of s)d.has(e.name)||c(e.name,0);for(let e of s)l.has(e.name)||c(e.name,0);for(let e of[...s].sort((e,t)=>l.get(t.name)-l.get(e.name))){let t=a.get(e.name)??[];t.length&&l.set(e.name,Math.min(...t.map(e=>l.get(e)))-1)}let h=[],u=new Map,p=(e,t)=>((h[t]??=[]).push(e),u.set(e.id,e),e);for(let e of s)p({id:e.name,entity:e.name,...function(e){let t=(e.attributes??[]).filter(e=>e?.name);return{width:Math.min(340,Math.max(170,Math.ceil(6.6*Math.max(1.15*(e.name??"").length,...t.map(e=>eo(e).length+6.96969696969697))+28))),height:30+20*Math.max(1,t.length)+8}}(e),upper:[],lower:[],x:0},l.get(e.name)??0);let m=0;for(let[e,t]of a)for(let n of t){let t=e;for(let r=l.get(e)+1;r<l.get(n);r++){let e=p({id:`\u0000lane${m++}`,width:28,height:0,upper:[],lower:[],x:0},r);u.get(t).lower.push(e.id),e.upper.push(t),t=e.id}u.get(t).lower.push(n),u.get(n).upper.push(t)}for(let e=h.length-1;e>=0;e--)h[e]?.length||h.splice(e,1);let f=(e,t)=>e.length?e.reduce((e,n)=>e+t(u.get(n)),0)/e.length:null,g=(e,t)=>{let n=new Map;for(let e of h)e.forEach((e,t)=>n.set(e.id,t));let r=new Map(e.map((e,r)=>[e.id,f(e[t],e=>n.get(e.id))??r]));e.sort((e,t)=>r.get(e.id)-r.get(t.id))};for(let e=0;e<2;e++){for(let e=1;e<h.length;e++)g(h[e],"upper");for(let e=h.length-2;e>=0;e--)g(h[e],"lower")}let x=e=>e.x+e.width/2,y=(e,t)=>{let r=0;for(let s of e){let e=f(s[t],x);s.x=Math.max(r,null===e?r:e-s.width/2),r=s.x+s.width+n}};for(let e of h)y(e,"upper");for(let e=h.length-2;e>=0;e--)y(h[e],"lower");let b=Math.min(0,...[...u.values()].map(e=>e.x)),v={},w=40;for(let e of h){for(let t of e)t.entity&&(v[t.entity]={x:Math.round(t.x-b)+40,y:w,width:t.width,height:t.height});w+=Math.max(0,...e.map(e=>e.height))+r}return v}(r);for(let[t,n]of Object.entries(i))e[t]&&(e[t]={...e[t],...n});return e},[r,i]),k=(0,l.useMemo)(()=>r?function(e){let t=[],n=function(e){let t=new Map;for(let n of e.entities??[])n?.name&&!t.has(n.name)&&t.set(n.name,n);return t}(e),r=new Set;for(let[s,i]of(e.entities??[]).entries()){if(!i?.name){t.push({ruleId:"E001",message:`Entity at index ${s} has no name`,element:`entities[${s}]`});continue}r.has(i.name)&&t.push({ruleId:"E001",message:`Duplicate entity name "${i.name}"`,element:i.name}),r.add(i.name);let e=new Set;for(let[r,s]of(i.attributes??[]).entries()){if(!s?.name){t.push({ruleId:"E002",message:`Attribute at index ${r} of "${i.name}" has no name`,element:`${i.name}[${r}]`});continue}let a=`${i.name}.${s.name}`;if(e.has(s.name)&&t.push({ruleId:"E002",message:`Duplicate attribute "${a}"`,element:a}),e.add(s.name),s.references){let e=function(e){let t=e.indexOf(".");return t<0?{entity:e}:{entity:e.slice(0,t),attribute:e.slice(t+1)}}(s.references),r=n.get(e.entity);r?e.attribute&&!(r.attributes??[]).some(t=>t?.name===e.attribute)&&t.push({ruleId:"E005",message:`"${a}" references undefined attribute "${s.references}"`,element:a}):t.push({ruleId:"E005",message:`"${a}" references undefined entity "${e.entity}"`,element:a})}}}for(let[r,s]of(e.relationships??[]).entries()){let e=`relationships[${r}]`;for(let i of["from","to"]){let a=s?.[i];a&&n.has(a)||t.push({ruleId:"E003",message:`Relationship ${r} ${i} names undefined entity "${a??""}"`,element:e})}z.includes(s?.cardinality)||t.push({ruleId:"E004",message:`Relationship ${r} cardinality "${s?.cardinality??""}" is not one of ${z.join(", ")}`,element:e})}return t}(r):[],[r]),N=(0,l.useMemo)(()=>k.map(e=>(e.element??"").split(/[.[]/)[0]).filter(Boolean),[k]),S=(0,l.useCallback)(async e=>{let n;if(r&&t){try{n=e(r)}catch(e){return g(e instanceof Error?e.message:String(e))}s(n),v(null);try{let e=await fetch(`/api/file${(0,t7.docQuery)(t)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({content:JSON.stringify(n,null,2)+"\n"})});if(!e.ok)throw Error((await e.json())?.error??`HTTP ${e.status}`);w.current?.emitFull(n),g("saved")}catch(e){g(`not saved: ${e instanceof Error?e.message:String(e)}`)}}},[r,t]),_=(0,l.useCallback)((e,n)=>{a(r=>{let s={...r,[e]:{x:Math.round(n.x),y:Math.round(n.y)}};try{localStorage.setItem(nj(t),JSON.stringify(s))}catch{}return s})},[t]),C=async()=>{if(!r)return;g("checking links…");let e=await nk(t);if(0===e.length)return v([]),g("no .smdf.json beside this document to check against");let n=e.flatMap(e=>(function(e,t){let n=[],r=new Map;for(let e of t.entities??[])e?.name&&!r.has(e.name)&&r.set(e.name,e);let s=e.settings?.name??"",i=e.settings?.objects??[],a=e.state?function e(t){let n=[t];for(let r of t.states??[])n.push(...e(r));for(let r of t.parallel?.states??[])n.push(...e(r));return n}(e.state):[],o=a.flatMap(e=>(e.transitions??[]).map(e=>e.condition??"")),l=new Map;for(let e of i){let s=r.get(e.class);if(s){l.set(e.instance,s);continue}o.some(t=>G(t,e.instance).length>0)&&n.push({ruleId:"L001",message:`Object "${e.instance}" has class "${e.class}", which is not an entity in "${t.settings?.name??""}", and a guard reads its fields`,element:e.instance})}for(let e of a)for(let t of e.transitions??[])if(t.condition)for(let[r,s]of l)for(let i of G(t.condition,r))(s.attributes??[]).some(e=>e?.name===i)||n.push({ruleId:"L002",message:`Guard on ${e.name} [${t.event}] reads "${r}.${i}", which is not an attribute of "${s.name}"`,element:e.name});if(s){let e=new Set([...l.values()].map(e=>e.name));for(let r of t.entities??[])for(let t of r?.attributes??[])t&&V(t).includes(s)&&(e.has(r.name)||n.push({ruleId:"L003",message:`"${r.name}.${t.name}" stores the state of "${s}", but "${r.name}" is not the class of any of that machine's objects`,element:`${r.name}.${t.name}`}))}return n})(e.def,r).map(t=>({...t,message:`${e.def.settings?.name??e.path}: ${t.message}`})));n.push(...function(e,t){let n=[];for(let r of e.entities??[])for(let e of r?.attributes??[])if(e)for(let s of V(e))t.includes(s)||n.push({ruleId:"L004",message:`"${r.name}.${e.name}" stores the state of "${s}", which is not among the machines checked (${t.join(", ")||"none"})`,element:`${r.name}.${e.name}`});return n}(r,e.map(e=>e.def.settings?.name??""))),v(n),g(`checked ${e.length} machine(s): ${n.length} problem(s)`)},E=async e=>{let n=(await nk(t)).find(t=>t.def.settings?.name===e);n?(0,t7.navigateToDoc)(n.path):g(`no .smdf.json beside this document defines '${e}'`)},$=r?.entities.find(e=>e.name===p)??null,M=t.split("/").pop()||"…";return(0,o.jsxs)("div",{className:"app-shell flex flex-col overflow-hidden bg-gray-950 text-gray-200",children:[(0,o.jsxs)("header",{className:"flex flex-wrap items-center gap-2 border-b border-gray-800 bg-gray-900 px-3 py-2 text-xs",children:[(0,o.jsx)("span",{className:"font-semibold text-blue-300",children:"ERD"}),(0,o.jsx)(t9,{}),(0,o.jsxs)("span",{className:"text-gray-400",title:t,children:[r?.settings.name??""," · ",M]}),(0,o.jsxs)("span",{className:"ml-auto text-gray-500",children:[f,x>1?` \xb7 ${x} in the room`:""]}),(0,o.jsx)("button",{className:nS,onClick:()=>{a({});try{localStorage.removeItem(nj(t))}catch{}u(e=>e+1)},title:"Forget the dragged positions and lay the board out again",children:"⤢ Arrange"}),(0,o.jsx)("button",{className:nS,onClick:()=>u(e=>e+1),children:"Fit"}),(0,o.jsx)("button",{className:nS,onClick:C,title:"Check the state machines beside this document against it",children:"Check links"}),(0,o.jsx)("button",{className:nS,onClick:()=>r&&navigator.clipboard?.writeText(function(e){let t=["erDiagram"],n=" ",r=new Set;for(let s of e.relationships??[]){if(!s?.from||!s?.to)continue;let e=et[s.cardinality]??et["1:N"];t.push(`${n}${er(s.from)} ${e} ${er(s.to)} : ${ei(s.label??"")}`),r.add(s.from),r.add(s.to)}let s=new Set;for(let i of e.entities??[]){if(!i?.name||s.has(i.name))continue;s.add(i.name);let e=(i.attributes??[]).filter(e=>e?.name);if(0===e.length){r.has(i.name)||t.push(`${n}${er(i.name)}`);continue}for(let r of(t.push(`${n}${er(i.name)} {`),e))t.push(`${n}${n}${function(e){let t=[];"pk"===e.key&&t.push("PK"),"uk"===e.key&&t.push("UK"),e.references&&t.push("FK");let n=[],r=V(e);r.length&&n.push(`stateOf ${r.join(", ")}`),e.description&&n.push(e.description);let s=[es(e.type??"","unknown"),es(e.name,"unnamed")];return t.length&&s.push(t.join(", ")),n.length&&s.push(ei(n.join(" — "))),s.join(" ")}(r)}`);t.push(`${n}}`)}return t.join("\n")}(r)).then(()=>g("mermaid copied")),children:"Copy mermaid"})]}),(0,o.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col md:flex-row",children:[(0,o.jsx)("div",{className:"min-h-[45dvh] flex-1 overflow-hidden",children:r&&(0,o.jsx)(ek,{definition:r,positions:j,viewport:c,onViewportChange:d,selection:p,errorElements:N,fitKey:h,onSelect:m,onClearSelection:()=>m(null),onEntityMove:_,onOpenMachine:E,emptyHint:"No entities yet — add one in the panel, or let an agent call add_entity."})}),r&&(0,o.jsxs)("aside",{className:"touch-targets w-full overflow-y-auto border-t border-gray-800 bg-gray-900 p-3 md:w-80 md:border-l md:border-t-0",children:[(0,o.jsx)("div",{className:n_,style:{marginTop:0},children:"Entities"}),(0,o.jsx)("div",{className:"flex flex-wrap gap-1",children:r.entities.map(e=>(0,o.jsx)("button",{className:`${nS} ${p===e.name?"border-blue-500 text-blue-300":""}`,onClick:()=>m(e.name),children:e.name},e.name))}),(0,o.jsx)(nE,{fields:[{name:"name",placeholder:"new entity"}],submit:"+ Entity",onSubmit:e=>{S(t=>(function(e,t){if(!t.name?.trim())throw Error("An entity needs a name.");let n=Q(e);if(n.entities.some(e=>e.name===t.name))throw Error(`Entity '${t.name}' already exists.`);return n.entities.push(ee({...t,attributes:t.attributes??[]})),n})(t,{name:e.name.trim()})),m(e.name.trim())}}),$&&(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("div",{className:n_,children:$.name}),($.attributes??[]).map(e=>(0,o.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 font-mono text-[11px]",children:[(0,o.jsxs)("span",{className:e.stateOf?"text-blue-300":"text-gray-300",children:[e.name," : ",e.type,(0,o.jsxs)("span",{className:"text-gray-500",children:[e.key?` ${e.key.toUpperCase()}`:"",e.references?` → ${e.references}`:"",e.stateOf?` ◉ ${[e.stateOf].flat().join(", ")}`:""]})]}),(0,o.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":`Remove ${e.name}`,onClick:()=>S(t=>(function(e,t,n){let r=Q(e),s=Z(r,t),i=s.attributes?.length??0;if(s.attributes=(s.attributes??[]).filter(e=>e.name!==n),s.attributes.length===i)throw Error(`Attribute '${t}.${n}' not found.`);return r})(t,$.name,e.name)),children:"✕"})]},e.name)),(0,o.jsx)(nE,{fields:[{name:"name",placeholder:"attribute"},{name:"type",placeholder:"type",initial:"string"},{name:"key",options:["","pk","uk"]},{name:"references",placeholder:"references Entity.attr"},{name:"stateOf",placeholder:"stateOf Machine"}],submit:"+ Attribute",onSubmit:e=>S(t=>(function(e,t,n){if(!n.name?.trim())throw Error("An attribute needs a name.");let r=Q(e),s=Z(r,t);if(s.attributes??=[],s.attributes.some(e=>e.name===n.name))throw Error(`Attribute '${t}.${n.name}' already exists.`);return s.attributes.push(ee({...n})),r})(t,$.name,{name:e.name.trim(),type:e.type.trim()||"string",key:"pk"===e.key||"uk"===e.key?e.key:void 0,references:e.references.trim()||void 0,stateOf:e.stateOf.trim()||void 0}))}),(0,o.jsxs)("button",{className:`${nS} mt-2 text-red-300`,onClick:()=>{S(e=>{var t;let n;return t=$.name,Z(n=Q(e),t),n.entities=n.entities.filter(e=>e.name!==t),n.relationships=n.relationships.filter(e=>e.from!==t&&e.to!==t),n}),m(null)},children:["🗑 Delete ",$.name]})]}),(0,o.jsx)("div",{className:n_,children:"Relationships"}),r.relationships.map((e,t)=>(0,o.jsxs)("div",{className:"flex items-center justify-between gap-2 py-0.5 text-[11px] text-gray-300",children:[(0,o.jsxs)("span",{children:[e.from," ",(0,o.jsx)("span",{className:"text-gray-500",children:e.cardinality})," ",e.to,e.label?(0,o.jsxs)("span",{className:"text-gray-500",children:[" : ",e.label]}):null]}),(0,o.jsx)("button",{className:"text-gray-500 hover:text-red-400","aria-label":"Remove relationship",onClick:()=>S(t=>(function(e,t,n,r){let s=Q(e),i=s.relationships.length;if(s.relationships=s.relationships.filter(e=>e.from!==t||e.to!==n||void 0!==r&&e.label!==r),s.relationships.length===i)throw Error(`No relationship from '${t}' to '${n}'${void 0===r?"":` labelled '${r}'`}.`);return s})(t,e.from,e.to,e.label)),children:"✕"})]},t)),r.entities.length>0&&(0,o.jsx)(nE,{fields:[{name:"from",options:r.entities.map(e=>e.name)},{name:"cardinality",options:[...z],initial:"1:N"},{name:"to",options:r.entities.map(e=>e.name)},{name:"label",placeholder:"label (a verb)"}],submit:"+ Relationship",onSubmit:e=>S(t=>(function(e,t){let n=Q(e);if(Z(n,t.from),Z(n,t.to),!z.includes(t.cardinality))throw Error(`Cardinality '${t.cardinality}' is not one of ${z.join(", ")}.`);return n.relationships.push(ee({...t})),n})(t,{from:e.from,to:e.to,cardinality:e.cardinality,label:e.label.trim()||void 0}))}),(k.length>0||b)&&(0,o.jsx)("div",{className:n_,children:"Problems"}),k.map((e,t)=>(0,o.jsxs)("div",{className:"py-0.5 text-[11px] text-red-300",children:["[",e.ruleId,"] ",e.message]},`p${t}`)),b?.length===0&&0===k.length&&(0,o.jsx)("div",{className:"py-0.5 text-[11px] text-green-400",children:"Every name the machines use resolves."}),b?.map((e,t)=>(0,o.jsxs)("div",{className:"py-0.5 text-[11px] text-amber-300",children:["[",e.ruleId,"] ",e.message]},`l${t}`))]})]})]})}function nE({fields:e,submit:t,onSubmit:n}){let r=()=>Object.fromEntries(e.map(e=>[e.name,e.initial??e.options?.[0]??""])),[s,i]=(0,l.useState)(r),a=e[0];return(0,o.jsxs)("form",{className:"mt-1 grid grid-cols-2 gap-1",onSubmit:t=>{t.preventDefault();let o={...r(),...s};o[a.name]?.trim()&&(n(o),i(t=>Object.fromEntries(e.map(e=>[e.name,e.options?t[e.name]??"":e.initial??""]))))},children:[e.map(e=>e.options?(0,o.jsx)("select",{className:nN,"aria-label":e.name,value:s[e.name]??"",onChange:t=>i(n=>({...n,[e.name]:t.target.value})),children:e.options.map(t=>(0,o.jsx)("option",{value:t,children:t||`(${e.name})`},t))},e.name):(0,o.jsx)("input",{className:nN,"aria-label":e.name,placeholder:e.placeholder,value:s[e.name]??"",onChange:t=>i(n=>({...n,[e.name]:t.target.value}))},e.name)),(0,o.jsx)("button",{type:"submit",className:`${nS} col-span-2`,children:t})]})}function n$(){let e=(0,t7.useRequestedDoc)(),[t,n]=(0,l.useState)(null);(0,l.useEffect)(()=>{let e=!0;return no().then(t=>{e&&n(t.projectFile&&K(t.projectFile)?"erd":"machine")}),()=>{e=!1}},[]);let r=e?K(e)?"erd":"machine":t;return null===r?(0,o.jsx)("div",{className:"app-shell bg-gray-950"}):"erd"===r?(0,o.jsx)(nC,{}):(0,o.jsx)(nM,{})}function nM(){var e,t;let n,r,[s,i]=(0,l.useState)("properties"),[a,c]=(0,l.useState)(!1),d=tq(e=>e.errors),h=tq(e=>e.contextMenu),u=tq(e=>e.hideContextMenu),p=tq(e=>e.addState),m=tq(e=>e.removeState),f=tq(e=>e.setDrawMode),g=tq(e=>e.setDrawSource),x=[{id:"properties",label:"Properties",icon:"🎛"},{id:"events",label:"Events",icon:"⚡"},{id:"settings",label:"Settings",icon:"⚙"},{id:"validation",label:"Errors",icon:"⚠",badge:d.length||void 0}],y=x.find(e=>e.id===s)?.label??"";return(0,o.jsxs)("div",{className:"app-shell dock-offset flex flex-col overflow-hidden",onClick:()=>h.visible&&u(),children:[(0,o.jsx)(nl,{}),(0,o.jsx)(nw,{}),(0,o.jsx)(nt,{}),(0,o.jsxs)("div",{className:"flex flex-1 min-h-0 overflow-hidden relative",children:[(0,o.jsx)("div",{className:"flex-1 overflow-hidden",children:(0,o.jsx)(t1,{})}),a&&(0,o.jsx)("div",{className:"fixed inset-0 z-20 bg-black/50 md:hidden",onClick:()=>c(!1),"aria-hidden":"true"}),(0,o.jsxs)("aside",{className:`safe-x fixed inset-x-0 bottom-0 z-30 h-[70dvh] flex flex-col overflow-hidden rounded-t-2xl border-t border-gray-800 bg-gray-900 shadow-2xl transition-transform duration-200 ease-out ${a?"translate-y-0":"translate-y-full pointer-events-none"} md:static md:z-auto md:h-auto md:w-80 md:translate-y-0 md:pointer-events-auto md:rounded-none md:border-t-0 md:border-l md:shadow-none md:transition-none`,children:[(0,o.jsxs)("div",{className:"md:hidden",children:[(0,o.jsx)("div",{className:"flex justify-center pt-2 pb-1",children:(0,o.jsx)("span",{className:"h-1 w-10 rounded-full bg-gray-700"})}),(0,o.jsxs)("div",{className:"flex items-center justify-between border-b border-gray-800 px-4 pb-2",children:[(0,o.jsx)("h2",{className:"text-sm font-semibold text-gray-300",children:y}),(0,o.jsx)("button",{onClick:()=>c(!1),className:"-mr-2 px-3 py-2 text-lg text-gray-400","aria-label":"Close panel",children:"✕"})]})]}),(0,o.jsx)("div",{className:"hidden border-b border-gray-800 md:flex",children:x.map(e=>(0,o.jsxs)("button",{onClick:()=>i(e.id),className:`flex-1 text-xs py-2 px-1 text-center transition-colors relative ${s===e.id?"text-blue-400 border-b-2 border-blue-400 bg-gray-800/50":"text-gray-500 hover:text-gray-300"}`,children:[e.label,void 0!==e.badge&&e.badge>0&&(0,o.jsx)("span",{className:"absolute top-1 right-1 bg-red-600 text-white text-[9px] rounded-full px-1 min-w-[14px]",children:e.badge})]},e.id))}),(0,o.jsxs)("div",{className:"touch-targets dock-offset flex-1 overflow-y-auto overscroll-contain",children:["properties"===s&&(0,o.jsx)(t5,{}),"events"===s&&(0,o.jsx)(t3,{}),"settings"===s&&(0,o.jsx)(t6,{}),"validation"===s&&(0,o.jsx)(t8,{})]})]}),(0,o.jsx)(nn,{})]}),(0,o.jsx)("nav",{className:"dock-safe safe-x fixed inset-x-0 bottom-0 z-40 flex border-t border-gray-800 bg-gray-900/95 backdrop-blur-md md:hidden",children:x.map(e=>{let t=a&&s===e.id;return(0,o.jsxs)("button",{onClick:()=>{var t;return t=e.id,void(c(e=>!(e&&s===t)),i(t))},"aria-pressed":t,className:`relative flex h-14 flex-1 flex-col items-center justify-center gap-0.5 text-[11px] transition-colors ${t?"text-blue-400":"text-gray-500"}`,children:[(0,o.jsx)("span",{className:"text-base leading-none",children:e.icon}),(0,o.jsx)("span",{children:e.label}),void 0!==e.badge&&e.badge>0&&(0,o.jsx)("span",{className:"absolute top-1 right-1/2 translate-x-4 rounded-full bg-red-600 px-1 text-[10px] leading-4 text-white min-w-[16px]",children:e.badge}),t&&(0,o.jsx)("span",{className:"absolute inset-x-4 top-0 h-0.5 rounded-full bg-blue-400"})]},e.id)})}),h.visible&&(0,o.jsx)("div",{className:"fixed z-50 bg-gray-900 border border-gray-700 rounded-lg shadow-xl py-1 min-w-[180px] md:min-w-[140px]",style:(e=h.x,t=h.y,n=window.innerWidth,r=window.innerHeight,{left:e,top:t,maxWidth:"calc(100vw - 1rem)",maxHeight:"calc(100dvh - 1rem)",overflowY:"auto",transform:`translate(${n>0&&e>n/2?"-100%":"0"}, ${r>0&&t>r/2?"-100%":"0"})`}),onClick:e=>e.stopPropagation(),children:h.target?.kind==="state"?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{f("transition"),g(h.target.id),u()},children:"↗ Draw transition from here"}),(0,o.jsx)("button",{className:"block w-full text-left text-sm text-red-400 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{h.target?.id&&m(h.target.id),u()},children:"🗑 Delete state"})]}):(0,o.jsx)(o.Fragment,{children:(0,o.jsx)("button",{className:"block w-full text-left text-sm text-gray-300 hover:bg-gray-800 px-4 py-3 md:text-xs md:px-3 md:py-1.5",onClick:()=>{let e=prompt("State name:");e&&p(null,{name:e,kind:"normal"}),u()},children:"+ Add state here"})})})]})}e.s(["default",()=>n$],63052)}]);
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@miadi/stateloom-web-source",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@miadi/stateloom-web-source",
9
- "version": "0.1.4",
9
+ "version": "0.1.6",
10
10
  "dependencies": {
11
11
  "@miadi/stateloom-canvas": "file:../bridge-canvas",
12
12
  "@miadi/stateloom-client": "file:../bridge-client",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@miadi/stateloom-web-source",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "private": true,
5
5
  "//": [
6
6
  "This is the designer's SOURCE and is never published — hence private: true.",
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useState, type CSSProperties } from "react";
3
+ import { useEffect, useState, type CSSProperties } from "react";
4
4
  import Canvas from "@/components/Canvas";
5
5
  import PropertiesPanel from "@/components/PropertiesPanel";
6
6
  import EventsPanel from "@/components/EventsPanel";
@@ -11,6 +11,10 @@ import CodePreview from "@/components/CodePreview";
11
11
  import DesignBridge from "@/components/DesignBridge";
12
12
  import UiScale from "@/components/UiScale";
13
13
  import { useDesignerStore } from "@/store/useDesignerStore";
14
+ import ErdWorkspace from "@/components/erd/ErdWorkspace";
15
+ import { isErdfPath } from "@miadi/stateloom-protocol";
16
+ import { useRequestedDoc } from "@/lib/docParam";
17
+ import { loadRuntimeConfig } from "@/lib/runtimeConfig";
14
18
 
15
19
  type Tab = "properties" | "events" | "settings" | "validation";
16
20
 
@@ -41,7 +45,33 @@ function contextMenuPlacement(x: number, y: number): CSSProperties {
41
45
  };
42
46
  }
43
47
 
48
+ /**
49
+ * The document's type is its extension (Spec 80): a `.erdf.json` opens the ERD
50
+ * workspace, anything else the state designer. Decided before either mounts, so
51
+ * the state designer's store and bridge never see an ERD: `?doc=` answers by its
52
+ * extension, and without it the serving process names its default document.
53
+ */
44
54
  export default function Home() {
55
+ // `null` until its first effect has read the URL, and whenever there is no `?doc=`.
56
+ const requested = useRequestedDoc();
57
+ const [defaultKind, setDefaultKind] = useState<"machine" | "erd" | null>(null);
58
+
59
+ useEffect(() => {
60
+ let live = true;
61
+ loadRuntimeConfig().then((c) => {
62
+ if (live) setDefaultKind(c.projectFile && isErdfPath(c.projectFile) ? "erd" : "machine");
63
+ });
64
+ return () => {
65
+ live = false;
66
+ };
67
+ }, []);
68
+
69
+ const kind = requested ? (isErdfPath(requested) ? "erd" : "machine") : defaultKind;
70
+ if (kind === null) return <div className="app-shell bg-gray-950" />;
71
+ return kind === "erd" ? <ErdWorkspace /> : <MachineDesigner />;
72
+ }
73
+
74
+ function MachineDesigner() {
45
75
  const [activeTab, setActiveTab] = useState<Tab>("properties");
46
76
  // Phone-only state. The panel column and the bottom sheet are the same
47
77
  // element: below `md` it is an overlay that starts closed so the canvas owns
@@ -30,6 +30,10 @@ export default function DocSwitcher() {
30
30
  const [typed, setTyped] = useState("");
31
31
  const [docs, setDocs] = useState<DocEntry[] | null>(null);
32
32
  const [roots, setRoots] = useState<string[]>([]);
33
+ // What the SERVER currently has open. Not the same as `requested`: with no
34
+ // `?doc=` the browser knows only "the default", and the default is a real
35
+ // path that would otherwise be offered as somewhere to switch to.
36
+ const [current, setCurrent] = useState<string | null>(null);
33
37
  const [error, setError] = useState<string | null>(null);
34
38
 
35
39
  // Fetched on each open, not once: an agent creating a document while the
@@ -40,10 +44,11 @@ export default function DocSwitcher() {
40
44
  setError(null);
41
45
  fetch("/api/docs", { cache: "no-store" })
42
46
  .then((r) => (r.ok ? r.json() : Promise.reject(new Error(`HTTP ${r.status}`))))
43
- .then((body: { docs?: DocEntry[]; roots?: string[] }) => {
47
+ .then((body: { docs?: DocEntry[]; roots?: string[]; current?: string }) => {
44
48
  if (!live) return;
45
49
  setDocs(body.docs ?? []);
46
50
  setRoots(body.roots ?? []);
51
+ setCurrent(body.current ?? null);
47
52
  })
48
53
  .catch((e: Error) => {
49
54
  if (!live) return;
@@ -69,7 +74,8 @@ export default function DocSwitcher() {
69
74
  ? rememberedDocs().filter((d) => d.startsWith("/") && d !== requested && !listed.has(d))
70
75
  : [];
71
76
 
72
- const available = (docs ?? []).filter((d) => d.path !== requested);
77
+ const here = requested ?? current;
78
+ const available = (docs ?? []).filter((d) => d.path !== here);
73
79
  const filter = typed.trim().toLowerCase();
74
80
  const shown = filter
75
81
  ? available.filter((d) => d.path.toLowerCase().includes(filter))