diff --git a/apps/ios/EditorBundle/index.html b/apps/ios/EditorBundle/index.html
index f3be2865..96d836ab 100644
--- a/apps/ios/EditorBundle/index.html
+++ b/apps/ios/EditorBundle/index.html
@@ -7,38 +7,38 @@
content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
/>
EdgeEver Editor
-
-
+`},"getStyles"),hT,Gc=(hT=class{constructor(){this.d=""}moveTo(e,r){return this.d+=`M ${e} ${r} `,this}lineTo(e,r){return this.d+=`L ${e} ${r} `,this}horizontalTo(e){return this.d+=`H ${e} `,this}verticalTo(e){return this.d+=`V ${e} `,this}arcTo(e,r,n,i,a,s,o){return this.d+=`A ${e} ${r} ${n} ${i?1:0} ${a?1:0} ${s} ${o} `,this}build(){return this.d.trim()}},w(hT,"PathBuilder"),hT),dT,i2r=(dT=class{constructor(e,r=bae()){this.textCache=new Map,this.svg=e,this.config=r}measureText(e){if(this.textCache.has(e))return this.textCache.get(e);const r=this.svg.append("text").attr("font-family",this.config.fontFamily).attr("font-size",this.config.fontSize).text(e),n=r.node().getBBox(),i={width:n.width,height:n.height};return r.remove(),this.textCache.set(e,i),i}renderTerminal(e,r){const n=this.measureText(r),i=n.width+this.config.padding*2,a=n.height+this.config.padding*2,s=e.append("g").attr("class","railroad-terminal");return s.append("rect").attr("x",0).attr("y",0).attr("width",i).attr("height",a).attr("rx",10).attr("ry",10),s.append("text").attr("x",i/2).attr("y",a/2).text(r),{element:s.node(),dimensions:{width:i,height:a,up:a/2,down:a/2}}}renderNonTerminal(e,r){const n=this.measureText(r),i=n.width+this.config.padding*2,a=n.height+this.config.padding*2,s=e.append("g").attr("class","railroad-nonterminal");return s.append("rect").attr("x",0).attr("y",0).attr("width",i).attr("height",a),s.append("text").attr("x",i/2).attr("y",a/2).text(r),{element:s.node(),dimensions:{width:i,height:a,up:a/2,down:a/2}}}renderSequence(e,r){const n=r.map(u=>this.renderExpression(e,u));let i=0,a=0,s=0;for(const u of n)i+=u.dimensions.width,a=Math.max(a,u.dimensions.up),s=Math.max(s,u.dimensions.down);i+=(n.length-1)*this.config.horizontalSeparation;const o=e.append("g").attr("class","railroad-sequence");let l=0;for(let u=0;uthis.renderExpression(e,f));let i=0,a=0;for(const f of n)i=Math.max(i,f.dimensions.width),a+=f.dimensions.height;a+=(n.length-1)*this.config.verticalSeparation;const s=this.config.arcRadius,o=s*4,l=i+o,u=e.append("g").attr("class","railroad-choice");let h=0;const d=a/2;for(const f of n){const p=h,g=p+f.dimensions.up,m=s*2+(i-f.dimensions.width)/2;u.node().appendChild(f.element).setAttribute("transform",`translate(${m}, ${p})`);const v=new Gc,x=g>d;g===d?v.moveTo(0,d).lineTo(m,g):v.moveTo(0,d).arcTo(s,s,0,!1,x,s,d+(x?s:-s)).lineTo(s,g-(x?s:-s)).arcTo(s,s,0,!1,!x,s*2,g).lineTo(m,g),u.append("path").attr("class","railroad-line").attr("d",v.build());const b=new Gc,T=m+f.dimensions.width,k=l-s*2;g===d?b.moveTo(T,g).lineTo(l,d):b.moveTo(T,g).lineTo(k,g).arcTo(s,s,0,!1,!x,l-s,g+(x?-s:s)).lineTo(l-s,d+(x?s:-s)).arcTo(s,s,0,!1,x,l,d),u.append("path").attr("class","railroad-line").attr("d",b.build()),h+=f.dimensions.height+this.config.verticalSeparation}return{element:u.node(),dimensions:{width:l,height:a,up:d,down:a-d}}}renderOptional(e,r){const n=this.renderExpression(e,r),i=this.config.arcRadius,a=i*2,s=n.dimensions.width+i*4,o=n.dimensions.height+a,l=e.append("g").attr("class","railroad-optional"),u=i*2,h=a;l.node().appendChild(n.element).setAttribute("transform",`translate(${u}, ${h})`);const f=h+n.dimensions.up,p=new Gc().moveTo(0,f).lineTo(i*2,f);l.append("path").attr("class","railroad-line").attr("d",p.build());const g=new Gc().moveTo(u+n.dimensions.width,f).lineTo(s,f);l.append("path").attr("class","railroad-line").attr("d",g.build());const m=new Gc().moveTo(0,f).arcTo(i,i,0,!1,!1,i,f-i).lineTo(i,i).arcTo(i,i,0,!1,!0,i*2,0).lineTo(s-i*2,0).arcTo(i,i,0,!1,!0,s-i,i).lineTo(s-i,f-i).arcTo(i,i,0,!1,!1,s,f);return l.append("path").attr("class","railroad-line").attr("d",m.build()),{element:l.node(),dimensions:{width:s,height:o,up:f,down:o-f}}}renderRepetition(e,r,n){const i=this.renderExpression(e,r),a=this.config.arcRadius,s=a*2,o=i.dimensions.width+a*4,l=n===0,u=i.dimensions.height+s+(l?s:0),h=e.append("g").attr("class","railroad-repetition"),d=a*2,f=l?s:0;h.node().appendChild(i.element).setAttribute("transform",`translate(${d}, ${f})`);const g=f+i.dimensions.up;h.append("path").attr("class","railroad-line").attr("d",new Gc().moveTo(0,g).lineTo(a*2,g).build()),h.append("path").attr("class","railroad-line").attr("d",new Gc().moveTo(d+i.dimensions.width,g).lineTo(o,g).build());const m=f+i.dimensions.height+a,y=new Gc().moveTo(d+i.dimensions.width,g).arcTo(a,a,0,!1,!0,d+i.dimensions.width+a,g+a).lineTo(d+i.dimensions.width+a,m).arcTo(a,a,0,!1,!0,d+i.dimensions.width,m+a).lineTo(a*2,m+a).arcTo(a,a,0,!1,!0,a,m).lineTo(a,g+a).arcTo(a,a,0,!1,!0,a*2,g);if(h.append("path").attr("class","railroad-line").attr("d",y.build()),l){const v=new Gc().moveTo(0,g).arcTo(a,a,0,!1,!1,a,g-a).lineTo(a,a).arcTo(a,a,0,!1,!0,a*2,0).lineTo(o-a*2,0).arcTo(a,a,0,!1,!0,o-a,a).lineTo(o-a,g-a).arcTo(a,a,0,!1,!1,o,g);h.append("path").attr("class","railroad-line").attr("d",v.build())}return{element:h.node(),dimensions:{width:o,height:u,up:g,down:u-g}}}renderSpecial(e,r){const n=this.measureText("? "+r+" ?"),i=n.width+this.config.padding*2,a=n.height+this.config.padding*2,s=e.append("g").attr("class","railroad-special");return s.append("rect").attr("x",0).attr("y",0).attr("width",i).attr("height",a),s.append("text").attr("x",i/2).attr("y",a/2).text("? "+r+" ?"),{element:s.node(),dimensions:{width:i,height:a,up:a/2,down:a/2}}}renderExpression(e,r){switch(r.type){case"terminal":return this.renderTerminal(e,r.value);case"nonterminal":return this.renderNonTerminal(e,r.name);case"sequence":return this.renderSequence(e,r.elements);case"choice":return this.renderChoice(e,r.alternatives);case"optional":return this.renderOptional(e,r.element);case"repetition":return this.renderRepetition(e,r.element,r.min);case"special":return this.renderSpecial(e,r.text);default:throw new Error(`Unknown node type: ${r.type}`)}}renderRule(e,r){const n=this.svg.append("g").attr("class","railroad-rule").attr("transform",`translate(0, ${r})`),i=e.name+" =",a=this.measureText(i).width+20,s=a+20,o=n.append("g"),l=this.renderExpression(o,e.definition),u=Math.max(20,l.dimensions.up),h=u-l.dimensions.up;return o.attr("transform",`translate(${s}, ${h})`),n.append("g").attr("class","railroad-rule-name-group").append("text").attr("class","railroad-rule-name").attr("x",0).attr("y",u).text(i),n.append("g").attr("class","railroad-start").append("circle").attr("cx",a).attr("cy",u).attr("r",this.config.markerRadius),n.append("g").attr("class","railroad-end").append("circle").attr("cx",s+l.dimensions.width+10).attr("cy",u).attr("r",this.config.markerRadius),n.append("path").attr("class","railroad-line").attr("d",new Gc().moveTo(a+this.config.markerRadius,u).lineTo(s,u).build()),n.append("path").attr("class","railroad-line").attr("d",new Gc().moveTo(s+l.dimensions.width,u).lineTo(s+l.dimensions.width+10-this.config.markerRadius,u).build()),{height:Math.max(40,h+l.dimensions.height+this.config.padding*2),width:s+l.dimensions.width+10+this.config.markerRadius}}renderDiagram(e){let r=this.config.padding,n=0;for(const i of e){const a=this.renderRule(i,r);r+=a.height+this.config.verticalSeparation,n=Math.max(n,a.width)}return{width:n+this.config.padding*2,height:r+this.config.padding}}},w(dT,"RailroadRenderer"),dT),Pve=w((t,e,r)=>{Ra(t,e.height,e.width,r),t.attr("viewBox",`0 0 ${e.width} ${e.height}`)},"configureRailroadSvgSize"),a2r=w((t,e,r)=>{he.debug(`[Railroad] Rendering diagram
+`+t);try{const n=Do(e);n.attr("class","railroad-diagram");const i=pr().railroad,a=(i==null?void 0:i.useMaxWidth)??!0,s=Wi.getRules();if(he.debug(`[Railroad] Rendering ${s.length} rules`),s.length===0){he.warn("[Railroad] No rules to render"),Pve(n,{height:100,width:200},a);return}const l=new i2r(n,bae()).renderDiagram(s);Pve(n,l,a),he.debug("[Railroad] Render complete")}catch(n){throw he.error("[Railroad] Render error:",n),n}},"draw"),gP={draw:a2r},s2r=mie().Railroad.parser.LangiumParser,N2=w(t=>{switch(t.$type){case"RailroadTerminalExpr":return{type:"terminal",value:t.value};case"RailroadNonTerminalExpr":return{type:"nonterminal",name:t.name};case"RailroadSpecialExpr":return{type:"special",text:t.text};case"RailroadSequenceExpr":{const e=t.elements.map(N2);return e.length===1?e[0]:{type:"sequence",elements:e}}case"RailroadChoiceExpr":{const e=t.alternatives.map(N2);return e.length===1?e[0]:{type:"choice",alternatives:e}}case"RailroadOptionalExpr":return{type:"optional",element:N2(t.element)};case"RailroadOneOrMoreExpr":return{type:"repetition",element:N2(t.element),min:1,max:1/0};case"RailroadZeroOrMoreExpr":return{type:"repetition",element:N2(t.element),min:0,max:1/0};default:throw new Error(`Unsupported railroad expression: ${t.$type}`)}},"transformExpression"),o2r=w(t=>({name:t.name,definition:N2(t.definition)}),"transformRule"),l2r=w(t=>{Ml(t,Wi),t.title&&Wi.setTitle(t.title),t.rules.map(e=>Wi.addRule(o2r(e)))},"populateDb"),c2r={parse:w(t=>{Wi.clear(),he.debug("[Railroad Parser] Starting Langium parse");const e=s2r.parse(t);if(e.lexerErrors.length>0||e.parserErrors.length>0)throw new I7(e);const r=e.value;he.debug("[Railroad Parser] Parsed rules:",r.rules.length),l2r(r),he.debug("[Railroad Parser] Parse complete")},"parse"),parser:{yy:Wi}},u2r={parser:c2r,db:Wi,renderer:gP,styles:pP};const h2r=Object.freeze(Object.defineProperty({__proto__:null,diagram:u2r},Symbol.toStringTag,{value:"Module"}));var d2r=yie().RailroadEbnf.parser.LangiumParser,j_=w(t=>{const e=t.alternatives.map(f2r);return e.length===1?e[0]:{type:"choice",alternatives:e}},"transformChoice"),f2r=w(t=>{const e=t.elements.map(g2r);return e.length===1?e[0]:{type:"sequence",elements:e}},"transformSequence"),iXe=w(t=>{switch(t.$type){case"EbnfTerminal":return{type:"terminal",value:t.value};case"EbnfNonTerminal":return{type:"nonterminal",name:t.name};case"EbnfSpecial":return{type:"special",text:t.text};case"EbnfGroup":return j_(t.element);case"EbnfOptional":return{type:"optional",element:j_(t.element)};case"EbnfRepetition":return{type:"repetition",element:j_(t.element),min:0,max:1/0};default:throw new Error(`Unsupported EBNF primary node: ${t.$type}`)}},"transformPrimary"),p2r=w((t,e)=>{switch(e.$type){case"EbnfOptionalPostfix":return{type:"optional",element:t};case"EbnfZeroOrMorePostfix":return{type:"repetition",element:t,min:0,max:1/0};case"EbnfOneOrMorePostfix":return{type:"repetition",element:t,min:1,max:1/0};case"EbnfExceptionPostfix":return{type:"sequence",elements:[t,{type:"terminal",value:"-"},iXe(e.except)]};default:throw new Error(`Unsupported EBNF postfix node: ${e.$type}`)}},"transformPostfix"),g2r=w(t=>t.postfixes.reduce((e,r)=>p2r(e,r),iXe(t.base)),"transformTerm"),m2r=w(t=>({name:t.name,definition:j_(t.definition)}),"transformRule"),y2r=w(t=>{Ml(t,Wi),t.title&&Wi.setTitle(t.title),t.rules.map(e=>Wi.addRule(m2r(e)))},"populateDb"),v2r={parse:w(t=>{Wi.clear(),he.debug("[EBNF Parser] Starting Langium parse");const e=d2r.parse(t);if(e.lexerErrors.length>0||e.parserErrors.length>0)throw new I7(e);const r=e.value;he.debug("[EBNF Parser] Parsed rules:",r.rules.length),y2r(r),he.debug("[EBNF Parser] Parse complete")},"parse"),parser:{yy:Wi}},b2r={parser:v2r,db:Wi,renderer:gP,styles:pP};const x2r=Object.freeze(Object.defineProperty({__proto__:null,diagram:b2r},Symbol.toStringTag,{value:"Module"}));var w2r=vie().RailroadAbnf.parser.LangiumParser,XX=w(t=>{const e=t.alternatives.map(T2r);return e.length===1?e[0]:{type:"choice",alternatives:e}},"transformAlternation"),T2r=w(t=>{const e=t.elements.map(C2r);return e.length===1?e[0]:{type:"sequence",elements:e}},"transformConcatenation"),k2r=w(t=>{if(t.includes("*")){const[r,n]=t.split("*"),i=r?parseInt(r,10):0,a=n?parseInt(n,10):1/0;return{min:i,max:a}}const e=parseInt(t,10);return{min:e,max:e}},"parseRepeat"),C2r=w(t=>{const e=S2r(t.primary);if(!t.repeat)return e;const{min:r,max:n}=k2r(t.repeat);return r===0&&n===1?{type:"optional",element:e}:{type:"repetition",element:e,min:r,max:n}},"transformElement"),S2r=w(t=>{switch(t.$type){case"AbnfStringLiteral":return{type:"terminal",value:t.value};case"AbnfNumVal":return{type:"terminal",value:t.value};case"AbnfRuleName":return{type:"nonterminal",name:t.name};case"AbnfGroup":return XX(t.element);case"AbnfOptionalGroup":return{type:"optional",element:XX(t.element)};default:throw new Error(`Unsupported ABNF primary node: ${t.$type}`)}},"transformPrimary"),E2r=w(t=>({name:t.name,definition:XX(t.definition)}),"transformRule"),A2r=w(t=>{Ml(t,Wi),t.title&&Wi.setTitle(t.title),t.rules.map(e=>Wi.addRule(E2r(e)))},"populateDb"),R2r={parse:w(t=>{Wi.clear(),he.debug("[ABNF Parser] Starting Langium parse");const e=w2r.parse(t);if(e.lexerErrors.length>0||e.parserErrors.length>0)throw new I7(e);const r=e.value;he.debug("[ABNF Parser] Parsed rules:",r.rules.length),A2r(r),he.debug("[ABNF Parser] Parse complete")},"parse"),parser:{yy:Wi}},_2r={parser:R2r,db:Wi,renderer:gP,styles:pP};const M2r=Object.freeze(Object.defineProperty({__proto__:null,diagram:_2r},Symbol.toStringTag,{value:"Module"}));var L2r=bie().RailroadPeg.parser.LangiumParser,aXe=w(t=>{const e=t.alternatives.map(I2r);return e.length===1?e[0]:{type:"choice",alternatives:e}},"transformOrderedChoice"),I2r=w(t=>{const e=t.elements.map($2r);return e.length===1?e[0]:{type:"sequence",elements:e}},"transformSequence"),$2r=w(t=>{const e=N2r(t.suffix);return t.operator?{type:"special",text:t.operator==="&"?`&${Bve(e)}`:`!${Bve(e)}`}:e},"transformPrefix"),Bve=w(t=>{switch(t.type){case"terminal":return`"${t.value}"`;case"nonterminal":return t.name;case"special":return t.text;default:return"(...)"}},"nodeToLabel"),N2r=w(t=>{const e=D2r(t.primary);if(!t.operator)return e;switch(t.operator){case"?":return{type:"optional",element:e};case"*":return{type:"repetition",element:e,min:0,max:1/0};case"+":return{type:"repetition",element:e,min:1,max:1/0};default:throw new Error(`Unsupported PEG suffix operator: ${t.operator}`)}},"transformSuffix"),D2r=w(t=>{switch(t.$type){case"PegLiteral":return{type:"terminal",value:t.value};case"PegIdentifier":return{type:"nonterminal",name:t.name};case"PegGroup":return aXe(t.element);case"PegAny":return{type:"special",text:t.dot};default:throw new Error(`Unsupported PEG primary node: ${t.$type}`)}},"transformPrimary"),O2r=w(t=>({name:t.name,definition:aXe(t.definition)}),"transformRule"),P2r=w(t=>{Ml(t,Wi),t.title&&Wi.setTitle(t.title),t.rules.map(e=>Wi.addRule(O2r(e)))},"populateDb"),B2r={parse:w(t=>{Wi.clear(),he.debug("[PEG Parser] Starting Langium parse");const e=L2r.parse(t);if(e.lexerErrors.length>0||e.parserErrors.length>0)throw new I7(e);const r=e.value;he.debug("[PEG Parser] Parsed rules:",r.rules.length),P2r(r),he.debug("[PEG Parser] Parse complete")},"parse"),parser:{yy:Wi}},F2r={parser:B2r,db:Wi,renderer:gP,styles:pP};const z2r=Object.freeze(Object.defineProperty({__proto__:null,diagram:F2r},Symbol.toStringTag,{value:"Module"}));var H2r=1;function xae(){if(!(typeof globalThis>"u"))return globalThis}w(xae,"getCaptureGlobal");function sXe(){var t;return!!((t=xae())!=null&&t.mermaidCaptureSizes)}w(sXe,"shouldCaptureSizes");function oXe(){return typeof location>"u"?"browser-dev":`${location.pathname}${location.search}`}w(oXe,"capturedFromLocation");function lXe(t,e){const r=xae();if(!r)return;const n=e.node(),i=(n&&"ownerSVGElement"in n?n.ownerSVGElement:null)??n,a=(i==null?void 0:i.id)??"(unknown)";r.mermaidCapturedSizes??(r.mermaidCapturedSizes=[]);const s={svgId:a,sizes:t};r.mermaidCapturedSizes.push(s),r.mermaidLastCapturedSizes=s}w(lXe,"emitCapturedSizes");function cXe(t,e){const r=[];for(const n of e.nodes)n.isGroup||r.push({id:n.id,width:n.width??0,height:n.height??0});r.length!==0&&lXe({metadata:{captureVersion:H2r,capturedAt:new Date().toISOString(),capturedFrom:oXe()},nodes:r},t)}w(cXe,"captureNodeSizes");const V2r=Object.freeze(Object.defineProperty({__proto__:null,captureNodeSizes:cXe,shouldCaptureSizes:sXe},Symbol.toStringTag,{value:"Module"})),W2r=Object.freeze(Object.defineProperty({__proto__:null,InfoModule:kqe,createInfoServices:Cqe},Symbol.toStringTag,{value:"Module"})),q2r=Object.freeze(Object.defineProperty({__proto__:null,PacketModule:Sqe,createPacketServices:Eqe},Symbol.toStringTag,{value:"Module"})),G2r=Object.freeze(Object.defineProperty({__proto__:null,PieModule:Aqe,createPieServices:Rqe},Symbol.toStringTag,{value:"Module"})),U2r=Object.freeze(Object.defineProperty({__proto__:null,TreeViewModule:_qe,createTreeViewServices:Mqe},Symbol.toStringTag,{value:"Module"})),Y2r=Object.freeze(Object.defineProperty({__proto__:null,ArchitectureModule:Lqe,createArchitectureServices:Iqe},Symbol.toStringTag,{value:"Module"})),j2r=Object.freeze(Object.defineProperty({__proto__:null,GitGraphModule:wqe,createGitGraphServices:Tqe},Symbol.toStringTag,{value:"Module"})),X2r=Object.freeze(Object.defineProperty({__proto__:null,EventModelingModule:Nqe,createEventModelingServices:Dqe},Symbol.toStringTag,{value:"Module"})),K2r=Object.freeze(Object.defineProperty({__proto__:null,RadarModule:lqe,createRadarServices:cqe},Symbol.toStringTag,{value:"Module"})),Z2r=Object.freeze(Object.defineProperty({__proto__:null,RailroadModule:uqe,createRailroadServices:mie},Symbol.toStringTag,{value:"Module"})),Q2r=Object.freeze(Object.defineProperty({__proto__:null,RailroadEbnfModule:hqe,createRailroadEbnfServices:yie},Symbol.toStringTag,{value:"Module"})),J2r=Object.freeze(Object.defineProperty({__proto__:null,RailroadAbnfModule:dqe,createRailroadAbnfServices:vie},Symbol.toStringTag,{value:"Module"})),ebr=Object.freeze(Object.defineProperty({__proto__:null,RailroadPegModule:fqe,createRailroadPegServices:bie},Symbol.toStringTag,{value:"Module"})),tbr=Object.freeze(Object.defineProperty({__proto__:null,TreemapModule:gqe,createTreemapServices:mqe},Symbol.toStringTag,{value:"Module"})),rbr=Object.freeze(Object.defineProperty({__proto__:null,WardleyModule:yqe,createWardleyServices:vqe},Symbol.toStringTag,{value:"Module"})),nbr=Object.freeze(Object.defineProperty({__proto__:null,CynefinModule:bqe,createCynefinServices:xqe},Symbol.toStringTag,{value:"Module"}));
+