diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts index 149dec92c..4785b2779 100644 --- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts +++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts @@ -161,6 +161,7 @@ export const addVertex = function ( if (!doc.label?.trim() && vertex.text === id) { vertex.text = ''; } + vertex.constrainedImage = !!doc.constrainedImage; } if (doc.w) { vertex.assetWidth = Number(doc.w); @@ -899,6 +900,9 @@ const addNodeFromVertex = ( img: vertex.img, assetWidth: vertex.assetWidth, assetHeight: vertex.assetHeight, + imageAspectRatio: vertex.imageAspectRatio, + defaultWidth: vertex.defaultWidth, + constrainedImage: vertex.constrainedImage, }); } }; diff --git a/packages/mermaid/src/diagrams/flowchart/types.ts b/packages/mermaid/src/diagrams/flowchart/types.ts index 97dc54fa7..c60b1e8c1 100644 --- a/packages/mermaid/src/diagrams/flowchart/types.ts +++ b/packages/mermaid/src/diagrams/flowchart/types.ts @@ -17,6 +17,9 @@ export interface FlowVertex { img?: string; assetWidth?: number; assetHeight?: number; + defaultWidth?: number; + imageAspectRatio?: number; + constrainedImage?: boolean; } export interface FlowText { diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/imageSquare.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/imageSquare.ts index 551223ef4..0a9932f06 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/imageSquare.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/imageSquare.ts @@ -17,18 +17,22 @@ export const imageSquare = async ( const imageNaturalWidth = Number(img.naturalWidth.toString().replace('px', '')); const imageNaturalHeight = Number(img.naturalHeight.toString().replace('px', '')); + node.imageAspectRatio = imageNaturalWidth / imageNaturalHeight; const { labelStyles } = styles2String(node); node.labelStyle = labelStyles; const defaultWidth = flowchart?.wrappingWidth; + node.defaultWidth = flowchart?.wrappingWidth; const imageWidth = Math.max( node.label ? (defaultWidth ?? 0) : 0, node?.assetWidth ?? imageNaturalWidth ); - const imageHeight = node?.assetHeight ?? imageNaturalHeight; + const imageHeight = node.constrainedImage + ? imageWidth / node.imageAspectRatio + : (node?.assetHeight ?? imageNaturalHeight); node.width = Math.max(imageWidth, defaultWidth ?? 0); const { shapeSvg, bbox, label } = await labelHelper(parent, node, 'image-shape default'); diff --git a/packages/mermaid/src/rendering-util/types.ts b/packages/mermaid/src/rendering-util/types.ts index 510e94b94..25a616fb7 100644 --- a/packages/mermaid/src/rendering-util/types.ts +++ b/packages/mermaid/src/rendering-util/types.ts @@ -69,6 +69,9 @@ export interface Node { img?: string; assetWidth?: number; assetHeight?: number; + defaultWidth?: number; + imageAspectRatio?: number; + constrainedImage?: boolean; } // Common properties for any edge in the system diff --git a/packages/mermaid/src/types.ts b/packages/mermaid/src/types.ts index 7aa085047..37590fa2b 100644 --- a/packages/mermaid/src/types.ts +++ b/packages/mermaid/src/types.ts @@ -7,6 +7,7 @@ export interface NodeMetaData { img?: string; w?: string; h?: string; + constrainedImage?: boolean; } import type { MermaidConfig } from './config.type.js';