diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconRounded.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconRounded.ts
index 84cd29292..75849f8f4 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconRounded.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconRounded.ts
@@ -15,31 +15,42 @@ export const iconRounded = async (
) => {
const { labelStyles } = styles2String(node);
node.labelStyle = labelStyles;
+ const defaultWidth = flowchart?.wrappingWidth;
+ const labelPadding = node.label ? 8 : 0;
+ const padding = node.height ? node.height * 0.05 : 15;
const assetHeight = node.assetHeight ?? 48;
const assetWidth = node.assetWidth ?? 48;
- const iconSize = Math.max(assetHeight, assetWidth);
- const defaultWidth = flowchart?.wrappingWidth;
- node.width = Math.max(iconSize, defaultWidth ?? 0);
- const { shapeSvg, bbox, halfPadding, label } = await labelHelper(
- parent,
- node,
- 'icon-shape default'
- );
+ let iconSize = Math.max(assetHeight, assetWidth);
+ let height = iconSize + padding * 2;
+ let width = iconSize + padding * 2;
+ let adjustDimensions = false;
+ if (node.width || node.height) {
+ adjustDimensions = true;
+ node.width = (node?.width ?? 10) - labelPadding * 2;
+ node.height = (node?.height ?? 10) - labelPadding * 2;
+ width = node.width;
+ height = node.height;
+ } else {
+ node.width = Math.max(width, defaultWidth ?? 0);
+ }
+ const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'icon-shape default');
const topLabel = node.pos === 't';
- const padding = node.look === 'neo' ? halfPadding * 2 : halfPadding;
+ if (adjustDimensions) {
+ node.width = node.width + labelPadding * 2;
+ node.height = (node.height ?? 10) + labelPadding * 2;
+ width = node.width;
+ height = node.height;
+ iconSize = Math.max(node.width - padding * 2, node.height - padding * 2);
+ }
- const height = iconSize + padding * 2;
- const width = iconSize + padding * 2;
const { nodeBorder, mainBkg } = themeVariables;
const { stylesMap } = compileStyles(node);
const x = -width / 2;
const y = -height / 2;
- const labelPadding = node.label ? 8 : 0;
-
// @ts-ignore - rough is not typed
const rc = rough.svg(shapeSvg);
const options = userNodeOverrides(node, { stroke: stylesMap.get('fill') ?? mainBkg });
@@ -66,18 +77,13 @@ export const iconRounded = async (
if (node.icon) {
iconElem.html(
- `${await getIconSVG(node.icon, { height: iconSize, width: iconSize, fallbackPrefix: '' })}`
+ `${await getIconSVG(node.icon, { height: iconSize, fallbackPrefix: '' })}`
);
const iconBBox = iconElem.node().getBBox();
const iconWidth = iconBBox.width;
// const iconHeight = iconBBox.height;
const iconX = iconBBox.x;
// const iconY = iconBBox.y;
-
- // iconElem.attr(
- // 'transform',
- // `translate(${-iconWidth / 2 - iconX},${topLabel ? outerHeight / 2 - iconHeight - iconY - padding : outerHeight / 2 - iconHeight - iconY - padding - bbox.height - labelPadding})`
- // );
iconElem.attr(
'transform',
`translate(${-iconWidth / 2 - iconX},${topLabel ? -iconSize / 2 : -iconSize / 2})`
diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconSquare.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconSquare.ts
index 6b1141967..76d502766 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconSquare.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/iconSquare.ts
@@ -14,31 +14,46 @@ export const iconSquare = async (
) => {
const { labelStyles } = styles2String(node);
node.labelStyle = labelStyles;
+ const defaultWidth = flowchart?.wrappingWidth;
+ const labelPadding = node.label ? 8 : 0;
+ const padding = node.height ? node.height * 0.05 : 15;
const assetHeight = node.assetHeight ?? 48;
const assetWidth = node.assetWidth ?? 48;
- const iconSize = Math.max(assetHeight, assetWidth);
- const defaultWidth = flowchart?.wrappingWidth;
- node.width = Math.max(iconSize, defaultWidth ?? 0);
- const { shapeSvg, bbox, halfPadding, label } = await labelHelper(
- parent,
- node,
- 'icon-shape default'
- );
+ let iconSize = Math.max(assetHeight, assetWidth);
+ let height = iconSize + padding * 2;
+ let width = iconSize + padding * 2;
+ let adjustDimensions = false;
+ if (node.width || node.height) {
+ adjustDimensions = true;
+ node.width = (node?.width ?? 10) - labelPadding * 2;
+ node.height = (node?.height ?? 10) - labelPadding * 2;
+ width = node.width;
+ height = node.height;
+ } else {
+ node.width = Math.max(width, defaultWidth ?? 0);
+ }
+ const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'icon-shape default');
const topLabel = node.pos === 't';
- const padding = node.look === 'neo' ? halfPadding * 2 : halfPadding;
+ // node.width = Math.max(iconSize, defaultWidth ?? 0);
- const height = iconSize + padding * 2;
- const width = iconSize + padding * 2;
+ if (adjustDimensions) {
+ node.width = node.width + labelPadding * 2;
+ node.height = (node.height ?? 10) + labelPadding * 2;
+ width = node.width;
+ height = node.height;
+ iconSize = Math.max(node.width - padding * 2, node.height - padding * 2);
+ }
+
+ //const height = iconSize + padding * 2;
+ //const width = iconSize + padding * 2;
const { nodeBorder, mainBkg } = themeVariables;
const { stylesMap } = compileStyles(node);
const x = -width / 2;
const y = -height / 2;
- const labelPadding = node.label ? 8 : 0;
-
// @ts-ignore - rough is not typed
const rc = rough.svg(shapeSvg);
const options = userNodeOverrides(node, { stroke: stylesMap.get('fill') ?? mainBkg });
@@ -50,31 +65,30 @@ export const iconSquare = async (
const iconNode = rc.rectangle(x, y, width, height, options);
- const outerWidth = Math.max(width, bbox.width);
- const outerHeight = height + bbox.height + labelPadding;
+ // const outerWidth = Math.max(width, bbox.width);
+ // const outerHeight = height + bbox.height + labelPadding;
- const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {
- ...options,
- fill: 'transparent',
- stroke: 'none',
- });
+ // const outerNode = rc.rectangle(-outerWidth / 2, -outerHeight / 2, outerWidth, outerHeight, {
+ // ...options,
+ // fill: 'transparent',
+ // stroke: 'none',
+ // });
- const iconShape = shapeSvg.insert(() => iconNode, ':first-child');
- const outerShape = shapeSvg.insert(() => outerNode);
+ // const outerShape = shapeSvg.insert(() => outerNode);
const iconElem = shapeSvg.append('g');
if (node.icon) {
iconElem.html(
- `${await getIconSVG(node.icon, { height: iconSize, width: iconSize, fallbackPrefix: '' })}`
+ `${await getIconSVG(node.icon, { height: iconSize, fallbackPrefix: '' })}`
);
const iconBBox = iconElem.node().getBBox();
const iconWidth = iconBBox.width;
- const iconHeight = iconBBox.height;
+ // const iconHeight = iconBBox.height;
const iconX = iconBBox.x;
- const iconY = iconBBox.y;
+ // const iconY = iconBBox.y;
iconElem.attr(
'transform',
- `translate(${-iconWidth / 2 - iconX},${topLabel ? outerHeight / 2 - iconHeight - iconY - padding : outerHeight / 2 - iconHeight - iconY - padding - bbox.height - labelPadding})`
+ `translate(${-iconWidth / 2 - iconX},${topLabel ? -iconSize / 2 : -iconSize / 2})`
);
iconElem.selectAll('path').attr('fill', stylesMap.get('stroke') ?? nodeBorder);
iconElem.attr('class', 'icon');
@@ -82,14 +96,23 @@ export const iconSquare = async (
label.attr(
'transform',
- `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -outerHeight / 2 : outerHeight / 2 - bbox.height})`
+ `translate(${-bbox.width / 2 - (bbox.x - (bbox.left ?? 0))},${topLabel ? -height / 2 - bbox.height - labelPadding : height / 2 + labelPadding})`
);
- iconShape.attr(
- 'transform',
- `translate(${0},${topLabel ? bbox.height / 2 + labelPadding / 2 : -bbox.height / 2 - labelPadding / 2})`
- );
+ const iconShape = shapeSvg.insert(() => iconNode, ':first-child');
+ // iconShape.attr(
+ // 'transform',
+ // `translate(${0},${topLabel ? bbox.height / 2 - labelPadding : -bbox.height / 2 + labelPadding })`
+ // );
+ // iconShape.attr(
+ // 'transform',
+ // `translate(${-width/2},${topLabel ? -width / 2 : -width / 2 })`
+ // );
+ // rect.attr(
+ // 'transform',
+ // `translate(${-width/2},${topLabel ? -width / 2 + labelPadding/2 : -width / 2 + labelPadding/2})`
+ // );
if (stylesMap.get('stroke')) {
iconElem.selectAll('path').attr('style', `fill: ${stylesMap.get('stroke')}`);
}
@@ -98,43 +121,43 @@ export const iconSquare = async (
iconShape.selectAll('path').attr('style', `stroke: ${stylesMap.get('fill')}`);
}
- updateNodeBounds(node, outerShape);
+ updateNodeBounds(node, iconShape);
node.intersect = function (point) {
log.info('iconSquare intersect', node, point);
- if (!node.label) {
- return intersect.rect(node, point);
- }
- const dx = node.x ?? 0;
- const dy = node.y ?? 0;
- const nodeHeight = node.height ?? 0;
- let points = [];
- if (topLabel) {
- points = [
- { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },
- { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },
- { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
- { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
- { x: dx + width / 2, y: dy + nodeHeight / 2 },
- { x: dx - width / 2, y: dy + nodeHeight / 2 },
- { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
- { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
- ];
- } else {
- points = [
- { x: dx - width / 2, y: dy - nodeHeight / 2 },
- { x: dx + width / 2, y: dy - nodeHeight / 2 },
- { x: dx + width / 2, y: dy - nodeHeight / 2 + height },
- { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height },
- { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },
- { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },
- { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height },
- { x: dx - width / 2, y: dy - nodeHeight / 2 + height },
- ];
- }
+ // if (!node.label) {
+ return intersect.rect(node, point);
+ // }
+ // const dx = node.x ?? 0;
+ // const dy = node.y ?? 0;
+ // const nodeHeight = node.height ?? 0;
+ // let points = [];
+ // if (topLabel) {
+ // points = [
+ // { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 },
+ // { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 },
+ // { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
+ // { x: dx + width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
+ // { x: dx + width / 2, y: dy + nodeHeight / 2 },
+ // { x: dx - width / 2, y: dy + nodeHeight / 2 },
+ // { x: dx - width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
+ // { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + bbox.height + labelPadding },
+ // ];
+ // } else {
+ // points = [
+ // { x: dx - width / 2, y: dy - nodeHeight / 2 },
+ // { x: dx + width / 2, y: dy - nodeHeight / 2 },
+ // { x: dx + width / 2, y: dy - nodeHeight / 2 + height },
+ // { x: dx + bbox.width / 2, y: dy - nodeHeight / 2 + height },
+ // { x: dx + bbox.width / 2 / 2, y: dy + nodeHeight / 2 },
+ // { x: dx - bbox.width / 2, y: dy + nodeHeight / 2 },
+ // { x: dx - bbox.width / 2, y: dy - nodeHeight / 2 + height },
+ // { x: dx - width / 2, y: dy - nodeHeight / 2 + height },
+ // ];
+ // }
- const pos = intersect.polygon(node, points, point);
- return pos;
+ // const pos = intersect.polygon(node, points, point);
+ // return pos;
};
return shapeSvg;