diff --git a/cypress/integration/rendering/block.spec.ts b/cypress/integration/rendering/block.spec.ts index d43c8db10..7856f534d 100644 --- a/cypress/integration/rendering/block.spec.ts +++ b/cypress/integration/rendering/block.spec.ts @@ -301,4 +301,39 @@ describe('Block diagram', () => { {} ); }); + + it('BL22: sizing - it should be possible to make a block wider', () => { + imgSnapshotTest( + `block-beta + A("rounded):2 + B:2 + C + `, + {} + ); + }); + + it('BL23: sizing - it should be possieble to make a composite block wider', () => { + imgSnapshotTest( + `block-beta + block:2 + A + end + B + `, + {} + ); + }); + + it('BL23: sizing - it should be possieble to make a composite block wider', () => { + imgSnapshotTest( + `block-beta + block:2 + A + end + B + `, + {} + ); + }); }); diff --git a/cypress/platform/knsv2.html b/cypress/platform/knsv2.html index d84557ffe..4fed7a962 100644 --- a/cypress/platform/knsv2.html +++ b/cypress/platform/knsv2.html @@ -62,6 +62,52 @@ +
+block-beta
+columns 3
+  space Browser space
+  space:3
+
+    A
+    B
+    C
+
+    space:3
+    space
+    db{{"This is the text in the box"}}
+
+      classDef green fill:#9f6,stroke:#333,stroke-width:2px;
+      style B fill:#f9F,stroke:#333,stroke-width:4px
+      class A green
+
+      Browser --> A
+      Browser --> B
+      Browser --> C
+      A --> db
+      B --> db
+      C--> db
+
+      block
+        D
+        E
+      end
+    
+
+block-beta
+  block
+    D
+    E
+  end
+  db("This is the text in the box")
+    
+
+block-beta
+
+      block
+        D
+      end
+      A["A: I am a wide one"]
+    
 block-beta
     A["square"]
@@ -78,7 +124,7 @@ block-beta
 block-beta
     A(["stadium"])
     
-
+    
 block-beta
     %% A[["subroutine"]]
     %% B[("cylinder")]
diff --git a/packages/mermaid/src/diagrams/block/blockDB.ts b/packages/mermaid/src/diagrams/block/blockDB.ts
index 4ee5343fa..e575f0680 100644
--- a/packages/mermaid/src/diagrams/block/blockDB.ts
+++ b/packages/mermaid/src/diagrams/block/blockDB.ts
@@ -79,7 +79,6 @@ export const addStyle2Node = function (id: string, styles = '') {
  * @param {string} cssClassName CSS class name
  */
 export const setCssClass = function (itemIds: string, cssClassName: string) {
-  console.log('abc88 setCssClass enter', itemIds, cssClassName);
   itemIds.split(',').forEach(function (id: string) {
     let foundBlock = blockDatabase[id];
     if (foundBlock === undefined) {
@@ -91,7 +90,6 @@ export const setCssClass = function (itemIds: string, cssClassName: string) {
       foundBlock.classes = [];
     }
     foundBlock.classes.push(cssClassName);
-    console.log('abc88 setCssClass', foundBlock);
   });
 };
 
@@ -130,21 +128,15 @@ const populateBlockDatabase = (_blockList: Block[], parent: Block): void => {
   const children = [];
   for (const block of blockList) {
     if (block.type === 'classDef') {
-      // console.log('abc88 classDef', block);
       addStyleClass(block.id, block.css);
       continue;
     }
     if (block.type === 'applyClass') {
-      // console.log('abc88 applyClass', block);
-      // addStyleClass(block.id, block.css);
       setCssClass(block.id, block?.styleClass || '');
       continue;
     }
     if (block.type === 'applyStyles') {
-      console.log('abc88 applyStyles', block);
-      addStyle2Node(block.id, block.styles);
-      // addStyleClass(block.id, block.css);
-      // setCssClass(block.id, block.styles);
+      addStyle2Node(block.id, block?.styles);
       continue;
     }
     if (block.type === 'column-setting') {
@@ -361,7 +353,6 @@ type IGetClasses = () => Record;
  * @returns {{} | any | classes}
  */
 export const getClasses = function () {
-  console.log('abc88 block db getClasses', classes);
   return classes;
 };
 export interface BlockDB extends DiagramDB {
diff --git a/packages/mermaid/src/diagrams/block/blockRenderer.ts b/packages/mermaid/src/diagrams/block/blockRenderer.ts
index 69f0eefb0..10d2f2906 100644
--- a/packages/mermaid/src/diagrams/block/blockRenderer.ts
+++ b/packages/mermaid/src/diagrams/block/blockRenderer.ts
@@ -25,7 +25,7 @@ import { configureSvgSize } from '../../setupGraphViewbox.js';
  * @returns {object} ClassDef styles
  */
 export const getClasses = function (text: any, diagObj: any) {
-  log.info('abc88 Extracting classes', diagObj.db.getClasses());
+  log.info('Extracting classes', diagObj.db.getClasses());
   try {
     return diagObj.db.getClasses();
   } catch (e) {
diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts
index f9a6cd3f9..1b110fc64 100644
--- a/packages/mermaid/src/diagrams/block/layout.ts
+++ b/packages/mermaid/src/diagrams/block/layout.ts
@@ -34,28 +34,38 @@ export function calculateBlockPosition(columns: number, position: number): Block
   return { px, py };
 }
 
-function calcBlockSizes(block: Block, db: BlockDB) {
-  log.debug('calculateSize (start)', block.id, block?.size?.x, block?.size?.width);
+const getMaxChildSize = (block: Block) => {
+  let maxWidth = 0;
+  let maxHeight = 0;
+  // find max width of children
+  for (const child of block.children) {
+    const { width, height, x, y } = child.size || { width: 0, height: 0, x: 0, y: 0 };
+    log.debug('abc88', child.id, width, height, x, y);
+    if (width > maxWidth) {
+      maxWidth = width;
+    }
+    if (height > maxHeight) {
+      maxHeight = height;
+    }
+  }
+  return { width: maxWidth, height: maxHeight };
+};
+
+function setBlockSizes(block: Block, db: BlockDB, sieblingWidth: number = 0) {
+  log.debug('calculateSize abc88 (start)', block.id, block?.size?.x, block?.size?.width);
   const totalWidth = 0;
   const totalHeight = 0;
   let maxWidth = 0;
   let maxHeight = 0;
 
-  if (block.children) {
+  if (block.children?.length > 0) {
     for (const child of block.children) {
-      calcBlockSizes(child, db);
+      setBlockSizes(child, db);
     }
     // find max width of children
-    for (const child of block.children) {
-      const { width, height, x, y } = child.size || { width: 0, height: 0, x: 0, y: 0 };
-      // log.debug('APA', child.id, width, height, x, y);
-      if (width > maxWidth) {
-        maxWidth = width;
-      }
-      if (height > maxHeight) {
-        maxHeight = height;
-      }
-    }
+    const childSize = getMaxChildSize(block);
+    maxWidth = childSize.width;
+    maxHeight = childSize.height;
 
     // set width of block to max width of children
     for (const child of block.children) {
@@ -66,22 +76,10 @@ function calcBlockSizes(block: Block, db: BlockDB) {
         child.size.y = 0;
       }
     }
+    for (const child of block.children) {
+      setBlockSizes(child, db, maxWidth);
+    }
 
-    // // Position items relative to self
-    // let x = -padding / 2;
-    // const y = 0;
-
-    // let accumulatedPaddingX = 0;
-    // for (const child of block.children) {
-    //   if (child.size) {
-    //     child.size.x = x;
-    //     child.size.y = y;
-    //     x += maxWidth + padding;
-    //   }
-    //   accumulatedPaddingX += padding;
-    // }
-  }
-  if (block.children?.length > 0) {
     const columns = block.columns || -1;
     const numItems = block.children.length;
 
@@ -92,6 +90,33 @@ function calcBlockSizes(block: Block, db: BlockDB) {
     }
     const ySize = Math.ceil(numItems / xSize);
 
+    let width = xSize * (maxWidth + padding) + padding;
+    // If maxWidth
+    if (width < sieblingWidth) {
+      console.log(
+        'Detected to small siebling: abc88',
+        block.id,
+        'sieblingWidth',
+        sieblingWidth,
+        'width',
+        width
+      );
+      width = sieblingWidth;
+      const childWidth = (sieblingWidth - xSize * padding - padding) / xSize;
+      log.debug('Size indata abc88', block.id, 'childWidth', childWidth, 'maxWidth', maxWidth);
+      log.debug('Size indata abc88 xSize', xSize, 'paddiong', padding);
+
+      // // set width of block to max width of children
+      for (const child of block.children) {
+        if (child.size) {
+          child.size.width = childWidth;
+          child.size.height = maxHeight;
+          child.size.x = 0;
+          child.size.y = 0;
+        }
+      }
+    }
+
     log.debug(
       '(calc)',
       block.id,
@@ -105,13 +130,14 @@ function calcBlockSizes(block: Block, db: BlockDB) {
     );
 
     block.size = {
-      width: xSize * (maxWidth + padding) + padding,
+      width,
       height: ySize * (maxHeight + padding) + padding,
       x: 0,
       y: 0,
     };
   }
-  log.debug('calculateSize APA (done)', block.id, block?.size?.x, block?.size?.width);
+
+  log.debug('calculateSize abc88 (done)', block.id, block?.size?.x, block?.size?.width);
 }
 
 function layoutBlocks(block: Block, db: BlockDB) {
@@ -240,7 +266,8 @@ export function layout(db: BlockDB) {
   if (!root) {
     return;
   }
-  calcBlockSizes(root, db);
+
+  setBlockSizes(root, db, 0);
   layoutBlocks(root, db);
   // Position blocks relative to parents
   // positionBlock(root, root, db);
diff --git a/packages/mermaid/src/diagrams/block/parser/block.jison b/packages/mermaid/src/diagrams/block/parser/block.jison
index be4bed809..3f91a7d96 100644
--- a/packages/mermaid/src/diagrams/block/parser/block.jison
+++ b/packages/mermaid/src/diagrams/block/parser/block.jison
@@ -225,7 +225,7 @@ statement
 
 nodeStatement
   : nodeStatement link node {
-    yy.getLogger().info('Rule: (nodeStatement link node) ', $1, $2, $3, 'abc88 typestr: ',$2.edgeTypeStr);
+    yy.getLogger().info('Rule: (nodeStatement link node) ', $1, $2, $3, ' typestr: ',$2.edgeTypeStr);
     const edgeData = yy.edgeStrToEdgeData($2.edgeTypeStr)
     $$ = [
       {id: $1.id, label: $1.label, type:$1.type, directions: $1.directions},
@@ -286,7 +286,6 @@ cssClassStatement
 
 styleStatement
     : style STYLE_ENTITY_IDS STYLE_DEFINITION_DATA {
-        console.log('abc88 apply class: id(s): ',$2, '  style class: ', $3);
         $$={ type: 'applyStyles', id: $2.trim(), styles: $3.trim() };
         }
     ;
diff --git a/packages/mermaid/src/diagrams/block/renderHelpers.ts b/packages/mermaid/src/diagrams/block/renderHelpers.ts
index 117959796..757bbadb9 100644
--- a/packages/mermaid/src/diagrams/block/renderHelpers.ts
+++ b/packages/mermaid/src/diagrams/block/renderHelpers.ts
@@ -18,7 +18,6 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) {
   if ((vertex?.classes?.length || 0) > 0) {
     classStr = (vertex?.classes || []).join(' ');
   }
-  console.log('abc88 vertex.classes styles', block.id, vertex?.styles);
   classStr = classStr + ' flowchart-label';
 
   // We create a SVG label, either by delegating to addHtmlLabel or manually
@@ -135,7 +134,6 @@ function getNodeFromBlock(block: Block, db: BlockDB, positioned = false) {
     // props: vertex.props,
     padding: padding ?? (getConfig()?.flowchart?.padding || 0),
   };
-  console.log('abc88 return node', vertex.id, node);
   return node;
 }
 type IOperation = (elem: any, block: any, db: any) => Promise;
@@ -210,7 +208,6 @@ export async function insertEdges(
 
   for (const block of blocks) {
     if (block.size) {
-      console.log('abc88 block', block, block.id);
       g.setNode(block.id, {
         width: block.size.width,
         height: block.size.height,
@@ -219,7 +216,6 @@ export async function insertEdges(
     }
   }
 
-  console.log('abc88 edges', edges);
   for (const edge of edges) {
     // elem, e, edge, clusterDb, diagramType, graph;
     if (edge.start && edge.end) {
@@ -227,8 +223,6 @@ export async function insertEdges(
       const startBlock2 = g.node(edge.start);
       const endBlock = db.getBlock(edge.end);
       const endBlock2 = g.node(edge.end);
-      console.log('abc88 startBlock', startBlock2);
-      console.log('abc88 endBlock', endBlock2);
 
       if (startBlock?.size && endBlock?.size) {
         const start = startBlock.size;
diff --git a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
index 5ed06723e..4d26f0afa 100644
--- a/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
+++ b/packages/mermaid/src/diagrams/flowchart/elk/flowRenderer-elk.js
@@ -307,13 +307,12 @@ const getNextPosition = (position, edgeDirection, graphDirection) => {
     },
   };
   portPos.TD = portPos.TB;
-  log.info('abc88', graphDirection, edgeDirection, position);
   return portPos[graphDirection][edgeDirection][position];
   // return 'south';
 };
 
 const getNextPort = (node, edgeDirection, graphDirection) => {
-  log.info('getNextPort abc88', { node, edgeDirection, graphDirection });
+  log.info('getNextPort', { node, edgeDirection, graphDirection });
   if (!portPos[node]) {
     switch (graphDirection) {
       case 'TB':
diff --git a/packages/mermaid/src/diagrams/flowchart/flowRenderer-v2.js b/packages/mermaid/src/diagrams/flowchart/flowRenderer-v2.js
index 6f219f166..7c964b4e7 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowRenderer-v2.js
+++ b/packages/mermaid/src/diagrams/flowchart/flowRenderer-v2.js
@@ -169,7 +169,7 @@ export const addVertices = function (vert, g, svgId, root, doc, diagObj) {
       padding: getConfig().flowchart.padding,
     });
 
-    log.info('abc88 setNode', {
+    log.info('setNode', {
       labelStyle: styles.labelStyle,
       labelType: vertex.labelType,
       shape: _shape,
diff --git a/packages/mermaid/src/mermaidAPI.ts b/packages/mermaid/src/mermaidAPI.ts
index 80837fd34..aa5c1edeb 100644
--- a/packages/mermaid/src/mermaidAPI.ts
+++ b/packages/mermaid/src/mermaidAPI.ts
@@ -204,7 +204,7 @@ export const createCssStyles = (
     cssStyles += `\n:root { --mermaid-alt-font-family: ${config.altFontFamily}}`;
   }
 
-  console.log('abc88 expr check', !isEmpty(classDefs), classDefs);
+  console.log('expr check', !isEmpty(classDefs), classDefs);
 
   // classDefs defined in the diagram text
   if (!isEmpty(classDefs) && CLASSDEF_DIAGRAMS.includes(graphType)) {