Generate production-ready .drawio XML files that render cleanly in app.diagrams.net.
.drawio file and tell the user how to open it (see Output Delivery)These are non-negotiable. Every flowchart MUST follow all of them.
diagrams.net auto-scales to fit the canvas. A canvas too large = tiny text on screen.
Content complexitypageWidthpageHeightSimple (≤3 stages, few nodes)6001200Medium (4-5 stages)8002800Complex (6+ stages, nested)8003800
dx and dy to match or slightly exceed page dimensions.Use swimlane containers for every stage/group — never bare mxgraph.basic.rect:
xml
<mxCell id="g1" parent="1" connectable="0"
style="swimlane;startSize=32;fillColor=#EBF5FF;strokeColor=#2563EB;
strokeWidth=2;fontSize=16;fontStyle=1;fontColor=#1e40af;
rounded=0;collapsible=0;"
value="① Stage Name" vertex="1">
<mxGeometry x="20" y="60" width="720" height="200" as="geometry" />
</mxCell>
Key properties:
startSize=32 — header height for titlerounded=0 — sharp corners (never rounded containers)collapsible=0 — prevent collapse UIconnectable="0" — on the cell tag, not in styleThree tiers of text size — no exceptions:
LevelfontSizefontStyleExampleStage title (swimlane)14-161 (bold)① Skill 上传Node title (inside box)13 with <b> tagbold via HTML**格式验证 ✅**Node body text12normalSKILL.md & YAML 合法
Use inline HTML for mixed sizes within a single cell:
xml
value="<b style="font-size:13px">Title</b><br><br>Body text line 1<br>Body text line 2"
All text: align=center — no exceptions for node content
Stage titles use swimlane's built-in left-aligned bold header (this is fine)
Nodes within a container: distribute evenly across the container width
Arrows must be clean and orthogonal. No diagonal lines, no crossing, no spaghetti.
xml
<mxCell id="ea_1to2" parent="1" source="g1" target="g2" edge="1"
style="edgeStyle=orthogonalEdgeStyle;strokeWidth=3;strokeColor=#2563EB;
fontColor=#2563EB;fontSize=12;fontStyle=1;"
value="Label text">
xml
<mxCell id="e30" parent="g2" source="30" target="31" edge="1"
style="edgeStyle=orthogonalEdgeStyle;strokeWidth=2;strokeColor=#82b366;">
Use explicit entry points to prevent crossing:
xml
<!-- Left target: entryX=0.25 -->
style="...entryX=0.25;entryY=0;exitX=0.5;exitY=1;"
<!-- Center target: entryX=0.5 -->
style="...entryX=0.5;entryY=0;exitX=0.5;exitY=1;"
<!-- Right target: entryX=0.75 -->
style="...entryX=0.75;entryY=0;exitX=0.5;exitY=1;"
Use dashed lines routed via explicit waypoints on the left margin:
xml
style="edgeStyle=orthogonalEdgeStyle;dashed=1;strokeColor=#d97706;strokeWidth=2;"
With <Array as="points"> routing along x=5 to avoid crossing content.
Use this consistent 5-stage palette. If fewer stages, use a subset:
StagefillColorstrokeColorfontColor1 (intro/input)#EBF5FF#2563EB#1e40af2 (validation)#F0FDF4#16a34a#0478573 (evaluation)#FAF5FF#7c3aed#6d28d94 (approval)#F0FDF4#059669#0478575 (management)#FFF7ED#ea580c#c2410c
Sub-containers (dashed): use lighter fills (#FEFCE8, #FFF7ED, #FEF2F2) with dashed=1.
Node fills: always #FFFFFF with border color matching the parent stage.
Special nodes:
pageWidth - 40 (e.g., 720 for 800-wide canvas)When two parallel options exist (e.g., manual vs automatic):
xml
<mxCell id="s1or" parent="s1box"
style="text;html=1;align=center;fontSize=16;fontStyle=1;fontColor=#999;"
value="或" vertex="1">
Place centered between the two option boxes, vertically aligned to their midpoint.
For status flow annotations or notes at the bottom of a container:
xml
style="rounded=1;whiteSpace=wrap;html=1;fillColor=#f5f5f5;strokeColor=#999;
fontSize=11;align=center;fontStyle=2;"
Height: 22-28px, italic, gray — visually subordinate to main content.
See references/template.md for the complete XML skeleton.
交付本地 .drawio 文件,告诉用户打开方式。
.drawio XML, 必须包含 <mxfile> 外层包裹:xml
<mxfile host="app.diagrams.net" type="device">
<diagram id="xxx" name="图表名称">
<mxGraphModel ...>
<root>
...
</root>
</mxGraphModel>
</diagram>
</mxfile>
.drawio 结尾打开方式(告知用户,选其一即可):
.drawio 文件拖拽到已打开的 app.diagrams.net 页面中Before writing the file, verify:
pageWidth ≤ 800swimlane style with rounded=0;collapsible=0align=center<b> tags at fontSize 13<!-- -->) in the output — they cause load errorsedge cells have edge="1" attribute and valid source/targetconnectable="0" on the tag (not in style)parent="containerId"