w-flowchart 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -1
- package/dist/w-flowchart.umd.js +2 -2
- package/dist/w-flowchart.umd.js.map +1 -1
- package/docs/WFlowchart.mjs.html +186 -0
- package/docs/global.html +657 -0
- package/docs/index.html +2 -2
- package/package.json +52 -49
- package/src/WFlowchart.mjs +114 -0
- package/src/p1/README.md +2 -2
- package/src/p1/gen.mjs +54 -20
- package/src/p10/README.md +6 -2
- package/src/p10/gen.mjs +235 -15
- package/src/p2/README.md +1 -1
- package/src/p2/gen.mjs +52 -7
- package/src/p3/README.md +1 -1
- package/src/p3/gen.mjs +24 -2
- package/src/p4/README.md +1 -1
- package/src/p4/gen.mjs +36 -10
- package/src/p5/README.md +1 -1
- package/src/p5/gen.mjs +41 -16
- package/src/p6/README.md +1 -1
- package/src/p6/gen.mjs +108 -5
- package/src/p7/README.md +1 -1
- package/src/p7/gen.mjs +42 -3
- package/src/p8/README.md +1 -1
- package/src/p8/gen.mjs +41 -2
- package/src/p9/README.md +1 -1
- package/src/p9/page9.html +13 -5
- package/test/cases-diamond.mjs +221 -0
- package/test/cases.mjs +17 -1
- package/test/data//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +43 -0
- package/test/data//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.json +132 -0
- package/test/data//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.json +27 -0
- package/test/data//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.json +111 -0
- package/test/data//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.json +117 -0
- package/test/data//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.json +203 -0
- package/test/data//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.json +156 -0
- package/test/data//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +46 -0
- package/test/data//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.json +137 -0
- package/test/data//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.json +28 -0
- package/test/data//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.json +134 -0
- package/test/data//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.json +178 -0
- package/test/figures.mjs +3 -2
- package/test/lib.mjs +3 -1
- package/test/p1.test.mjs +5 -0
- package/test/p10.test.mjs +54 -2
- package/test/p2.test.mjs +5 -0
- package/test/p3.test.mjs +5 -0
- package/test/p4.test.mjs +5 -0
- package/test/p5.test.mjs +6 -0
- package/test/p6.test.mjs +5 -0
- package/test/p7.test.mjs +5 -0
- package/test/p8.test.mjs +5 -0
- package/test/p9.test.mjs +5 -0
- package/test/pics/p1/cycle.png +0 -0
- package/test/pics/p1/deep-nest.png +0 -0
- package/test/pics/p1/diamond.png +0 -0
- package/test/pics/p1/edges-mix.png +0 -0
- package/test/pics/p1/english.png +0 -0
- package/test/pics/p1/flat-tb.png +0 -0
- package/test/pics/p1/fold-tall.png +0 -0
- package/test/pics/p1/fold-wide.png +0 -0
- package/test/pics/p1/group-edge.png +0 -0
- package/test/pics/p1/items-node.png +0 -0
- package/test/pics/p1/long-label.png +0 -0
- package/test/pics/p1/lr-flat.png +0 -0
- package/test/pics/p1/nested-group.png +0 -0
- package/test/pics/p1/no-edges.png +0 -0
- package/test/pics/p1/title-overflow.png +0 -0
- package/test/pics/p1/valign.png +0 -0
- package/test/pics/p1//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p1//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p1//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p1//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p1//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p1//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p1//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p1//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p1//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p1//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p1//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p1//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p10/cycle.png +0 -0
- package/test/pics/p10/cycle.svg +1 -0
- package/test/pics/p10/deep-nest.svg +1 -0
- package/test/pics/p10/dia-1in-1out.png +0 -0
- package/test/pics/p10/dia-1in-1out.svg +1 -0
- package/test/pics/p10/dia-1in-2out.png +0 -0
- package/test/pics/p10/dia-1in-2out.svg +1 -0
- package/test/pics/p10/dia-1in.png +0 -0
- package/test/pics/p10/dia-1in.svg +1 -0
- package/test/pics/p10/dia-1out.png +0 -0
- package/test/pics/p10/dia-1out.svg +1 -0
- package/test/pics/p10/dia-2in-1out.png +0 -0
- package/test/pics/p10/dia-2in-1out.svg +1 -0
- package/test/pics/p10/dia-2in-2out-dd.png +0 -0
- package/test/pics/p10/dia-2in-2out-dd.svg +1 -0
- package/test/pics/p10/dia-2in-2out-ss.png +0 -0
- package/test/pics/p10/dia-2in-2out-ss.svg +1 -0
- package/test/pics/p10/dia-2in.png +0 -0
- package/test/pics/p10/dia-2in.svg +1 -0
- package/test/pics/p10/dia-2out.png +0 -0
- package/test/pics/p10/dia-2out.svg +1 -0
- package/test/pics/p10/diamond.png +0 -0
- package/test/pics/p10/diamond.svg +1 -0
- package/test/pics/p10/edges-mix.png +0 -0
- package/test/pics/p10/edges-mix.svg +1 -0
- package/test/pics/p10/english.png +0 -0
- package/test/pics/p10/english.svg +1 -0
- package/test/pics/p10/flat-tb.svg +1 -0
- package/test/pics/p10/fold-tall.svg +1 -0
- package/test/pics/p10/fold-wide.svg +1 -0
- package/test/pics/p10/group-edge.png +0 -0
- package/test/pics/p10/group-edge.svg +1 -0
- package/test/pics/p10/items-node.svg +1 -0
- package/test/pics/p10/long-label.svg +1 -0
- package/test/pics/p10/lr-flat.svg +1 -0
- package/test/pics/p10/nested-group.png +0 -0
- package/test/pics/p10/nested-group.svg +1 -0
- package/test/pics/p10/no-edges.svg +1 -0
- package/test/pics/p10/title-overflow.svg +1 -0
- package/test/pics/p10/valign.svg +1 -0
- package/test/pics/p10//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p10//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +1 -0
- package/test/pics/p10//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p10//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.svg +1 -0
- package/test/pics/p10//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p10//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.svg +1 -0
- package/test/pics/p10//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p10//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.svg +1 -0
- package/test/pics/p10//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p10//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.svg +1 -0
- package/test/pics/p10//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p10//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.svg +1 -0
- package/test/pics/p10//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p10//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.svg +1 -0
- package/test/pics/p10//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p10//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +1 -0
- package/test/pics/p10//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p10//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.svg +1 -0
- package/test/pics/p10//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p10//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.svg +1 -0
- package/test/pics/p10//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p10//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.svg +1 -0
- package/test/pics/p10//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p10//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.svg +1 -0
- package/test/pics/p2/cycle.png +0 -0
- package/test/pics/p2/deep-nest.png +0 -0
- package/test/pics/p2/diamond.png +0 -0
- package/test/pics/p2/edges-mix.png +0 -0
- package/test/pics/p2/english.png +0 -0
- package/test/pics/p2/flat-tb.png +0 -0
- package/test/pics/p2/fold-tall.png +0 -0
- package/test/pics/p2/fold-wide.png +0 -0
- package/test/pics/p2/group-edge.png +0 -0
- package/test/pics/p2/items-node.png +0 -0
- package/test/pics/p2/long-label.png +0 -0
- package/test/pics/p2/lr-flat.png +0 -0
- package/test/pics/p2/nested-group.png +0 -0
- package/test/pics/p2/no-edges.png +0 -0
- package/test/pics/p2/title-overflow.png +0 -0
- package/test/pics/p2/valign.png +0 -0
- package/test/pics/p2//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p2//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p2//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p2//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p2//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p2//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p2//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p2//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p2//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p2//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p2//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p2//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p3/cycle.png +0 -0
- package/test/pics/p3/deep-nest.png +0 -0
- package/test/pics/p3/diamond.png +0 -0
- package/test/pics/p3/edges-mix.png +0 -0
- package/test/pics/p3/english.png +0 -0
- package/test/pics/p3/flat-tb.png +0 -0
- package/test/pics/p3/fold-tall.png +0 -0
- package/test/pics/p3/fold-wide.png +0 -0
- package/test/pics/p3/group-edge.png +0 -0
- package/test/pics/p3/items-node.png +0 -0
- package/test/pics/p3/long-label.png +0 -0
- package/test/pics/p3/lr-flat.png +0 -0
- package/test/pics/p3/nested-group.png +0 -0
- package/test/pics/p3/no-edges.png +0 -0
- package/test/pics/p3/title-overflow.png +0 -0
- package/test/pics/p3/valign.png +0 -0
- package/test/pics/p3//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p3//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p3//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p3//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p3//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p3//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p3//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p3//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p3//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p3//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p3//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p3//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p4/cycle.png +0 -0
- package/test/pics/p4/deep-nest.png +0 -0
- package/test/pics/p4/diamond.png +0 -0
- package/test/pics/p4/edges-mix.png +0 -0
- package/test/pics/p4/english.png +0 -0
- package/test/pics/p4/flat-tb.png +0 -0
- package/test/pics/p4/fold-tall.png +0 -0
- package/test/pics/p4/fold-wide.png +0 -0
- package/test/pics/p4/group-edge.png +0 -0
- package/test/pics/p4/items-node.png +0 -0
- package/test/pics/p4/long-label.png +0 -0
- package/test/pics/p4/lr-flat.png +0 -0
- package/test/pics/p4/nested-group.png +0 -0
- package/test/pics/p4/no-edges.png +0 -0
- package/test/pics/p4/title-overflow.png +0 -0
- package/test/pics/p4/valign.png +0 -0
- package/test/pics/p4//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p4//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p4//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p4//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p4//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p4//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p4//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p4//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p4//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p4//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p4//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p4//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p5/cycle.png +0 -0
- package/test/pics/p5/deep-nest.png +0 -0
- package/test/pics/p5/diamond.png +0 -0
- package/test/pics/p5/edges-mix.png +0 -0
- package/test/pics/p5/english.png +0 -0
- package/test/pics/p5/flat-tb.png +0 -0
- package/test/pics/p5/fold-tall.png +0 -0
- package/test/pics/p5/fold-wide.png +0 -0
- package/test/pics/p5/group-edge.png +0 -0
- package/test/pics/p5/items-node.png +0 -0
- package/test/pics/p5/long-label.png +0 -0
- package/test/pics/p5/lr-flat.png +0 -0
- package/test/pics/p5/nested-group.png +0 -0
- package/test/pics/p5/no-edges.png +0 -0
- package/test/pics/p5/title-overflow.png +0 -0
- package/test/pics/p5/valign.png +0 -0
- package/test/pics/p5//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p5//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p5//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p5//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p5//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p5//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p5//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p5//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p5//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p5//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p5//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p5//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p6/cycle.png +0 -0
- package/test/pics/p6/deep-nest.png +0 -0
- package/test/pics/p6/diamond.png +0 -0
- package/test/pics/p6/edges-mix.png +0 -0
- package/test/pics/p6/english.png +0 -0
- package/test/pics/p6/flat-tb.png +0 -0
- package/test/pics/p6/fold-tall.png +0 -0
- package/test/pics/p6/fold-wide.png +0 -0
- package/test/pics/p6/group-edge.png +0 -0
- package/test/pics/p6/items-node.png +0 -0
- package/test/pics/p6/long-label.png +0 -0
- package/test/pics/p6/lr-flat.png +0 -0
- package/test/pics/p6/nested-group.png +0 -0
- package/test/pics/p6/no-edges.png +0 -0
- package/test/pics/p6/title-overflow.png +0 -0
- package/test/pics/p6/valign.png +0 -0
- package/test/pics/p6//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p6//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p6//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p6//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p6//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.alt.png +0 -0
- package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.new.png +0 -0
- package/test/pics/p6//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p6//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p6//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p6//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p6//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p6//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p6//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p7/cycle.png +0 -0
- package/test/pics/p7/deep-nest.png +0 -0
- package/test/pics/p7/diamond.png +0 -0
- package/test/pics/p7/edges-mix.png +0 -0
- package/test/pics/p7/english.png +0 -0
- package/test/pics/p7/flat-tb.png +0 -0
- package/test/pics/p7/fold-tall.png +0 -0
- package/test/pics/p7/fold-wide.png +0 -0
- package/test/pics/p7/group-edge.png +0 -0
- package/test/pics/p7/items-node.png +0 -0
- package/test/pics/p7/long-label.png +0 -0
- package/test/pics/p7/lr-flat.png +0 -0
- package/test/pics/p7/nested-group.png +0 -0
- package/test/pics/p7/no-edges.png +0 -0
- package/test/pics/p7/title-overflow.png +0 -0
- package/test/pics/p7/valign.png +0 -0
- package/test/pics/p7//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p7//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p7//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p7//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p7//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p7//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p7//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p7//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p7//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p7//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p7//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p7//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p8/cycle.png +0 -0
- package/test/pics/p8/deep-nest.png +0 -0
- package/test/pics/p8/diamond.png +0 -0
- package/test/pics/p8/edges-mix.png +0 -0
- package/test/pics/p8/english.png +0 -0
- package/test/pics/p8/flat-tb.png +0 -0
- package/test/pics/p8/fold-tall.png +0 -0
- package/test/pics/p8/fold-wide.png +0 -0
- package/test/pics/p8/group-edge.png +0 -0
- package/test/pics/p8/items-node.png +0 -0
- package/test/pics/p8/long-label.png +0 -0
- package/test/pics/p8/lr-flat.png +0 -0
- package/test/pics/p8/nested-group.png +0 -0
- package/test/pics/p8/no-edges.png +0 -0
- package/test/pics/p8/title-overflow.png +0 -0
- package/test/pics/p8/valign.png +0 -0
- package/test/pics/p8//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p8//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p8//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p8//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p8//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p8//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p8//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p8//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p8//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p8//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p8//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p8//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p9/cycle.png +0 -0
- package/test/pics/p9/deep-nest.png +0 -0
- package/test/pics/p9/diamond.png +0 -0
- package/test/pics/p9/edges-mix.png +0 -0
- package/test/pics/p9/english.png +0 -0
- package/test/pics/p9/flat-tb.png +0 -0
- package/test/pics/p9/fold-tall.png +0 -0
- package/test/pics/p9/fold-wide.png +0 -0
- package/test/pics/p9/group-edge.png +0 -0
- package/test/pics/p9/items-node.png +0 -0
- package/test/pics/p9/long-label.png +0 -0
- package/test/pics/p9/lr-flat.png +0 -0
- package/test/pics/p9/nested-group.png +0 -0
- package/test/pics/p9/no-edges.png +0 -0
- package/test/pics/p9/title-overflow.png +0 -0
- package/test/pics/p9/valign.png +0 -0
- package/test/pics/p9//345/267/245/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p9//345/276/256/346/234/215/345/213/231/345/217/242/351/233/206/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p9//346/234/203/345/223/241/350/250/273/345/206/212/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p9//346/250/241/347/265/204/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics/p9//346/254/212/351/231/220/350/247/222/350/211/262/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics/p9//347/211/251/350/201/257/347/266/262/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p9//347/263/273/347/265/261/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p9//350/250/202/345/226/256/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p9//350/263/207/346/226/231/346/265/201/345/220/221/345/234/226.png +0 -0
- package/test/pics/p9//350/263/207/346/226/231/346/270/205/346/264/227/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics/p9//351/233/273/345/225/206/345/271/263/345/217/260/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics/p9//351/240/201/351/235/242/345/260/216/350/246/275/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/snapshot.mjs +67 -0
- package/test/wflowchart.test.mjs +57 -11
- package/toolg/gDistRollup.mjs +3 -0
- package/test/data//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.json +0 -92
- package/test/data//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.json +0 -112
- package/test/data//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.json +0 -116
- package/test/data//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.json +0 -251
- package/test/data//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.json +0 -126
- package/test/data//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.json +0 -133
- package/test/data//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.json +0 -102
- package/test/data//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.json +0 -117
- package/test/data//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.json +0 -162
- package/test/pics/cycle.png +0 -0
- package/test/pics/cycle.svg +0 -1
- package/test/pics/deep-nest.svg +0 -1
- package/test/pics/diamond.png +0 -0
- package/test/pics/diamond.svg +0 -1
- package/test/pics/edges-mix.png +0 -0
- package/test/pics/edges-mix.svg +0 -1
- package/test/pics/english.png +0 -0
- package/test/pics/english.svg +0 -1
- package/test/pics/flat-tb.svg +0 -1
- package/test/pics/fold-tall.svg +0 -1
- package/test/pics/fold-wide.svg +0 -1
- package/test/pics/group-edge.png +0 -0
- package/test/pics/group-edge.svg +0 -1
- package/test/pics/items-node.svg +0 -1
- package/test/pics/long-label.svg +0 -1
- package/test/pics/lr-flat.svg +0 -1
- package/test/pics/nested-group.png +0 -0
- package/test/pics/nested-group.svg +0 -1
- package/test/pics/no-edges.svg +0 -1
- package/test/pics/title-overflow.svg +0 -1
- package/test/pics/valign.svg +0 -1
- package/test/pics//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics//344/275/234/346/245/255/346/265/201/347/250/213/345/234/226.svg +0 -1
- package/test/pics//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.png +0 -0
- package/test/pics//345/211/215/347/253/257/346/236/266/346/247/213/350/210/207/350/263/207/346/226/231/346/265/201/345/234/226.svg +0 -1
- package/test/pics//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics//345/276/214/347/253/257/346/234/215/345/213/231/347/265/204/346/210/220/345/234/226.svg +0 -1
- package/test/pics//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.png +0 -0
- package/test/pics//346/211/271/346/254/241/344/270/212/345/202/263/350/231/225/347/220/206/346/265/201/347/250/213/345/234/226.svg +0 -1
- package/test/pics//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.png +0 -0
- package/test/pics//347/250/213/345/274/217/345/205/203/344/273/266/347/265/204/346/210/220/345/234/226.svg +0 -1
- package/test/pics//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics//347/250/213/345/274/217/345/210/206/345/261/244/346/236/266/346/247/213/345/234/226.svg +0 -1
- package/test/pics//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.png +0 -0
- package/test/pics//347/263/273/347/265/261/346/236/266/346/247/213/345/234/226.svg +0 -1
- package/test/pics//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics//347/263/273/347/265/261/351/227/234/350/201/257/345/234/226.svg +0 -1
- package/test/pics//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.png +0 -0
- package/test/pics//347/267/232/344/270/212/347/225/253/351/235/242/351/227/234/350/201/257/345/234/226.svg +0 -1
- /package/test/pics/{deep-nest.png → p10/deep-nest.png} +0 -0
- /package/test/pics/{flat-tb.png → p10/flat-tb.png} +0 -0
- /package/test/pics/{fold-tall.png → p10/fold-tall.png} +0 -0
- /package/test/pics/{fold-wide.png → p10/fold-wide.png} +0 -0
- /package/test/pics/{items-node.png → p10/items-node.png} +0 -0
- /package/test/pics/{long-label.png → p10/long-label.png} +0 -0
- /package/test/pics/{lr-flat.png → p10/lr-flat.png} +0 -0
- /package/test/pics/{no-edges.png → p10/no-edges.png} +0 -0
- /package/test/pics/{title-overflow.png → p10/title-overflow.png} +0 -0
- /package/test/pics/{valign.png → p10/valign.png} +0 -0
package/README.md
CHANGED
|
@@ -43,7 +43,11 @@ let inp = {
|
|
|
43
43
|
],
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
let buf = await WFlowchart('p10'
|
|
46
|
+
let buf = await WFlowchart(inp) //預設 opt.mode 為 'p10'; 可用 WFlowchart(inp, { mode: 'p3' }) 指定產線('p1'~'p10' 各對應一套繪圖引擎)
|
|
47
47
|
fs.writeFileSync('flowchart.png', buf)
|
|
48
48
|
// => 產出 flowchart.png
|
|
49
|
+
|
|
50
|
+
let svg = await WFlowchart(inp, { output: 'svg' }) //輸出 standalone SVG 字串(p1~p8 與 p10 支援; p9 不支援)
|
|
51
|
+
fs.writeFileSync('flowchart.svg', svg)
|
|
52
|
+
// => 產出 flowchart.svg
|
|
49
53
|
```
|
package/dist/w-flowchart.umd.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* w-flowchart v1.0.
|
|
2
|
+
* w-flowchart v1.0.1
|
|
3
3
|
* (c) 2018-2021 yuda-lyu(semisphere)
|
|
4
4
|
* Released under the MIT License.
|
|
5
5
|
*/
|
|
6
|
-
!function(n){"function"==typeof define&&define.amd?define(n):n()}(function(){});
|
|
6
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("playwright"),require("fs"),require("url"),require("path"),require("@terrastruct/d2"),require("sharp")):"function"==typeof define&&define.amd?define(["playwright","fs","url","path","@terrastruct/d2","sharp"],t):(e="undefined"!=typeof globalThis?globalThis:e||self)["w-flowchart"]=t(e.playwright,e.fs,e.url,e.path,e["@terrastruct/d2"],e.sharp)}(this,function(e,t,n,r,o,a){"use strict";var i="undefined"!=typeof document?document.currentScript:null,s=Array.isArray,l="object"==typeof global&&global&&global.Object===Object&&global,c="object"==typeof self&&self&&self.Object===Object&&self,d=l||c||Function("return this")(),p=d.Symbol,f=Object.prototype,u=f.hasOwnProperty,h=f.toString,g=p?p.toStringTag:void 0;var y=Object.prototype.toString;var b=p?p.toStringTag:void 0;function m(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":b&&b in Object(e)?function(e){var t=u.call(e,g),n=e[g];try{e[g]=void 0;var r=!0}catch(e){}var o=h.call(e);return r&&(t?e[g]=n:delete e[g]),o}(e):function(e){return y.call(e)}(e)}function x(e){return null!=e&&"object"==typeof e}function w(e){return"symbol"==typeof e||x(e)&&"[object Symbol]"==m(e)}var v=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,k=/^\w*$/;function _(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function E(e){if(!_(e))return!1;var t=m(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}var S,I=d["__core-js_shared__"],O=(S=/[^.]+$/.exec(I&&I.keys&&I.keys.IE_PROTO||""))?"Symbol(src)_1."+S:"";var A=Function.prototype.toString;function M(e){if(null!=e){try{return A.call(e)}catch(e){}try{return e+""}catch(e){}}return""}var j=/^\[object .+?Constructor\]$/,L=Function.prototype,P=Object.prototype,B=L.toString,F=P.hasOwnProperty,D=RegExp("^"+B.call(F).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function N(e){return!(!_(e)||(t=e,O&&O in t))&&(E(e)?D:j).test(M(e));var t}function $(e,t){var n=function(e,t){return null==e?void 0:e[t]}(e,t);return N(n)?n:void 0}var G=$(Object,"create");var T=Object.prototype.hasOwnProperty;var C=Object.prototype.hasOwnProperty;function R(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}function H(e,t){return e===t||e!=e&&t!=t}function z(e,t){for(var n=e.length;n--;)if(H(e[n][0],t))return n;return-1}R.prototype.clear=function(){this.__data__=G?G(null):{},this.size=0},R.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},R.prototype.get=function(e){var t=this.__data__;if(G){var n=t[e];return"__lodash_hash_undefined__"===n?void 0:n}return T.call(t,e)?t[e]:void 0},R.prototype.has=function(e){var t=this.__data__;return G?void 0!==t[e]:C.call(t,e)},R.prototype.set=function(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=G&&void 0===t?"__lodash_hash_undefined__":t,this};var W=Array.prototype.splice;function q(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}q.prototype.clear=function(){this.__data__=[],this.size=0},q.prototype.delete=function(e){var t=this.__data__,n=z(t,e);return!(n<0)&&(n==t.length-1?t.pop():W.call(t,n,1),--this.size,!0)},q.prototype.get=function(e){var t=this.__data__,n=z(t,e);return n<0?void 0:t[n][1]},q.prototype.has=function(e){return z(this.__data__,e)>-1},q.prototype.set=function(e,t){var n=this.__data__,r=z(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this};var J=$(d,"Map");function U(e,t){var n,r,o=e.__data__;return("string"==(r=typeof(n=t))||"number"==r||"symbol"==r||"boolean"==r?"__proto__"!==n:null===n)?o["string"==typeof t?"string":"hash"]:o.map}function X(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}X.prototype.clear=function(){this.size=0,this.__data__={hash:new R,map:new(J||q),string:new R}},X.prototype.delete=function(e){var t=U(this,e).delete(e);return this.size-=t?1:0,t},X.prototype.get=function(e){return U(this,e).get(e)},X.prototype.has=function(e){return U(this,e).has(e)},X.prototype.set=function(e,t){var n=U(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this};function Y(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],a=n.cache;if(a.has(o))return a.get(o);var i=e.apply(this,r);return n.cache=a.set(o,i)||a,i};return n.cache=new(Y.Cache||X),n}Y.Cache=X;var V,Z,K,Q=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,ee=/\\(\\)?/g,te=(V=function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(Q,function(e,n,r,o){t.push(r?o.replace(ee,"$1"):n||e)}),t},Z=Y(V,function(e){return 500===K.size&&K.clear(),e}),K=Z.cache,Z),ne=te;var re=p?p.prototype:void 0,oe=re?re.toString:void 0;function ae(e){if("string"==typeof e)return e;if(s(e))return function(e,t){for(var n=-1,r=null==e?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}(e,ae)+"";if(w(e))return oe?oe.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function ie(e,t){return s(e)?e:function(e,t){if(s(e))return!1;var n=typeof e;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=e&&!w(e))||k.test(e)||!v.test(e)||null!=t&&e in Object(t)}(e,t)?[e]:ne(function(e){return null==e?"":ae(e)}(e))}function se(e){if("string"==typeof e||w(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function le(e,t,n){var r=null==e?void 0:function(e,t){for(var n=0,r=(t=ie(t,e)).length;null!=e&&n<r;)e=e[se(t[n++])];return n&&n==r?e:void 0}(e,t);return void 0===r?n:r}function ce(e){var t=this.__data__=new q(e);this.size=t.size}ce.prototype.clear=function(){this.__data__=new q,this.size=0},ce.prototype.delete=function(e){var t=this.__data__,n=t.delete(e);return this.size=t.size,n},ce.prototype.get=function(e){return this.__data__.get(e)},ce.prototype.has=function(e){return this.__data__.has(e)},ce.prototype.set=function(e,t){var n=this.__data__;if(n instanceof q){var r=n.__data__;if(!J||r.length<199)return r.push([e,t]),this.size=++n.size,this;n=this.__data__=new X(r)}return n.set(e,t),this.size=n.size,this};var de=function(){try{var e=$(Object,"defineProperty");return e({},"",{}),e}catch(e){}}(),pe=de;function fe(e,t,n){"__proto__"==t&&pe?pe(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}var ue=Object.prototype.hasOwnProperty;function he(e,t,n){var r=e[t];ue.call(e,t)&&H(r,n)&&(void 0!==n||t in e)||fe(e,t,n)}function ge(e,t,n,r){var o=!n;n||(n={});for(var a=-1,i=t.length;++a<i;){var s=t[a],l=r?r(n[s],e[s],s,n,e):void 0;void 0===l&&(l=e[s]),o?fe(n,s,l):he(n,s,l)}return n}function ye(e){return x(e)&&"[object Arguments]"==m(e)}var be=Object.prototype,me=be.hasOwnProperty,xe=be.propertyIsEnumerable,we=ye(function(){return arguments}())?ye:function(e){return x(e)&&me.call(e,"callee")&&!xe.call(e,"callee")},ve=we;var ke="object"==typeof exports&&exports&&!exports.nodeType&&exports,_e=ke&&"object"==typeof module&&module&&!module.nodeType&&module,Ee=_e&&_e.exports===ke?d.Buffer:void 0,Se=(Ee?Ee.isBuffer:void 0)||function(){return!1},Ie=/^(?:0|[1-9]\d*)$/;function Oe(e,t){var n=typeof e;return!!(t=null==t?9007199254740991:t)&&("number"==n||"symbol"!=n&&Ie.test(e))&&e>-1&&e%1==0&&e<t}function Ae(e){return"number"==typeof e&&e>-1&&e%1==0&&e<=9007199254740991}var Me={};function je(e){return function(t){return e(t)}}Me["[object Float32Array]"]=Me["[object Float64Array]"]=Me["[object Int8Array]"]=Me["[object Int16Array]"]=Me["[object Int32Array]"]=Me["[object Uint8Array]"]=Me["[object Uint8ClampedArray]"]=Me["[object Uint16Array]"]=Me["[object Uint32Array]"]=!0,Me["[object Arguments]"]=Me["[object Array]"]=Me["[object ArrayBuffer]"]=Me["[object Boolean]"]=Me["[object DataView]"]=Me["[object Date]"]=Me["[object Error]"]=Me["[object Function]"]=Me["[object Map]"]=Me["[object Number]"]=Me["[object Object]"]=Me["[object RegExp]"]=Me["[object Set]"]=Me["[object String]"]=Me["[object WeakMap]"]=!1;var Le="object"==typeof exports&&exports&&!exports.nodeType&&exports,Pe=Le&&"object"==typeof module&&module&&!module.nodeType&&module,Be=Pe&&Pe.exports===Le&&l.process,Fe=function(){try{var e=Pe&&Pe.require&&Pe.require("util").types;return e||Be&&Be.binding&&Be.binding("util")}catch(e){}}(),De=Fe&&Fe.isTypedArray,Ne=De?je(De):function(e){return x(e)&&Ae(e.length)&&!!Me[m(e)]},$e=Object.prototype.hasOwnProperty;function Ge(e,t){var n=s(e),r=!n&&ve(e),o=!n&&!r&&Se(e),a=!n&&!r&&!o&&Ne(e),i=n||r||o||a,l=i?function(e,t){for(var n=-1,r=Array(e);++n<e;)r[n]=t(n);return r}(e.length,String):[],c=l.length;for(var d in e)!t&&!$e.call(e,d)||i&&("length"==d||o&&("offset"==d||"parent"==d)||a&&("buffer"==d||"byteLength"==d||"byteOffset"==d)||Oe(d,c))||l.push(d);return l}var Te=Object.prototype;function Ce(e){var t=e&&e.constructor;return e===("function"==typeof t&&t.prototype||Te)}function Re(e,t){return function(n){return e(t(n))}}var He=Re(Object.keys,Object),ze=Object.prototype.hasOwnProperty;function We(e){return null!=e&&Ae(e.length)&&!E(e)}function qe(e){return We(e)?Ge(e):function(e){if(!Ce(e))return He(e);var t=[];for(var n in Object(e))ze.call(e,n)&&"constructor"!=n&&t.push(n);return t}(e)}var Je=Object.prototype.hasOwnProperty;function Ue(e){if(!_(e))return function(e){var t=[];if(null!=e)for(var n in Object(e))t.push(n);return t}(e);var t=Ce(e),n=[];for(var r in e)("constructor"!=r||!t&&Je.call(e,r))&&n.push(r);return n}function Xe(e){return We(e)?Ge(e,!0):Ue(e)}var Ye="object"==typeof exports&&exports&&!exports.nodeType&&exports,Ve=Ye&&"object"==typeof module&&module&&!module.nodeType&&module,Ze=Ve&&Ve.exports===Ye?d.Buffer:void 0,Ke=Ze?Ze.allocUnsafe:void 0;function Qe(){return[]}var et=Object.prototype.propertyIsEnumerable,tt=Object.getOwnPropertySymbols,nt=tt?function(e){return null==e?[]:(e=Object(e),function(e,t){for(var n=-1,r=null==e?0:e.length,o=0,a=[];++n<r;){var i=e[n];t(i,n,e)&&(a[o++]=i)}return a}(tt(e),function(t){return et.call(e,t)}))}:Qe,rt=nt;function ot(e,t){for(var n=-1,r=t.length,o=e.length;++n<r;)e[o+n]=t[n];return e}var at=Re(Object.getPrototypeOf,Object),it=Object.getOwnPropertySymbols?function(e){for(var t=[];e;)ot(t,rt(e)),e=at(e);return t}:Qe,st=it;function lt(e,t,n){var r=t(e);return s(e)?r:ot(r,n(e))}function ct(e){return lt(e,qe,rt)}function dt(e){return lt(e,Xe,st)}var pt=$(d,"DataView"),ft=$(d,"Promise"),ut=$(d,"Set"),ht=$(d,"WeakMap"),gt="[object Map]",yt="[object Promise]",bt="[object Set]",mt="[object WeakMap]",xt="[object DataView]",wt=M(pt),vt=M(J),kt=M(ft),_t=M(ut),Et=M(ht),St=m;(pt&&St(new pt(new ArrayBuffer(1)))!=xt||J&&St(new J)!=gt||ft&&St(ft.resolve())!=yt||ut&&St(new ut)!=bt||ht&&St(new ht)!=mt)&&(St=function(e){var t=m(e),n="[object Object]"==t?e.constructor:void 0,r=n?M(n):"";if(r)switch(r){case wt:return xt;case vt:return gt;case kt:return yt;case _t:return bt;case Et:return mt}return t});var It=St,Ot=Object.prototype.hasOwnProperty;var At=d.Uint8Array;function Mt(e){var t=new e.constructor(e.byteLength);return new At(t).set(new At(e)),t}var jt=/\w*$/;var Lt=p?p.prototype:void 0,Pt=Lt?Lt.valueOf:void 0;function Bt(e,t,n){var r,o=e.constructor;switch(t){case"[object ArrayBuffer]":return Mt(e);case"[object Boolean]":case"[object Date]":return new o(+e);case"[object DataView]":return function(e,t){var n=t?Mt(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.byteLength)}(e,n);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return function(e,t){var n=t?Mt(e.buffer):e.buffer;return new e.constructor(n,e.byteOffset,e.length)}(e,n);case"[object Map]":case"[object Set]":return new o;case"[object Number]":case"[object String]":return new o(e);case"[object RegExp]":return function(e){var t=new e.constructor(e.source,jt.exec(e));return t.lastIndex=e.lastIndex,t}(e);case"[object Symbol]":return r=e,Pt?Object(Pt.call(r)):{}}}var Ft=Object.create,Dt=function(){function e(){}return function(t){if(!_(t))return{};if(Ft)return Ft(t);e.prototype=t;var n=new e;return e.prototype=void 0,n}}(),Nt=Dt;var $t=Fe&&Fe.isMap,Gt=$t?je($t):function(e){return x(e)&&"[object Map]"==It(e)};var Tt=Fe&&Fe.isSet,Ct=Tt?je(Tt):function(e){return x(e)&&"[object Set]"==It(e)},Rt="[object Arguments]",Ht="[object Function]",zt="[object Object]",Wt={};function qt(e,t,n,r,o,a){var i,l=1&t,c=2&t,d=4&t;if(n&&(i=o?n(e,r,o,a):n(e)),void 0!==i)return i;if(!_(e))return e;var p=s(e);if(p){if(i=function(e){var t=e.length,n=new e.constructor(t);return t&&"string"==typeof e[0]&&Ot.call(e,"index")&&(n.index=e.index,n.input=e.input),n}(e),!l)return function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}(e,i)}else{var f=It(e),u=f==Ht||"[object GeneratorFunction]"==f;if(Se(e))return function(e,t){if(t)return e.slice();var n=e.length,r=Ke?Ke(n):new e.constructor(n);return e.copy(r),r}(e,l);if(f==zt||f==Rt||u&&!o){if(i=c||u?{}:function(e){return"function"!=typeof e.constructor||Ce(e)?{}:Nt(at(e))}(e),!l)return c?function(e,t){return ge(e,st(e),t)}(e,function(e,t){return e&&ge(t,Xe(t),e)}(i,e)):function(e,t){return ge(e,rt(e),t)}(e,function(e,t){return e&&ge(t,qe(t),e)}(i,e))}else{if(!Wt[f])return o?e:{};i=Bt(e,f,l)}}a||(a=new ce);var h=a.get(e);if(h)return h;a.set(e,i),Ct(e)?e.forEach(function(r){i.add(qt(r,t,n,r,e,a))}):Gt(e)&&e.forEach(function(r,o){i.set(o,qt(r,t,n,o,e,a))});var g=p?void 0:(d?c?dt:ct:c?Xe:qe)(e);return function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r&&!1!==t(e[n],n,e););}(g||e,function(r,o){g&&(r=e[o=r]),he(i,o,qt(r,t,n,o,e,a))}),i}Wt[Rt]=Wt["[object Array]"]=Wt["[object ArrayBuffer]"]=Wt["[object DataView]"]=Wt["[object Boolean]"]=Wt["[object Date]"]=Wt["[object Float32Array]"]=Wt["[object Float64Array]"]=Wt["[object Int8Array]"]=Wt["[object Int16Array]"]=Wt["[object Int32Array]"]=Wt["[object Map]"]=Wt["[object Number]"]=Wt[zt]=Wt["[object RegExp]"]=Wt["[object Set]"]=Wt["[object String]"]=Wt["[object Symbol]"]=Wt["[object Uint8Array]"]=Wt["[object Uint8ClampedArray]"]=Wt["[object Uint16Array]"]=Wt["[object Uint32Array]"]=!0,Wt["[object Error]"]=Wt[Ht]=Wt["[object WeakMap]"]=!1;function Jt(e){return"[object String]"===Object.prototype.toString.call(e)}function Ut(e){return!(!Jt(e)||""===e)}function Xt(e){return"[object Object]"===Object.prototype.toString.call(e)}function Yt(e){return"[object Array]"===Object.prototype.toString.call(e)}function Vt(e){return!!function(e){return"[object Undefined]"===Object.prototype.toString.call(e)}(e)||(!!function(e){return"[object Null]"===Object.prototype.toString.call(e)}(e)||(!!function(e){if(Xt(e)){for(let t in e)return!1;return!0}return!1}(e)||(!!function(e){return!(!Jt(e)||""!==e)}(e)||(!!function(e){return!!Yt(e)&&0===e.length}(e)||!!function(e){return e!=e}(e)))))}const Zt={blue:{fill:"#eef4fb",stroke:"#3f6fb0",text:"#1c2b36",shape:"box"},green:{fill:"#eaf4ef",stroke:"#348a5c",text:"#1c2b36",shape:"box"},orange:{fill:"#fcf0e2",stroke:"#c46e1a",text:"#1c2b36",shape:"box"},purple:{fill:"#f4f0fa",stroke:"#8163ad",text:"#23303a",shape:"box"},red:{fill:"#fbecea",stroke:"#c0392b",text:"#23303a",shape:"box"},done:{fill:"#eaf4ef",stroke:"#256046",text:"#256046",shape:"box"},diamond:{fill:"#fcf0e2",stroke:"#c46e1a",text:"#23303a",shape:"diamond"},blueG:{fill:"#f5f9fe",stroke:"#3f6fb0",text:"#3f6fb0",group:!0},blueG2:{fill:"#eef4fb",stroke:"#3f6fb0",text:"#3f6fb0",group:!0},greenG:{fill:"#f0f7f3",stroke:"#348a5c",text:"#348a5c",group:!0},greenG2:{fill:"#eaf4ef",stroke:"#348a5c",text:"#348a5c",group:!0},orangeG:{fill:"#fdf6ec",stroke:"#c46e1a",text:"#c46e1a",group:!0},purpleG:{fill:"#faf7fd",stroke:"#8163ad",text:"#8163ad",group:!0}},Kt={line:"#44505a",text:"#4a5560",textBg:"transparent",haloColor:"#ffffff",haloWidth:3.5},Qt="'Microsoft JhengHei', sans-serif",en=e=>/G2?$/.test(e||""),tn=e=>Zt[e]||Zt.blue,nn=r.dirname(n.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:i&&"SCRIPT"===i.tagName.toUpperCase()&&i.src||new URL("w-flowchart.umd.js",document.baseURI).href));function rn(e){let n=nn;for(let o=0;o<10;o++){const o=r.join(n,"node_modules",e);if(t.existsSync(o))return o;const a=r.dirname(n);if(a===n)break;n=a}throw new Error("找不到本機套件檔案 node_modules/"+e)}function on(e){return t.readFileSync(rn(e),"utf8").replace(/<\/script/gi,"<\\/script")}function an(e){return t.readFileSync(rn(e),"utf8")}const sn=on("mermaid10/dist/mermaid.min.js");function ln(e,t){return"diamond"===e.cls?`${t(e.id)}{"${e.label}"}`:`${t(e.id)}["${e.label}"]`}function cn(e){const{dir:t,nodes:n,edges:r}=e,o=new Set,a={},i=e=>{if(a[e])return a[e];const t="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let n=t,r=2;for(;o.has(n);)n=t+"_"+r++;return o.add(n),a[e]=n,n},s={};for(const e of n)s[e.id]=e;new Set(n.filter(e=>en(e.cls)).map(e=>e.id));const l=new Set(n.map(e=>e.cls)),c=[];for(const e of l){const t=Zt[e]||Zt.blue;en(e)?c.push(` classDef ${e} fill:${t.fill},stroke:${t.stroke},stroke-width:1.8px,color:${t.text}`):"diamond"===e?c.push(` classDef ${e} fill:${t.fill},stroke:${t.stroke},stroke-width:1.6px,color:${t.text}`):c.push(` classDef ${e} fill:${t.fill},stroke:${t.stroke},stroke-width:1.5px,color:${t.text}`)}const d={};for(const e of n)d[e.cls]||(d[e.cls]=[]),d[e.cls].push(e.id);const p=[];for(const[e,t]of Object.entries(d))p.push(` class ${t.map(i).join(",")} ${e}`);const f=n.filter(e=>en(e.cls)&&!e.group).map(e=>e.id),u=n.filter(e=>!en(e.cls)&&!e.group);function h(e,t){const r=s[e],o=[];o.push(`${t}subgraph ${i(e)}["${r.label}"]`);const a=n.filter(t=>t.group===e&&!en(t.cls));for(const e of a)o.push(`${t} ${ln(e,i)}`);const l=n.filter(t=>en(t.cls)&&t.group===e);for(const e of l)o.push(...h(e.id,t+" "));return o.push(`${t}end`),o}const g=[];for(const e of r){const t="dashed"===e.kind?"-..->":"--\x3e",n=e.label?`|"${e.label}"| `:"";g.push(` ${i(e.from)} ${t} ${n}${i(e.to)}`)}const y=[`flowchart ${t}`];for(const e of u)y.push(` ${ln(e,i)}`);for(const e of f)y.push(...h(e," "));return y.push(...g),y.push(...c),y.push(...p),y.join("\n")}async function dn(t){const n=await e.chromium.launch();try{const e=await n.newPage({deviceScaleFactor:4});await e.setContent(function(e){return`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${sn}<\/script>\n</head><body style="margin:0;background:#fff;font-family:'微軟正黑體','Microsoft JhengHei',sans-serif">\n<div id="box" style="display:inline-block;padding:24px"></div>\n<script>\nmermaid.initialize({ startOnLoad:false, theme:'base', themeVariables:{ fontFamily:"'Microsoft JhengHei','微軟正黑體',sans-serif", fontSize:'17px', primaryColor:'#eef4fb', primaryBorderColor:'#3f6fb0', lineColor:'#44505a', primaryTextColor:'#1c2b36' }, themeCSS: '.flowchart-link{stroke:#44505a !important;stroke-width:2.5px !important;} .edgePaths .path{stroke:#44505a !important;stroke-width:2.5px !important;} .marker,.marker path{fill:#44505a !important;stroke:#44505a !important;} .edgeLabel .label{background:transparent !important;} .edgeLabel{background:transparent !important;} .edgeLabel rect{fill:transparent !important;opacity:0 !important;} .label foreignObject{overflow:visible;} .cluster-label text,.cluster-label span,.cluster-label div,.edgeLabel span{font-family:"Microsoft JhengHei","微軟正黑體",sans-serif !important;}' });\n(async () => {\n try {\n const { svg } = await mermaid.render('g', ${JSON.stringify(e)})\n document.getElementById('box').innerHTML = svg\n const DK = '#333333', W = '3px'\n document.querySelectorAll('#box .edgePaths path, #box .edgePath path, #box path.flowchart-link, #box g.edgePaths path').forEach((p) => { p.style.setProperty('stroke', DK, 'important'); p.style.setProperty('stroke-width', W, 'important') })\n document.querySelectorAll('#box marker path, #box .marker, #box .marker path').forEach((m) => { m.style.setProperty('fill', DK, 'important'); m.style.setProperty('stroke', DK, 'important') })\n document.querySelectorAll('#box .node rect, #box .node polygon, #box .node circle, #box .node path').forEach((n) => { n.style.setProperty('stroke-width', '2px', 'important') })\n document.querySelectorAll('#box .cluster rect, #box .cluster polygon, #box .cluster path').forEach((c) => { c.style.setProperty('stroke', '#777777', 'important'); c.style.setProperty('stroke-width', '1.5px', 'important') })\n // 修正 A: 邊標籤背景透明 + 白色光暈(透過 foreignObject 內 span 的 CSS)\n document.querySelectorAll('#box .edgeLabel rect, #box .edgeLabel .label').forEach((el) => {\n el.style.setProperty('fill', 'transparent', 'important')\n el.style.setProperty('background', 'transparent', 'important')\n el.style.setProperty('opacity', '1', 'important')\n })\n document.querySelectorAll('#box .edgeLabel foreignObject').forEach((fo) => {\n fo.style.setProperty('overflow', 'visible', 'important')\n })\n document.querySelectorAll('#box .edgeLabel span, #box .edgeLabel .edgeLabel').forEach((sp) => {\n sp.style.setProperty('background', 'transparent', 'important')\n sp.style.setProperty('color', '#4a5560', 'important')\n // 字型覆蓋: 邊標籤 span 可能繼承系統字型, 強制指定\n sp.style.setProperty('font-family', "'Microsoft JhengHei', '微軟正黑體', sans-serif", 'important')\n // 白色光暈: CSS text-shadow 多向\n sp.style.setProperty('text-shadow', '-1.5px -1.5px 0 #fff, 1.5px -1.5px 0 #fff, -1.5px 1.5px 0 #fff, 1.5px 1.5px 0 #fff, 0 -2px 0 #fff, 0 2px 0 #fff, -2px 0 0 #fff, 2px 0 0 #fff', 'important')\n // 修正 B: 英數識別字不攔腰斷\n sp.style.setProperty('word-break', 'normal', 'important')\n sp.style.setProperty('overflow-wrap', 'break-word', 'important')\n })\n // 字型覆蓋: cluster(subgraph)標題文字 — mermaid@10 的 .cluster-label text/span 不繼承 fontFamily themeVariable\n document.querySelectorAll('#box .cluster-label text, #box .cluster-label span, #box .cluster-label div').forEach((el) => {\n el.style.setProperty('font-family', "'Microsoft JhengHei', '微軟正黑體', sans-serif", 'important')\n })\n document.title = 'DONE'\n }\n catch (e) {\n document.title = 'FAIL'\n console.log('mmErr', e.message)\n }\n})()\n<\/script></body></html>`}(t),{waitUntil:"load"}),await e.waitForFunction(()=>"DONE"===document.title||"FAIL"===document.title,{timeout:3e4});if("DONE"!==await e.title()){const t=await e.evaluate(()=>{const e=document.getElementById("box");return e?e.innerText:""});throw new Error(`mermaid render failed: ${t}`)}return await e.evaluate(()=>document.fonts.ready),{browser:n,page:e}}catch(e){throw await n.close(),e}}const pn="https://pkg.local/";async function fn(n){const r="---\nconfig:\n layout: elk\n---\n"+function(e){const t=e.dir||"TB",n="TB"===t?"LR":"TB",r=new Set,o={},a=e=>{if(o[e])return o[e];const t="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let n=t,a=2;for(;r.has(n);)n=t+"_"+a++;return r.add(n),o[e]=n,n},i={},s={};for(const t of e.nodes)s[t.id]=t,t.group&&(i[t.group]||(i[t.group]=[]),i[t.group].push(t.id));const l=e.nodes.filter(e=>!e.group),c=[];function d(e,t){const r=" ".repeat(t);if(en(e.cls)){c.push(`${r}subgraph ${a(e.id)}["${e.label}"]`),c.push(`${r} direction ${n}`);const o=i[e.id]||[];for(const e of o)d(s[e],t+1);c.push(`${r}end`)}else{const t="diamond"===e.cls?`{${e.label}}`:`["${e.label}"]`;c.push(`${r}${a(e.id)}${t}`)}}c.push(`flowchart ${t}`);for(const e of l)d(e,1);for(const t of e.edges){const e="dashed"===t.kind?"-.->":"--\x3e",n=t.label?`|"${t.label}"|`:"";c.push(` ${a(t.from)} ${e}${n} ${a(t.to)}`)}const p=new Set(e.nodes.map(e=>e.cls)),f={};for(const t of e.nodes)f[t.cls]||(f[t.cls]=[]),f[t.cls].push(t.id);for(const e of p){const t=Zt[e]||Zt.blue,n=t.fill,r=t.stroke,o=t.text,a=(en(e),"1.5px");c.push(` classDef ${e} fill:${n},stroke:${r},stroke-width:${a},color:${o};`)}for(const[e,t]of Object.entries(f))c.push(` class ${t.map(a).join(",")} ${e};`);return c.join("\n")}(n),o=await e.chromium.launch();try{const e=await o.newPage({deviceScaleFactor:2});await async function(e){await e.route(pn+"**",e=>{const n=decodeURIComponent(e.request().url().slice(18).split("?")[0]);try{e.fulfill({body:t.readFileSync(rn(n)),contentType:n.endsWith(".css")?"text/css":"text/javascript"})}catch(t){e.fulfill({status:404,body:String(t&&t.message||t)})}})}(e),await e.setContent("<!doctype html><html lang=\"zh-Hant\"><head><meta charset=\"utf-8\">\n<style>\n /* 修正 A: 邊標籤光暈 — paint-order + stroke 白邊讓線段透出、文字仍清晰 */\n .edgeLabel text, .edgeLabel tspan {\n paint-order: stroke fill;\n stroke: #ffffff;\n stroke-width: 3.5px;\n stroke-linejoin: round;\n }\n /* 修正 A: 邊標籤背景框透明(移除不透明白底, 否則會遮斷轉折線) */\n .edgeLabel rect, .edgeLabel .label-container {\n fill: transparent !important;\n fill-opacity: 0 !important;\n stroke: none !important;\n }\n /* 修正 B: 節點標籤禁止英數識別字被攔腰斷行 */\n .node foreignObject div, .node foreignObject span,\n .label foreignObject div, .label foreignObject span {\n word-break: keep-all;\n overflow-wrap: break-word;\n white-space: normal;\n }\n /* 修正 C: 字型全覆蓋 — subgraph/容器標題(cluster-label)強制 Microsoft JhengHei */\n .cluster-label foreignObject div, .cluster-label foreignObject span,\n .cluster-label text, .cluster-label tspan,\n .nodeLabel, .nodeLabel span, text, tspan {\n font-family: 'Microsoft JhengHei','微軟正黑體',sans-serif !important;\n }\n</style>\n</head>\n<body style=\"margin:0;background:#fff;font-family:'微軟正黑體','Microsoft JhengHei',sans-serif\">\n<div id=\"box\" style=\"display:inline-block;padding:24px\"></div>\n<script type=\"module\">\ntry {\n const mermaid = (await import('https://pkg.local/mermaid11/dist/mermaid.esm.min.mjs')).default\n const elk = (await import('https://pkg.local/@mermaid-js/layout-elk/dist/mermaid-layout-elk.esm.min.mjs')).default\n mermaid.registerLayoutLoaders(elk)\n mermaid.initialize({ startOnLoad:false, theme:'base', flowchart:{ useMaxWidth:false }, themeVariables:{ fontFamily:\"'微軟正黑體','Microsoft JhengHei',sans-serif\", fontSize:'17px', primaryColor:'#eef4fb', primaryBorderColor:'#3f6fb0', lineColor:'#44505a', primaryTextColor:'#1c2b36' } })\n window.renderFig = async (code, idx) => {\n try {\n const { svg } = await mermaid.render('g'+idx, code)\n const box = document.getElementById('box'); box.innerHTML = svg\n const svgEl = box.querySelector('svg')\n try {\n const vb = svgEl.viewBox && svgEl.viewBox.baseVal\n let w = vb && vb.width, h = vb && vb.height\n if (!w || !h) { const bb = svgEl.getBBox(); w = bb.width; h = bb.height }\n svgEl.style.maxWidth = 'none'\n svgEl.setAttribute('width', Math.ceil(w))\n svgEl.setAttribute('height', Math.ceil(h))\n } catch(e){}\n const DK='#333333', W='3px'\n box.querySelectorAll('.edgePaths path, .edgePath path, path.flowchart-link, g.edgePaths path').forEach(p=>{p.style.setProperty('stroke',DK,'important');p.style.setProperty('stroke-width',W,'important')})\n box.querySelectorAll('marker path, .marker, .marker path').forEach(m=>{m.style.setProperty('fill',DK,'important');m.style.setProperty('stroke',DK,'important')})\n box.querySelectorAll('.node rect, .node polygon, .node circle, .node path').forEach(n=>n.style.setProperty('stroke-width','2px','important'))\n box.querySelectorAll('.cluster rect, .cluster polygon, .cluster path').forEach(c=>{c.style.setProperty('stroke','#777','important');c.style.setProperty('stroke-width','1.5px','important')})\n // 修正 A (JS 層): 邊標籤背景矩形透明 + 文字白色光暈(JS inline style 強制覆蓋 mermaid 注入的樣式)\n box.querySelectorAll('.edgeLabel rect, .edgeLabel .label-container').forEach(r=>{\n r.style.setProperty('fill','transparent','important')\n r.style.setProperty('fill-opacity','0','important')\n r.style.setProperty('stroke','none','important')\n })\n box.querySelectorAll('.edgeLabel text, .edgeLabel tspan').forEach(t=>{\n t.style.setProperty('paint-order','stroke fill','important')\n t.style.setProperty('stroke','#ffffff','important')\n t.style.setProperty('stroke-width','3.5px','important')\n t.style.setProperty('stroke-linejoin','round','important')\n })\n // 修正 C (JS 層): 字型全覆蓋 — subgraph/容器標題 cluster-label + 所有 SVG text/tspan\n const FF = \"'Microsoft JhengHei','微軟正黑體',sans-serif\"\n box.querySelectorAll('.cluster-label foreignObject div, .cluster-label foreignObject span').forEach(el=>{\n el.style.setProperty('font-family',FF,'important')\n })\n box.querySelectorAll('text, tspan').forEach(el=>{\n el.style.setProperty('font-family',FF,'important')\n })\n if (document.fonts && document.fonts.ready) await document.fonts.ready\n return { ok:true }\n } catch(e){ return { ok:false, err:(e&&(e.message||e.stack))||String(e) } }\n }\n window.__ready = true\n} catch(e){ window.__setupErr = (e&&(e.message||e.stack))||String(e) }\n<\/script></body></html>",{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready||window.__setupErr,{timeout:9e4}).catch(()=>{});const n=await e.evaluate(()=>window.__setupErr);if(n)throw new Error(n);const a=await e.evaluate(([e,t])=>window.renderFig(e,t),[r,0]);if(!a.ok)throw new Error(a.err);return await e.waitForTimeout(250),{browser:o,page:e}}catch(e){throw await o.close(),e}}function un(e){return String(e).toLowerCase().replace(/[^a-z]/g,e=>"2"===e?"b":"g")}function hn(e){const t="LR"===e.dir?"right":"down",n=function(){const e=[];for(const[t,n]of Object.entries(Zt))"diamond"!==t&&e.push(`#.${un(t)}: fill=${n.fill} stroke=${n.stroke}`);return e.join("\n")}(),r={};for(const t of e.nodes)r[t.id]=t;return`#direction: ${t}\n#font: Microsoft JhengHei\n${n}\n${e.nodes.map(e=>{return`[${t=e.cls,"diamond"===t?"<choice>":`<${un(t)}>`}${e.label}]`;var t}).join("\n")}\n${e.nodes.filter(e=>e.group&&r[e.group]).map(e=>`[${r[e.group].label}] --\x3e [${e.label}]`).join("\n")}\n${e.edges.map(e=>{const t=r[e.from]?.label??e.from,n=r[e.to]?.label??e.to,o="dashed"===e.kind?"--\x3e":"->";return`[${t}]${e.label?` ${e.label} `:" "}${o} [${n}]`}).join("\n")}`}const gn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${on("graphre/dist/graphre.js")}<\/script>\n<script>${on("nomnoml/dist/nomnoml.js")}<\/script>\n</head><body style="margin:0;background:#fff;font-family:'Microsoft JhengHei',sans-serif">\n<div id="box" style="display:inline-block;padding:20px"></div>\n<script>\nvar HALO_COLOR = ${JSON.stringify(Kt.haloColor)}, HALO_W = ${Kt.haloWidth}\nfunction applyEdgeLabelHalo(box){\n // 邊標籤 = <text> 無 data-name(節點內標籤皆帶 data-name)。\n var svg = box.querySelector('svg')\n var ts = Array.prototype.slice.call(box.querySelectorAll('svg text'))\n ts.forEach(function(t){\n if (t.hasAttribute('data-name')) return // 節點標籤, 不處理\n // (A) 白描邊 + paint-order:stroke 使描邊在字下方\n t.setAttribute('paint-order','stroke')\n t.setAttribute('stroke', HALO_COLOR)\n t.setAttribute('stroke-width', HALO_W)\n t.setAttribute('stroke-linejoin','round')\n // (B) z-order: 移至 svg 尾端 → 最後繪製, 永不被節點 rect/容器填色蓋住\n svg.appendChild(t)\n })\n}\nwindow.renderAndDetect = function(src){\n try {\n var svg = window.nomnoml.renderSvg(src)\n var box = document.getElementById('box'); box.innerHTML = svg\n applyEdgeLabelHalo(box)\n var texts = Array.prototype.slice.call(box.querySelectorAll('svg text'))\n var R = texts.map(function(t){ return t.getBoundingClientRect() })\n // 只計「節點×節點」文字重疊驅動間距(原則2/3): 節點標籤帶 data-name; 邊標籤無 data-name。\n // 凡牽涉邊標籤之重疊(邊標籤×節點 / 邊標籤×邊標籤)一律「不算碰撞」——其可讀性已由\n // halo(白描邊)+ z-order(提至最上層)保證, 不該用「加大間距」處理(否則 進度回報×Worker Thread\n // 這類邊標籤壓節點之 bbox 重疊會把圖撐爆)。唯有節點本體互疊才是 z-order 無法解、須間距處理者。\n var isNode = texts.map(function(t){ return t.hasAttribute('data-name') })\n var col = 0, details = []\n for (var i=0;i<R.length;i++) for (var j=i+1;j<R.length;j++){\n if (!(isNode[i] && isNode[j])) continue // 任一方為邊標籤 → 交給 halo+z-order, 不驅動間距\n var a=R[i], b=R[j]\n var ix = Math.min(a.right,b.right)-Math.max(a.left,b.left)\n var iy = Math.min(a.bottom,b.bottom)-Math.max(a.top,b.top)\n if (ix>2 && iy>2){ col++; if(details.length<3) details.push(((texts[i].textContent||'').trim().slice(0,6))+'×'+((texts[j].textContent||'').trim().slice(0,6))) }\n }\n return { ok:true, collisions: col, details: details }\n } catch(e){ return { ok:false, err:(e&&(e.message||e.stack))||String(e) } }\n}\nwindow.__ready = true\n<\/script></body></html>`;async function yn(t){const n=await e.chromium.launch();try{const e=await n.newPage({deviceScaleFactor:2});await e.setContent(gn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{});const r=hn(t),o=await async function(e,t){const n=[40,60,85];let r=null;for(const o of n){const n=await e.evaluate(e=>window.renderAndDetect(e),"#spacing: "+o+"\n"+t);if(!n.ok)return{ok:!1,err:String(n.err).split("\n")[0]};if((null===r||n.collisions<r.collisions)&&(r={spacing:o,collisions:n.collisions,details:n.details}),0===n.collisions){r={spacing:o,collisions:0,details:[]};break}}return{ok:!0,...r}}(e,r);if(!o.ok)throw new Error(o.err);return await e.evaluate(e=>window.renderAndDetect(e),"#spacing: "+o.spacing+"\n"+r),await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(180),{browser:n,page:e}}catch(e){throw await n.close(),e}}const bn=on("cytoscape/dist/cytoscape.min.js"),mn=on("dagre/dist/dagre.min.js"),xn=on("cytoscape-dagre/dist/cytoscape-dagre.js"),wn=on("cytoscape-svg/cytoscape-svg.js");function vn(e){const t=[];for(const n of e.nodes)t.push({data:{id:n.id,label:n.label,parent:n.group},classes:n.cls});for(const n of e.edges)t.push({data:{source:n.from,target:n.to,label:n.label},classes:"dashed"===n.kind?"dashed":void 0});return t}const kn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${bn}<\/script>\n<script>${mn}<\/script>\n<script>${xn}<\/script>\n<script>${wn}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="cy" style="width:1400px;height:1400px;background:#fff"></div>\n<script>\nif (window.cytoscapeDagre) { try { cytoscape.use(window.cytoscapeDagre) } catch(e){} }\nif (window.cytoscapeSvg) { try { cytoscape.use(window.cytoscapeSvg) } catch(e){} }\n// mode: 'png'(預設) 或 'svg' — 版面/元素/樣式建置流程共用, 僅末端輸出格式不同(genPng 行為不變)\nwindow.renderFig = function(els, styleJson, rankDir, mode){ return new Promise(function(resolve){\n try {\n var cy = cytoscape({ container: document.getElementById('cy'), elements: els, style: JSON.parse(styleJson) })\n els.forEach(function(x){ if (x.classes && x.data && x.data.id) cy.getElementById(x.data.id).addClass(x.classes) })\n var l = cy.layout({ name:'dagre', rankDir:rankDir, nodeSep:42, rankSep:55, edgeSep:18 })\n l.promiseOn('layoutstop').then(function(){\n setTimeout(function(){\n try {\n var bb=cy.elements().boundingBox()\n if (mode === 'svg') { window.__svg = cy.svg({ full:true, scale:2, bg:'#ffffff' }) }\n else { window.__png = cy.png({ full:true, scale:2, bg:'#ffffff', output:'base64' }) }\n resolve({ ok:true, w:Math.round(bb.w), h:Math.round(bb.h) })\n }\n catch(e){ resolve({ ok:false, err:String(e.message||e) }) }\n }, 250)\n })\n l.run()\n } catch(e){ resolve({ ok:false, err:String(e.message||e) }) }\n})}\nwindow.__ready = true\n<\/script></body></html>`;async function _n(t,n){const r=await e.chromium.launch();try{const e=await r.newPage({deviceScaleFactor:1});await e.setContent(kn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=await e.evaluate(([e,t,n,r])=>window.renderFig(e,t,n,r),[vn(t),'[\n { "selector":"node", "style":{ "shape":"round-rectangle","background-color":"#eef4fb","border-color":"#3f6fb0","border-width":1.8,"label":"data(label)","text-valign":"center","text-halign":"center","font-family":"Microsoft JhengHei, sans-serif","font-size":14,"color":"#1c2b36","width":"label","height":"label","padding":"10px","text-wrap":"wrap","text-max-width":"360px" } },\n { "selector":"node.green", "style":{ "background-color":"#eaf4ef","border-color":"#348a5c" } },\n { "selector":"node.orange", "style":{ "background-color":"#fcf0e2","border-color":"#c46e1a" } },\n { "selector":"node.purple", "style":{ "background-color":"#f4f0fa","border-color":"#8163ad" } },\n { "selector":"node.red", "style":{ "background-color":"#fbecea","border-color":"#c0392b" } },\n { "selector":"node.done", "style":{ "background-color":"#eaf4ef","border-color":"#256046","color":"#256046" } },\n { "selector":"node.diamond", "style":{ "shape":"diamond","background-color":"#fcf0e2","border-color":"#c46e1a","padding":"34px","text-max-width":"120px" } },\n { "selector":":parent", "style":{ "text-valign":"top","text-halign":"center","font-family":"Microsoft JhengHei, sans-serif","font-weight":"bold","padding":"16px","background-opacity":0.35,"border-width":2,"z-compound-depth":"bottom" } },\n { "selector":"node.blueG", "style":{ "background-color":"#f5f9fe","border-color":"#3f6fb0","color":"#3f6fb0" } },\n { "selector":"node.blueG2", "style":{ "background-color":"#eef4fb","border-color":"#3f6fb0","color":"#3f6fb0" } },\n { "selector":"node.greenG", "style":{ "background-color":"#f0f7f3","border-color":"#348a5c","color":"#348a5c" } },\n { "selector":"node.greenG2", "style":{ "background-color":"#eaf4ef","border-color":"#348a5c","color":"#348a5c" } },\n { "selector":"node.orangeG", "style":{ "background-color":"#fdf6ec","border-color":"#c46e1a","color":"#c46e1a" } },\n { "selector":"node.purpleG", "style":{ "background-color":"#faf7fd","border-color":"#8163ad","color":"#8163ad" } },\n { "selector":"edge", "style":{ "width":2.2,"line-color":"#44505a","target-arrow-color":"#44505a","target-arrow-shape":"triangle","curve-style":"bezier","label":"data(label)","font-family":"Microsoft JhengHei, sans-serif","font-size":12.5,"color":"#4a5560","text-background-opacity":0,"text-outline-color":"#ffffff","text-outline-width":3,"text-margin-y":-2 } },\n { "selector":"edge.dashed", "style":{ "line-style":"dashed" } }\n]',t.dir,n]);if(!o.ok)throw new Error(o.err);return await e.evaluate(e=>"svg"===e?window.__svg:window.__png,n)}finally{await r.close()}}const En='"Microsoft JhengHei","Microsoft YaHei",sans-serif',Sn=`<style>text,.text-bold,.text-italic,.text-underline,tspan{font-family:${En} !important;}.text-bold{font-weight:bold !important;}</style>`;const In="<style>.text-italic{paint-order:stroke;stroke:#ffffff;stroke-width:3.5px;}</style>";const On=e=>String(e).replace(/\$/g,"\\$"),An={TB:"down",LR:"right",BT:"up",RL:"left"};function Mn(e,t){const n=tn(e),r=[];return r.push(` style.fill: "${n.fill}"`),r.push(` style.stroke: "${n.stroke}"`),n.text&&(t||"done"===e)&&r.push(` style.font-color: "${n.text}"`),t&&r.push(" style.bold: true"),"diamond"===n.shape&&r.push(" shape: diamond"),r}function jn(e,t,n){const r=[];let o=e;for(;o;)r.unshift(o),o=t[o];return r.map(n).join(".")}function Ln(e,t,n,r,o,a){const i=" ".repeat(o),s=[];if(en(e.cls)){s.push(`${i}${a(e.id)}: "${On(e.label)}" {`);const l=t[e.id]||[];l.length>0&&s.push(`${i} direction: ${An[r]||"down"}`);for(const t of Mn(e.cls,!0))s.push(`${i}${t}`);for(const e of l)s.push(Ln(e,t,n,r,o+2,a));s.push(`${i}}`)}else{s.push(`${i}${a(e.id)}: "${On(e.label)}" {`);for(const t of Mn(e.cls,!1))s.push(`${i}${t}`);s.push(`${i}}`)}return s.join("\n")}const Pn={layout:"dagre",pad:40,themeID:0};async function Bn(e){const t=new o.D2;try{const n=function(e){const t=new Set,n={},r=e=>{if(n[e])return n[e];const r="n_"+String(e).replace(/[^A-Za-z0-9_]/g,"_");let o=r,a=2;for(;t.has(o);)o=r+"_"+a++;return t.add(o),n[e]=o,o},o={},a={};for(const t of e.nodes)t.group&&(o[t.id]=t.group,a[t.group]||(a[t.group]=[]),a[t.group].push(t));const i=e.nodes.filter(e=>!e.group),s=[];s.push(`direction: ${An[e.dir]||"down"}`);for(const t of i)s.push(Ln(t,a,o,e.dir,0,r));for(const t of e.edges){let e=`${jn(t.from,o,r)} -> ${jn(t.to,o,r)}`;t.label&&(e+=`: "${On(t.label)}"`),"dashed"===t.kind&&(e+=" { style.stroke-dash: 4 }"),s.push(e)}return s.join("\n\n")}(e),r=await t.compile({fs:{index:n},options:Pn});let o=await t.render(r.diagram,r.renderOptions);return o=function(e){const t=(e=e.replace(/<mask\b([^>]*)>([\s\S]*?)<\/mask>/g,(e,t,n)=>`<mask${t}>${n.replace(/<rect[^>]*fill="black"[^>]*><\/rect>/g,"")}</mask>`)).indexOf("<style");if(t>=0)return e.slice(0,t)+In+e.slice(t);const n=e.indexOf(">");return e.slice(0,n+1)+In+e.slice(n+1)}(o),o=function(e){const t=(e=(e=e.replace(/font-family\s*:\s*[^;}<]+/gi,`font-family:${En}`)).replace(/font-family\s*=\s*"[^"]*"/gi,`font-family="${En}"`)).indexOf("<style");if(t>=0)return e.slice(0,t)+Sn+e.slice(t);const n=e.indexOf(">");return e.slice(0,n+1)+Sn+e.slice(n+1)}(o),o}finally{await t.ready.catch(()=>{}),t.worker&&t.worker.terminate&&await t.worker.terminate()}}const Fn=on("@antv/g6/dist/g6.min.js"),Dn=on("@antv/g-lite/dist/index.umd.min.js"),Nn=on("@antv/g-svg/dist/index.umd.min.js");function $n(e){const t=String(e).split("\n");return[Math.round(Math.max(...t.map(e=>[...e].reduce((e,t)=>e+(/[一-鿿()/]/.test(t)?15.5:8.5),0)))+34),Math.round(26*t.length+20)]}function Gn(e){const t=[],n=[],r=new Set(e.nodes.filter(e=>en(e.cls)).map(e=>e.id)),o={};for(const t of e.nodes)t.group&&(o[t.group]=o[t.group]||[]).push(t);const a=e=>{for(const t of o[e]||[]){if(!en(t.cls))return t.id;const e=a(t.id);if(e)return e}return null},i=e=>r.has(e)&&a(e)||e;for(const r of e.nodes){const e=tn(r.cls);if(en(r.cls)){n.push({id:r.id,combo:r.group,type:"rect",style:{zIndex:-10,labelText:r.label,labelPlacement:"top",labelFontFamily:Qt,labelFontSize:15,labelFontWeight:700,labelFill:e.text,fill:e.fill,fillOpacity:.3,stroke:e.stroke,lineWidth:2}});continue}const o="diamond"===e.shape;let[a,i]=$n(r.label);o&&(a+=60,i+=50),t.push({id:r.id,combo:r.group,type:o?"diamond":"rect",style:{size:[a,i],radius:o?0:6,lineWidth:1.8,fill:e.fill,stroke:e.stroke,labelText:r.label,labelPlacement:"center",labelFill:e.text,labelFontSize:14,labelFontFamily:Qt}})}let s=0;return{nodes:t,combos:n,edges:e.edges.map(e=>{s++;const t="dashed"===e.kind;return{id:"e"+s,source:i(e.from),target:i(e.to),style:{zIndex:100,lineWidth:2.2,endArrow:!0,stroke:t?tn("orange").stroke:Kt.line,lineDash:t?[7,5]:void 0,labelText:e.label||"",labelFontFamily:Qt,labelFontSize:12.5,labelFill:Kt.text,labelBackground:!1,labelStroke:Kt.haloColor,labelLineWidth:Kt.haloWidth,labelPaintOrder:"stroke",labelAutoRotate:!1}}})}}const Tn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Fn}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="g6" style="background:#fff"></div>\n<script>\nwindow.renderFig = async function(g, rankdir, nodesep, ranksep, canvas, font, comboZ, edgeZ){\n try {\n const el = document.getElementById('g6')\n el.style.width = canvas + 'px'; el.style.height = canvas + 'px'\n if (window.__graph) { try { window.__graph.destroy() } catch(e){} }\n const graph = new G6.Graph({\n container: el, width: canvas, height: canvas, autoFit:'view',\n data: { nodes: g.nodes, edges: g.edges, combos: g.combos },\n layout: { type:'antv-dagre', rankdir: rankdir, nodesep: nodesep, ranksep: ranksep, sortByCombo: (g.combos && g.combos.length>0) },\n // 原則2:combo 墊底、edge 最上層之 graph 預設(各元素 style 已設, 此處兜底)\n combo: { type:'rect', style:{ zIndex: comboZ, padding:[30,18,18,18], labelPlacement:'top', labelFontFamily: font } },\n edge: { type:'polyline', style:{ zIndex: edgeZ, lineWidth:2.2, endArrow:true, labelFontFamily: font } },\n // 原則1:node/edge/combo 三層 graph 預設字型統一(JhengHei), 全覆蓋兜底\n node: { style:{ labelFontFamily: font } },\n })\n window.__graph = graph\n await graph.render()\n await new Promise(r=>setTimeout(r,300))\n return { ok:true }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\n// 以目前已渲染之圖截圖\nwindow.snap = async function(){\n try {\n await new Promise(r=>setTimeout(r,200))\n const png = await window.__graph.toDataURL({ mode:'overall' })\n return { ok:true, png }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__ready=true\n<\/script></body></html>`;const Cn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Dn}<\/script>\n<script>${Nn}<\/script>\n<script>${Fn}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="g6" style="background:#fff"></div>\n<script>\nwindow.renderFigSvg = async function(g, rankdir, nodesep, ranksep, canvas, font, comboZ, edgeZ){\n try {\n const el = document.getElementById('g6')\n el.style.width = canvas + 'px'; el.style.height = canvas + 'px'\n if (window.__graph) { try { window.__graph.destroy() } catch(e){} }\n const graph = new G6.Graph({\n container: el, width: canvas, height: canvas, autoFit:'view',\n renderer: () => new window.G.SVG.Renderer(),\n data: { nodes: g.nodes, edges: g.edges, combos: g.combos },\n layout: { type:'antv-dagre', rankdir: rankdir, nodesep: nodesep, ranksep: ranksep, sortByCombo: (g.combos && g.combos.length>0) },\n combo: { type:'rect', style:{ zIndex: comboZ, padding:[30,18,18,18], labelPlacement:'top', labelFontFamily: font } },\n edge: { type:'polyline', style:{ zIndex: edgeZ, lineWidth:2.2, endArrow:true, labelFontFamily: font } },\n node: { style:{ labelFontFamily: font } },\n })\n window.__graph = graph\n await graph.render()\n await new Promise(r=>setTimeout(r,300))\n return { ok:true }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\n// 取 main layer 之 SVG DOM(SVG renderer 下唯一承載節點/邊/combo 之 layer, background/label/transient 三層無內容),\n// 以 canvas.getBounds() 對齊 toDataURL({mode:'overall'}) 之緊裁切邊界改寫 viewBox/width/height, 補白底矩形。\nwindow.snapSvg = async function(){\n try {\n await new Promise(r=>setTimeout(r,200))\n const canvas = window.__graph.getCanvas()\n const bounds = canvas.getBounds()\n const minX = bounds.min[0], minY = bounds.min[1]\n const w = bounds.max[0] - minX, h = bounds.max[1] - minY\n const mainEl = canvas.getLayer('main').getContextService().getDomElement()\n const svg = mainEl.cloneNode(true)\n // canvas.getBounds() 回傳世界座標(排版原始座標, 未經 camera 縮放平移); 但複製之 DOM 內容掛在\n // #g-svg-camera 群組下, 帶有互動視圖之 camera transform(autoFit:'view' 縮放平移)。\n // 兩者座標系不同, 混用會裁切錯位, 故先歸零 camera transform, 使內容回到與 bounds 相同之世界座標。\n const cameraEl = svg.querySelector('#g-svg-camera')\n if (cameraEl) cameraEl.removeAttribute('transform')\n svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg')\n svg.setAttribute('viewBox', minX + ' ' + minY + ' ' + w + ' ' + h)\n svg.setAttribute('width', String(Math.ceil(w)))\n svg.setAttribute('height', String(Math.ceil(h)))\n svg.removeAttribute('tabindex')\n svg.style.background = ''\n svg.style.pointerEvents = ''\n svg.style.gridArea = ''\n svg.style.outline = ''\n const bgRect = document.createElementNS('http://www.w3.org/2000/svg', 'rect')\n bgRect.setAttribute('x', String(minX)); bgRect.setAttribute('y', String(minY))\n bgRect.setAttribute('width', String(w)); bgRect.setAttribute('height', String(h))\n bgRect.setAttribute('fill', '#fff')\n svg.insertBefore(bgRect, svg.firstChild)\n const out = svg.outerHTML.replace(/ /g, ' ')\n return { ok:true, svg: out }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__readySvg=true\n<\/script></body></html>`;const Rn=on("@joint/core/dist/joint.min.js"),Hn=on("dagre/dist/dagre.min.js"),zn=Object.fromEntries(Object.entries(Zt).map(([e,t])=>{const n={fill:t.fill,stroke:t.stroke,color:t.text};return"diamond"===t.shape&&(n.shape="diamond"),t.group&&(n.group=!0),[e,n]}));const Wn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${Rn}<\/script>\n<script>${Hn}<\/script>\n</head><body style="margin:0;background:#fff">\n<div id="paper" style="background:#fff"></div>\n<script>\nvar CLS = ${JSON.stringify(zn)}\nvar FONT = 'Microsoft JhengHei, "Microsoft JhengHei", sans-serif'\nvar FS = 14, FSG = 14.5, FSL = 12.5\n\n// 量測文字寬度(canvas)\nvar __cv = document.createElement('canvas'); var __cx = __cv.getContext('2d')\nfunction measure(text, fs){ __cx.font = fs + 'px ' + FONT; return __cx.measureText(text).width }\n\n// 依字寬自動換行(回傳 lines 陣列 + 最大寬)\nfunction wrapText(text, fs, maxW){\n // 先嘗試以全形分隔符/括號斷點,否則逐字\n var lines = [], cur = ''\n for (var i = 0; i < text.length; i++){\n var ch = text[i]\n var test = cur + ch\n if (measure(test, fs) > maxW && cur !== ''){ lines.push(cur); cur = ch }\n else cur = test\n }\n if (cur) lines.push(cur)\n var w = 0; lines.forEach(function(l){ w = Math.max(w, measure(l, fs)) })\n return { lines: lines, w: w }\n}\n\nfunction renderFig(els, rankDir, sep){\n return new Promise(function(resolve){\n try {\n var NODESEP = (sep && sep.nodesep) || 32 // 同層節點間距(緊湊固定基準)\n var RANKSEP = (sep && sep.ranksep) || 48 // 層間距(緊湊固定基準)\n var nodes = els.filter(function(x){ return x.id !== undefined })\n var edges = els.filter(function(x){ return x.source !== undefined })\n var nodeById = {}; nodes.forEach(function(nn){ nodeById[nn.id] = nn })\n\n // 分類:群組(parent)與一般節點\n var groups = nodes.filter(function(nn){ return CLS[nn.cls] && CLS[nn.cls].group })\n var groupIds = {}; groups.forEach(function(g){ groupIds[g.id] = true })\n var leaves = nodes.filter(function(nn){ return !groupIds[nn.id] })\n\n // 量測 leaf 節點尺寸(含換行)\n var maxLeafW = 480\n var sizing = {}\n leaves.forEach(function(nn){\n var st = CLS[nn.cls] || CLS.blue\n var wr = wrapText(nn.label, FS, maxLeafW)\n var w, h\n if (st.shape === 'diamond'){\n var tw = wr.w + 24, th = wr.lines.length * (FS + 6) + 16\n w = Math.max(tw * 1.9, 130); h = Math.max(th * 1.9, 90)\n } else {\n w = Math.max(wr.w + 34, 90); h = wr.lines.length * (FS + 7) + 24\n }\n sizing[nn.id] = { w: Math.round(w), h: Math.round(h), lines: wr.lines }\n })\n\n // ── 兩段式 layout(避開 dagre compound 對「群組為邊端點」的 rank bug)──\n // 巢狀關係:childrenOf[parentId] = [子節點...];topLevel = 無 parent 者\n var GPAD = 16 // 群組內距(標題列高 titleH 依群組各自動態計算)\n var childrenOf = {}\n nodes.forEach(function(nn){ var p = nn.parent || '__root'; (childrenOf[p] = childrenOf[p] || []).push(nn) })\n var grpById = {}; groups.forEach(function(gp){ grpById[gp.id] = gp })\n var parentOf = {}; nodes.forEach(function(nn){ parentOf[nn.id] = nn.parent || '__root' })\n // 將節點往上抬升,直到其 parent 為指定容器(回傳該容器之直接子);無則回 null\n function liftTo(nodeId, containerId){\n var cur = nodeId\n while (cur != null){\n if (parentOf[cur] === containerId) return cur\n cur = (parentOf[cur] === '__root') ? null : parentOf[cur]\n }\n return null\n }\n\n // size[id] = {w,h}:leaf 直接取量測;group 需先排內部子圖才得知\n var size = {}\n leaves.forEach(function(nn){ size[nn.id] = { w: sizing[nn.id].w, h: sizing[nn.id].h } })\n // 群組內每個子節點相對群組內容左上角的偏移\n var innerPos = {} // innerPos[childId] = {x,y} 相對其 parent 內容區\n var groupContentW = {}, groupContentH = {}\n var titleH = {}, titleLines = {} // 每個群組標題列高度與換行\n\n // 對一個容器(root 或 group)內的直接子節點做 dagre 排版,回傳 {w,h} 內容尺寸\n function layoutContainer(containerId){\n var kids = (childrenOf[containerId] || [])\n // 先遞迴排子群組,取得其尺寸\n kids.forEach(function(k){ if (grpById[k.id]) { var s = layoutContainer(k.id); size[k.id] = { w: s.w, h: s.h } } })\n var dg = new dagre.graphlib.Graph()\n dg.setGraph({ rankdir: rankDir, nodesep: NODESEP, ranksep: RANKSEP, marginx: 0, marginy: 0, ranker: 'tight-tree' })\n dg.setDefaultEdgeLabel(function(){ return {} })\n var kidSet = {}; kids.forEach(function(k){ kidSet[k.id] = true; dg.setNode(k.id, { width: size[k.id].w, height: size[k.id].h }) })\n // 納入「抬升至本容器直接子」後兩端相異之邊(含跨群組邊),避免重複\n var seen = {}\n edges.forEach(function(ed){\n var s = liftTo(ed.source, containerId), t = liftTo(ed.target, containerId)\n if (s && t && s !== t && kidSet[s] && kidSet[t]){\n var key = s + '' + t\n if (!seen[key]){ seen[key] = true; dg.setEdge(s, t) }\n }\n })\n dagre.layout(dg)\n var minX = 1e9, minY = 1e9, maxX = -1e9, maxY = -1e9\n kids.forEach(function(k){\n var p = dg.node(k.id)\n minX = Math.min(minX, p.x - p.width/2); minY = Math.min(minY, p.y - p.height/2)\n maxX = Math.max(maxX, p.x + p.width/2); maxY = Math.max(maxY, p.y + p.height/2)\n })\n if (kids.length === 0){ minX = minY = maxX = maxY = 0 }\n kids.forEach(function(k){\n var p = dg.node(k.id)\n innerPos[k.id + '@' + containerId] = { x: p.x - p.width/2 - minX, y: p.y - p.height/2 - minY }\n })\n var cw = (maxX - minX), ch = (maxY - minY)\n if (containerId !== '__root'){\n cw += GPAD * 2\n // 標題依群組內寬換行,動態決定標題列高度\n var gp = grpById[containerId]\n var twr = wrapText(gp.label, FSG, cw - GPAD * 2)\n var th = twr.lines.length * (FSG + 4) + 12\n titleH[containerId] = th; titleLines[containerId] = twr.lines\n ch += GPAD * 2 + th // 群組外框含內距與標題列\n }\n groupContentW[containerId] = cw; groupContentH[containerId] = ch\n return { w: cw, h: ch }\n }\n layoutContainer('__root')\n\n // 由 root 內容起,遞迴攤平出每個節點的絕對 (x,y)=中心點\n var pos = {} // pos[id] = {x,y,w,h}(x,y 為中心)\n function place(containerId, originX, originY){\n // originX/originY = 此容器內容區左上角絕對座標\n var kids = (childrenOf[containerId] || [])\n kids.forEach(function(k){\n var off = innerPos[k.id + '@' + containerId]\n var w = size[k.id].w, h = size[k.id].h\n var topLeftX = originX + off.x, topLeftY = originY + off.y\n pos[k.id] = { x: topLeftX + w/2, y: topLeftY + h/2, w: w, h: h }\n if (grpById[k.id]){\n // 群組內容區左上角 = 群組左上角 + 內距 +(標題列)\n place(k.id, topLeftX + GPAD, topLeftY + GPAD + titleH[k.id])\n }\n })\n }\n place('__root', 0, 0)\n\n // 建 JointJS graph\n var graph = new joint.dia.Graph({}, { cellNamespace: joint.shapes })\n var cells = []\n var cellById = {}\n\n // 群組容器(先畫,置底);標題用獨立 TextBlock 置於頂部中央\n var groupTitleCells = []\n groups.forEach(function(gp){\n var p = pos[gp.id]\n var st = CLS[gp.cls]\n var x = p.x - p.w/2, y = p.y - p.h/2\n var r = new joint.shapes.standard.Rectangle()\n r.position(x, y); r.resize(p.w, p.h)\n r.attr({\n body: { fill: st.fill, stroke: st.stroke, strokeWidth: 2, rx: 8, ry: 8, fillOpacity: 0.5 },\n label: { text: '' }\n })\n cells.push(r); cellById[gp.id] = r\n // 標題(獨立元件,置頂中央)\n var th = titleH[gp.id]\n var tb = new joint.shapes.standard.TextBlock()\n tb.resize(p.w - 16, th)\n tb.position(x + 8, y + 4)\n tb.attr({\n body: { fill: 'none', stroke: 'none' },\n // TextBlock 以 foreignObject<div> 渲染: font-family 屬性對 HTML div 無效(會落回瀏覽器預設 Times New Roman),\n // 字型必須寫進 style(JointJS 將 style keys 複製為 div inline CSS)才會套用 → 群組標題與全圖統一 JhengHei\n label: { text: (titleLines[gp.id] || [gp.label]).join('\\n'), fontFamily: FONT, fontSize: FSG, fontWeight: 'bold', fill: st.color,\n style: { color: st.color, fontWeight: 'bold', fontFamily: FONT } }\n })\n groupTitleCells.push(tb)\n })\n\n // leaf 節點\n leaves.forEach(function(nn){\n var p = pos[nn.id]\n var st = CLS[nn.cls] || CLS.blue\n var sz = sizing[nn.id]\n var cell\n if (st.shape === 'diamond'){\n cell = new joint.shapes.standard.Polygon()\n cell.attr('body/refPoints', '50,0 100,50 50,100 0,50')\n } else {\n cell = new joint.shapes.standard.Rectangle()\n cell.attr('body/rx', 6); cell.attr('body/ry', 6)\n }\n cell.position(p.x - p.w/2, p.y - p.h/2)\n cell.resize(p.w, p.h)\n cell.attr('body/fill', st.fill)\n cell.attr('body/stroke', st.stroke)\n cell.attr('body/strokeWidth', 1.8)\n cell.attr('label/text', sz.lines.join('\\n'))\n cell.attr('label/fontFamily', FONT)\n cell.attr('label/fontSize', FS)\n cell.attr('label/fill', st.color)\n cell.attr('label/lineHeight', (FS + 7) + 'px')\n cells.push(cell); cellById[nn.id] = cell\n })\n\n // 邊\n edges.forEach(function(ed){\n var s = cellById[ed.source], t = cellById[ed.target]\n if (!s || !t) return\n var l = new joint.shapes.standard.Link()\n l.source(s); l.target(t)\n var dashed = ed.cls === 'dashed'\n l.attr({\n line: {\n stroke: '#44505a', strokeWidth: 2.2,\n strokeDasharray: dashed ? '6,4' : null,\n targetMarker: { type: 'path', d: 'M 10 -5 0 0 10 5 z', fill: '#44505a' }\n }\n })\n l.router('normal'); l.connector('rounded', { radius: 6 })\n if (ed.label){\n // 邊標籤距離: 預設置中(0.5); 虛線(跨群組/驗證類)靠來源端;\n // 跨群組邊(端點落在不同容器)把標籤推向「位於容器外」的一端, 避免疊到群組內節點。\n var srcIn = parentOf[ed.source] && parentOf[ed.source] !== '__root'\n var tgtIn = parentOf[ed.target] && parentOf[ed.target] !== '__root'\n var dist = 0.5\n if (dashed) dist = 0.32\n else if (tgtIn && !srcIn) dist = 0.26 // 進入群組: 標籤靠來源(群組外)\n else if (srcIn && !tgtIn) dist = 0.74 // 離開群組: 標籤靠目標(群組外)\n // 全域修正 A: 背景框透明(不遮轉折線), 文字以白色光暈/描邊保持清晰\n // SVG paint-order:stroke → 先描白邊再填字 → 線段能透出、文字仍清晰\n l.labels([{\n markup: [{ tagName: 'text', selector: 'lbl' }],\n attrs: {\n lbl: { text: ed.label, fontFamily: FONT, fontSize: FSL, fill: '#4a5560',\n stroke: '#ffffff', strokeWidth: 3.5, paintOrder: 'stroke', strokeLinejoin: 'round',\n textAnchor: 'middle', textVerticalAnchor: 'middle' }\n },\n position: { distance: dist }\n }])\n }\n cells.push(l)\n })\n\n // 群組標題置於最上層\n groupTitleCells.forEach(function(tb){ cells.push(tb) })\n\n var paper = document.getElementById('paper')\n var P = new joint.dia.Paper({\n el: paper, model: graph,\n width: 100, height: 100, background: { color: '#ffffff' },\n cellViewNamespace: joint.shapes\n })\n graph.resetCells(cells)\n // 確保群組在底層\n groups.forEach(function(gp){ cellById[gp.id].toBack() })\n P.fitToContent({ padding: 28, allowNewOrigin: 'any', useModelGeometry: true })\n\n // ── 碰撞偵測(通用機制, 對所有圖一致) ─────────────────────────────\n // 量測「節點 bounding box」與「邊標籤 bounding box」, 兩兩偵測重疊(>2px 計碰撞)。\n // 群組容器刻意包住其子節點, 故排除「容器 ↔ 其後代」之合法重疊; 其餘皆計入。\n // 座標一律取 getBoundingClientRect()(同一螢幕座標系, 跨節點/標籤可直接比對, paper 未縮放故相對關係即真實版面)。\n // 容器後代集合(供排除合法包含)\n var descOf = {}\n function collectDesc(gid){\n var set = {}; var stack = (childrenOf[gid] || []).slice()\n while (stack.length){ var c = stack.pop(); set[c.id] = true; if (grpById[c.id]) (childrenOf[c.id] || []).forEach(function(k){ stack.push(k) }) }\n return set\n }\n groups.forEach(function(gp){ descOf[gp.id] = collectDesc(gp.id) })\n function toRect(dom, kind, id){\n var r = dom.getBoundingClientRect()\n return { kind: kind, id: id, x: r.left, y: r.top, w: r.width, h: r.height }\n }\n // 收集矩形: 節點(cellView body 之 client rect), 群組亦納入(偵測容器 ↔ 無關節點/容器)\n var rects = []\n nodes.forEach(function(nn){\n var c = cellById[nn.id]; if (!c) return\n var cv = P.findViewByModel(c); if (!cv) return\n // 群組量「外框 body」, 不含其內子節點; 一般節點量整個 cell\n var dom = grpById[nn.id] ? (cv.el.querySelector('[joint-selector="body"], rect') || cv.el) : cv.el\n rects.push(toRect(dom, grpById[nn.id] ? 'group' : 'node', nn.id))\n })\n // 邊標籤: 取其 label <text>(同一連線之 halo+fill 為單一 text, 不重複計)\n var labelRects = []\n cells.forEach(function(c){\n if (!(c.isLink && c.isLink())) return\n if (!(c.attributes.labels && c.attributes.labels.length)) return\n var lv = P.findViewByModel(c); if (!lv) return\n var tnodes = lv.el.querySelectorAll('[joint-selector="lbl"]')\n if (!tnodes.length) tnodes = lv.el.querySelectorAll('.labels text, .label text')\n for (var ti = 0; ti < tnodes.length; ti++){\n var r = tnodes[ti].getBoundingClientRect()\n if (r.width < 1) continue\n labelRects.push({ kind: 'label', id: c.id + ':' + ti, x: r.left, y: r.top, w: r.width, h: r.height })\n }\n })\n function overlapPx(a, b){\n var ix = Math.min(a.x + a.w, b.x + b.w) - Math.max(a.x, b.x)\n var iy = Math.min(a.y + a.h, b.y + b.h) - Math.max(a.y, b.y)\n return { ix: ix, iy: iy }\n }\n var allRects = rects.concat(labelRects)\n var collisions = 0, minGap = 1e9, details = []\n for (var i = 0; i < allRects.length; i++) for (var j = i + 1; j < allRects.length; j++){\n var A = allRects[i], B = allRects[j]\n // 排除合法包含: 容器 ↔ 其後代節點\n if (A.kind === 'group' && descOf[A.id] && descOf[A.id][B.id]) continue\n if (B.kind === 'group' && descOf[B.id] && descOf[B.id][A.id]) continue\n // 排除「群組外框 ↔ 邊標籤」: 群組為半透明色塊背景(swimlane), 標籤帶白色光暈疊於其上仍清晰,\n // 且跨群組邊必然穿越群組邊界 → 不計為碰撞(真正要避免的是標籤疊到節點文字/其他標籤)\n if ((A.kind === 'group' && B.kind === 'label') || (B.kind === 'group' && A.kind === 'label')) continue\n var ov = overlapPx(A, B)\n if (ov.ix > 2 && ov.iy > 2){\n collisions++\n if (details.length < 4) details.push((A.kind[0]) + A.id.slice(0, 6) + '×' + (B.kind[0]) + B.id.slice(0, 6))\n } else if (ov.ix > -200 && ov.iy > -200){\n // 估「最近可見間隙」: 兩矩形在分離軸上的最小正向距離(僅在另一軸有重疊時才算同列/同行相鄰)\n if (ov.ix <= 2 && ov.iy > 2) minGap = Math.min(minGap, -ov.ix)\n if (ov.iy <= 2 && ov.ix > 2) minGap = Math.min(minGap, -ov.iy)\n }\n }\n if (!isFinite(minGap)) minGap = 999\n resolve({ ok: true, w: Math.round(P.options.width), h: Math.round(P.options.height),\n collisions: collisions, minGap: Math.round(minGap), details: details })\n } catch(e){ resolve({ ok: false, err: String(e.message || e), stack: String(e.stack) }) }\n })\n}\nwindow.renderFig = renderFig\nwindow.__ready = true\n<\/script></body></html>`;async function qn(t){const n=await e.chromium.launch();try{const e=await n.newPage({deviceScaleFactor:2}),r=[];e.on("pageerror",e=>r.push(e.message)),e.on("console",e=>{"error"===e.type()&&r.push("c:"+e.text())}),await e.setContent(Wn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o={nodesep:32,ranksep:48},{els:a,rankDir:i}=function(e){const t=[];for(const n of e.nodes)t.push({id:n.id,label:n.label,cls:n.cls||"blue",parent:n.group||null});for(const n of e.edges)t.push({source:n.from,target:n.to,label:n.label||"",cls:"dashed"===n.kind?"dashed":""});return{els:t,rankDir:e.dir}}(t),s=await e.evaluate(([e,t,n])=>window.renderFig(e,t,n),[a,i,o]);if(!s.ok)throw new Error(s.err+(s.stack?"\n"+s.stack:""));return{browser:n,page:e,res:s}}catch(e){throw await n.close(),e}}const Jn=an("@logicflow/core/dist/index.css"),Un=on("@logicflow/core/dist/index.min.js"),Xn=on("dagre/dist/dagre.min.js");const Yn=Object.fromEntries(Object.entries(Zt).map(([e,t])=>[e,{fill:t.fill,stroke:t.stroke,text:t.text}])),Vn=JSON.stringify(Yn),Zn=JSON.stringify(Kt),Kn=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<style>${Jn}</style>\n<script>${Un}<\/script>\n<script>${Xn}<\/script>\n<style>\n * { font-family: ${Qt}; }\n html,body{ margin:0; background:#fff; }\n #app { background:#fff; }\n .lf-grid { display:none !important; }\n</style>\n</head><body>\n<div id="app"></div>\n<script>\nvar PAL = ${Vn}\nvar EDGE = ${Zn}\nvar FONT = ${JSON.stringify(`14px ${Qt}`)} // canvas 量測用之 font 短語\nvar FONT_FAMILY = ${JSON.stringify(Qt)} // 純 font-family(供 SVG text 明確指定, 字型全覆蓋)\n\n// ---- 通用版面常數(非逐圖; 皆為與內容無關之全域預設) ----\nvar FONT_SIZE = 14, LINE_H = 22 // 節點字級 / 行高\nvar NODE_MAXW = 230, DIAMOND_MAXW = 110 // 換行最大寬度(矩形 / 菱形)\nvar PAD_X = 28, PAD_Y = 22 // 矩形內距\nvar DIA_PAD_X = 60, DIA_PAD_Y = 46 // 菱形內距(對角需較大留白)\nvar NODE_MINW = 120, NODE_MINH = 56 // 矩形最小尺寸\nvar DIA_MINW = 150, DIA_MINH = 110 // 菱形最小尺寸\nvar MARGIN = 20 // dagre 邊距\nvar GROUP_TITLE = 26 // 群組容器標題列高\nvar CANVAS_MARGIN = 60 // 畫布外緣留白\nvar LABEL_GAP = 28, LABEL_BIAS = 0.62 // 跨界邊標籤離容器框間隙 / 偏容器側權重\n\n// ---- 緊湊固定間距(通用機制, 對所有圖一致; 不做「掃描放大 until 零碰撞」) ----\n// 一律以單一緊湊間距排版, 維持報告可用的緊湊尺寸; 不因避碰撞而把圖撐大。\n// 文字遮蔽改由繪製順序(z-order)解決(群組墊底 / 節點居中 / 邊與邊標籤置頂), 不靠加大間距。\n// LR 層距略大於 TB(水平向標籤較長), 仍為固定值。\nvar SEP_TB = [36, 55] // [nodesep, ranksep] — 上下向緊湊間距\nvar SEP_LR = [36, 82] // [nodesep, ranksep] — 左右向緊湊間距\nvar COLLIDE_TOL = 2 // 重疊 >此像素 才計為碰撞(僅供回報用, 不再驅動間距放大)\n\n// 量測文字寬度\nvar _cv = document.createElement('canvas'); var _cx = _cv.getContext('2d')\nfunction measure(t, font){ _cx.font = font; return _cx.measureText(t).width }\n\n// 將長 label 依最大寬度斷行: 中文逐字可斷; 連續英數識別字(token)視為不可攔腰斷之整體, 整段超寬才獨佔一行。\nfunction wrap(label, maxW, font){\n _cx.font = font\n // 先切成 token: 連續英數(含 . _ / 等識別字常見字元)為一個 token, 其餘(中文/標點/空白)逐字\n var chars = Array.from(label)\n var tokens = [], buf = ''\n function isWordChar(c){ return /[0-9A-Za-z._/\\-]/.test(c) }\n for (var i=0;i<chars.length;i++){\n if (isWordChar(chars[i])){ buf += chars[i] }\n else { if (buf){ tokens.push(buf); buf='' } tokens.push(chars[i]) }\n }\n if (buf) tokens.push(buf)\n var lines = [], cur = ''\n for (var k=0;k<tokens.length;k++){\n var tk = tokens[k]\n var test = cur + tk\n if (_cx.measureText(test).width > maxW && cur.length>0){ lines.push(cur); cur = tk }\n else cur = test\n }\n if (cur) lines.push(cur)\n // 去除純空白造成的行首空白\n return lines.map(function(l){ return l.replace(/^\\s+/, '') }).filter(function(l){ return l.length>0 })\n}\n\n// 依 label 自動推算節點尺寸(寬: 依最寬一行字寬 + 內距; 高: 依行數 + 內距; 皆套最小值)\nfunction sizeOf(label, isDiamond){\n var maxW = isDiamond ? DIAMOND_MAXW : NODE_MAXW\n var lines = wrap(label, maxW, FONT)\n if (!lines.length) lines = [label]\n var w = 0\n lines.forEach(function(l){ w = Math.max(w, measure(l, FONT)) })\n var padX = isDiamond ? DIA_PAD_X : PAD_X, padY = isDiamond ? DIA_PAD_Y : PAD_Y\n var W = Math.ceil(w + padX*2)\n var H = Math.ceil(lines.length*LINE_H + padY*2)\n if (isDiamond){ W = Math.max(W, DIA_MINW); H = Math.max(H, DIA_MINH) }\n else { W = Math.max(W, NODE_MINW); H = Math.max(H, NODE_MINH) }\n return { w: W, h: H, text: lines.join('\\n') }\n}\n\n// 兩矩形重疊量(回傳 {ix,iy} 為水平/垂直交集像素, 皆>0 才重疊)\nfunction overlap(a, b){\n var ix = Math.min(a.x+a.w/2, b.x+b.w/2) - Math.max(a.x-a.w/2, b.x-b.w/2)\n var iy = Math.min(a.y+a.h/2, b.y+b.h/2) - Math.max(a.y-a.h/2, b.y-b.h/2)\n return { ix: ix, iy: iy }\n}\n\n// ---- 解析 fig 為內部結構 + 量測尺寸(只做一次, 不隨間距改變) ----\nfunction prepare(fig){\n var els = fig.els\n var nodes = els.filter(function(x){ return !('source' in x) })\n var edges = els.filter(function(x){ return ('source' in x) })\n var byId = {}; nodes.forEach(function(nd){ byId[nd.id] = nd })\n var groupIds = {}; nodes.forEach(function(nd){ if (nd.parent) groupIds[nd.parent] = true })\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n var sz = sizeOf(nd.label, nd.cls === 'diamond')\n nd._w = sz.w; nd._h = sz.h; nd._text = sz.text\n })\n return { nodes: nodes, edges: edges, byId: byId, groupIds: groupIds, rankDir: fig.rankDir }\n}\n\n// ---- 以給定間距做 dagre compound 排版, 回傳座標/群組框/邊標籤座標(供偵測與渲染) ----\nfunction layout(P, nodeSep, rankSep){\n var nodes = P.nodes, edges = P.edges, byId = P.byId, groupIds = P.groupIds\n var g = new dagre.graphlib.Graph({ compound:true })\n g.setGraph({ rankdir: P.rankDir, nodesep: nodeSep, ranksep: rankSep, marginx: MARGIN, marginy: MARGIN })\n g.setDefaultEdgeLabel(function(){ return {} })\n Object.keys(groupIds).forEach(function(gid){ g.setNode(gid, { label: gid }) })\n Object.keys(groupIds).forEach(function(gid){\n var gp = byId[gid] && byId[gid].parent\n if (gp && groupIds[gp]) g.setParent(gid, gp)\n })\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n g.setNode(nd.id, { width: nd._w, height: nd._h })\n if (nd.parent) g.setParent(nd.id, nd.parent)\n })\n function repLeaf(gid){\n var c = nodes.filter(function(x){ return x.parent === gid && !groupIds[x.id] })\n return c.length ? c[0].id : null\n }\n edges.forEach(function(ed){\n var sG = groupIds[ed.source], tG = groupIds[ed.target]\n if (!sG && !tG){ g.setEdge(ed.source, ed.target); return }\n var s = sG ? repLeaf(ed.source) : ed.source\n var t = tG ? repLeaf(ed.target) : ed.target\n if (s && t) g.setEdge(s, t)\n })\n dagre.layout(g)\n\n // leaf 節點座標\n var lfNodes = []\n nodes.forEach(function(nd){\n if (groupIds[nd.id]) return\n var p = g.node(nd.id)\n var pal = PAL[nd.cls] || PAL.blue\n var type = nd.cls === 'diamond' ? 'diamond' : 'rect'\n lfNodes.push({ id: nd.id, type: type, x: Math.round(p.x), y: Math.round(p.y), text: nd._text, _pal: pal, _w: nd._w, _h: nd._h })\n })\n // 群組容器框(dagre cluster bbox)\n function depth(gid){ var d=0,p=byId[gid]&&byId[gid].parent; while(p){ d++; p=byId[p]&&byId[p].parent } return d }\n var lfGroupNodes = []\n Object.keys(groupIds).sort(function(a,b){ return depth(a)-depth(b) }).forEach(function(gid){\n var gn = g.node(gid)\n var pal = PAL[byId[gid].cls] || PAL.blue\n lfGroupNodes.push({ id: gid, label: byId[gid].label, _pal: pal,\n x: Math.round(gn.x), y: Math.round(gn.y), _w: Math.round(gn.width), _h: Math.round(gn.height) })\n })\n\n // 幾何查詢\n var geo = {}\n lfNodes.forEach(function(nd){ geo[nd.id]={ x:nd.x, y:nd.y, w:nd._w, h:nd._h } })\n lfGroupNodes.forEach(function(b){ geo[b.id]={ x:b.x, y:b.y, w:b._w, h:b._h } })\n var parentBox = {}\n nodes.forEach(function(nd){ if (nd.parent && geo[nd.parent]) parentBox[nd.id] = geo[nd.parent] })\n function inGroup(id){ return !!parentBox[id] }\n\n // 跨界邊標籤座標(落在外部節點與群組框之間淨空)\n function labelPos(ed){\n if (!ed.label) return null\n var sIn = inGroup(ed.source) || groupIds[ed.source]\n var tIn = inGroup(ed.target) || groupIds[ed.target]\n var outId = null, inId = null\n if (sIn && !tIn){ inId=ed.source; outId=ed.target }\n else if (!sIn && tIn){ outId=ed.source; inId=ed.target }\n else {\n var s = geo[ed.source], t = geo[ed.target]\n if (!s || !t) return null\n var mx = (s.x+t.x)/2, my = (s.y+t.y)/2\n var hit = null\n lfGroupNodes.forEach(function(b){\n if (mx > b.x-b._w/2 && mx < b.x+b._w/2 && my > b.y-b._h/2 && my < b.y+b._h/2) hit = b\n })\n if (!hit) return null\n return { x: Math.round(hit.x - hit._w/2 - LABEL_GAP), y: Math.round(my) }\n }\n var o = geo[outId], box = parentBox[inId] || geo[inId]\n var tgt = geo[ed.target] || geo[inId]\n if (!o || !box || !tgt) return null\n var bias = LABEL_BIAS, obias = 1 - LABEL_BIAS\n if (P.rankDir === 'LR'){\n var boxEdgeX = (o.x < box.x) ? (box.x - box.w/2) : (box.x + box.w/2)\n var oInnerX = o.x + (o.x<box.x ? o.w/2 : -o.w/2)\n var lx = boxEdgeX*bias + oInnerX*obias\n return { x: Math.round(lx), y: Math.round(tgt.y) }\n } else {\n var boxEdgeY = (o.y < box.y) ? (box.y - box.h/2) : (box.y + box.h/2)\n var oInnerY = o.y + (o.y<box.y ? o.h/2 : -o.h/2)\n var ly = boxEdgeY*bias + oInnerY*obias\n return { x: Math.round(tgt.x), y: Math.round(ly) }\n }\n }\n\n // 邊 + 標籤框(供偵測). 標籤框尺寸依文字量測。\n var lfEdges = [], labelBoxes = []\n edges.forEach(function(ed, i){\n var lp = labelPos(ed)\n var txt = ed.label ? (lp ? { value: ed.label, x: lp.x, y: lp.y } : ed.label) : ''\n lfEdges.push({ id:'e'+i, sourceNodeId: ed.source, targetNodeId: ed.target, text: txt, _dashed: ed.dashed })\n if (ed.label){\n // 標籤未指定座標時, 取兩端中點估其位置(供偵測)\n var lx, ly\n if (lp){ lx = lp.x; ly = lp.y }\n else { var s=geo[ed.source], t=geo[ed.target]; if(!s||!t) return; lx=(s.x+t.x)/2; ly=(s.y+t.y)/2 }\n var lw = measure(ed.label, FONT) + 14, lh = LINE_H\n labelBoxes.push({ x: lx, y: ly, w: lw, h: lh, _label: true })\n }\n })\n\n return { lfNodes: lfNodes, lfGroupNodes: lfGroupNodes, lfEdges: lfEdges, labelBoxes: labelBoxes,\n byId: byId, parentBox: parentBox }\n}\n\n// ---- 偵測重疊: leaf↔leaf、group↔group(非巢狀)、leaf↔group(非歸屬)、邊標籤↔節點/其他標籤 ----\n// 回傳 { collisions, minGap(零碰撞時計區塊間最小可見間隙) }\nfunction detect(L){\n var byId = L.byId\n // 取某 leaf/group 的祖先群組鏈(含自身), 用於排除「容器內含其成員」的合法重疊\n function ancestors(id){ var arr=[id], p=byId[id]&&byId[id].parent; while(p){ arr.push(p); p=byId[p]&&byId[p].parent } return arr }\n // 判 a 是否為 b 之祖先或同一(容器包含成員 → 非碰撞)\n function related(idA, idB){\n var ca = ancestors(idA), cb = ancestors(idB)\n return ca.indexOf(idB) >= 0 || cb.indexOf(idA) >= 0\n }\n // 待偵測之矩形集合(節點 + 群組框, 各帶 id; 標籤無 id)\n var rects = []\n L.lfNodes.forEach(function(n){ rects.push({ id:n.id, x:n.x, y:n.y, w:n._w, h:n._h, kind:'node' }) })\n L.lfGroupNodes.forEach(function(b){ rects.push({ id:b.id, x:b.x, y:b.y, w:b._w, h:b._h, kind:'group' }) })\n var labels = L.labelBoxes.map(function(l){ return { x:l.x, y:l.y, w:l.w, h:l.h, kind:'label' } })\n\n var collisions = 0, minGap = Infinity\n // 節點/群組 兩兩(排除容器-成員關係)\n for (var i=0;i<rects.length;i++){\n for (var j=i+1;j<rects.length;j++){\n var A=rects[i], B=rects[j]\n if (related(A.id, B.id)) continue\n var ov = overlap(A, B)\n if (ov.ix > COLLIDE_TOL && ov.iy > COLLIDE_TOL){ collisions++ }\n else {\n // 未重疊: 取較近軸向之間隙(僅在另一軸有投影重疊時才計, 否則為斜對角不相鄰)\n if (ov.ix > 0) minGap = Math.min(minGap, -ov.iy) // 水平有交集 → 垂直間隙\n else if (ov.iy > 0) minGap = Math.min(minGap, -ov.ix) // 垂直有交集 → 水平間隙\n }\n }\n }\n // 邊標籤 ↔ 節點/群組(群組框為淺底大容器, 標籤落其內屬正常 → 僅與 leaf 節點及其他標籤計碰撞)\n for (var li=0;li<labels.length;li++){\n var lab = labels[li]\n for (var ri=0;ri<rects.length;ri++){\n if (rects[ri].kind !== 'node') continue\n var ovl = overlap(lab, rects[ri])\n if (ovl.ix > COLLIDE_TOL && ovl.iy > COLLIDE_TOL) collisions++\n }\n for (var lj=li+1;lj<labels.length;lj++){\n var ovll = overlap(lab, labels[lj])\n if (ovll.ix > COLLIDE_TOL && ovll.iy > COLLIDE_TOL) collisions++\n }\n }\n if (!isFinite(minGap)) minGap = 0 // 無相鄰對(單一節點等)\n return { collisions: collisions, minGap: minGap }\n}\n\n// ---- 把一份 layout 結果實際畫到 LF 並截圖前準備(回傳畫布尺寸) ----\nfunction renderLayout(L){\n var lfNodes = L.lfNodes, lfGroupNodes = L.lfGroupNodes, lfEdges = L.lfEdges\n\n // 整體 bbox → 畫布尺寸\n var minX=1e9,minY=1e9,maxX=-1e9,maxY=-1e9\n lfGroupNodes.concat(lfNodes).forEach(function(nd){\n minX=Math.min(minX, nd.x-nd._w/2); maxX=Math.max(maxX, nd.x+nd._w/2)\n minY=Math.min(minY, nd.y-nd._h/2); maxY=Math.max(maxY, nd.y+nd._h/2)\n })\n var M = CANVAS_MARGIN\n var W = Math.ceil(maxX-minX+M*2), H = Math.ceil(maxY-minY+M*2)\n var app = document.getElementById('app')\n app.innerHTML = ''\n app.style.width = W+'px'; app.style.height = H+'px'\n\n var G = window.Core || window.LogicFlow\n var LF = G.default || G.LogicFlow || G\n var RectNode = G.RectNode, RectNodeModel = G.RectNodeModel\n var DiamondNode = G.DiamondNode, DiamondNodeModel = G.DiamondNodeModel\n\n var lf = new LF({ container: app, grid:false, background:false, isSilentMode:true, stopScrollGraph:true, stopZoomGraph:true, adjustEdge:false,\n style: {\n rect: { rx: 7, ry: 7 },\n polyline: { stroke: EDGE.line, strokeWidth: 1.8 },\n nodeText: { color:'#1c2b36', fontFamily: FONT_FAMILY, fontSize: FONT_SIZE, overflowMode:'autoWrap', lineHeight: 1.4 },\n },\n })\n\n function makeRect(name){\n lf.register({ type: name, view: RectNode, model: class extends RectNodeModel {\n setAttributes(){ var p=this.properties||{}; if(p.width)this.width=p.width; if(p.height)this.height=p.height; this.radius=7 }\n getNodeStyle(){ var s=super.getNodeStyle(); var pal=this.properties._pal||PAL.blue; s.fill=pal.fill; s.stroke=pal.stroke; s.strokeWidth=this.properties.isGroup?2:1.8; if(this.properties.isGroup){s.fillOpacity=0.45} return s }\n getTextStyle(){ var s=super.getTextStyle(); var pal=this.properties._pal||PAL.blue; s.color=pal.text; s.fontFamily=FONT_FAMILY; s.fontSize=this.properties.isGroup?15:FONT_SIZE; if(this.properties.isGroup){s.fontWeight=700} s.overflowMode='autoWrap'; s.lineHeight=1.35; if(this.width)s.wrapPadding='0px'; return s }\n }})\n }\n function makeDiamond(name){\n lf.register({ type: name, view: DiamondNode, model: class extends DiamondNodeModel {\n setAttributes(){ var p=this.properties||{}; if(p.width)this.rx=p.width/2; if(p.height)this.ry=p.height/2 }\n getNodeStyle(){ var s=super.getNodeStyle(); var pal=this.properties._pal||PAL.diamond; s.fill=pal.fill; s.stroke=pal.stroke; s.strokeWidth=1.8; return s }\n getTextStyle(){ var s=super.getTextStyle(); var pal=this.properties._pal||PAL.diamond; s.color=pal.text; s.fontFamily=FONT_FAMILY; s.fontSize=FONT_SIZE; s.overflowMode='autoWrap'; return s }\n }})\n }\n makeRect('cRect'); makeDiamond('cDiamond')\n\n // 邊標籤樣式(全域修正 A): 背景透明(不遮轉折線) + 文字白色光暈(paint-order:stroke + stroke=白)\n function edgeText(s){\n s.color=EDGE.text; s.fontFamily=FONT_FAMILY; s.fontSize=12.5; s.overflowMode='default'; s.textWidth=400\n s.background={ fill:'transparent', stroke:'none' } // 透明底: 線段能透出, 不被白底遮斷\n s.stroke=EDGE.haloColor; s.strokeWidth=EDGE.haloWidth; s.paintOrder='stroke' // 白光暈描邊(描在文字下方)\n return s\n }\n var PolylineEdge=G.PolylineEdge, PolylineEdgeModel=G.PolylineEdgeModel\n lf.register({ type:'cDash', view:PolylineEdge, model: class extends PolylineEdgeModel {\n getEdgeStyle(){ var s=super.getEdgeStyle(); s.stroke='#7a8690'; s.strokeWidth=1.8; s.strokeDasharray='6 4'; return s }\n getTextStyle(){ return edgeText(super.getTextStyle()) }\n }})\n lf.register({ type:'cLine', view:PolylineEdge, model: class extends PolylineEdgeModel {\n getEdgeStyle(){ var s=super.getEdgeStyle(); s.stroke=EDGE.line; s.strokeWidth=1.8; return s }\n getTextStyle(){ return edgeText(super.getTextStyle()) }\n }})\n\n var graphNodes = []\n lfGroupNodes.forEach(function(b){\n graphNodes.push({ id:b.id, type:'cRect', x:b.x, y:b.y,\n text:{ value: b.label, x: b.x, y: Math.round(b.y - b._h/2 + GROUP_TITLE/2 + 4) },\n properties:{ width:b._w, height:b._h, isGroup:true, _pal:b._pal } })\n })\n lfNodes.forEach(function(nd){\n graphNodes.push({ id:nd.id, type: nd.type==='diamond'?'cDiamond':'cRect', x:nd.x, y:nd.y, text:nd.text, properties:{ width:nd._w, height:nd._h, _pal:nd._pal } })\n })\n var graphEdges = lfEdges.map(function(ed){\n return { id:ed.id, type: ed._dashed?'cDash':'cLine', sourceNodeId:ed.sourceNodeId, targetNodeId:ed.targetNodeId, text: ed.text||'' }\n })\n\n lf.render({ nodes: graphNodes, edges: graphEdges })\n\n // ---- 繪製順序(z-order, 原則2) ----\n // LF 預設把邊畫在節點下方, 群組(node)與節點同層; 文字會被節點/群組底色蓋住。\n // 以 setElementZIndex 數值分層強制: 群組容器=底(Z_GROUP) → 節點=中(Z_NODE) → 邊與邊標籤=頂(Z_EDGE),\n // 確保任何文字(節點文字 / 群組標題 / 邊標籤)都不被容器填色或其他區塊遮住。\n var Z_GROUP = 1, Z_NODE = 10, Z_EDGE = 100\n lfGroupNodes.forEach(function(b){ lf.setElementZIndex(b.id, Z_GROUP) }) // 半透明容器墊最底\n lfNodes.forEach(function(nd){ lf.setElementZIndex(nd.id, Z_NODE) }) // 節點居中\n graphEdges.forEach(function(ed){ lf.setElementZIndex(ed.id, Z_EDGE) }) // 邊與邊標籤置頂\n\n return { w: W, h: H, nNodes: graphNodes.length, nEdges: graphEdges.length }\n}\n\n// ---- 對外: 解析 → 以單一緊湊固定間距排版 → 實際渲染(z-order 處理遮蔽, 不掃描放大間距) ----\nwindow.renderFig = function(fig){ return new Promise(function(resolve){\n try {\n var P = prepare(fig)\n var sep = (P.rankDir === 'LR') ? SEP_LR : SEP_TB\n var L = layout(P, sep[0], sep[1])\n var d = detect(L) // 僅供回報(碰撞數/最小間隙), 不驅動任何放大\n var info = renderLayout(L)\n setTimeout(function(){ resolve({ ok:true, w:info.w, h:info.h, nNodes:info.nNodes, nEdges:info.nEdges,\n nodeSep:sep[0], rankSep:sep[1], collisions:d.collisions, minGap:Math.round(d.minGap) }) }, 200)\n } catch(e){ resolve({ ok:false, err: String(e && (e.stack||e.message||e)) }) }\n})}\nwindow.__ready = true\n<\/script></body></html>`;async function Qn(t){const n=await e.chromium.launch();try{const e=await n.newPage({deviceScaleFactor:2}),r=[];e.on("pageerror",e=>r.push(e.message)),e.on("console",e=>{"error"===e.type()&&r.push("console:"+e.text())}),await e.setContent(Kn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:3e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=function(e){const t=[];for(const n of e.nodes)t.push({id:n.id,label:n.label,cls:n.cls||"blue",parent:n.group});for(const n of e.edges)t.push({source:n.from,target:n.to,label:n.label||"",dashed:"dashed"===n.kind});return{rankDir:e.dir,els:t}}(t),a=await e.evaluate(e=>window.renderFig(e),o);if(!a.ok)throw new Error(a.err||"renderFig failed");return await e.evaluate(()=>document.fonts&&document.fonts.ready),{browser:n,page:e,res:a}}catch(e){throw await n.close(),e}}const er=r.dirname(n.fileURLToPath("undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:i&&"SCRIPT"===i.tagName.toUpperCase()&&i.src||new URL("w-flowchart.umd.js",document.baseURI).href)),tr=t.readFileSync(`${er}/page9.html`,"utf8").replace("/*__XYFLOW_CSS__*/",()=>an("@xyflow/react/dist/style.css")).replace("/*__REACT_JS__*/",()=>on("react/umd/react.production.min.js")).replace("/*__REACT_DOM_JS__*/",()=>on("react-dom/umd/react-dom.production.min.js")).replace("/*__XYFLOW_JS__*/",()=>on("@xyflow/react/dist/umd/index.js")).replace("/*__DAGRE_JS__*/",()=>on("@dagrejs/dagre/dist/dagre.min.js"));const nr=`<!doctype html><html lang="zh-Hant"><head><meta charset="utf-8">\n<script>${on("elkjs/lib/elk.bundled.js")}<\/script>\n<style>body{margin:0;background:#fff} .lbl{font-family:'Microsoft JhengHei','微軟正黑體',sans-serif}</style>\n</head><body>\n<div id="meas" style="position:absolute;left:-99999px;top:0;font-family:'Microsoft JhengHei',sans-serif;visibility:hidden"></div>\n<div id="stage"></div>\n<script>\nconst FONT = "'Microsoft JhengHei','微軟正黑體',sans-serif"\nconst EDGE_LINE = '${Kt.line}', EDGE_TEXT = '${Kt.text}', HALO = '${Kt.haloColor}'\nconst FS = 14, GFS = 15, EFS = 12.5, MAXW = 200\n// 容器內矩形框之垂直對齊: 預設 top; 可於數據之群組節點設 align:'top'|'center'|'bottom' 個別覆寫(改 DEF_VALIGN 改全域預設)\nconst VALIGN = { top:'TOP', center:'CENTER', bottom:'BOTTOM' }, DEF_VALIGN = 'top'\nconst meas = document.getElementById('meas')\nfunction measure(label, fs, maxW){\n const d=document.createElement('div')\n d.style.cssText='display:inline-block;white-space:normal;overflow-wrap:break-word;word-break:normal;text-align:center;line-height:1.4;font-size:'+fs+'px;max-width:'+maxW+'px;padding:0;font-family:'+FONT\n d.textContent=label; meas.appendChild(d); const r=d.getBoundingClientRect(); meas.removeChild(d)\n return { w:Math.ceil(r.width), h:Math.ceil(r.height) }\n}\n// 量整塊 items 尺寸: 完全比照渲染(line-height 1.55、各項 nowrap)→ 直接得 items 區實際高度, 避免逐項估高(用錯 line-height)累積成底部多餘留白\nfunction measureItems(items, fs){\n const d=document.createElement('div')\n d.style.cssText='display:inline-block;font-size:'+fs+'px;line-height:1.55;font-family:'+FONT\n d.innerHTML=items.map(it=>'<div style="white-space:nowrap">• '+String(it).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')+'</div>').join('')\n meas.appendChild(d); const r=d.getBoundingClientRect(); meas.removeChild(d)\n return { w:Math.ceil(r.width), h:Math.ceil(r.height) }\n}\nconst esc = s => String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')\nconst mix = (a,b,t) => { const pa=[1,3,5].map(i=>parseInt(a.slice(i,i+2),16)), pb=[1,3,5].map(i=>parseInt(b.slice(i,i+2),16)); return '#'+pa.map((x,i)=>Math.round(x*(1-t)+pb[i]*t).toString(16).padStart(2,'0')).join('') }\n// 確保「起點後第一段」與「終點前最後一段」之直線長度 >= MIN(轉折不貼端點, 維持箭頭指向性)。\n// 做法: 末段過短時, 沿趨近軸向把「最後轉角」與「其前一轉角」一起後移(兩者同移=保正交); 需 >=4 點才不動端點。\n// ── 菱形端點貼齊(ELK 以外接矩形算端點, 落在矩形邊上非頂點處會與菱形斜邊「空接」) ──\n// 規則(共進共出, 每側獨立; 詳 p10/README):\n// R1 共出: 該側所有「出」一律由該側「頂點」出發, 多條共用首段後於各自高度 90 度轉出(分岔)。\n// R2 共進: 該側「無出」→ 全部匯入「頂點」(各自橫移至中軸, 共用末段, 箭頭重合);\n// 該側「有出」→ 依「半側」匯入該半側「斜邊中點」(頂點讓給出, 進出不同點)。\n// 正交線交叉允許存在(正交路由常態), 一致性優先。\n\n// 判定端點落在外接矩形哪一側; 回 { ax, sg, v }(離開軸/正負/該側頂點), 不在邊上回 null\nfunction diamondSide(p, box){\n const cx = box.x + box.w/2, cy = box.y + box.h/2, EPS = 1.5\n if (Math.abs(p.y - (box.y + box.h)) < EPS) return { ax: 'y', sg: 1, v: { x: cx, y: box.y + box.h } }\n if (Math.abs(p.y - box.y) < EPS) return { ax: 'y', sg: -1, v: { x: cx, y: box.y } }\n if (Math.abs(p.x - box.x) < EPS) return { ax: 'x', sg: -1, v: { x: box.x, y: cy } }\n if (Math.abs(p.x - (box.x + box.w)) < EPS) return { ax: 'x', sg: 1, v: { x: box.x + box.w, y: cy } }\n return null\n}\n\n// 該側某「半側」之斜邊中點(混合側的進匯點); half=+1 取座標較大半側, -1 反之\nfunction diamondSlantMid(box, side, half){\n const cx = box.x + box.w/2, cy = box.y + box.h/2, hw = box.w/2, hh = box.h/2\n if (side.ax === 'y') return { x: cx + half * hw / 2, y: cy + side.sg * hh / 2 }\n return { x: cx + side.sg * hw / 2, y: cy + half * hh / 2 }\n}\n\n// R1 共出: 出邊起點改自「頂點」出發\nfunction routeOutFromVertex(pts, side){\n const p0 = pts[0], p1 = pts[1]\n const EPS = 1.5, J = 18\n const v = side.v\n const off = side.ax === 'y' ? Math.abs(p0.x - v.x) : Math.abs(p0.y - v.y)\n if (off < EPS) return // 已在頂點(置中), 不動\n const alongAxis = side.ax === 'y' ? Math.abs(p1.x - p0.x) < EPS : Math.abs(p1.y - p0.y) < EPS\n if (!alongAxis) { pts.unshift(v); return } // 原首段即沿側邊橫走: 自頂點先橫走接回\n if (pts.length > 2) {\n // 有後續轉折: 頂點 → 沿軸行至原首個轉折高度 → 橫向接回(單一 L 型; 轉折可貼近頂點)\n const q1 = side.ax === 'y' ? { x: v.x, y: p1.y } : { x: p1.x, y: v.y }\n pts.splice(0, 1, v, q1)\n return\n }\n // 無轉折之直線邊: 於頂點外側作雙直角接回各自路線(距離取 J 與可用長度之小者)\n const segLen = side.ax === 'y' ? (p1.y - p0.y) * side.sg : (p1.x - p0.x) * side.sg\n const j = Math.min(J, Math.max(4, segLen / 2))\n const q1 = side.ax === 'y' ? { x: v.x, y: v.y + side.sg * j } : { x: v.x + side.sg * j, y: v.y }\n const q2 = side.ax === 'y' ? { x: p0.x, y: v.y + side.sg * j } : { x: v.x + side.sg * j, y: p0.y }\n pts.splice(0, 1, v, q1, q2)\n}\n\n// R2 決策: 進匯點 = 該側無出 → 頂點; 有出 → 依端點所在半側之斜邊中點\nfunction diamondInAnchor(box, side, hasOutOnSide, pE){\n if(!hasOutOnSide) return { x: side.v.x, y: side.v.y }\n const half = (side.ax === 'y' ? (pE.x - (box.x + box.w/2)) : (pE.y - (box.y + box.h/2))) >= 0 ? 1 : -1\n return diamondSlantMid(box, side, half)\n}\n\n// R2 共進: 進邊終點改匯入 anchor(頂點或半側斜邊中點)\n// 橫向差距小且末段前為可伸縮橫向段 → 整段末端直線「平移」對齊 anchor 軸線(零多餘轉折);\n// 否則於側外 J 處橫移 bus 再沿軸進入 anchor。\nfunction routeInToAnchor(pts, side, anchor){\n const pE = pts[pts.length - 1], pP = pts[pts.length - 2]\n const EPS = 1.5, J = 18, SLIDE = 40 // SLIDE: 可平移之最大橫向差距(過大恐撞鄰近元素, 改走 bus)\n const alongAxis = side.ax === 'y' ? Math.abs(pP.x - pE.x) < EPS : Math.abs(pP.y - pE.y) < EPS\n if (!alongAxis) return // 末段非沿進入軸(罕見), 保留原路由\n const lateral = side.ax === 'y' ? Math.abs(pE.x - anchor.x) : Math.abs(pE.y - anchor.y)\n if (lateral < EPS) {\n pts[pts.length - 1] = { x: anchor.x, y: anchor.y } // 已在 anchor 軸線上: 直接沿軸進入\n return\n }\n if (lateral <= SLIDE && pts.length >= 3) {\n const pP2 = pts[pts.length - 3]\n const prevHorizontal = side.ax === 'y' ? Math.abs(pP2.y - pP.y) < EPS : Math.abs(pP2.x - pP.x) < EPS\n if (prevHorizontal) {\n if (side.ax === 'y') pP.x = anchor.x; else pP.y = anchor.y\n pts[pts.length - 1] = { x: anchor.x, y: anchor.y }\n return\n }\n }\n const Lv = side.ax === 'y' ? side.v.y + side.sg * J : side.v.x + side.sg * J // 側外橫移層\n const segOK = side.ax === 'y' ? (pP.y - Lv) * side.sg > 2 : (pP.x - Lv) * side.sg > 2 // 原末段須延伸到橫移層之外\n if (!segOK) { pts[pts.length - 1] = { x: anchor.x, y: anchor.y }; return } // 空間不足: 直接斜線前最短接入(極罕見)\n const b1 = side.ax === 'y' ? { x: pE.x, y: Lv } : { x: Lv, y: pE.y }\n const b2 = side.ax === 'y' ? { x: anchor.x, y: Lv } : { x: Lv, y: anchor.y }\n pts.splice(pts.length - 1, 1, b1, b2, { x: anchor.x, y: anchor.y })\n}\n\nfunction ensureStub(pts, MIN, skipStart){\n function fixEnd(p){\n const n=p.length; if(n<4) return\n const C=p[n-1], B=p[n-2]\n const dx=C.x-B.x, dy=C.y-B.y, len=Math.abs(dx)+Math.abs(dy)\n if(len>=MIN || len<0.5) return\n const need=MIN-len, ux=dx/len, uy=dy/len\n p[n-2]={x:B.x-ux*need, y:B.y-uy*need}\n p[n-3]={x:p[n-3].x-ux*need, y:p[n-3].y-uy*need}\n }\n // 終點端(箭頭側)一律套最低門檻——含菱形貼齊後之路徑(bus 支線本給滿 J; 平移/保留支線之轉角平移不破壞正交)\n fixEnd(pts)\n // 起點端僅於「菱形頂點分岔」時跳過(分岔轉折貼近頂點屬預期; 後移轉角會與其後路徑段脫勾扭出斜線)\n if(!skipStart){ pts.reverse(); fixEnd(pts); pts.reverse() }\n return pts\n}\n\n// 供測試直接驗證菱形端點規則之純函式(不影響渲染)\nwindow.__dia = { diamondSide, diamondSlantMid, diamondInAnchor, routeOutFromVertex, routeInToAnchor }\n\nwindow.renderFig = async function(spec){\n try {\n const dir = spec.dir==='LR' ? 'RIGHT' : 'DOWN'\n const nById={}, gById={}\n spec.nodes.forEach(n=>nById[n.id]=n); spec.groups.forEach(g=>gById[g.id]=g)\n\n // 節點尺寸量測\n const size={}\n spec.nodes.forEach(n=>{\n if(n.items && n.items.length){ // 標題+項目節點(類 UML class box): 量標題與各項目 → 框寬=最寬列+邊距, 框高=標題列+各項目列\n const tm=measure(n.title||n.label, FS, 250), im=measureItems(n.items, FS-1)\n const headH=tm.h+12 // 標題列高(框頂到分隔線), 供分層繪製定位\n size[n.id]={ w:Math.max(tm.w, im.w)+30, h:headH+im.h+10, headH } // items 區高 = 實量塊高 + 上下 padding(6+4), 與渲染一致無多餘留白\n } else { const m=measure(n.label, FS, n.diamond?150:MAXW); if(n.diamond){ const d=Math.round(Math.max(m.w,m.h)*1.5+34); size[n.id]={w:d,h:d} } else size[n.id]={w:m.w+24,h:m.h+16} }\n })\n\n // 遞迴建 ELK 子樹(群組含 children)\n // 保序: 數據之節點順序=語義順序(選單/報告章節順序), 令 ELK 同層節點依 model order 排列, 不因交叉最小化重排(如 GIS2D/GIS3D 被拆開)。\n // considerModelOrder/forceNodeModelOrder 於 elkjs + INCLUDE_CHILDREN(巢狀)會內部崩潰, 故改用 semiInteractive:\n // crossingMinimization.semiInteractive + 各葉節點 elk.position 位置提示(以數據序為序), 同層節點依提示排序, 巢狀圖亦支援。\n // 例外: 含循環(如流程之退回邊)的圖, 位置提示會干擾分層使入口節點偏離頂端 → 根層不加提示(容器內仍保序)。\n const ORDER_OPTS = { 'elk.layered.crossingMinimization.semiInteractive':'true' }\n const hasCycle = (() => { const adj={}; spec.edges.forEach(e=>{ (adj[e.from]=adj[e.from]||[]).push(e.to) }); const st={}; const dfs=(u)=>{ st[u]=1; for(const v of (adj[u]||[])){ if(st[v]===1) return true; if(!st[v] && dfs(v)) return true } st[u]=2; return false }; return Object.keys(adj).some(u=>!st[u]&&dfs(u)) })()\n const gOpts = { 'elk.layered.nodePlacement.bk.fixedAlignment':'BALANCED', 'elk.padding':'[top=10,left=14,bottom=14,right=14]', 'elk.nodeLabels.placement':'[H_CENTER, V_TOP, INSIDE]', 'elk.algorithm':'layered', 'elk.direction':dir, 'elk.edgeRouting':'ORTHOGONAL', 'elk.hierarchyHandling':'INCLUDE_CHILDREN', 'elk.spacing.nodeNode':'28', 'elk.layered.spacing.nodeNodeBetweenLayers':'30', 'elk.spacing.edgeEdge':'22', 'elk.layered.spacing.edgeEdgeBetweenLayers':'24', ...ORDER_OPTS }\n function elkEdge(e){ const lab = e.label ? [{ text:e.label, width: measure(e.label,EFS,300).w, height:18 }] : []; return { id:e.id, sources:[e.from], targets:[e.to], labels:lab } }\n function build(parentId, padMap, wrapAR){\n const children=[], edges=[]\n spec.groups.filter(g=>g.parent===parentId).forEach(g=>{ const sub=build(g.id, padMap, wrapAR); const gm=measure(g.label,GFS,400)\n // 第二趟: 標題比容器寬時加大該容器左右 padding 撐寬(ELK 尊重複合容器 padding; 巢狀父容器自動跟著變寬, 不溢出又不過寬)\n const ex=(padMap&&padMap[g.id])||0\n const go={ ...gOpts, 'elk.padding':'[top=10,left='+(14+ex)+',bottom=14,right='+(14+ex)+']' }\n // A4 折排: 該容器被挑中時設 aspectRatio 觸發 ELK wrapping, 把線性鏈折成多欄/列(跨欄/列連接線由 ELK 自動正交路由)\n const ar=wrapAR&&wrapAR[g.id]; if(ar){ go['elk.aspectRatio']=String(ar); go['elk.layered.wrapping.strategy']='SINGLE_EDGE' }\n if(parentId || !hasCycle){ go['elk.position']='('+g.mi+','+g.mi+')' }\n children.push({ id:g.id, labels:[{text:g.label, width:gm.w+12, height:gm.h+6}], layoutOptions:go, children:sub.children, edges:sub.edges }) })\n spec.nodes.filter(n=>n.parent===parentId).forEach(n=>{ const va=VALIGN[(gById[parentId]&&gById[parentId].align)||DEF_VALIGN]||'TOP'; const lo={ 'elk.alignment':va }; if(parentId || !hasCycle){ lo['elk.position']='('+n.mi+','+n.mi+')' } children.push({ id:n.id, width:size[n.id].w, height:size[n.id].h, layoutOptions:lo }) })\n spec.edges.filter(e=>e.container===parentId).forEach(e=>{ edges.push(elkEdge(e)) })\n return { children, edges }\n }\n const rootOpts = { 'elk.layered.nodePlacement.bk.fixedAlignment':'BALANCED', 'elk.algorithm':'layered', 'elk.direction':dir, 'elk.edgeRouting':'ORTHOGONAL', 'elk.hierarchyHandling':'INCLUDE_CHILDREN', 'elk.spacing.nodeNode':'30', 'elk.layered.spacing.nodeNodeBetweenLayers':'34', 'elk.spacing.edgeNode':'24', 'elk.spacing.edgeEdge':'22', 'elk.layered.spacing.edgeEdgeBetweenLayers':'24', 'elk.layered.spacing.edgeNodeBetweenLayers':'26', ...(hasCycle ? { 'elk.layered.cycleBreaking.strategy':'MODEL_ORDER' } : ORDER_OPTS) }\n const elk = new ELK()\n const mkGraph = (pm, war) => { const rb = build(null, pm, war); return { id:'root', layoutOptions:rootOpts, children:rb.children, edges:rb.edges } }\n let res = await elk.layout(mkGraph({}, {}))\n // 第二趟: 偵測「標題寬 > 容器寬」之容器 → 加大其左右 padding 撐寬, 重新佈局(巢狀父容器自動跟進; 標題不溢出又不過寬)\n const padMap = {}\n ;(function collect(cell){ (cell.children||[]).forEach(ch=>{ if(gById[ch.id]){ const lw=(ch.labels&&ch.labels[0]&&ch.labels[0].width)||0; if(lw>(ch.width||0)) padMap[ch.id]=Math.ceil((lw-ch.width)/2)+6; collect(ch) } }) })(res)\n if(Object.keys(padMap).length) res = await elk.layout(mkGraph(padMap, {}))\n // ---- A4 長寬比自動折排 ----\n // A4 直式 h/w≈1.414、橫式≈0.707. 過高(R>HIGH)→挑最高之多子容器折成多欄縮高; 過寬(R<LOW)→挑最寬者折成多列增高.\n // 折排引擎=ELK wrapping(設 aspectRatio 觸發, 自動正交畫跨欄/列連接線); 逐次加深直到落入 A4 區間 / 無可折 / 達上限.\n const A4HIGH=1.45, A4LOW=0.70, wrapAR={}\n const foldable = () => { const out=[]; (function w(cell){ (cell.children||[]).forEach(ch=>{ if(gById[ch.id]){ if((ch.children||[]).length>=4) out.push({id:ch.id, w:ch.width||0, h:ch.height||0}); w(ch) } }) })(res); return out }\n for(let it=0; it<8; it++){\n const R=(res.height||1)/(res.width||1)\n if(R<=A4HIGH && R>=A4LOW) break\n const fs=foldable(); if(!fs.length) break\n let pick\n if(R>A4HIGH){ fs.sort((a,b)=>b.h-a.h); pick=fs.find(g=>(wrapAR[g.id]||0.6)<6) }\n else { fs.sort((a,b)=>b.w-a.w); pick=fs.find(g=>(wrapAR[g.id]||3.5)>0.22) }\n if(!pick) break\n wrapAR[pick.id] = R>A4HIGH ? (wrapAR[pick.id]||0.6)*1.9 : (wrapAR[pick.id]||3.5)/1.9\n res = await elk.layout(mkGraph(padMap, wrapAR))\n }\n\n // 遞迴收集: 容器(深度序)、節點(絕對座標)、邊(以容器絕對座標 + section 點)\n const groupsOut=[], nodesOut=[], edgesOut=[]\n function walk(cell, ox, oy, depth){\n ;(cell.children||[]).forEach(ch=>{\n const ax=ox+(ch.x||0), ay=oy+(ch.y||0)\n if (gById[ch.id]) { groupsOut.push({ g:gById[ch.id], x:ax, y:ay, w:ch.width, h:ch.height, depth, lbl:(ch.labels&&ch.labels[0])||null }); walk(ch, ax, ay, depth+1) }\n else if (nById[ch.id]) nodesOut.push({ n:nById[ch.id], x:ax, y:ay, w:ch.width, h:ch.height })\n })\n ;(cell.edges||[]).forEach(e=>{ edgesOut.push({ e:e, ox:ox, oy:oy }) })\n }\n walk(res, 0, 0, 0)\n\n const W=Math.ceil(res.width), H=Math.ceil(res.height), PAD=18\n let svg=''\n // 1) 容器(外層先畫=墊底; depth 小先畫)\n groupsOut.sort((a,b)=>a.depth-b.depth).forEach(o=>{\n svg+='<rect x="'+(o.x)+'" y="'+(o.y)+'" width="'+o.w+'" height="'+o.h+'" rx="8" fill="'+o.g.fill+'" fill-opacity="0.38" stroke="'+o.g.stroke+'" stroke-width="2"/>'\n const tw=o.lbl?o.lbl.width+12:o.w, th=o.lbl?o.lbl.height+6:24, tx=o.x+Math.max(0,(o.w-tw)/2), ty=o.y+(o.lbl?o.lbl.y:5)\n svg+='<foreignObject x="'+tx+'" y="'+ty+'" width="'+tw+'" height="'+th+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="text-align:center;font-weight:bold;font-size:'+GFS+'px;color:'+o.g.stroke+';line-height:1.3;overflow-wrap:break-word;word-break:normal">'+esc(o.g.label)+'</div></foreignObject>'\n })\n // 2) 邊(在節點之下、容器之上)\n const nodeBoxById={}; nodesOut.forEach(o=>{ nodeBoxById[o.n.id]={ x:o.x, y:o.y, w:o.w, h:o.h, diamond:!!o.n.diamond } })\n const specEdgeById={}; spec.edges.forEach(se=>{ specEdgeById[se.id]=se })\n // 2a) 蒐集各 section 絕對路徑點 + 統計各菱形「各側」進出數(側=上/下/左/右, key: nodeId|軸|正負)。\n // 規則: 純出側→全部由頂點分岔; 純入側→各自貼斜邊; 混合側→全部貼斜邊\n // (混合側若連出走頂點+橫向接回, 橫向段必與夾在中間的連入直線交叉; 全貼斜邊則零共用點、零新增交叉)\n const drawList=[], sideMix={}\n edgesOut.forEach(o=>{\n const e=o.e, se=specEdgeById[e.id]\n const srcBox=se&&nodeBoxById[se.from], tgtBox=se&&nodeBoxById[se.to]\n const secs=(e.sections||[]).map(sec=>{\n const pts=[sec.startPoint].concat(sec.bendPoints||[]).concat([sec.endPoint]).map(p=>({x:o.ox+p.x, y:o.oy+p.y}))\n const item={ pts }\n if(srcBox&&srcBox.diamond){ item.srcSide=diamondSide(pts[0], srcBox); if(item.srcSide){ const k=se.from+'|'+item.srcSide.ax+item.srcSide.sg; (sideMix[k]=sideMix[k]||{in:0,out:0}).out++ } }\n if(tgtBox&&tgtBox.diamond){ item.tgtSide=diamondSide(pts[pts.length-1], tgtBox); if(item.tgtSide){ const k=se.to+'|'+item.tgtSide.ax+item.tgtSide.sg; (sideMix[k]=sideMix[k]||{in:0,out:0}).in++ } }\n return item\n })\n drawList.push({ o, e, se, srcBox, tgtBox, secs })\n })\n // 2a-2) 通用路徑化簡: ELK 階層邊(INCLUDE_CHILDREN)常見「先繞反方向再折返」之 S/U 形繞行,\n // 反覆對「三段式窗」(平行-垂直-平行)嘗試收斂成兩段, 僅在碰撞偵測全過才接受:\n // 不撞節點框/容器標題帶/邊標籤、不與他邊平行段貼齊併線; 端點段軸向與方向不可翻轉(維持節點進出方向,\n // 化簡先於菱形貼齊故不干擾貼齊規則); 本邊標籤若因化簡脫離路徑則整段還原(標籤座標由 ELK 依原路徑決定)。\n const obstacles=[]\n nodesOut.forEach(o=>{ obstacles.push({ x:o.x-8, y:o.y-8, w:o.w+16, h:o.h+16 }) })\n groupsOut.forEach(o=>{ if(!o.lbl) return; const tw=o.lbl.width+12, th=o.lbl.height+6, tx=o.x+Math.max(0,(o.w-tw)/2), ty=o.y+o.lbl.y; obstacles.push({ x:tx-4, y:ty-4, w:tw+8, h:th+8 }) })\n const labelBoxes=[]\n drawList.forEach(dd=>{ (dd.e.labels||[]).forEach(l=>{ if(!l.text) return; labelBoxes.push({ x:dd.o.ox+(l.x||0)-2, y:dd.o.oy+(l.y||0)-2, w:(l.width||40)+10, h:(l.height||18)+8 }) }) })\n function segHitsBox(a,b,box){ // 軸對齊線段 vs 矩形(線段必水平或垂直)\n const x1=Math.min(a.x,b.x), x2=Math.max(a.x,b.x), y1=Math.min(a.y,b.y), y2=Math.max(a.y,b.y)\n return x2>box.x && x1<box.x+box.w && y2>box.y && y1<box.y+box.h\n }\n function segOverlapsOther(a,b,selfItem){ // 與他邊平行段貼齊重疊(側距<6 且共線範圍>10)→ 視覺併線, 拒絕\n const horiz = Math.abs(a.y-b.y)<0.5\n for(const dd of drawList) for(const it of dd.secs){ if(it===selfItem) continue\n const q=it.pts\n for(let k=0;k+1<q.length;k++){ const c=q[k], d=q[k+1]\n if(horiz && Math.abs(c.y-d.y)<0.5 && Math.abs(c.y-a.y)<6){ const lo=Math.max(Math.min(a.x,b.x),Math.min(c.x,d.x)), hi=Math.min(Math.max(a.x,b.x),Math.max(c.x,d.x)); if(hi-lo>10) return true }\n if(!horiz && Math.abs(c.x-d.x)<0.5 && Math.abs(c.x-a.x)<6){ const lo=Math.max(Math.min(a.y,b.y),Math.min(c.y,d.y)), hi=Math.min(Math.max(a.y,b.y),Math.max(c.y,d.y)); if(hi-lo>10) return true }\n }\n }\n return false\n }\n // 標籤一律為硬障礙(含本邊自己的): ELK 邊標籤是「先佔位、路徑繞標籤走」, 原路的 jog 即標籤讓位,\n // 拉直會從自家標籤正中穿過(且「脫離才還原」守門對「穿過=距離變近」無感), 故不可豁免自家標籤\n function segClear(a,b,selfItem){\n for(const ob of obstacles) if(segHitsBox(a,b,ob)) return false\n for(const lb of labelBoxes) if(segHitsBox(a,b,lb)) return false\n return !segOverlapsOther(a,b,selfItem)\n }\n function mergeColl(p){ // 去重合點 + 併共線(含同線折返, 折返僅由化簡產生)\n for(let i=p.length-2;i>=0;i--) if(Math.abs(p[i].x-p[i+1].x)<0.5 && Math.abs(p[i].y-p[i+1].y)<0.5) p.splice(i,1)\n for(let i=p.length-2;i>=1;i--){ const A=p[i-1],B=p[i],C=p[i+1]\n if((Math.abs(A.x-B.x)<0.5 && Math.abs(B.x-C.x)<0.5) || (Math.abs(A.y-B.y)<0.5 && Math.abs(B.y-C.y)<0.5)) p.splice(i,1) }\n }\n function distToPoly(pt,p){ let d=Infinity\n for(let i=0;i+1<p.length;i++){ const a=p[i], b=p[i+1]\n const len2=Math.max(1,(b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y))\n const t=Math.max(0,Math.min(1, ((pt.x-a.x)*(b.x-a.x)+(pt.y-a.y)*(b.y-a.y))/len2 ))\n const qx=a.x+t*(b.x-a.x), qy=a.y+t*(b.y-a.y); d=Math.min(d, Math.hypot(pt.x-qx, pt.y-qy)) }\n return d\n }\n function simplifyOrtho(item, labels){\n const p=item.pts\n const before=p.map(q=>({x:q.x,y:q.y}))\n mergeColl(p)\n for(let pass=0; pass<20; pass++){\n let changed=false\n for(let i=0;i+3<p.length;i++){\n const isStart=(i===0), isEnd=(i+3===p.length-1)\n if(isStart && isEnd) continue // 4 點路徑已極簡, 兩端軸向無法同時保持\n const A=p[i], B=p[i+1], C=p[i+2], D=p[i+3]\n const s1h=Math.abs(A.y-B.y)<0.5\n // 取代點取窗之一角: 一般保持首段軸向; 末端窗改保持末段軸向(箭頭進入方向不可變)\n const P = isEnd ? (s1h ? {x:A.x,y:D.y} : {x:D.x,y:A.y}) : (s1h ? {x:D.x,y:A.y} : {x:A.x,y:D.y})\n if(isStart){ const sg0=s1h?Math.sign(B.x-A.x):Math.sign(B.y-A.y), sgN=s1h?Math.sign(P.x-A.x):Math.sign(P.y-A.y); if(sgN!==sg0) continue }\n if(isEnd){ const s3h=Math.abs(C.y-D.y)<0.5, sg0=s3h?Math.sign(D.x-C.x):Math.sign(D.y-C.y), sgN=s3h?Math.sign(D.x-P.x):Math.sign(D.y-P.y); if(sgN!==sg0) continue }\n if(!segClear(A,P,item) || !segClear(P,D,item)) continue\n p.splice(i+1, 2, P)\n mergeColl(p)\n changed=true\n break\n }\n if(!changed) break\n }\n // 標籤守門: 化簡若令本邊任一標籤脫離路徑(距離顯著變大), 整段還原\n if(labels.length && p.length !== before.length){\n for(const l of labels){\n if(distToPoly(l,p) > distToPoly(l,before)+2){ p.length=0; before.forEach(q=>p.push(q)); return }\n }\n }\n }\n drawList.forEach(dd=>{\n const labs=(dd.e.labels||[]).filter(l=>l.text).map(l=>({ x:dd.o.ox+(l.x||0)+(l.width||40)/2, y:dd.o.oy+(l.y||0)+(l.height||18)/2 }))\n dd.secs.forEach(item=>{ if(item.pts.length>=5) simplifyOrtho(item, labs) })\n })\n // 2b) 依側別規則貼齊並繪製\n const procSegsById={} // 實際繪製之路徑點(含菱形貼齊與 ensureStub), 供 geom 輸出一致\n drawList.forEach(dd=>{\n const o=dd.o, e=dd.e\n dd.secs.forEach(item=>{\n const pts=item.pts\n if(item.srcSide && pts.length >= 2) routeOutFromVertex(pts, item.srcSide) // R1: 出永遠自該側頂點\n if(item.tgtSide && pts.length >= 2){\n // R2: 純進側匯「頂點」; 混合側依「半側」匯「斜邊中點」(進出不同點)\n const m=sideMix[dd.se.to+'|'+item.tgtSide.ax+item.tgtSide.sg]\n const anchor=diamondInAnchor(dd.tgtBox, item.tgtSide, !!(m && m.out > 0), pts[pts.length-1])\n routeInToAnchor(pts, item.tgtSide, anchor)\n }\n // 分岔/匯入重排後清除共線折返: 頂點分岔之「接回原路第一轉折層」若跨過下一轉點, 會多走再折回疊出短勾, 併共線即塌縮為直接連線\n if(item.srcSide || item.tgtSide) mergeColl(pts)\n ensureStub(pts, 18, !!item.srcSide)\n ;(procSegsById[e.id]=procSegsById[e.id]||[]).push(pts)\n let d='M '+pts[0].x+' '+pts[0].y; for(let i=1;i<pts.length;i++) d+=' L '+pts[i].x+' '+pts[i].y\n const dash = (e.id && spec.edges.find(x=>x.id===e.id) && spec.edges.find(x=>x.id===e.id).dashed) ? ' stroke-dasharray="6 4"' : ''\n svg+='<path d="'+d+'" fill="none" stroke="'+EDGE_LINE+'" stroke-width="2"'+dash+'/>'\n // 箭頭(終點)\n const a=pts[pts.length-2], b=pts[pts.length-1], ang=Math.atan2(b.y-a.y,b.x-a.x), L=9, w=4\n const x1=b.x-L*Math.cos(ang)+w*Math.sin(ang), y1=b.y-L*Math.sin(ang)-w*Math.cos(ang)\n const x2=b.x-L*Math.cos(ang)-w*Math.sin(ang), y2=b.y-L*Math.sin(ang)+w*Math.cos(ang)\n svg+='<path d="M '+b.x+' '+b.y+' L '+x1+' '+y1+' L '+x2+' '+y2+' Z" fill="'+EDGE_LINE+'"/>'\n })\n // 邊標籤(白光暈)\n ;(e.labels||[]).forEach(l=>{ if(!l.text) return; const lx=o.ox+(l.x||0), ly=o.oy+(l.y||0), lw=l.width||40, lh=l.height||18\n svg+='<foreignObject x="'+lx+'" y="'+ly+'" width="'+(lw+6)+'" height="'+(lh+4)+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="font-size:'+EFS+'px;color:'+EDGE_TEXT+';text-shadow:0 0 3px '+HALO+',0 0 3px '+HALO+',0 0 3px '+HALO+',0 0 3px '+HALO+';white-space:nowrap">'+esc(l.text)+'</div></foreignObject>' })\n })\n // 3) 節點(最上)。各文字 div 之斷行 CSS(overflow-wrap:break-word + word-break:normal)須與 measure()/measureItems() 一致,\n // 否則長英文識別字量測時折行、渲染時不折 → 單行溢出 foreignObject 被裁切\n nodesOut.forEach(o=>{\n const n=o.n\n if(n.items && n.items.length){ // 標題+項目框: 依序分層(框背景→標題背景→框線→分隔線→標題→items), 使框線置頂不被標題背景遮蔽、線寬完整\n const headH=(size[n.id]&&size[n.id].headH)||26, r=7, sep=o.y+headH\n const lis=n.items.map(it=>'<div style="white-space:nowrap">• '+esc(it)+'</div>').join('')\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="'+r+'" fill="'+n.fill+'"/>' // 1 框背景\n svg+='<path d="M '+(o.x+r)+' '+o.y+' H '+(o.x+o.w-r)+' A '+r+' '+r+' 0 0 1 '+(o.x+o.w)+' '+(o.y+r)+' V '+sep+' H '+o.x+' V '+(o.y+r)+' A '+r+' '+r+' 0 0 1 '+(o.x+r)+' '+o.y+' Z" fill="'+mix(n.fill,n.stroke,0.16)+'"/>' // 2 標題背景(上圓角下平)\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="'+r+'" fill="none" stroke="'+n.stroke+'" stroke-width="1.6"/>' // 3 框線(頂層)\n svg+='<line x1="'+o.x+'" y1="'+sep+'" x2="'+(o.x+o.w)+'" y2="'+sep+'" stroke="'+n.stroke+'" stroke-width="1"/>' // 4 分隔線\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+headH+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-weight:bold;font-size:'+FS+'px;color:'+n.font+'"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.title||n.label)+'</div></div></foreignObject>' // 5 標題文字\n svg+='<foreignObject x="'+o.x+'" y="'+sep+'" width="'+o.w+'" height="'+(o.h-headH)+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="font-size:'+(FS-1)+'px;line-height:1.55;padding:6px 9px 4px;text-align:left;color:'+n.font+'">'+lis+'</div></foreignObject>' // 6 items文字\n } else if(n.diamond){ const cx=o.x+o.w/2, cy=o.y+o.h/2\n svg+='<polygon points="'+cx+','+o.y+' '+(o.x+o.w)+','+cy+' '+cx+','+(o.y+o.h)+' '+o.x+','+cy+'" fill="'+n.fill+'" stroke="'+n.stroke+'" stroke-width="1.8"/>'\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:'+FS+'px;color:'+n.font+';line-height:1.4;padding:0 4px;box-sizing:border-box"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.label)+'</div></div></foreignObject>'\n } else {\n svg+='<rect x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'" rx="7" fill="'+n.fill+'" stroke="'+n.stroke+'" stroke-width="1.6"/>'\n svg+='<foreignObject x="'+o.x+'" y="'+o.y+'" width="'+o.w+'" height="'+o.h+'"><div xmlns="http://www.w3.org/1999/xhtml" class="lbl" style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;text-align:center;font-size:'+FS+'px;color:'+n.font+';line-height:1.4;padding:0 4px;box-sizing:border-box"><div style="width:100%;min-width:0;overflow-wrap:break-word;word-break:normal">'+esc(n.label)+'</div></div></foreignObject>'\n }\n })\n\n const full='<svg xmlns="http://www.w3.org/2000/svg" width="'+(W+PAD*2)+'" height="'+(H+PAD*2)+'" viewBox="'+(-PAD)+' '+(-PAD)+' '+(W+PAD*2)+' '+(H+PAD*2)+'" style="background:#fff">'+svg+'</svg>'\n document.getElementById('stage').innerHTML = full\n // 幾何輸出(供 test 斷言: 存在性/包含/標題不溢出/重疊/A4比例/items框高); 不影響 SVG/PNG\n const geom = {\n W:W+PAD*2, H:H+PAD*2,\n nodes: nodesOut.map(o=>({ id:o.n.id, x:o.x, y:o.y, w:o.w, h:o.h, parent:o.n.parent||null, kind:(o.n.items&&o.n.items.length)?'items':(o.n.diamond?'diamond':'box'), headH:(size[o.n.id]&&size[o.n.id].headH)||null })),\n groups: groupsOut.map(o=>({ id:o.g.id, x:o.x, y:o.y, w:o.w, h:o.h, depth:o.depth, parent:o.g.parent||null, labelW:(o.lbl&&o.lbl.width)||0 })),\n edges: edgesOut.map(o=>({ id:o.e.id, segs: procSegsById[o.e.id]||[] }))\n }\n return { ok:true, w:W+PAD*2, h:H+PAD*2, geom }\n } catch(e){ return { ok:false, err:String(e&&(e.stack||e.message)||e).slice(0,400) } }\n}\nwindow.__ready = true\n<\/script></body></html>`;async function rr(t){const n=await e.chromium.launch();try{const e=await n.newPage({deviceScaleFactor:2});await e.setContent(nr,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const r=await e.evaluate(e=>window.renderFig(e),function(e){const t=e.nodes.filter(e=>en(e.cls)).map(t=>{const n=tn(t.cls);return{id:t.id,label:t.label,parent:t.group||null,align:t.align,mi:e.nodes.indexOf(t),fill:n.fill,stroke:n.stroke,font:n.text}}),n=e.nodes.filter(e=>!en(e.cls)).map(t=>{const n=tn(t.cls);return{id:t.id,label:t.label,title:t.title,items:t.items,parent:t.group||null,mi:e.nodes.indexOf(t),diamond:"diamond"===n.shape,fill:n.fill,stroke:n.stroke,font:n.text}}),r=e.edges.map((e,t)=>({id:"e"+t,from:e.from,to:e.to,label:e.label||"",dashed:"dashed"===e.kind})),o={};t.forEach(e=>o[e.id]=e.parent),n.forEach(e=>o[e.id]=e.parent);const a=e=>{const t=[];let n=o[e];for(;n;)t.push(n),n=o[n];return t};return r.forEach(e=>{const t=new Set(a(e.to));e.container=a(e.from).find(e=>t.has(e))||null}),{dir:e.dir||"TB",nodes:n,groups:t,edges:r}}(t));if(!r.ok)throw new Error("p10 render failed: "+r.err);return await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(150),{browser:n,page:e}}catch(e){throw await n.close(),e}}const or={p1:async function(e,t={}){const{browser:n,page:r}=await dn(cn(e));try{return await r.locator("#box svg").screenshot()}finally{await n.close()}},p2:async function(e,t={}){const{browser:n,page:r}=await fn(e);try{return await r.locator("#box svg").screenshot()}finally{await n.close()}},p3:async function(e,t={}){const{browser:n,page:r}=await yn(e);try{return await r.locator("#box svg").screenshot()}finally{await n.close()}},p4:async function(e,t={}){const n=await _n(e,"png");return Buffer.from(n,"base64")},p5:async function(e,t={}){const n=await Bn(e),r=n.match(/viewBox="0 0 (\d+(?:\.\d+)?) (\d+(?:\.\d+)?)"/),o=r?parseFloat(r[1]):1e3,i=96*Math.min(2.4,Math.max(1.4,1700/o));return await a(Buffer.from(n),{density:i}).png().toBuffer()},p6:async function(t,n={}){const r=await e.chromium.launch();try{const e=await r.newPage({deviceScaleFactor:2}),n=[];e.on("pageerror",e=>n.push(e.message)),e.on("console",e=>{"error"===e.type()&&n.push("c:"+e.text())}),await e.setContent(Tn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__ready,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=Gn(t),a=await e.evaluate(([e,t,n,r,o,a,i,s])=>window.renderFig(e,t,n,r,o,a,i,s),[o,t.dir,28,60,2200,Qt,-10,100]);if(!a.ok)throw new Error("renderFig failed :: "+String(a.err).split("\n")[0]);const i=await e.evaluate(()=>window.snap());if(!i.ok)throw new Error("snap failed :: "+i.err);return Buffer.from(i.png.split(",")[1],"base64")}finally{await r.close()}},p7:async function(e,t={}){const{browser:n,page:r}=await qn(e);try{const e=await r.$("#paper svg");return await e.screenshot()}finally{await n.close()}},p8:async function(e,t={}){const{browser:n,page:r}=await Qn(e);try{return await r.locator("#app").screenshot()}finally{await n.close()}},p9:async function(t,n={}){const r=await e.chromium.launch();try{const e=await r.newPage({deviceScaleFactor:2}),n=[];e.on("pageerror",e=>n.push(e.message)),e.on("console",e=>{"error"===e.type()&&n.push("c:"+e.text().slice(0,200))}),await e.setContent(tr,{waitUntil:"load"}),await e.waitForFunction(()=>"READY"===document.title||"FAIL"===document.title,{timeout:6e4}).catch(()=>{});const o=await e.evaluate(()=>({t:document.title,err:window.__err}));if("READY"!==o.t)throw new Error("BOOT FAIL :: "+o.err+" | "+n.slice(0,6).join(" | "));const a=function(e){const t=e.nodes.map(e=>{const t={id:e.id,label:e.label,kind:e.cls};return e.group&&(t.parent=e.group),t}),n=e.edges.map(e=>{const t={s:e.from,t:e.to};return e.label&&(t.l=e.label),"dashed"===e.kind&&(t.dashed=!0),t});return{layout:"dagrec",rankDir:e.dir||"TB",nodesep:38,ranksep:44,nodes:t,edges:n}}(t),i=await e.evaluate(e=>window.renderFig(e),a);if(!i.ok)throw new Error("FAIL :: "+i.err);return await e.evaluate(()=>document.fonts&&document.fonts.ready),await e.waitForTimeout(250),await e.locator("#shot").screenshot()}finally{await r.close()}},p10:async function(e,t={}){const{browser:n,page:r}=await rr(e);try{return await r.locator("#stage svg").screenshot()}finally{await n.close()}}},ar={p1:async function(e,t={}){const{browser:n,page:r}=await dn(cn(e));try{return(await r.evaluate(()=>{const e=document.querySelector("#box svg"),t=e.viewBox.baseVal;return e.style.maxWidth="none",e.setAttribute("width",Math.ceil(t.width)),e.setAttribute("height",Math.ceil(t.height)),document.getElementById("box").innerHTML})).replace(/ /g," ").trim()}finally{await n.close()}},p2:async function(e,t={}){const{browser:n,page:r}=await fn(e);try{return(await r.evaluate(()=>{const e=document.querySelector("#box svg"),t=Array.from(document.querySelectorAll("head style")).map(e=>e.textContent).join("\n"),n=document.createElementNS("http://www.w3.org/2000/svg","style");n.textContent=t,e.insertBefore(n,e.firstChild);const r=document.getElementById("box").innerHTML;return n.remove(),r})).replace(/ /g," ").trim()}finally{await n.close()}},p3:async function(e,t={}){const{browser:n,page:r}=await yn(e);try{return(await r.evaluate(()=>document.getElementById("box").innerHTML)).replace(/ /g," ").trim()}finally{await n.close()}},p4:async function(e,t={}){let n=await _n(e,"svg");return n=n.replace(/ /g," "),/\sxmlns=/.test(n)||(n=n.replace("<svg",'<svg xmlns="http://www.w3.org/2000/svg"')),/font-family/.test(n)||(n=n.replace(">","><style>text{font-family:'Microsoft JhengHei',sans-serif}</style>")),n},p5:async function(e,t={}){return await Bn(e)},p6:async function(t,n={}){const r=await e.chromium.launch();try{const e=await r.newPage(),n=[];e.on("pageerror",e=>n.push(e.message)),e.on("console",e=>{"error"===e.type()&&n.push("c:"+e.text())}),await e.setContent(Cn,{waitUntil:"load"}),await e.waitForFunction(()=>window.__readySvg,{timeout:6e4}).catch(()=>{}),await e.evaluate(()=>document.fonts&&document.fonts.ready);const o=Gn(t),a=await e.evaluate(([e,t,n,r,o,a,i,s])=>window.renderFigSvg(e,t,n,r,o,a,i,s),[o,t.dir,28,60,2200,Qt,-10,100]);if(!a.ok)throw new Error("renderFigSvg failed :: "+String(a.err).split("\n")[0]);const i=await e.evaluate(()=>window.snapSvg());if(!i.ok)throw new Error("snapSvg failed :: "+i.err);return i.svg}finally{await r.close()}},p7:async function(e,t={}){const{browser:n,page:r,res:o}=await qn(e);try{let e=await r.$eval("#paper svg",e=>e.outerHTML);return e=e.replace(/^<svg([^>]*)>/,(e,t)=>{let n=t;return/\bxmlns=/.test(n)||(n=' xmlns="http://www.w3.org/2000/svg"'+n),n=n.replace(/\swidth="100%"/,` width="${o.w}"`),n=n.replace(/\sheight="100%"/,` height="${o.h}"`),n=n.replace(/position:\s*absolute;\s*inset:\s*[^;]*;\s*/,""),`<svg${n}>`}),e.replace(/ /g," ").trim()}finally{await n.close()}},p8:async function(e,t={}){const{browser:n,page:r,res:o}=await Qn(e);try{let e=await r.evaluate(()=>document.querySelector("svg.lf-canvas-overlay").outerHTML);const t=e.match(/^<svg[^>]*>/);if(!t)throw new Error("genSvg: 找不到圖面 svg 根元素");let n=t[0].replace('width="100%"',`width="${o.w}"`).replace('height="100%"',`height="${o.h}"`);n=n.replace(/>$/,` viewBox="0 0 ${o.w} ${o.h}">`),e=n+e.slice(t[0].length);const a=`<style>${Jn}\n* { font-family: ${Qt}; }</style><rect x="0" y="0" width="${o.w}" height="${o.h}" fill="#fff"></rect>`;return e=e.replace("<g transform",a+"<g transform"),e=e.replace(/ /g," "),e}finally{await n.close()}},p10:async function(e,t={}){const{browser:n,page:r}=await rr(e);try{return(await r.evaluate(()=>document.getElementById("stage").innerHTML)).replace(/ /g," ").trim()}finally{await n.close()}}};return async function(e,t={}){let n=le(t,"mode");Ut(n)||(n="p10");const r=n.trim().toLowerCase();if(!or[r])throw new Error(`invalid opt.mode[${n}], 須為 ${Object.keys(or).join(", ")} 之一`);let o=le(t,"output");Ut(o)||(o="png");const a=o.trim().toLowerCase();if("png"!==a&&"svg"!==a)throw new Error(`invalid opt.output[${o}], 須為 png 或 svg`);if("svg"===a&&!ar[r])throw new Error(`mode[${r}] 不支援 svg 輸出, 支援: ${Object.keys(ar).join(", ")}`);if(!function(e){if(Xt(e)){for(let t in e)return!0;return!1}return!1}(e))throw new Error("invalid inp, 須為 { dir, nodes, edges } 正規化繪圖數據");if(!Yt(i=e.nodes)||0===i.length||1===i.length&&Vt(i[0]))throw new Error("invalid inp.nodes, 須為非空陣列");var i;if(!Yt(e.edges))throw new Error("invalid inp.edges, 須為陣列");const s=((l=qt(e,5)).nodes.forEach(e=>{e.title&&null==e.label&&(e.label=e.title+(e.items&&e.items.length?" ("+e.items.join("/")+")":""))}),l);var l;return await("svg"===a?ar:or)[r](s,t)}});
|
|
7
7
|
//# sourceMappingURL=w-flowchart.umd.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"w-flowchart.umd.js","sources":[],"sourcesContent":null,"names":[],"mappings":";;;;;"}
|
|
1
|
+
{"version":3,"file":"w-flowchart.umd.js","sources":["../node_modules/lodash-es/isArray.js","../node_modules/lodash-es/_freeGlobal.js","../node_modules/lodash-es/_root.js","../node_modules/lodash-es/_Symbol.js","../node_modules/lodash-es/_getRawTag.js","../node_modules/lodash-es/_objectToString.js","../node_modules/lodash-es/_baseGetTag.js","../node_modules/lodash-es/isObjectLike.js","../node_modules/lodash-es/isSymbol.js","../node_modules/lodash-es/_isKey.js","../node_modules/lodash-es/isObject.js","../node_modules/lodash-es/isFunction.js","../node_modules/lodash-es/_coreJsData.js","../node_modules/lodash-es/_isMasked.js","../node_modules/lodash-es/_toSource.js","../node_modules/lodash-es/_baseIsNative.js","../node_modules/lodash-es/_getNative.js","../node_modules/lodash-es/_getValue.js","../node_modules/lodash-es/_nativeCreate.js","../node_modules/lodash-es/_hashGet.js","../node_modules/lodash-es/_hashHas.js","../node_modules/lodash-es/_Hash.js","../node_modules/lodash-es/eq.js","../node_modules/lodash-es/_assocIndexOf.js","../node_modules/lodash-es/_hashClear.js","../node_modules/lodash-es/_hashDelete.js","../node_modules/lodash-es/_hashSet.js","../node_modules/lodash-es/_listCacheDelete.js","../node_modules/lodash-es/_ListCache.js","../node_modules/lodash-es/_listCacheClear.js","../node_modules/lodash-es/_listCacheGet.js","../node_modules/lodash-es/_listCacheHas.js","../node_modules/lodash-es/_listCacheSet.js","../node_modules/lodash-es/_Map.js","../node_modules/lodash-es/_getMapData.js","../node_modules/lodash-es/_isKeyable.js","../node_modules/lodash-es/_MapCache.js","../node_modules/lodash-es/_mapCacheClear.js","../node_modules/lodash-es/_mapCacheDelete.js","../node_modules/lodash-es/_mapCacheGet.js","../node_modules/lodash-es/_mapCacheHas.js","../node_modules/lodash-es/_mapCacheSet.js","../node_modules/lodash-es/memoize.js","../node_modules/lodash-es/_stringToPath.js","../node_modules/lodash-es/_memoizeCapped.js","../node_modules/lodash-es/_baseToString.js","../node_modules/lodash-es/_arrayMap.js","../node_modules/lodash-es/_castPath.js","../node_modules/lodash-es/toString.js","../node_modules/lodash-es/_toKey.js","../node_modules/lodash-es/get.js","../node_modules/lodash-es/_baseGet.js","../node_modules/lodash-es/_Stack.js","../node_modules/lodash-es/_stackClear.js","../node_modules/lodash-es/_stackDelete.js","../node_modules/lodash-es/_stackGet.js","../node_modules/lodash-es/_stackHas.js","../node_modules/lodash-es/_stackSet.js","../node_modules/lodash-es/_defineProperty.js","../node_modules/lodash-es/_baseAssignValue.js","../node_modules/lodash-es/_assignValue.js","../node_modules/lodash-es/_copyObject.js","../node_modules/lodash-es/_baseIsArguments.js","../node_modules/lodash-es/isArguments.js","../node_modules/lodash-es/isBuffer.js","../node_modules/lodash-es/stubFalse.js","../node_modules/lodash-es/_isIndex.js","../node_modules/lodash-es/isLength.js","../node_modules/lodash-es/_baseIsTypedArray.js","../node_modules/lodash-es/_baseUnary.js","../node_modules/lodash-es/_nodeUtil.js","../node_modules/lodash-es/isTypedArray.js","../node_modules/lodash-es/_arrayLikeKeys.js","../node_modules/lodash-es/_baseTimes.js","../node_modules/lodash-es/_isPrototype.js","../node_modules/lodash-es/_overArg.js","../node_modules/lodash-es/_nativeKeys.js","../node_modules/lodash-es/_baseKeys.js","../node_modules/lodash-es/isArrayLike.js","../node_modules/lodash-es/keys.js","../node_modules/lodash-es/_baseKeysIn.js","../node_modules/lodash-es/_nativeKeysIn.js","../node_modules/lodash-es/keysIn.js","../node_modules/lodash-es/_cloneBuffer.js","../node_modules/lodash-es/stubArray.js","../node_modules/lodash-es/_getSymbols.js","../node_modules/lodash-es/_arrayFilter.js","../node_modules/lodash-es/_arrayPush.js","../node_modules/lodash-es/_getPrototype.js","../node_modules/lodash-es/_getSymbolsIn.js","../node_modules/lodash-es/_baseGetAllKeys.js","../node_modules/lodash-es/_getAllKeys.js","../node_modules/lodash-es/_getAllKeysIn.js","../node_modules/lodash-es/_DataView.js","../node_modules/lodash-es/_Promise.js","../node_modules/lodash-es/_Set.js","../node_modules/lodash-es/_WeakMap.js","../node_modules/lodash-es/_getTag.js","../node_modules/lodash-es/_initCloneArray.js","../node_modules/lodash-es/_Uint8Array.js","../node_modules/lodash-es/_cloneArrayBuffer.js","../node_modules/lodash-es/_cloneRegExp.js","../node_modules/lodash-es/_cloneSymbol.js","../node_modules/lodash-es/_initCloneByTag.js","../node_modules/lodash-es/_cloneDataView.js","../node_modules/lodash-es/_cloneTypedArray.js","../node_modules/lodash-es/_baseCreate.js","../node_modules/lodash-es/isMap.js","../node_modules/lodash-es/_baseIsMap.js","../node_modules/lodash-es/isSet.js","../node_modules/lodash-es/_baseIsSet.js","../node_modules/lodash-es/_baseClone.js","../node_modules/lodash-es/_copyArray.js","../node_modules/lodash-es/_initCloneObject.js","../node_modules/lodash-es/_copySymbolsIn.js","../node_modules/lodash-es/_baseAssignIn.js","../node_modules/lodash-es/_copySymbols.js","../node_modules/lodash-es/_baseAssign.js","../node_modules/lodash-es/_arrayEach.js","../node_modules/wsemi/src/isstr.mjs","../node_modules/wsemi/src/isestr.mjs","../node_modules/wsemi/src/isobj.mjs","../node_modules/wsemi/src/isarr.mjs","../node_modules/wsemi/src/iser.mjs","../node_modules/wsemi/src/isundefined.mjs","../node_modules/wsemi/src/isnull.mjs","../node_modules/wsemi/src/isobj0.mjs","../node_modules/wsemi/src/isstr0.mjs","../node_modules/wsemi/src/isarr0.mjs","../node_modules/wsemi/src/isnan.mjs","../src/common/palette.mjs","../src/common/pkg.mjs","../src/p1/gen.mjs","../src/p2/gen.mjs","../src/p3/gen.mjs","../src/p4/gen.mjs","../src/p5/gen.mjs","../src/p6/gen.mjs","../src/p7/gen.mjs","../src/p8/gen.mjs","../src/p9/gen.mjs","../src/p10/gen.mjs","../src/WFlowchart.mjs","../node_modules/wsemi/src/iseobj.mjs","../node_modules/wsemi/src/isearr.mjs","../src/common/derive.mjs","../node_modules/lodash-es/cloneDeep.js"],"sourcesContent":null,"names":["isArray$1","Array","isArray","freeGlobal$1","global","Object","freeSelf","self","root$1","freeGlobal","Function","Symbol$1","root","Symbol","objectProto","prototype","hasOwnProperty","nativeObjectToString","toString","symToStringTag","toStringTag","undefined","baseGetTag","value","isOwn","call","tag","unmasked","e","result","getRawTag","objectToString","isObjectLike","isSymbol","reIsDeepProp","reIsPlainProp","isObject","type","isFunction","uid","coreJsData$1","maskSrcKey","exec","coreJsData","keys","IE_PROTO","funcToString","toSource","func","reIsHostCtor","funcProto","reIsNative","RegExp","replace","baseIsNative","test","getNative","object","key","getValue","nativeCreate$1","Hash","entries","index","length","this","clear","entry","set","eq","other","assocIndexOf","array","__data__","nativeCreate","size","has","get","data","splice","ListCache","pop","push","Map$1","getMapData","map","MapCache","hash","Map","string","memoize","resolver","TypeError","memoized","args","arguments","apply","cache","Cache","rePropName","reEscapeChar","stringToPath","charCodeAt","match","number","quote","subString","stringToPath$1","symbolProto","symbolToString","baseToString","iteratee","arrayMap","castPath","isKey","toKey","path","defaultValue","baseGet","Stack","pairs","LARGE_ARRAY_SIZE","defineProperty","defineProperty$1","baseAssignValue","configurable","enumerable","writable","assignValue","objValue","copyObject","source","props","customizer","isNew","newValue","baseIsArguments","propertyIsEnumerable","isArguments","isArguments$1","freeExports","exports","nodeType","freeModule","module","Buffer","isBuffer$1","isBuffer","reIsUint","isIndex","isLength","typedArrayTags","baseUnary","freeProcess","process","nodeUtil$1","types","require","binding","nodeIsTypedArray","nodeUtil","isTypedArray","isTypedArray$1","arrayLikeKeys","inherited","isArr","isArg","isBuff","isType","skipIndexes","n","baseTimes","String","isPrototype","Ctor","constructor","overArg","transform","arg","nativeKeys$1","isArrayLike","nativeKeys","baseKeys","baseKeysIn","nativeKeysIn","isProto","keysIn","allocUnsafe","stubArray","nativeGetSymbols","getOwnPropertySymbols","getSymbols","predicate","resIndex","arrayFilter","symbol","getSymbols$1","arrayPush","values","offset","getPrototype$1","getPrototypeOf","getSymbolsIn","getPrototype","getSymbolsIn$1","baseGetAllKeys","keysFunc","symbolsFunc","getAllKeys","getAllKeysIn","DataView$1","Promise$2","Set$2","WeakMap$1","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","DataView","mapCtorString","promiseCtorString","Promise","setCtorString","Set","weakMapCtorString","WeakMap","getTag","ArrayBuffer","resolve","ctorString","getTag$1","Uint8Array$1","Uint8Array","cloneArrayBuffer","arrayBuffer","byteLength","reFlags","symbolValueOf","valueOf","initCloneByTag","isDeep","dataView","buffer","byteOffset","cloneDataView","typedArray","cloneTypedArray","regexp","lastIndex","cloneRegExp","objectCreate","create","baseCreate","proto","baseCreate$1","nodeIsMap","isMap","isMap$1","nodeIsSet","isSet","isSet$1","argsTag","funcTag","objectTag","cloneableTags","baseClone","bitmask","stack","isFlat","isFull","input","initCloneArray","copyArray","isFunc","slice","copy","cloneBuffer","initCloneObject","copySymbolsIn","baseAssignIn","copySymbols","baseAssign","stacked","forEach","subValue","add","arrayEach","isstr","v","isestr","isobj","isarr","iser","isundefined","isnull","k","isobj0","isstr0","isarr0","isnan","PALETTE","blue","fill","stroke","text","shape","green","orange","purple","red","done","diamond","blueG","group","blueG2","greenG","greenG2","orangeG","purpleG","EDGE","line","textBg","haloColor","haloWidth","FONT","isGroupCls","cls","colorOf","__dir","dirname","fileURLToPath","import","pkgFile","rel","dir","i","fp","join","fs","existsSync","up","Error","pkgScript","readFileSync","pkgText","MERMAID_JS","nodeShape","nd","qid","id","label","translate","nodes","edges","used","qidMap","base","q","byId","filter","clsSet","classDefLines","p","clsToIds","classLines","ids","topGroupIds","standaloneNodes","renderSubgraph","gid","indent","g","lines","directChildren","nestedGroups","ng","edgeLines","ed","arrow","kind","lbl","from","to","async","renderFigPage","code","browser","chromium","launch","page","newPage","deviceScaleFactor","setContent","JSON","stringify","mermaidHtml","waitUntil","waitForFunction","document","title","timeout","msg","evaluate","el","getElementById","innerText","fonts","ready","err","close","PKG_ORIGIN","innerDir","childrenOf","nodeById","topNodes","renderNode","sp","repeat","kids","cid","clsByNodes","fillColor","strokeColor","textColor","sw","route","decodeURIComponent","request","url","split","fulfill","body","contentType","endsWith","status","message","routeLocalPkgs","window","__ready","__setupErr","catch","setupErr","r","c","idx","renderFig","ok","waitForTimeout","clsAlias","toLowerCase","clsDirs","buildClsDirectives","fromLabel","toLabel","setup","src","fx","sweep","best","s","x","renderAndDetect","collisions","spacing","details","autofix","CYTOSCAPE_JS","DAGRE_JS","CYTOSCAPE_DAGRE_JS","CYTOSCAPE_SVG_JS","toEls","els","parent","classes","target","html","renderPage","mode","res","st","rd","md","m","__svg","__png","FONT_FAMILY","FONT_OVERRIDE","EDGE_HALO_STYLE","esc","DIR_MAP","TB","LR","BT","RL","styLines","isGroup","qualifiedId","nodeId","parentMap","parts","cur","unshift","childrenMap","dataDir","pad","sl","kid","baseOpt","layout","themeID","d2Svg","d2inst","D2","d2src","blocks","compile","options","svg","render","diagram","renderOptions","maskBlock","attrs","inner","indexOf","injectEdgeLabelHalo","injectFont","worker","terminate","G6_JS","G_LITE_JS","G_SVG_JS","measure","Math","round","max","reduce","a","ch","combos","comboIds","firstLeaf","resolveEnd","combo","style","zIndex","labelText","labelPlacement","labelFontFamily","labelFontSize","labelFontWeight","labelFill","fillOpacity","lineWidth","isDiamond","w","h","radius","eid","dashed","endArrow","lineDash","labelBackground","labelStroke","labelLineWidth","labelPaintOrder","labelAutoRotate","htmlSvg","JOINT_JS","CLS","fromEntries","o","color","errs","on","ex","SEP","nodesep","ranksep","rankDir","LOGICFLOW_CSS","LOGICFLOW_JS","PAL","PAL_JSON","EDGE_JSON","renderToReadyPage","fig","PAGE_HTML","groups","align","mi","font","items","parentOf","anc","at","container","find","GENS_PNG","p1","opt","locator","screenshot","p2","p3","p4","b64","p5","parseFloat","density","min","sharp","png","toBuffer","p6","gg","ns","rs","cv","ft","cz","ez","snap","p7","$","p8","p9","boot","t","__err","spec","l","p10","GENS_SVG","querySelector","vb","viewBox","baseVal","maxWidth","setAttribute","ceil","width","height","innerHTML","trim","css","querySelectorAll","textContent","createElementNS","insertBefore","firstChild","out","remove","__readySvg","renderFigSvg","snapSvg","outer","$eval","outerHTML","m0","openTagMatch","openTag","inject","inp","output","iseobj","d","CLONE_DEEP_FLAG"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,143,144,146]}
|