Skip to content

Commit b452247

Browse files
authored
Merge branch 'develop' into sidv/autoGenerateShapeDocs
2 parents 14524e1 + 2506c29 commit b452247

File tree

8 files changed

+74
-10
lines changed

8 files changed

+74
-10
lines changed

.changeset/chilly-hotels-mix.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'mermaid': patch
3+
---
4+
5+
fix: Jagged edge fix for icon shape

.changeset/heavy-cats-mate.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'mermaid': patch
3+
---
4+
5+
fix: Icon color fix for colored icons.

cypress/integration/rendering/iconShape.spec.ts

+17
Original file line numberDiff line numberDiff line change
@@ -124,3 +124,20 @@ describe('Test iconShape with different h', () => {
124124
imgSnapshotTest(flowchartCode);
125125
});
126126
});
127+
128+
describe('Test colored iconShape', () => {
129+
it('with no styles', () => {
130+
let flowchartCode = `flowchart TB\n`;
131+
const icon = 'fluent-emoji:tropical-fish';
132+
flowchartCode += ` nA --> nAA@{ icon: '${icon}', form: 'square', label: 'icon with color' }\n`;
133+
imgSnapshotTest(flowchartCode);
134+
});
135+
136+
it('with styles', () => {
137+
let flowchartCode = `flowchart TB\n`;
138+
const icon = 'fluent-emoji:tropical-fish';
139+
flowchartCode += ` nA --> nAA@{ icon: '${icon}', form: 'square', label: 'icon with color' }\n`;
140+
flowchartCode += ` style nAA fill:#f9f,stroke:#333,stroke-width:4px \n`;
141+
imgSnapshotTest(flowchartCode);
142+
});
143+
});

cypress/platform/viewer.js

+37
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,48 @@ const contentLoaded = async function () {
6161
width: 512,
6262
height: 512,
6363
};
64+
/* MIT License
65+
66+
Copyright (c) Microsoft Corporation.
67+
68+
Permission is hereby granted, free of charge, to any person obtaining a copy
69+
of this software and associated documentation files (the "Software"), to deal
70+
in the Software without restriction, including without limitation the rights
71+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
72+
copies of the Software, and to permit persons to whom the Software is
73+
furnished to do so, subject to the following conditions:
74+
75+
The above copyright notice and this permission notice shall be included in all
76+
copies or substantial portions of the Software.
77+
78+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
79+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
80+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
81+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
82+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
83+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
84+
SOFTWARE */
85+
const staticAwsLogoIconPack = {
86+
prefix: 'fluent-emoji',
87+
icons: {
88+
'tropical-fish': {
89+
width: 32,
90+
height: 32,
91+
body: '<g fill="none"><circle cx="3.055" cy="19.945" r="1.055" fill="url(#f2515id0)" /><circle cx="3.055" cy="19.945" r="1.055" fill="url(#f2515id1)" /><circle cx="3.055" cy="17.945" r="1.055" fill="url(#f2515id2)" /><path fill="url(#f2515idj)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515id3)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515id4)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515idk)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515id5)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515id6)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515id7)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><path fill="url(#f2515idl)" d="M14.375 7H23a3 3 0 0 1 3 3v17a3 3 0 0 1-3 3h-8.625z" /><circle cx="14.5" cy="18.5" r="11.5" fill="url(#f2515id8)" /><circle cx="14.5" cy="18.5" r="11.5" fill="url(#f2515id9)" /><circle cx="14.5" cy="18.5" r="11.5" fill="url(#f2515ida)" /><circle cx="14.5" cy="18.5" r="11.5" fill="url(#f2515idb)" /><path fill="url(#f2515idc)" d="M6.7 10.05a10.8 10.8 0 0 1 3.988 8.388c0 3.417-1.586 6.464-4.06 8.445A11.47 11.47 0 0 1 3 18.5a11.47 11.47 0 0 1 3.7-8.45" /><g filter="url(#f2515idp)"><path fill="#4d82fd" d="M17.61 21.717v-5.873a.7.7 0 0 0-1.174-.516l-2.998 2.753a1 1 0 0 0 .01 1.483l2.995 2.675a.7.7 0 0 0 1.166-.522" /></g><path fill="url(#f2515idm)" d="M18 21.452v-5.874a.7.7 0 0 0-1.174-.516l-2.997 2.754a1 1 0 0 0 .01 1.482l2.995 2.676A.7.7 0 0 0 18 21.452" /><path fill="url(#f2515idn)" d="M18 21.452v-5.874a.7.7 0 0 0-1.174-.516l-2.997 2.754a1 1 0 0 0 .01 1.482l2.995 2.676A.7.7 0 0 0 18 21.452" /><path fill="url(#f2515idd)" d="M18 21.452v-5.874a.7.7 0 0 0-1.174-.516l-2.997 2.754a1 1 0 0 0 .01 1.482l2.995 2.676A.7.7 0 0 0 18 21.452" /><circle cx="7.422" cy="16.391" r=".5" fill="url(#f2515ide)" /><circle cx="7.422" cy="16.391" r=".5" fill="url(#f2515idf)" /><circle cx="7.422" cy="16.391" r=".5" fill="url(#f2515ido)" /><path fill="url(#f2515idg)" d="M30.063 15.955c0-.672-.766-1.476-1.82-.956A4.5 4.5 0 0 0 26 18.893c0 1.662.901 3.114 2.242 3.893c.759.441 1.82-.073 1.82-.83z" /><path fill="url(#f2515idh)" d="M30.063 15.955c0-.672-.766-1.476-1.82-.956A4.5 4.5 0 0 0 26 18.893c0 1.662.901 3.114 2.242 3.893c.759.441 1.82-.073 1.82-.83z" /><path fill="url(#f2515idi)" d="M30.063 15.955c0-.672-.766-1.476-1.82-.956A4.5 4.5 0 0 0 26 18.893c0 1.662.901 3.114 2.242 3.893c.759.441 1.82-.073 1.82-.83z" /><defs><radialGradient id="f2515id0" cx="0" cy="0" r="1" gradientTransform="matrix(1.3125 -.53906 .83075 2.02268 2 20.484)" gradientUnits="userSpaceOnUse"><stop stop-color="#6d5a93" /><stop offset="1" stop-color="#5f498c" /></radialGradient><radialGradient id="f2515id1" cx="0" cy="0" r="1" gradientTransform="rotate(98.219 -6.59 10.698)scale(.71042 .794)" gradientUnits="userSpaceOnUse"><stop stop-color="#442e79" /><stop offset="1" stop-color="#442e79" stop-opacity="0" /></radialGradient><radialGradient id="f2515id2" cx="0" cy="0" r="1" gradientTransform="matrix(1.625 0 0 2.50428 1.875 17.945)" gradientUnits="userSpaceOnUse"><stop stop-color="#6d5a93" /><stop offset="1" stop-color="#5f498c" /></radialGradient><radialGradient id="f2515id3" cx="0" cy="0" r="1" gradientTransform="matrix(8.0625 -3.625 5.13835 11.4284 17.188 31.625)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff835d" /><stop offset="1" stop-color="#ff835d" stop-opacity="0" /></radialGradient><radialGradient id="f2515id4" cx="0" cy="0" r="1" gradientTransform="rotate(46.65 -12.942 36.264)scale(5.37182 7.61442)" gradientUnits="userSpaceOnUse"><stop stop-color="#ff835d" /><stop offset="1" stop-color="#ff835d" stop-opacity="0" /></radialGradient><radialGradient id="f2515id5" cx="0" cy="0" r="1" gradientTransform="matrix(16.7498 18.68764 -12.28497 11.01107 9.25 10.625)" gradientUnits="userSpaceOnUse"><stop offset=".943" stop-color="#ff835d" stop-opacity="0" /><stop offset="1" stop-color="#ff835d" /></radialGradient><radialGradient id="f2515id6" cx="0" cy="0" r="1" gradientTransform="rotate(143.673 11.127 8.392)scale(3.95643 5.87059)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffe65e" /><stop offset=".654" stop-color="#ffe65e" stop-opacity="0" /></radialGradient><radialGradient id="f2515id7" cx="0" cy="0" r="1" gradientTransform="matrix(0 -6.0625 11.8125 0 27.125 14.938)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffe65e" /><stop offset="1" stop-color="#ffe65e" stop-opacity="0" /></radialGradient><radialGradient id="f2515id8" cx="0" cy="0" r="1" gradientTransform="matrix(-10.49993 18.125 -19.41091 -11.24487 22.813 9.75)" gradientUnits="userSpaceOnUse"><stop stop-color="#76cdff" /><stop offset="1" stop-color="#5181ff" /></radialGradient><radialGradient id="f2515id9" cx="0" cy="0" r="1" gradientTransform="matrix(0 23.0625 -17.9752 0 14.5 9.063)" gradientUnits="userSpaceOnUse"><stop offset=".786" stop-color="#5a67ff" stop-opacity="0" /><stop offset=".929" stop-color="#5a67ff" /></radialGradient><radialGradient id="f2515ida" cx="0" cy="0" r="1" gradientTransform="matrix(-3.6875 0 0 -6.17092 28.5 18.813)" gradientUnits="userSpaceOnUse"><stop offset=".017" stop-color="#5a67ff" /><stop offset="1" stop-color="#5a67ff" stop-opacity="0" /></radialGradient><radialGradient id="f2515idb" cx="0" cy="0" r="1" gradientTransform="matrix(2.37499 2.81251 -7.52137 6.35133 7.875 8.125)" gradientUnits="userSpaceOnUse"><stop stop-color="#65afe3" /><stop offset="1" stop-color="#65afe3" stop-opacity="0" /></radialGradient><radialGradient id="f2515idc" cx="0" cy="0" r="1" gradientTransform="matrix(23.875 0 0 34.7797 .625 18.467)" gradientUnits="userSpaceOnUse"><stop offset=".065" stop-color="#80739f" /><stop offset=".262" stop-color="#6f53a3" /></radialGradient><radialGradient id="f2515idd" cx="0" cy="0" r="1" gradientTransform="matrix(0 4.5 -.71873 0 18 15.844)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffd65c" /><stop offset="1" stop-color="#ffd65c" stop-opacity="0" /></radialGradient><radialGradient id="f2515ide" cx="0" cy="0" r="1" gradientTransform="matrix(-.40625 .5625 -.5015 -.3622 7.57 16.23)" gradientUnits="userSpaceOnUse"><stop offset=".006" stop-color="#433437" /><stop offset="1" stop-color="#3b2838" /></radialGradient><radialGradient id="f2515idf" cx="0" cy="0" r="1" gradientTransform="rotate(137.643 .653 9.607)scale(.35946 .31624)" gradientUnits="userSpaceOnUse"><stop stop-color="#5c5051" /><stop offset="1" stop-color="#5c5051" stop-opacity="0" /></radialGradient><radialGradient id="f2515idg" cx="0" cy="0" r="1" gradientTransform="matrix(-4.375 0 0 -8.85937 30.375 18.89)" gradientUnits="userSpaceOnUse"><stop offset=".329" stop-color="#ffc256" /><stop offset="1" stop-color="#ff8646" /></radialGradient><radialGradient id="f2515idh" cx="0" cy="0" r="1" gradientTransform="matrix(0 4.59375 -1.28023 0 30.063 17.094)" gradientUnits="userSpaceOnUse"><stop stop-color="#ffd661" /><stop offset="1" stop-color="#ffd661" stop-opacity="0" /></radialGradient><radialGradient id="f2515idi" cx="0" cy="0" r="1" gradientTransform="matrix(-5.375 0 0 -5.125 31.188 18.89)" gradientUnits="userSpaceOnUse"><stop offset=".892" stop-color="#f37539" stop-opacity="0" /><stop offset="1" stop-color="#f37539" /></radialGradient><linearGradient id="f2515idj" x1="30.813" x2="20.5" y1="17.375" y2="17.375" gradientUnits="userSpaceOnUse"><stop stop-color="#ffe359" /><stop offset="1" stop-color="#ffbe3e" /></linearGradient><linearGradient id="f2515idk" x1="26" x2="26" y1="30.656" y2="29.438" gradientUnits="userSpaceOnUse"><stop offset=".118" stop-color="#ff835d" /><stop offset="1" stop-color="#ff835d" stop-opacity="0" /></linearGradient><linearGradient id="f2515idl" x1="19.094" x2="19.219" y1="6.313" y2="7.625" gradientUnits="userSpaceOnUse"><stop stop-color="#ffb941" /><stop offset="1" stop-color="#ffb941" stop-opacity="0" /></linearGradient><linearGradient id="f2515idm" x1="18" x2="13.813" y1="17.875" y2="17.875" gradientUnits="userSpaceOnUse"><stop stop-color="#ffd65c" /><stop offset="1" stop-color="#ff8c42" /></linearGradient><linearGradient id="f2515idn" x1="15.752" x2="14.281" y1="19.594" y2="20.625" gradientUnits="userSpaceOnUse"><stop stop-color="#ff8c42" stop-opacity="0" /><stop offset="1" stop-color="#ff8c42" /></linearGradient><linearGradient id="f2515ido" x1="7.324" x2="6.98" y1="15.998" y2="15.779" gradientUnits="userSpaceOnUse"><stop stop-color="#5c5051" stop-opacity="0" /><stop offset="1" stop-color="#5c5051" /></linearGradient><filter id="f2515idp" width="5.995" height="8.777" x="12.364" y="14.392" color-interpolation-filters="sRGB" filterUnits="userSpaceOnUse"><feFlood flood-opacity="0" result="BackgroundImageFix" /><feBlend in="SourceGraphic" in2="BackgroundImageFix" result="shape" /><feGaussianBlur result="effect1_foregroundBlur_28327_5989" stdDeviation=".375" /></filter></defs></g>',
92+
},
93+
},
94+
width: 256,
95+
height: 256,
96+
};
6497
mermaid.registerIconPacks([
6598
{
6699
name: 'fa',
67100
loader: () => staticBellIconPack,
68101
},
102+
{
103+
name: 'fluent-emoji',
104+
loader: () => staticAwsLogoIconPack,
105+
},
69106
]);
70107
await mermaid.run();
71108
}

packages/mermaid/src/rendering-util/rendering-elements/shapes/icon.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export const icon = async (
7777
: -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY
7878
})`
7979
);
80-
iconElem.selectAll('path').attr('fill', stylesMap.get('stroke') || nodeBorder);
80+
iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);
8181
}
8282

8383
label.attr(

packages/mermaid/src/rendering-util/rendering-elements/shapes/iconCircle.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ export const iconCircle = async (
2626

2727
const topLabel = node.pos === 't';
2828

29-
const { nodeBorder, mainBkg } = themeVariables;
29+
const { nodeBorder } = themeVariables;
3030
const { stylesMap } = compileStyles(node);
3131
const rc = rough.svg(shapeSvg);
32-
const options = userNodeOverrides(node, { stroke: stylesMap.get('fill') || mainBkg });
32+
const options = userNodeOverrides(node, { stroke: 'transparent' });
3333

3434
if (node.look !== 'handDrawn') {
3535
options.roughness = 0;
@@ -74,7 +74,7 @@ export const iconCircle = async (
7474
: -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY
7575
})`
7676
);
77-
iconElem.selectAll('path').attr('fill', stylesMap.get('stroke') || nodeBorder);
77+
iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);
7878
label.attr(
7979
'transform',
8080
`translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${

packages/mermaid/src/rendering-util/rendering-elements/shapes/iconRounded.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const iconRounded = async (
3030

3131
const height = iconSize + halfPadding * 2;
3232
const width = iconSize + halfPadding * 2;
33-
const { nodeBorder, mainBkg } = themeVariables;
33+
const { nodeBorder } = themeVariables;
3434
const { stylesMap } = compileStyles(node);
3535

3636
const x = -width / 2;
@@ -39,7 +39,7 @@ export const iconRounded = async (
3939
const labelPadding = node.label ? 8 : 0;
4040

4141
const rc = rough.svg(shapeSvg);
42-
const options = userNodeOverrides(node, { stroke: stylesMap.get('fill') || mainBkg });
42+
const options = userNodeOverrides(node, { stroke: 'transparent' });
4343

4444
if (node.look !== 'handDrawn') {
4545
options.roughness = 0;
@@ -82,7 +82,7 @@ export const iconRounded = async (
8282
: -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY
8383
})`
8484
);
85-
iconElem.selectAll('path').attr('fill', stylesMap.get('stroke') ?? nodeBorder);
85+
iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);
8686
}
8787

8888
label.attr(

packages/mermaid/src/rendering-util/rendering-elements/shapes/iconSquare.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const iconSquare = async (
2929

3030
const height = iconSize + halfPadding * 2;
3131
const width = iconSize + halfPadding * 2;
32-
const { nodeBorder, mainBkg } = themeVariables;
32+
const { nodeBorder } = themeVariables;
3333
const { stylesMap } = compileStyles(node);
3434

3535
const x = -width / 2;
@@ -38,7 +38,7 @@ export const iconSquare = async (
3838
const labelPadding = node.label ? 8 : 0;
3939

4040
const rc = rough.svg(shapeSvg);
41-
const options = userNodeOverrides(node, { stroke: stylesMap.get('fill') || mainBkg });
41+
const options = userNodeOverrides(node, { stroke: 'transparent' });
4242

4343
if (node.look !== 'handDrawn') {
4444
options.roughness = 0;
@@ -81,7 +81,7 @@ export const iconSquare = async (
8181
: -bbox.height / 2 - labelPadding / 2 - iconHeight / 2 - iconY
8282
})`
8383
);
84-
iconElem.selectAll('path').attr('fill', stylesMap.get('stroke') ?? nodeBorder);
84+
iconElem.attr('style', `color: ${stylesMap.get('stroke') ?? nodeBorder};`);
8585
}
8686

8787
label.attr(

0 commit comments

Comments
 (0)