From 4f9875fd4eae900a54c02f61c42b0fd263fc762f Mon Sep 17 00:00:00 2001 From: darshanr0107 Date: Fri, 29 Aug 2025 12:52:01 +0530 Subject: [PATCH] fix: adjust mindmap circle padding to ensure argos donot break on-behalf-of: @Mermaid-Chart --- packages/mermaid/src/diagrams/mindmap/mindmapDb.ts | 2 +- .../src/rendering-util/rendering-elements/shapes.ts | 9 +++++++++ .../rendering-elements/shapes/circle.ts | 10 +++++++--- .../rendering-elements/shapes/mindmapCircle.ts | 13 +++++++++++++ packages/mermaid/src/rendering-util/types.ts | 5 +++++ 5 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 packages/mermaid/src/rendering-util/rendering-elements/shapes/mindmapCircle.ts diff --git a/packages/mermaid/src/diagrams/mindmap/mindmapDb.ts b/packages/mermaid/src/diagrams/mindmap/mindmapDb.ts index a02f0be83..e2348bf5a 100644 --- a/packages/mermaid/src/diagrams/mindmap/mindmapDb.ts +++ b/packages/mermaid/src/diagrams/mindmap/mindmapDb.ts @@ -223,7 +223,7 @@ export class MindmapDB { const getShapeFromType = (type: number) => { switch (type) { case nodeType.CIRCLE: - return 'circle'; + return 'mindmap-circle'; case nodeType.RECT: return 'rect'; case nodeType.ROUNDED_RECT: diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes.ts index c4d5f04a6..518d932ed 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes.ts @@ -64,6 +64,7 @@ import { kanbanItem } from './shapes/kanbanItem.js'; import { bang } from './shapes/bang.js'; import { cloud } from './shapes/cloud.js'; import { defaultMindmapNode } from './shapes/defaultMindmapNode.js'; +import { mindmapCircle } from './shapes/mindmapCircle.js'; type ShapeHandler = ( parent: D3Selection, @@ -154,6 +155,14 @@ export const shapesDefs = [ aliases: ['default-mindmap', 'defaultMindmapNode'], handler: defaultMindmapNode, }, + { + semanticName: 'Mindmap Circle', + name: 'mindmapCircle', + shortName: 'mindmap-circle', + description: 'mindmapCircle', + aliases: ['mindmap-circle'], + handler: mindmapCircle, + }, { semanticName: 'Cloud', name: 'Cloud', diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/circle.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/circle.ts index 1dab28d60..57f72fd2d 100644 --- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/circle.ts +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/circle.ts @@ -2,16 +2,20 @@ import rough from 'roughjs'; import { log } from '../../../logger.js'; import type { Bounds, D3Selection, Point } from '../../../types.js'; import { handleUndefinedAttr } from '../../../utils.js'; -import type { Node } from '../../types.js'; +import type { MindmapOptions, Node, ShapeRenderOptions } from '../../types.js'; import intersect from '../intersect/index.js'; import { styles2String, userNodeOverrides } from './handDrawnShapeStyles.js'; import { getNodeClasses, labelHelper, updateNodeBounds } from './util.js'; -export async function circle(parent: D3Selection, node: Node) { +export async function circle( + parent: D3Selection, + node: Node, + options?: MindmapOptions | ShapeRenderOptions +) { const { labelStyles, nodeStyles } = styles2String(node); node.labelStyle = labelStyles; const { shapeSvg, bbox, halfPadding } = await labelHelper(parent, node, getNodeClasses(node)); - const padding = node.padding ?? halfPadding; + const padding = options?.padding ?? halfPadding; const radius = bbox.width / 2 + padding; let circleElem; const { cssStyles } = node; diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/mindmapCircle.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/mindmapCircle.ts new file mode 100644 index 000000000..5b9dab3fd --- /dev/null +++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/mindmapCircle.ts @@ -0,0 +1,13 @@ +import { circle } from './circle.js'; +import type { Node, MindmapOptions } from '../../types.js'; +import type { D3Selection } from '../../../types.js'; + +export async function mindmapCircle( + parent: D3Selection, + node: Node +) { + const options = { + padding: node.padding ?? 0, + } as MindmapOptions; + return circle(parent, node, options); +} diff --git a/packages/mermaid/src/rendering-util/types.ts b/packages/mermaid/src/rendering-util/types.ts index 45beb59d2..21a63b33b 100644 --- a/packages/mermaid/src/rendering-util/types.ts +++ b/packages/mermaid/src/rendering-util/types.ts @@ -171,6 +171,10 @@ export interface RectOptions { classes: string; } +export interface MindmapOptions { + padding: number; +} + // Extending the Node interface for specific types if needed export type ClassDiagramNode = Node & { memberData: any; // Specific property for class diagram nodes @@ -206,6 +210,7 @@ export interface ShapeRenderOptions { config: MermaidConfig; /** Some shapes render differently if a diagram has a direction `LR` */ dir?: Node['dir']; + padding?: number; } export type KanbanNode = Node & {