diff --git a/.changeset/beige-peas-shave.md b/.changeset/beige-peas-shave.md
new file mode 100644
index 000000000..c405f3dcc
--- /dev/null
+++ b/.changeset/beige-peas-shave.md
@@ -0,0 +1,5 @@
+---
+'@mermaid-js/mermaid-zenuml': patch
+---
+
+Fixed a critical bug that the ZenUML diagram is not rendered.
diff --git a/.changeset/large-mirrors-cheer.md b/.changeset/large-mirrors-cheer.md
new file mode 100644
index 000000000..4e3903039
--- /dev/null
+++ b/.changeset/large-mirrors-cheer.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+fix: Update casing of ID in requirement diagram
diff --git a/.changeset/lovely-queens-own.md b/.changeset/lovely-queens-own.md
new file mode 100644
index 000000000..edc8dda2d
--- /dev/null
+++ b/.changeset/lovely-queens-own.md
@@ -0,0 +1,8 @@
+---
+'mermaid': patch
+---
+
+fix(block): overflowing blocks no longer affect later lines
+
+This may change the layout of block diagrams that have overflowing lines
+(i.e. block diagrams that use up more columns that the `columns` specifier).
diff --git a/.changeset/smart-humans-cover.md b/.changeset/smart-humans-cover.md
new file mode 100644
index 000000000..4408e0a9c
--- /dev/null
+++ b/.changeset/smart-humans-cover.md
@@ -0,0 +1,5 @@
+---
+'mermaid': patch
+---
+
+fix: Update flowchart direction TD's behavior to be the same as TB
diff --git a/cypress/integration/rendering/block.spec.js b/cypress/integration/rendering/block.spec.js
index 589a30fde..f01d59375 100644
--- a/cypress/integration/rendering/block.spec.js
+++ b/cypress/integration/rendering/block.spec.js
@@ -384,4 +384,17 @@ describe('Block diagram', () => {
{}
);
});
+
+ it('BL30: block should overflow if too wide for columns', () => {
+ imgSnapshotTest(
+ `block-beta
+ columns 2
+ fit:2
+ overflow:3
+ short:1
+ also_overflow:2
+`,
+ {}
+ );
+ });
});
diff --git a/docs/diagrams/flowchart-code-flow.mmd b/docs/diagrams/flowchart-code-flow.mmd
new file mode 100644
index 000000000..d306dac7b
--- /dev/null
+++ b/docs/diagrams/flowchart-code-flow.mmd
@@ -0,0 +1,189 @@
+---
+references:
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowDiagram.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowDb.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowDetector.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowDetector-v2.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowRenderer-v3-unified.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/styles.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/types.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/flowChartShapes.js"
+ - "File: /packages/mermaid/src/diagrams/flowchart/parser/flowParser.ts"
+ - "File: /packages/mermaid/src/diagrams/flowchart/elk/detector.ts"
+generationTime: 2025-07-23T10:31:53.266Z
+---
+flowchart TD
+ %% Entry Points and Detection
+ Input["User Input Text"] --> Detection{Detection Phase}
+
+ Detection --> flowDetector["flowDetector.ts
detector(txt, config)"]
+ Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"]
+ Detection --> elkDetector["elk/detector.ts
detector(txt, config)"]
+
+ flowDetector --> |"Checks /^\s*graph/"| DetectLegacy{Legacy Flowchart?}
+ flowDetectorV2 --> |"Checks /^\s*flowchart/"| DetectNew{New Flowchart?}
+ elkDetector --> |"Checks /^\s*flowchart-elk/"| DetectElk{ELK Layout?}
+
+ DetectLegacy --> |Yes| LoadDiagram
+ DetectNew --> |Yes| LoadDiagram
+ DetectElk --> |Yes| LoadDiagram
+
+ %% Loading Phase
+ LoadDiagram["loader() function"] --> flowDiagram["flowDiagram.ts
diagram object"]
+
+ flowDiagram --> DiagramStructure{Diagram Components}
+ DiagramStructure --> Parser["parser: flowParser"]
+ DiagramStructure --> Database["db: new FlowDB()"]
+ DiagramStructure --> Renderer["renderer: flowRenderer-v3-unified"]
+ DiagramStructure --> Styles["styles: flowStyles"]
+ DiagramStructure --> Init["init: (cnf: MermaidConfig)"]
+
+ %% Parser Phase
+ Parser --> flowParser["parser/flowParser.ts
newParser.parse(src)"]
+ flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"]
+ RemoveWhitespace --> flowJison["parser/flow.jison
flowJisonParser.parse(newSrc)"]
+
+ flowJison --> ParseGraph["Parse Graph Structure"]
+ ParseGraph --> ParseVertices["Parse Vertices"]
+ ParseGraph --> ParseEdges["Parse Edges"]
+ ParseGraph --> ParseSubgraphs["Parse Subgraphs"]
+ ParseGraph --> ParseClasses["Parse Classes"]
+ ParseGraph --> ParseStyles["Parse Styles"]
+
+ %% Database Phase - FlowDB Class
+ Database --> FlowDBClass["flowDb.ts
FlowDB class"]
+
+ FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"]
+
+ DBInit --> DBMethods{FlowDB Methods}
+
+ DBMethods --> addVertex["addVertex(id, textObj, type, style,
classes, dir, props, metadata)"]
+ DBMethods --> addLink["addLink(_start[], _end[], linkData)"]
+ DBMethods --> addSingleLink["addSingleLink(_start, _end, type, id)"]
+ DBMethods --> setDirection["setDirection(dir)"]
+ DBMethods --> addSubGraph["addSubGraph(nodes[], id, title)"]
+ DBMethods --> addClass["addClass(id, style)"]
+ DBMethods --> setClass["setClass(ids, className)"]
+ DBMethods --> setTooltip["setTooltip(ids, tooltip)"]
+ DBMethods --> setClickEvent["setClickEvent(id, functionName, args)"]
+ DBMethods --> setClickFun["setClickFun(id, functionName, args)"]
+
+ %% Vertex Processing
+ addVertex --> VertexProcess{Vertex Processing}
+ VertexProcess --> CreateVertex["Create FlowVertex object
- id, labelType, domId
- styles[], classes[]"]
+ VertexProcess --> SanitizeText["sanitizeText(textObj.text)"]
+ VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"]
+ VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"]
+
+ %% Edge Processing
+ addSingleLink --> EdgeProcess{Edge Processing}
+ EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"]
+ EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"]
+ EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"]
+ EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"]
+ EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"]
+
+ %% Data Collection
+ DBMethods --> GetData["getData()"]
+ GetData --> CollectNodes["Collect nodes[] from vertices"]
+ GetData --> CollectEdges["Collect edges[] from edges"]
+ GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"]
+ GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"]
+ GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"]
+
+ %% Node Creation
+ AddNodeFromVertex --> NodeCreation{Node Creation}
+ NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"]
+ NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"]
+ NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"]
+ NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"]
+
+ %% Rendering Phase
+ Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"]
+
+ flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"]
+
+ RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"]
+ GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"]
+
+ SetupLayoutData --> CallRender["render(data4Layout, svg)"]
+ CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"]
+ SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"]
+
+ %% Shape Rendering
+ CallRender --> ShapeSystem["flowChartShapes.js
Shape Functions"]
+
+ ShapeSystem --> ShapeFunctions{Shape Functions}
+ ShapeFunctions --> question["question(parent, bbox, node)"]
+ ShapeFunctions --> hexagon["hexagon(parent, bbox, node)"]
+ ShapeFunctions --> rect_left_inv_arrow["rect_left_inv_arrow(parent, bbox, node)"]
+ ShapeFunctions --> lean_right["lean_right(parent, bbox, node)"]
+ ShapeFunctions --> lean_left["lean_left(parent, bbox, node)"]
+
+ ShapeFunctions --> insertPolygonShape["insertPolygonShape(parent, w, h, points)"]
+ ShapeFunctions --> intersectPolygon["intersectPolygon(node, points, point)"]
+ ShapeFunctions --> intersectRect["intersectRect(node, point)"]
+
+ %% Styling System
+ Styles --> stylesTS["styles.ts
getStyles(options)"]
+ stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"]
+
+ StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"]
+ GenerateCSS --> GetIconStyles["getIconStyles()"]
+
+ %% Type System
+ Parser --> TypeSystem["types.ts
Type Definitions"]
+ TypeSystem --> FlowVertex["FlowVertex interface"]
+ TypeSystem --> FlowEdge["FlowEdge interface"]
+ TypeSystem --> FlowClass["FlowClass interface"]
+ TypeSystem --> FlowSubGraph["FlowSubGraph interface"]
+ TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
Shape types"]
+
+ %% Utility Functions
+ DBMethods --> UtilityFunctions{Utility Functions}
+ UtilityFunctions --> lookUpDomId["lookUpDomId(id)"]
+ UtilityFunctions --> getClasses["getClasses()"]
+ UtilityFunctions --> getDirection["getDirection()"]
+ UtilityFunctions --> getVertices["getVertices()"]
+ UtilityFunctions --> getEdges["getEdges()"]
+ UtilityFunctions --> getSubGraphs["getSubGraphs()"]
+ UtilityFunctions --> clear["clear()"]
+ UtilityFunctions --> defaultConfig["defaultConfig()"]
+
+ %% Event Handling
+ ProcessLinks --> EventHandling{Event Handling}
+ EventHandling --> setupToolTips["setupToolTips(element)"]
+ EventHandling --> bindFunctions["bindFunctions(element)"]
+ EventHandling --> runFunc["utils.runFunc(functionName, args)"]
+
+ %% Common Database Functions
+ DBMethods --> CommonDB["commonDb.js functions"]
+ CommonDB --> setAccTitle["setAccTitle()"]
+ CommonDB --> getAccTitle["getAccTitle()"]
+ CommonDB --> setAccDescription["setAccDescription()"]
+ CommonDB --> getAccDescription["getAccDescription()"]
+ CommonDB --> setDiagramTitle["setDiagramTitle()"]
+ CommonDB --> getDiagramTitle["getDiagramTitle()"]
+ CommonDB --> commonClear["clear()"]
+
+ %% Final Output
+ ProcessLinks --> FinalSVG["Final SVG Output"]
+
+ %% Layout Algorithm Selection
+ SetupLayoutData --> LayoutAlgorithm{Layout Algorithm}
+ LayoutAlgorithm --> Dagre["dagre
(default)"]
+ LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"]
+ LayoutAlgorithm --> ELK["elk
(external package)"]
+
+ %% Testing Components
+ FlowDBClass --> TestFiles["Test Files"]
+ TestFiles --> flowDbSpec["flowDb.spec.ts"]
+ TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"]
+ TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"]
+
+ %% Configuration
+ Init --> ConfigSetup["Configuration Setup"]
+ ConfigSetup --> FlowchartConfig["cnf.flowchart config"]
+ ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"]
+ ConfigSetup --> LayoutConfig["layout config"]
+ ConfigSetup --> SetConfig["setConfig() calls"]
\ No newline at end of file
diff --git a/docs/diagrams/mermaid-api-sequence.mmd b/docs/diagrams/mermaid-api-sequence.mmd
new file mode 100644
index 000000000..ce7597525
--- /dev/null
+++ b/docs/diagrams/mermaid-api-sequence.mmd
@@ -0,0 +1,307 @@
+---
+references:
+ - "File: /packages/mermaid/src/mermaidAPI.ts"
+ - "File: /packages/mermaid/src/mermaid.ts"
+generationTime: 2025-01-28T16:30:00.000Z
+---
+sequenceDiagram
+ participant User as User/Browser
+ participant Mermaid as mermaid.ts
+ participant Queue as executionQueue
+ participant API as mermaidAPI.ts
+ participant Config as configApi
+ participant Preprocessor as preprocessDiagram
+ participant DiagramAPI as diagram-api
+ participant Diagram as Diagram.fromText
+ participant Renderer as diagram.renderer
+ participant Styles as Styling System
+ participant DOM as DOM/SVG
+
+ Note over User, DOM: Mermaid Complete API Flow
+
+ %% Initialization Phase
+ User->>+Mermaid: mermaid.initialize(config)
+ Mermaid->>+API: mermaidAPI.initialize(config)
+
+ API->>API: assignWithDepth({}, userOptions)
+ API->>API: handle legacy fontFamily config
+ API->>Config: saveConfigFromInitialize(options)
+
+ alt Theme Configuration Available
+ API->>API: check if theme in theme object
+ API->>API: set themeVariables from theme
+ else Default Theme
+ API->>API: use default theme variables
+ end
+
+ API->>Config: setSiteConfig(options) or getSiteConfig()
+ API->>API: setLogLevel(config.logLevel)
+ API->>DiagramAPI: addDiagrams()
+
+ API-->>-Mermaid: initialization complete
+ Mermaid-->>-User: ready to render
+
+ %% Content Loaded Event
+ User->>DOM: document.load event
+ DOM->>+Mermaid: contentLoaded()
+
+ opt startOnLoad is true
+ Mermaid->>Config: getConfig()
+ Config-->>Mermaid: { startOnLoad: true }
+ Mermaid->>Mermaid: run()
+ end
+
+ Mermaid-->>-DOM: event handling complete
+
+ %% Main Run Function
+ User->>+Mermaid: mermaid.run(options)
+
+ Mermaid->>Mermaid: runThrowsErrors(options)
+ Mermaid->>Config: getConfig()
+ Config-->>Mermaid: configuration object
+
+ alt nodes provided
+ Mermaid->>Mermaid: use provided nodes
+ else querySelector provided
+ Mermaid->>DOM: document.querySelectorAll(querySelector)
+ DOM-->>Mermaid: nodesToProcess
+ end
+
+ Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed)
+
+ loop For each diagram element
+ Mermaid->>DOM: check element.getAttribute('data-processed')
+
+ opt not processed
+ Mermaid->>DOM: element.setAttribute('data-processed', 'true')
+ Mermaid->>Mermaid: generate unique id
+ Mermaid->>DOM: get element.innerHTML
+ Mermaid->>Mermaid: entityDecode and clean text
+ Mermaid->>Mermaid: detectInit(txt)
+
+ Mermaid->>Queue: render(id, txt, element)
+ end
+ end
+
+ Mermaid-->>-User: processing initiated
+
+ %% Render Function (Queued)
+ activate Queue
+ Queue->>+API: mermaidAPI.render(id, text, container)
+
+ API->>DiagramAPI: addDiagrams()
+ API->>+Preprocessor: processAndSetConfigs(text)
+
+ Preprocessor->>Preprocessor: preprocessDiagram(text)
+ Preprocessor->>Config: reset()
+ Preprocessor->>Config: addDirective(processed.config)
+ Preprocessor-->>-API: { code, config }
+
+ API->>Config: getConfig()
+ Config-->>API: current configuration
+
+ opt text length > maxTextSize
+ API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG
+ end
+
+ API->>API: setup id selectors and element IDs
+ API->>API: determine security level (sandbox/loose)
+
+ %% DOM Setup
+ alt svgContainingElement provided
+ alt isSandboxed
+ API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID)
+ API->>DOM: select iframe contentDocument body
+ else
+ API->>DOM: select(svgContainingElement)
+ end
+ else no container
+ API->>API: removeExistingElements(document, id, divId, iFrameId)
+ alt isSandboxed
+ API->>DOM: sandboxedIframe(select('body'), iFrameID)
+ else
+ API->>DOM: select('body')
+ end
+ end
+
+ API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD)
+
+ %% Diagram Creation
+ API->>+Diagram: Diagram.fromText(text, { title: processed.title })
+
+ Diagram->>DiagramAPI: detect diagram type
+ Diagram->>DiagramAPI: load appropriate diagram
+ Diagram-->>-API: diagram instance
+
+ opt parsing error occurred
+ API->>+Diagram: Diagram.fromText('error')
+ Diagram-->>-API: error diagram
+ API->>API: store parseEncounteredException
+ end
+
+ %% Style Generation
+ API->>DOM: get svg element and firstChild
+ API->>Renderer: diag.renderer.getClasses(text, diag)
+ Renderer-->>API: diagramClassDefs
+
+ API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector)
+
+ Styles->>Styles: createCssStyles(config, classDefs)
+
+ opt config.themeCSS defined
+ Styles->>Styles: append themeCSS
+ end
+
+ opt fontFamily configured
+ Styles->>Styles: add CSS variables for fonts
+ end
+
+ opt classDefs exist
+ loop For each styleClassDef
+ opt has styles
+ Styles->>Styles: cssImportantStyles for each CSS element
+ end
+ opt has textStyles
+ Styles->>Styles: cssImportantStyles for tspan elements
+ end
+ end
+ end
+
+ Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables)
+ Styles->>Styles: serialize(compile(svgId{allStyles}), stringify)
+ Styles-->>-API: compiled CSS rules
+
+ API->>DOM: create style element
+ API->>DOM: style.innerHTML = rules
+ API->>DOM: svg.insertBefore(style, firstChild)
+
+ %% Diagram Rendering
+ API->>+Renderer: diag.renderer.draw(text, id, version, diag)
+
+ Renderer->>Renderer: diagram-specific rendering logic
+ Renderer->>DOM: create SVG elements
+ Renderer->>DOM: apply positioning and styling
+ Renderer-->>-API: rendered diagram
+
+ opt rendering error
+ alt suppressErrorRendering
+ API->>API: removeTempElements()
+ API->>Mermaid: throw error
+ else
+ API->>Renderer: errorRenderer.draw(text, id, version)
+ end
+ end
+
+ %% Accessibility and Cleanup
+ API->>DOM: select svg element
+ API->>Diagram: diag.db.getAccTitle()
+ API->>Diagram: diag.db.getAccDescription()
+ API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr)
+
+ API->>DOM: set xmlns for foreignobject elements
+ API->>DOM: get innerHTML from enclosing div
+
+ API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute)
+
+ opt not useArrowMarkerUrls and not sandboxed
+ API->>API: replace marker-end URLs with anchors
+ end
+
+ API->>API: decodeEntities(svgCode)
+ API->>API: replace
with
+ API-->>-API: cleaned SVG code
+
+ alt isSandboxed
+ API->>+API: putIntoIFrame(svgCode, svgEl)
+ API->>API: calculate iframe height
+ API->>API: toBase64 encode SVG content
+ API->>API: create iframe with sandbox attributes
+ API-->>-API: iframe HTML
+ else not loose security
+ API->>API: DOMPurify.sanitize(svgCode, options)
+ end
+
+ API->>API: attachFunctions()
+ API->>API: removeTempElements()
+
+ opt parseEncounteredException
+ API->>Mermaid: throw parseEncounteredException
+ end
+
+ API-->>-Queue: { diagramType, svg: svgCode, bindFunctions }
+
+ %% Return to Web Integration
+ activate Mermaid
+ Queue-->>Mermaid: render result
+ Mermaid->>DOM: element.innerHTML = svg
+
+ opt postRenderCallback
+ Mermaid->>User: postRenderCallback(id)
+ end
+
+ opt bindFunctions exist
+ Mermaid->>DOM: bindFunctions(element)
+ end
+ deactivate Mermaid
+
+ %% Parse Function Flow
+ User->>+Mermaid: mermaid.parse(text, parseOptions)
+ activate Queue
+
+ Queue->>+API: mermaidAPI.parse(text, parseOptions)
+
+ API->>DiagramAPI: addDiagrams()
+ API->>Preprocessor: processAndSetConfigs(text)
+ Preprocessor-->>API: { code, config }
+ API->>Diagram: getDiagramFromText(code)
+ Diagram-->>API: diagram instance
+ API-->>-Queue: { diagramType: diagram.type, config }
+
+ Queue-->>-Mermaid: parse result
+ Mermaid-->>-User: ParseResult or false
+
+ %% External Diagram Registration
+ User->>+Mermaid: registerExternalDiagrams(diagrams, options)
+
+ Mermaid->>DiagramAPI: addDiagrams()
+ Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams)
+
+ opt lazyLoad is false
+ Mermaid->>DiagramAPI: loadRegisteredDiagrams()
+ end
+
+ Mermaid-->>-User: registration complete
+
+ %% Error Handling
+ Note over Mermaid, API: Error Handling Throughout
+ alt Error occurs
+ API->>Mermaid: throw error
+ Mermaid->>+Mermaid: handleError(error, errors, parseError)
+
+ Mermaid->>Mermaid: log.warn(error)
+
+ alt isDetailedError
+ Mermaid->>User: parseError(error.str, error.hash)
+ else
+ Mermaid->>User: parseError(error)
+ end
+
+ opt not suppressErrors
+ Mermaid->>User: throw error
+ end
+
+ Mermaid-->>-User: error handled
+ end
+
+ %% Configuration Details
+ Note over Config: Configuration Functions
+ Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize()
+
+ Note over Styles: CSS Generation
+ Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions
+
+ Note over API: Security Levels
+ Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization
+
+ Note over API: Helper Functions
+ Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements()
\ No newline at end of file
diff --git a/docs/diagrams/mindmap-implementation-sequence.mmd b/docs/diagrams/mindmap-implementation-sequence.mmd
new file mode 100644
index 000000000..335855380
--- /dev/null
+++ b/docs/diagrams/mindmap-implementation-sequence.mmd
@@ -0,0 +1,180 @@
+---
+references:
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts"
+generationTime: 2025-01-28T16:00:00.000Z
+---
+sequenceDiagram
+ participant User as User Input Text
+ participant Detector as detector.ts
+ participant Loader as DiagramLoader
+ participant Definition as mindmap-definition.ts
+ participant Parser as parser/mindmap.jison
+ participant DB as MindmapDB
+ participant Renderer as mindmapRenderer.ts
+ participant Cytoscape as cytoscape.js
+ participant SVGDraw as svgDraw.ts
+ participant Styles as styles.ts
+ participant Output as Final SVG
+
+ Note over User, Output: Mindmap Implementation Flow
+
+ %% Detection Phase
+ User->>Detector: /^\s*mindmap/ text input
+ activate Detector
+ Detector->>Detector: detector(txt) validates pattern
+ Detector->>Loader: loader() function called
+ deactivate Detector
+
+ activate Loader
+ Loader->>Definition: import mindmap-definition.js
+ deactivate Loader
+
+ %% Core Structure Setup
+ activate Definition
+ Definition->>DB: get db() → new MindmapDB()
+ Definition->>Renderer: setup renderer
+ Definition->>Parser: setup parser
+ Definition->>Styles: setup styles
+ deactivate Definition
+
+ %% Database Initialization
+ activate DB
+ Note over DB: MindmapDB Constructor
+ DB->>DB: initialize nodes array
+ DB->>DB: setup nodeType constants
+ DB->>DB: bind methods
+ DB->>DB: clear() state
+
+ %% Parsing Phase
+ activate Parser
+ User->>Parser: mindmap syntax text
+
+ loop For each node in hierarchy
+ Parser->>DB: addNode(level, id, descr, type)
+ activate DB
+ DB->>DB: sanitizeText(id, descr)
+ DB->>DB: getType(startStr, endStr)
+ Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON
+ DB->>DB: getParent(level)
+ DB->>DB: create MindmapNode
+ DB->>DB: add to hierarchy
+ deactivate DB
+ end
+
+ opt Icon/Class Decoration
+ Parser->>DB: decorateNode(decoration)
+ DB->>DB: set icon/class properties
+ end
+ deactivate Parser
+
+ %% Data Preparation
+ Renderer->>DB: getData() for layout
+ activate DB
+ DB->>DB: collect all nodes
+ DB->>DB: build parent-child relationships
+ DB-->>Renderer: return node hierarchy
+ deactivate DB
+
+ %% Rendering Pipeline
+ activate Renderer
+ Note over Renderer: Rendering Phase
+
+ Renderer->>Cytoscape: initialize cytoscape
+ activate Cytoscape
+
+ loop For each node in mindmap
+ Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level)
+ Cytoscape->>Cytoscape: create node data
+ Cytoscape->>Cytoscape: set position (x, y)
+ end
+
+ loop For parent-child relationships
+ Renderer->>Cytoscape: add edges
+ Cytoscape->>Cytoscape: create edge data
+ end
+
+ Renderer->>Cytoscape: configure cose-bilkent layout
+ Cytoscape->>Cytoscape: calculate optimal positions
+ Cytoscape-->>Renderer: return positioned graph
+ deactivate Cytoscape
+
+ %% SVG Generation
+ Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf)
+ activate SVGDraw
+
+ loop For each node recursively
+ SVGDraw->>SVGDraw: select shape function
+
+ alt Default Shape
+ SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle
+ else Rectangle Shape
+ SVGDraw->>SVGDraw: rectBkg() - sharp corners
+ else Circle Shape
+ SVGDraw->>SVGDraw: circleBkg() - perfect circle
+ else Cloud Shape
+ SVGDraw->>SVGDraw: cloudBkg() - organic curves
+ else Bang Shape
+ SVGDraw->>SVGDraw: bangBkg() - explosion style
+ else Hexagon Shape
+ SVGDraw->>SVGDraw: hexagonBkg() - six sides
+ end
+
+ SVGDraw->>SVGDraw: create SVG elements
+ SVGDraw->>SVGDraw: add text labels
+ SVGDraw->>SVGDraw: position node
+
+ opt Node has children
+ SVGDraw->>SVGDraw: drawNodes() recursive call
+ end
+ end
+ deactivate SVGDraw
+
+ %% Edge Rendering
+ Renderer->>Renderer: drawEdges(edgesEl, cy)
+ loop For each edge
+ Renderer->>Renderer: extract edge bounds
+ Renderer->>Renderer: draw SVG path
+ end
+
+ %% Styling Application
+ Renderer->>Styles: getStyles(options)
+ activate Styles
+
+ Styles->>Styles: genSections(options)
+ loop For THEME_COLOR_LIMIT sections
+ Styles->>Styles: generate color scale
+ Styles->>Styles: create CSS rules
+ Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors
+ end
+
+ Styles->>Styles: apply theme integration
+ Styles-->>Renderer: return compiled CSS
+ deactivate Styles
+
+ %% Final Assembly
+ Renderer->>Output: selectSvgElement()
+ Renderer->>Output: setupGraphViewbox()
+ Renderer->>Output: apply styles
+ Renderer->>Output: add interactive elements
+ deactivate Renderer
+
+ activate Output
+ Note over Output: Final Mindmap Features
+ Output->>Output: responsive layout
+ Output->>Output: accessibility attributes
+ Output->>Output: hover effects
+ Output->>Output: click handling
+ Output-->>User: rendered mindmap
+ deactivate Output
+
+ %% Configuration Details
+ Note over DB, Styles: Configuration Options
+ Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding
+ Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration
+ Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules
\ No newline at end of file
diff --git a/package.json b/package.json
index c407d1158..ddd0446ed 100644
--- a/package.json
+++ b/package.json
@@ -97,8 +97,8 @@
"eslint-config-prettier": "^10.1.8",
"eslint-plugin-cypress": "^4.3.0",
"eslint-plugin-html": "^8.1.3",
- "eslint-plugin-jest": "^28.11.2",
- "eslint-plugin-jsdoc": "^50.6.17",
+ "eslint-plugin-jest": "^28.14.0",
+ "eslint-plugin-jsdoc": "^50.8.0",
"eslint-plugin-json": "^4.0.1",
"eslint-plugin-lodash": "^8.0.0",
"eslint-plugin-markdown": "^5.1.0",
@@ -126,7 +126,7 @@
"tslib": "^2.8.1",
"tsx": "^4.7.3",
"typescript": "~5.7.3",
- "typescript-eslint": "^8.32.1",
+ "typescript-eslint": "^8.38.0",
"vite": "^7.0.3",
"vite-plugin-istanbul": "^7.0.0",
"vitest": "^3.0.6"
diff --git a/packages/mermaid-zenuml/README.md b/packages/mermaid-zenuml/README.md
deleted file mode 120000
index 4300aecbe..000000000
--- a/packages/mermaid-zenuml/README.md
+++ /dev/null
@@ -1 +0,0 @@
-../mermaid/src/docs/syntax/zenuml.md
diff --git a/packages/mermaid-zenuml/README.md b/packages/mermaid-zenuml/README.md
new file mode 100644
index 000000000..b26295807
--- /dev/null
+++ b/packages/mermaid-zenuml/README.md
@@ -0,0 +1,384 @@
+# @mermaid-js/mermaid-zenuml
+
+MermaidJS plugin for ZenUML integration - A powerful sequence diagram rendering engine.
+
+> A Sequence diagram is an interaction diagram that shows how processes operate with one another and in what order.
+
+Mermaid can render sequence diagrams with [ZenUML](https://zenuml.com). Note that ZenUML uses a different
+syntax than the original Sequence Diagram in mermaid.
+
+```mermaid
+zenuml
+ BookLibService.Borrow(id) {
+ User = Session.GetUser()
+ if(User.isActive) {
+ try {
+ BookRepository.Update(id, onLoan, User)
+ receipt = new Receipt(id, dueDate)
+ } catch (BookNotFoundException) {
+ ErrorService.onException(BookNotFoundException)
+ } finally {
+ Connection.close()
+ }
+ }
+ return receipt
+ }
+```
+
+## Installation
+
+### With bundlers
+
+```sh
+npm install @mermaid-js/mermaid-zenuml
+```
+
+```ts
+import mermaid from 'mermaid';
+import zenuml from '@mermaid-js/mermaid-zenuml';
+
+await mermaid.registerExternalDiagrams([zenuml]);
+```
+
+### With CDN
+
+```html
+
+```
+
+> [!NOTE]
+> ZenUML uses experimental lazy loading & async rendering features which could change in the future.
+
+## Basic Usage
+
+Once the plugin is registered, you can create ZenUML diagrams using the `zenuml` syntax:
+
+```mermaid
+zenuml
+ Controller.Get(id) {
+ Service.Get(id) {
+ item = Repository.Get(id)
+ if(item) {
+ return item
+ } else {
+ return null
+ }
+ }
+ return result
+ }
+```
+
+## ZenUML Syntax Reference
+
+### Participants
+
+The participants can be defined implicitly as in the first example on this page. The participants or actors are
+rendered in order of appearance in the diagram source text. Sometimes you might want to show the participants in a
+different order than how they appear in the first message. It is possible to specify the actor's order of
+appearance by doing the following:
+
+```mermaid
+zenuml
+ title Declare participant (optional)
+ Bob
+ Alice
+ Alice->Bob: Hi Bob
+ Bob->Alice: Hi Alice
+```
+
+### Annotators
+
+If you specifically want to use symbols instead of just rectangles with text you can do so by using the annotator syntax to declare participants as per below.
+
+```mermaid
+zenuml
+ title Annotators
+ @Actor Alice
+ @Database Bob
+ Alice->Bob: Hi Bob
+ Bob->Alice: Hi Alice
+```
+
+Available annotators include:
+
+- `@Actor` - Human figure
+- `@Database` - Database symbol
+- `@Boundary` - Boundary symbol
+- `@Control` - Control symbol
+- `@Entity` - Entity symbol
+- `@Queue` - Queue symbol
+
+### Aliases
+
+The participants can have a convenient identifier and a descriptive label.
+
+```mermaid
+zenuml
+ title Aliases
+ A as Alice
+ J as John
+ A->J: Hello John, how are you?
+ J->A: Great!
+```
+
+## Messages
+
+Messages can be one of:
+
+1. Sync message
+2. Async message
+3. Creation message
+4. Reply message
+
+### Sync message
+
+You can think of a sync (blocking) method in a programming language.
+
+```mermaid
+zenuml
+ title Sync message
+ A.SyncMessage
+ A.SyncMessage(with, parameters) {
+ B.nestedSyncMessage()
+ }
+```
+
+### Async message
+
+You can think of an async (non-blocking) method in a programming language. Fire an event and forget about it.
+
+```mermaid
+zenuml
+ title Async message
+ Alice->Bob: How are you?
+```
+
+### Creation message
+
+We use `new` keyword to create an object.
+
+```mermaid
+zenuml
+ new A1
+ new A2(with, parameters)
+```
+
+### Reply message
+
+There are three ways to express a reply message:
+
+```mermaid
+zenuml
+ // 1. assign a variable from a sync message.
+ a = A.SyncMessage()
+
+ // 1.1. optionally give the variable a type
+ SomeType a = A.SyncMessage()
+
+ // 2. use return keyword
+ A.SyncMessage() {
+ return result
+ }
+
+ // 3. use @return or @reply annotator on an async message
+ @return
+ A->B: result
+```
+
+The third way `@return` is rarely used, but it is useful when you want to return to one level up.
+
+```mermaid
+zenuml
+ title Reply message
+ Client->A.method() {
+ B.method() {
+ if(condition) {
+ return x1
+ // return early
+ @return
+ A->Client: x11
+ }
+ }
+ return x2
+ }
+```
+
+## Advanced Features
+
+### Nesting
+
+Sync messages and Creation messages are naturally nestable with `{}`.
+
+```mermaid
+zenuml
+ A.method() {
+ B.nested_sync_method()
+ B->C: nested async message
+ }
+```
+
+### Comments
+
+It is possible to add comments to a sequence diagram with `// comment` syntax.
+Comments will be rendered above the messages or fragments. Comments on other places
+are ignored. Markdown is supported.
+
+```mermaid
+zenuml
+ // a comment on a participant will not be rendered
+ BookService
+ // a comment on a message.
+ // **Markdown** is supported.
+ BookService.getBook()
+```
+
+### Loops
+
+It is possible to express loops in a ZenUML diagram. This is done by any of the
+following notations:
+
+1. while
+2. for
+3. forEach, foreach
+4. loop
+
+```zenuml
+while(condition) {
+ ...statements...
+}
+```
+
+Example:
+
+```mermaid
+zenuml
+ Alice->John: Hello John, how are you?
+ while(true) {
+ John->Alice: Great!
+ }
+```
+
+### Alt (Alternative paths)
+
+It is possible to express alternative paths in a sequence diagram. This is done by the notation
+
+```zenuml
+if(condition1) {
+ ...statements...
+} else if(condition2) {
+ ...statements...
+} else {
+ ...statements...
+}
+```
+
+Example:
+
+```mermaid
+zenuml
+ Alice->Bob: Hello Bob, how are you?
+ if(is_sick) {
+ Bob->Alice: Not so good :(
+ } else {
+ Bob->Alice: Feeling fresh like a daisy
+ }
+```
+
+### Opt (Optional)
+
+It is possible to render an `opt` fragment. This is done by the notation
+
+```zenuml
+opt {
+ ...statements...
+}
+```
+
+Example:
+
+```mermaid
+zenuml
+ Alice->Bob: Hello Bob, how are you?
+ Bob->Alice: Not so good :(
+ opt {
+ Bob->Alice: Thanks for asking
+ }
+```
+
+### Parallel
+
+It is possible to show actions that are happening in parallel.
+
+This is done by the notation
+
+```zenuml
+par {
+ statement1
+ statement2
+ statement3
+}
+```
+
+Example:
+
+```mermaid
+zenuml
+ par {
+ Alice->Bob: Hello guys!
+ Alice->John: Hello guys!
+ }
+```
+
+### Try/Catch/Finally (Break)
+
+It is possible to indicate a stop of the sequence within the flow (usually used to model exceptions).
+
+This is done by the notation
+
+```
+try {
+ ...statements...
+} catch {
+ ...statements...
+} finally {
+ ...statements...
+}
+```
+
+Example:
+
+```mermaid
+zenuml
+ try {
+ Consumer->API: Book something
+ API->BookingService: Start booking process
+ } catch {
+ API->Consumer: show failure
+ } finally {
+ API->BookingService: rollback status
+ }
+```
+
+## Contributing
+
+This package is part of the [Mermaid](https://github.com/mermaid-js/mermaid) project. See the main repository for contributing guidelines.
+
+## Contributors
+
+- [Peng Xiao](https://github.com/MrCoder)
+- [Sidharth Vinod](https://sidharth.dev)
+- [Dong Cai](https://github.com/dontry)
+
+## License
+
+MIT
+
+## Links
+
+- [ZenUML Official Website](https://zenuml.com)
+- [Mermaid Documentation](https://mermaid.js.org)
+- [GitHub Repository](https://github.com/mermaid-js/mermaid)
diff --git a/packages/mermaid-zenuml/package.json b/packages/mermaid-zenuml/package.json
index d3a76e797..ec7b9486d 100644
--- a/packages/mermaid-zenuml/package.json
+++ b/packages/mermaid-zenuml/package.json
@@ -33,7 +33,7 @@
],
"license": "MIT",
"dependencies": {
- "@zenuml/core": "^3.31.1"
+ "@zenuml/core": "^3.35.2"
},
"devDependencies": {
"mermaid": "workspace:^"
diff --git a/packages/mermaid-zenuml/src/zenuml.d.ts b/packages/mermaid-zenuml/src/zenuml.d.ts
new file mode 100644
index 000000000..eac411bd2
--- /dev/null
+++ b/packages/mermaid-zenuml/src/zenuml.d.ts
@@ -0,0 +1,11 @@
+declare module '@zenuml/core' {
+ interface RenderOptions {
+ theme?: string;
+ mode?: string;
+ }
+
+ export default class ZenUml {
+ constructor(container: Element);
+ render(text: string, options?: RenderOptions): Promise;
+ }
+}
diff --git a/packages/mermaid-zenuml/src/zenumlRenderer.ts b/packages/mermaid-zenuml/src/zenumlRenderer.ts
index f9dd57996..42ec8fcb4 100644
--- a/packages/mermaid-zenuml/src/zenumlRenderer.ts
+++ b/packages/mermaid-zenuml/src/zenumlRenderer.ts
@@ -53,7 +53,6 @@ export const draw = async function (text: string, id: string) {
const { foreignObject, container, app } = createForeignObject(id);
svgContainer.appendChild(foreignObject);
- // @ts-expect-error @zenuml/core@3.0.0 exports the wrong type for ZenUml
const zenuml = new ZenUml(app);
// default is a theme name. More themes to be added and will be configurable in the future
await zenuml.render(text, { theme: 'default', mode: 'static' });
diff --git a/packages/mermaid/src/diagrams/block/layout.ts b/packages/mermaid/src/diagrams/block/layout.ts
index a00e935ac..ea0de6312 100644
--- a/packages/mermaid/src/diagrams/block/layout.ts
+++ b/packages/mermaid/src/diagrams/block/layout.ts
@@ -270,7 +270,12 @@ function layoutBlocks(block: Block, db: BlockDB) {
if (child.children) {
layoutBlocks(child, db);
}
- columnPos += child?.widthInColumns ?? 1;
+ let columnsFilled = child?.widthInColumns ?? 1;
+ if (columns > 0) {
+ // Make sure overflowing lines do not affect later lines
+ columnsFilled = Math.min(columnsFilled, columns - (columnPos % columns));
+ }
+ columnPos += columnsFilled;
log.debug('abc88 columnsPos', child, columnPos);
}
}
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
index 44a6ed052..3e4034e3d 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.spec.ts
@@ -165,3 +165,20 @@ describe('flow db getData', () => {
expect(edges[3].curve).toBe('stepBefore');
});
});
+
+describe('flow db direction', () => {
+ let flowDb: FlowDB;
+ beforeEach(() => {
+ flowDb = new FlowDB();
+ });
+
+ it('should set direction to TB when TD is set', () => {
+ flowDb.setDirection('TD');
+ expect(flowDb.getDirection()).toBe('TB');
+ });
+
+ it('should correctly set direction irrespective of leading spaces', () => {
+ flowDb.setDirection(' TD');
+ expect(flowDb.getDirection()).toBe('TB');
+ });
+});
diff --git a/packages/mermaid/src/diagrams/flowchart/flowDb.ts b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
index b729a85e0..632633730 100644
--- a/packages/mermaid/src/diagrams/flowchart/flowDb.ts
+++ b/packages/mermaid/src/diagrams/flowchart/flowDb.ts
@@ -406,7 +406,8 @@ You have to call mermaid.initialize.`
*
*/
public setDirection(dir: string) {
- this.direction = dir;
+ this.direction = dir.trim();
+
if (/.* Detection{Detection Phase}
+
+ Detection --> flowDetector["flowDetector.ts
detector(txt, config)"]
+ Detection --> flowDetectorV2["flowDetector-v2.ts
detector(txt, config)"]
+ Detection --> elkDetector["elk/detector.ts
detector(txt, config)"]
+
+ flowDetector --> |"Checks /^\s*graph/"| DetectLegacy{Legacy Flowchart?}
+ flowDetectorV2 --> |"Checks /^\s*flowchart/"| DetectNew{New Flowchart?}
+ elkDetector --> |"Checks /^\s*flowchart-elk/"| DetectElk{ELK Layout?}
+
+ DetectLegacy --> |Yes| LoadDiagram
+ DetectNew --> |Yes| LoadDiagram
+ DetectElk --> |Yes| LoadDiagram
+
+ %% Loading Phase
+ LoadDiagram["loader() function"] --> flowDiagram["flowDiagram.ts
diagram object"]
+
+ flowDiagram --> DiagramStructure{Diagram Components}
+ DiagramStructure --> Parser["parser: flowParser"]
+ DiagramStructure --> Database["db: new FlowDB()"]
+ DiagramStructure --> Renderer["renderer: flowRenderer-v3-unified"]
+ DiagramStructure --> Styles["styles: flowStyles"]
+ DiagramStructure --> Init["init: (cnf: MermaidConfig)"]
+
+ %% Parser Phase
+ Parser --> flowParser["parser/flowParser.ts
newParser.parse(src)"]
+ flowParser --> |"Preprocesses src"| RemoveWhitespace["Remove trailing whitespace
src.replace(/}\s*\n/g, '}\n')"]
+ RemoveWhitespace --> flowJison["parser/flow.jison
flowJisonParser.parse(newSrc)"]
+
+ flowJison --> ParseGraph["Parse Graph Structure"]
+ ParseGraph --> ParseVertices["Parse Vertices"]
+ ParseGraph --> ParseEdges["Parse Edges"]
+ ParseGraph --> ParseSubgraphs["Parse Subgraphs"]
+ ParseGraph --> ParseClasses["Parse Classes"]
+ ParseGraph --> ParseStyles["Parse Styles"]
+
+ %% Database Phase - FlowDB Class
+ Database --> FlowDBClass["flowDb.ts
FlowDB class"]
+
+ FlowDBClass --> DBInit["constructor()
- Initialize counters
- Bind methods
- Setup toolTips
- Call clear()"]
+
+ DBInit --> DBMethods{FlowDB Methods}
+
+ DBMethods --> addVertex["addVertex(id, textObj, type, style,
classes, dir, props, metadata)"]
+ DBMethods --> addLink["addLink(_start[], _end[], linkData)"]
+ DBMethods --> addSingleLink["addSingleLink(_start, _end, type, id)"]
+ DBMethods --> setDirection["setDirection(dir)"]
+ DBMethods --> addSubGraph["addSubGraph(nodes[], id, title)"]
+ DBMethods --> addClass["addClass(id, style)"]
+ DBMethods --> setClass["setClass(ids, className)"]
+ DBMethods --> setTooltip["setTooltip(ids, tooltip)"]
+ DBMethods --> setClickEvent["setClickEvent(id, functionName, args)"]
+ DBMethods --> setClickFun["setClickFun(id, functionName, args)"]
+
+ %% Vertex Processing
+ addVertex --> VertexProcess{Vertex Processing}
+ VertexProcess --> CreateVertex["Create FlowVertex object
- id, labelType, domId
- styles[], classes[]"]
+ VertexProcess --> SanitizeText["sanitizeText(textObj.text)"]
+ VertexProcess --> ParseMetadata["Parse YAML metadata
yaml.load(yamlData)"]
+ VertexProcess --> SetVertexProps["Set vertex properties
- shape, label, icon, form
- pos, img, constraint, w, h"]
+
+ %% Edge Processing
+ addSingleLink --> EdgeProcess{Edge Processing}
+ EdgeProcess --> CreateEdge["Create FlowEdge object
- start, end, type, text
- labelType, classes[]"]
+ EdgeProcess --> ProcessLinkText["Process link text
- sanitizeText()
- strip quotes"]
+ EdgeProcess --> SetEdgeProps["Set edge properties
- type, stroke, length"]
+ EdgeProcess --> GenerateEdgeId["Generate edge ID
getEdgeId(start, end, counter)"]
+ EdgeProcess --> ValidateEdgeLimit["Validate edge limit
maxEdges check"]
+
+ %% Data Collection
+ DBMethods --> GetData["getData()"]
+ GetData --> CollectNodes["Collect nodes[] from vertices"]
+ GetData --> CollectEdges["Collect edges[] from edges"]
+ GetData --> ProcessSubGraphs["Process subgraphs
- parentDB Map
- subGraphDB Map"]
+ GetData --> AddNodeFromVertex["addNodeFromVertex()
for each vertex"]
+ GetData --> ProcessEdgeTypes["destructEdgeType()
arrowTypeStart, arrowTypeEnd"]
+
+ %% Node Creation
+ AddNodeFromVertex --> NodeCreation{Node Creation}
+ NodeCreation --> FindExistingNode["findNode(nodes, vertex.id)"]
+ NodeCreation --> CreateBaseNode["Create base node
- id, label, parentId
- cssStyles, cssClasses
- shape, domId, tooltip"]
+ NodeCreation --> GetCompiledStyles["getCompiledStyles(classDefs)"]
+ NodeCreation --> GetTypeFromVertex["getTypeFromVertex(vertex)"]
+
+ %% Rendering Phase
+ Renderer --> flowRendererV3["flowRenderer-v3-unified.ts
draw(text, id, version, diag)"]
+
+ flowRendererV3 --> RenderInit["Initialize rendering
- getConfig()
- handle securityLevel
- getDiagramElement()"]
+
+ RenderInit --> GetLayoutData["diag.db.getData()
as LayoutData"]
+ GetLayoutData --> SetupLayoutData["Setup layout data
- type, layoutAlgorithm
- direction, spacing
- markers, diagramId"]
+
+ SetupLayoutData --> CallRender["render(data4Layout, svg)"]
+ CallRender --> SetupViewPort["setupViewPortForSVG(svg, padding)"]
+ SetupViewPort --> ProcessLinks["Process vertex links
- create anchor elements
- handle click events"]
+
+ %% Shape Rendering
+ CallRender --> ShapeSystem["flowChartShapes.js
Shape Functions"]
+
+ ShapeSystem --> ShapeFunctions{Shape Functions}
+ ShapeFunctions --> question["question(parent, bbox, node)"]
+ ShapeFunctions --> hexagon["hexagon(parent, bbox, node)"]
+ ShapeFunctions --> rect_left_inv_arrow["rect_left_inv_arrow(parent, bbox, node)"]
+ ShapeFunctions --> lean_right["lean_right(parent, bbox, node)"]
+ ShapeFunctions --> lean_left["lean_left(parent, bbox, node)"]
+
+ ShapeFunctions --> insertPolygonShape["insertPolygonShape(parent, w, h, points)"]
+ ShapeFunctions --> intersectPolygon["intersectPolygon(node, points, point)"]
+ ShapeFunctions --> intersectRect["intersectRect(node, point)"]
+
+ %% Styling System
+ Styles --> stylesTS["styles.ts
getStyles(options)"]
+ stylesTS --> StyleOptions["FlowChartStyleOptions
- arrowheadColor, border2
- clusterBkg, mainBkg
- fontFamily, textColor"]
+
+ StyleOptions --> GenerateCSS["Generate CSS styles
- .label, .cluster-label
- .node, .edgePath
- .flowchart-link, .edgeLabel"]
+ GenerateCSS --> GetIconStyles["getIconStyles()"]
+
+ %% Type System
+ Parser --> TypeSystem["types.ts
Type Definitions"]
+ TypeSystem --> FlowVertex["FlowVertex interface"]
+ TypeSystem --> FlowEdge["FlowEdge interface"]
+ TypeSystem --> FlowClass["FlowClass interface"]
+ TypeSystem --> FlowSubGraph["FlowSubGraph interface"]
+ TypeSystem --> FlowVertexTypeParam["FlowVertexTypeParam
Shape types"]
+
+ %% Utility Functions
+ DBMethods --> UtilityFunctions{Utility Functions}
+ UtilityFunctions --> lookUpDomId["lookUpDomId(id)"]
+ UtilityFunctions --> getClasses["getClasses()"]
+ UtilityFunctions --> getDirection["getDirection()"]
+ UtilityFunctions --> getVertices["getVertices()"]
+ UtilityFunctions --> getEdges["getEdges()"]
+ UtilityFunctions --> getSubGraphs["getSubGraphs()"]
+ UtilityFunctions --> clear["clear()"]
+ UtilityFunctions --> defaultConfig["defaultConfig()"]
+
+ %% Event Handling
+ ProcessLinks --> EventHandling{Event Handling}
+ EventHandling --> setupToolTips["setupToolTips(element)"]
+ EventHandling --> bindFunctions["bindFunctions(element)"]
+ EventHandling --> runFunc["utils.runFunc(functionName, args)"]
+
+ %% Common Database Functions
+ DBMethods --> CommonDB["commonDb.js functions"]
+ CommonDB --> setAccTitle["setAccTitle()"]
+ CommonDB --> getAccTitle["getAccTitle()"]
+ CommonDB --> setAccDescription["setAccDescription()"]
+ CommonDB --> getAccDescription["getAccDescription()"]
+ CommonDB --> setDiagramTitle["setDiagramTitle()"]
+ CommonDB --> getDiagramTitle["getDiagramTitle()"]
+ CommonDB --> commonClear["clear()"]
+
+ %% Final Output
+ ProcessLinks --> FinalSVG["Final SVG Output"]
+
+ %% Layout Algorithm Selection
+ SetupLayoutData --> LayoutAlgorithm{Layout Algorithm}
+ LayoutAlgorithm --> Dagre["dagre
(default)"]
+ LayoutAlgorithm --> DagreWrapper["dagre-wrapper
(v2 renderer)"]
+ LayoutAlgorithm --> ELK["elk
(external package)"]
+
+ %% Testing Components
+ FlowDBClass --> TestFiles["Test Files"]
+ TestFiles --> flowDbSpec["flowDb.spec.ts"]
+ TestFiles --> flowChartShapesSpec["flowChartShapes.spec.js"]
+ TestFiles --> ParserTests["parser/*.spec.js files
- flow-text.spec.js
- flow-edges.spec.js
- flow-style.spec.js
- subgraph.spec.js"]
+
+ %% Configuration
+ Init --> ConfigSetup["Configuration Setup"]
+ ConfigSetup --> FlowchartConfig["cnf.flowchart config"]
+ ConfigSetup --> ArrowMarkers["arrowMarkerAbsolute"]
+ ConfigSetup --> LayoutConfig["layout config"]
+ ConfigSetup --> SetConfig["setConfig() calls"]
\ No newline at end of file
diff --git a/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd
new file mode 100644
index 000000000..ce7597525
--- /dev/null
+++ b/packages/mermaid/src/docs/diagrams/mermaid-api-sequence.mmd
@@ -0,0 +1,307 @@
+---
+references:
+ - "File: /packages/mermaid/src/mermaidAPI.ts"
+ - "File: /packages/mermaid/src/mermaid.ts"
+generationTime: 2025-01-28T16:30:00.000Z
+---
+sequenceDiagram
+ participant User as User/Browser
+ participant Mermaid as mermaid.ts
+ participant Queue as executionQueue
+ participant API as mermaidAPI.ts
+ participant Config as configApi
+ participant Preprocessor as preprocessDiagram
+ participant DiagramAPI as diagram-api
+ participant Diagram as Diagram.fromText
+ participant Renderer as diagram.renderer
+ participant Styles as Styling System
+ participant DOM as DOM/SVG
+
+ Note over User, DOM: Mermaid Complete API Flow
+
+ %% Initialization Phase
+ User->>+Mermaid: mermaid.initialize(config)
+ Mermaid->>+API: mermaidAPI.initialize(config)
+
+ API->>API: assignWithDepth({}, userOptions)
+ API->>API: handle legacy fontFamily config
+ API->>Config: saveConfigFromInitialize(options)
+
+ alt Theme Configuration Available
+ API->>API: check if theme in theme object
+ API->>API: set themeVariables from theme
+ else Default Theme
+ API->>API: use default theme variables
+ end
+
+ API->>Config: setSiteConfig(options) or getSiteConfig()
+ API->>API: setLogLevel(config.logLevel)
+ API->>DiagramAPI: addDiagrams()
+
+ API-->>-Mermaid: initialization complete
+ Mermaid-->>-User: ready to render
+
+ %% Content Loaded Event
+ User->>DOM: document.load event
+ DOM->>+Mermaid: contentLoaded()
+
+ opt startOnLoad is true
+ Mermaid->>Config: getConfig()
+ Config-->>Mermaid: { startOnLoad: true }
+ Mermaid->>Mermaid: run()
+ end
+
+ Mermaid-->>-DOM: event handling complete
+
+ %% Main Run Function
+ User->>+Mermaid: mermaid.run(options)
+
+ Mermaid->>Mermaid: runThrowsErrors(options)
+ Mermaid->>Config: getConfig()
+ Config-->>Mermaid: configuration object
+
+ alt nodes provided
+ Mermaid->>Mermaid: use provided nodes
+ else querySelector provided
+ Mermaid->>DOM: document.querySelectorAll(querySelector)
+ DOM-->>Mermaid: nodesToProcess
+ end
+
+ Mermaid->>Mermaid: new InitIDGenerator(deterministicIds, seed)
+
+ loop For each diagram element
+ Mermaid->>DOM: check element.getAttribute('data-processed')
+
+ opt not processed
+ Mermaid->>DOM: element.setAttribute('data-processed', 'true')
+ Mermaid->>Mermaid: generate unique id
+ Mermaid->>DOM: get element.innerHTML
+ Mermaid->>Mermaid: entityDecode and clean text
+ Mermaid->>Mermaid: detectInit(txt)
+
+ Mermaid->>Queue: render(id, txt, element)
+ end
+ end
+
+ Mermaid-->>-User: processing initiated
+
+ %% Render Function (Queued)
+ activate Queue
+ Queue->>+API: mermaidAPI.render(id, text, container)
+
+ API->>DiagramAPI: addDiagrams()
+ API->>+Preprocessor: processAndSetConfigs(text)
+
+ Preprocessor->>Preprocessor: preprocessDiagram(text)
+ Preprocessor->>Config: reset()
+ Preprocessor->>Config: addDirective(processed.config)
+ Preprocessor-->>-API: { code, config }
+
+ API->>Config: getConfig()
+ Config-->>API: current configuration
+
+ opt text length > maxTextSize
+ API->>API: text = MAX_TEXTLENGTH_EXCEEDED_MSG
+ end
+
+ API->>API: setup id selectors and element IDs
+ API->>API: determine security level (sandbox/loose)
+
+ %% DOM Setup
+ alt svgContainingElement provided
+ alt isSandboxed
+ API->>DOM: sandboxedIframe(select(svgContainingElement), iFrameID)
+ API->>DOM: select iframe contentDocument body
+ else
+ API->>DOM: select(svgContainingElement)
+ end
+ else no container
+ API->>API: removeExistingElements(document, id, divId, iFrameId)
+ alt isSandboxed
+ API->>DOM: sandboxedIframe(select('body'), iFrameID)
+ else
+ API->>DOM: select('body')
+ end
+ end
+
+ API->>DOM: appendDivSvgG(root, id, enclosingDivID, fontFamily, XMLNS_XLINK_STD)
+
+ %% Diagram Creation
+ API->>+Diagram: Diagram.fromText(text, { title: processed.title })
+
+ Diagram->>DiagramAPI: detect diagram type
+ Diagram->>DiagramAPI: load appropriate diagram
+ Diagram-->>-API: diagram instance
+
+ opt parsing error occurred
+ API->>+Diagram: Diagram.fromText('error')
+ Diagram-->>-API: error diagram
+ API->>API: store parseEncounteredException
+ end
+
+ %% Style Generation
+ API->>DOM: get svg element and firstChild
+ API->>Renderer: diag.renderer.getClasses(text, diag)
+ Renderer-->>API: diagramClassDefs
+
+ API->>+Styles: createUserStyles(config, diagramType, diagramClassDefs, idSelector)
+
+ Styles->>Styles: createCssStyles(config, classDefs)
+
+ opt config.themeCSS defined
+ Styles->>Styles: append themeCSS
+ end
+
+ opt fontFamily configured
+ Styles->>Styles: add CSS variables for fonts
+ end
+
+ opt classDefs exist
+ loop For each styleClassDef
+ opt has styles
+ Styles->>Styles: cssImportantStyles for each CSS element
+ end
+ opt has textStyles
+ Styles->>Styles: cssImportantStyles for tspan elements
+ end
+ end
+ end
+
+ Styles->>Styles: getStyles(graphType, userCSSstyles, themeVariables)
+ Styles->>Styles: serialize(compile(svgId{allStyles}), stringify)
+ Styles-->>-API: compiled CSS rules
+
+ API->>DOM: create style element
+ API->>DOM: style.innerHTML = rules
+ API->>DOM: svg.insertBefore(style, firstChild)
+
+ %% Diagram Rendering
+ API->>+Renderer: diag.renderer.draw(text, id, version, diag)
+
+ Renderer->>Renderer: diagram-specific rendering logic
+ Renderer->>DOM: create SVG elements
+ Renderer->>DOM: apply positioning and styling
+ Renderer-->>-API: rendered diagram
+
+ opt rendering error
+ alt suppressErrorRendering
+ API->>API: removeTempElements()
+ API->>Mermaid: throw error
+ else
+ API->>Renderer: errorRenderer.draw(text, id, version)
+ end
+ end
+
+ %% Accessibility and Cleanup
+ API->>DOM: select svg element
+ API->>Diagram: diag.db.getAccTitle()
+ API->>Diagram: diag.db.getAccDescription()
+ API->>API: addA11yInfo(diagramType, svgNode, a11yTitle, a11yDescr)
+
+ API->>DOM: set xmlns for foreignobject elements
+ API->>DOM: get innerHTML from enclosing div
+
+ API->>+API: cleanUpSvgCode(svgCode, isSandboxed, arrowMarkerAbsolute)
+
+ opt not useArrowMarkerUrls and not sandboxed
+ API->>API: replace marker-end URLs with anchors
+ end
+
+ API->>API: decodeEntities(svgCode)
+ API->>API: replace
with
+ API-->>-API: cleaned SVG code
+
+ alt isSandboxed
+ API->>+API: putIntoIFrame(svgCode, svgEl)
+ API->>API: calculate iframe height
+ API->>API: toBase64 encode SVG content
+ API->>API: create iframe with sandbox attributes
+ API-->>-API: iframe HTML
+ else not loose security
+ API->>API: DOMPurify.sanitize(svgCode, options)
+ end
+
+ API->>API: attachFunctions()
+ API->>API: removeTempElements()
+
+ opt parseEncounteredException
+ API->>Mermaid: throw parseEncounteredException
+ end
+
+ API-->>-Queue: { diagramType, svg: svgCode, bindFunctions }
+
+ %% Return to Web Integration
+ activate Mermaid
+ Queue-->>Mermaid: render result
+ Mermaid->>DOM: element.innerHTML = svg
+
+ opt postRenderCallback
+ Mermaid->>User: postRenderCallback(id)
+ end
+
+ opt bindFunctions exist
+ Mermaid->>DOM: bindFunctions(element)
+ end
+ deactivate Mermaid
+
+ %% Parse Function Flow
+ User->>+Mermaid: mermaid.parse(text, parseOptions)
+ activate Queue
+
+ Queue->>+API: mermaidAPI.parse(text, parseOptions)
+
+ API->>DiagramAPI: addDiagrams()
+ API->>Preprocessor: processAndSetConfigs(text)
+ Preprocessor-->>API: { code, config }
+ API->>Diagram: getDiagramFromText(code)
+ Diagram-->>API: diagram instance
+ API-->>-Queue: { diagramType: diagram.type, config }
+
+ Queue-->>-Mermaid: parse result
+ Mermaid-->>-User: ParseResult or false
+
+ %% External Diagram Registration
+ User->>+Mermaid: registerExternalDiagrams(diagrams, options)
+
+ Mermaid->>DiagramAPI: addDiagrams()
+ Mermaid->>DiagramAPI: registerLazyLoadedDiagrams(...diagrams)
+
+ opt lazyLoad is false
+ Mermaid->>DiagramAPI: loadRegisteredDiagrams()
+ end
+
+ Mermaid-->>-User: registration complete
+
+ %% Error Handling
+ Note over Mermaid, API: Error Handling Throughout
+ alt Error occurs
+ API->>Mermaid: throw error
+ Mermaid->>+Mermaid: handleError(error, errors, parseError)
+
+ Mermaid->>Mermaid: log.warn(error)
+
+ alt isDetailedError
+ Mermaid->>User: parseError(error.str, error.hash)
+ else
+ Mermaid->>User: parseError(error)
+ end
+
+ opt not suppressErrors
+ Mermaid->>User: throw error
+ end
+
+ Mermaid-->>-User: error handled
+ end
+
+ %% Configuration Details
+ Note over Config: Configuration Functions
+ Note right of Config: Functions:
- reset()
- getConfig()
- setConfig()
- getSiteConfig()
- updateSiteConfig()
- saveConfigFromInitialize()
+
+ Note over Styles: CSS Generation
+ Note right of Styles: Features:
- createCssStyles()
- createUserStyles()
- cssImportantStyles()
- Theme integration
- Class definitions
+
+ Note over API: Security Levels
+ Note right of API: Modes:
- sandbox: iframe isolation
- loose: minimal sanitization
- default: DOMPurify sanitization
+
+ Note over API: Helper Functions
+ Note right of API: Utilities:
- cleanUpSvgCode()
- putIntoIFrame()
- appendDivSvgG()
- removeExistingElements()
\ No newline at end of file
diff --git a/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd
new file mode 100644
index 000000000..335855380
--- /dev/null
+++ b/packages/mermaid/src/docs/diagrams/mindmap-implementation-sequence.mmd
@@ -0,0 +1,180 @@
+---
+references:
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmap-definition.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapDb.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/detector.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapTypes.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/mindmapRenderer.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/styles.ts"
+ - "File: /packages/mermaid/src/diagrams/mindmap/svgDraw.ts"
+generationTime: 2025-01-28T16:00:00.000Z
+---
+sequenceDiagram
+ participant User as User Input Text
+ participant Detector as detector.ts
+ participant Loader as DiagramLoader
+ participant Definition as mindmap-definition.ts
+ participant Parser as parser/mindmap.jison
+ participant DB as MindmapDB
+ participant Renderer as mindmapRenderer.ts
+ participant Cytoscape as cytoscape.js
+ participant SVGDraw as svgDraw.ts
+ participant Styles as styles.ts
+ participant Output as Final SVG
+
+ Note over User, Output: Mindmap Implementation Flow
+
+ %% Detection Phase
+ User->>Detector: /^\s*mindmap/ text input
+ activate Detector
+ Detector->>Detector: detector(txt) validates pattern
+ Detector->>Loader: loader() function called
+ deactivate Detector
+
+ activate Loader
+ Loader->>Definition: import mindmap-definition.js
+ deactivate Loader
+
+ %% Core Structure Setup
+ activate Definition
+ Definition->>DB: get db() → new MindmapDB()
+ Definition->>Renderer: setup renderer
+ Definition->>Parser: setup parser
+ Definition->>Styles: setup styles
+ deactivate Definition
+
+ %% Database Initialization
+ activate DB
+ Note over DB: MindmapDB Constructor
+ DB->>DB: initialize nodes array
+ DB->>DB: setup nodeType constants
+ DB->>DB: bind methods
+ DB->>DB: clear() state
+
+ %% Parsing Phase
+ activate Parser
+ User->>Parser: mindmap syntax text
+
+ loop For each node in hierarchy
+ Parser->>DB: addNode(level, id, descr, type)
+ activate DB
+ DB->>DB: sanitizeText(id, descr)
+ DB->>DB: getType(startStr, endStr)
+ Note right of DB: Shape Detection:
[ → RECT
( → ROUNDED_RECT
(( → CIRCLE
)) → BANG
{{ → HEXAGON
+ DB->>DB: getParent(level)
+ DB->>DB: create MindmapNode
+ DB->>DB: add to hierarchy
+ deactivate DB
+ end
+
+ opt Icon/Class Decoration
+ Parser->>DB: decorateNode(decoration)
+ DB->>DB: set icon/class properties
+ end
+ deactivate Parser
+
+ %% Data Preparation
+ Renderer->>DB: getData() for layout
+ activate DB
+ DB->>DB: collect all nodes
+ DB->>DB: build parent-child relationships
+ DB-->>Renderer: return node hierarchy
+ deactivate DB
+
+ %% Rendering Pipeline
+ activate Renderer
+ Note over Renderer: Rendering Phase
+
+ Renderer->>Cytoscape: initialize cytoscape
+ activate Cytoscape
+
+ loop For each node in mindmap
+ Renderer->>Cytoscape: addNodes(mindmap, cy, conf, level)
+ Cytoscape->>Cytoscape: create node data
+ Cytoscape->>Cytoscape: set position (x, y)
+ end
+
+ loop For parent-child relationships
+ Renderer->>Cytoscape: add edges
+ Cytoscape->>Cytoscape: create edge data
+ end
+
+ Renderer->>Cytoscape: configure cose-bilkent layout
+ Cytoscape->>Cytoscape: calculate optimal positions
+ Cytoscape-->>Renderer: return positioned graph
+ deactivate Cytoscape
+
+ %% SVG Generation
+ Renderer->>SVGDraw: drawNodes(db, svg, mindmap, section, conf)
+ activate SVGDraw
+
+ loop For each node recursively
+ SVGDraw->>SVGDraw: select shape function
+
+ alt Default Shape
+ SVGDraw->>SVGDraw: defaultBkg() - rounded rectangle
+ else Rectangle Shape
+ SVGDraw->>SVGDraw: rectBkg() - sharp corners
+ else Circle Shape
+ SVGDraw->>SVGDraw: circleBkg() - perfect circle
+ else Cloud Shape
+ SVGDraw->>SVGDraw: cloudBkg() - organic curves
+ else Bang Shape
+ SVGDraw->>SVGDraw: bangBkg() - explosion style
+ else Hexagon Shape
+ SVGDraw->>SVGDraw: hexagonBkg() - six sides
+ end
+
+ SVGDraw->>SVGDraw: create SVG elements
+ SVGDraw->>SVGDraw: add text labels
+ SVGDraw->>SVGDraw: position node
+
+ opt Node has children
+ SVGDraw->>SVGDraw: drawNodes() recursive call
+ end
+ end
+ deactivate SVGDraw
+
+ %% Edge Rendering
+ Renderer->>Renderer: drawEdges(edgesEl, cy)
+ loop For each edge
+ Renderer->>Renderer: extract edge bounds
+ Renderer->>Renderer: draw SVG path
+ end
+
+ %% Styling Application
+ Renderer->>Styles: getStyles(options)
+ activate Styles
+
+ Styles->>Styles: genSections(options)
+ loop For THEME_COLOR_LIMIT sections
+ Styles->>Styles: generate color scale
+ Styles->>Styles: create CSS rules
+ Note right of Styles: .section-X fills
.edge-depth-X widths
.node-icon-X colors
+ end
+
+ Styles->>Styles: apply theme integration
+ Styles-->>Renderer: return compiled CSS
+ deactivate Styles
+
+ %% Final Assembly
+ Renderer->>Output: selectSvgElement()
+ Renderer->>Output: setupGraphViewbox()
+ Renderer->>Output: apply styles
+ Renderer->>Output: add interactive elements
+ deactivate Renderer
+
+ activate Output
+ Note over Output: Final Mindmap Features
+ Output->>Output: responsive layout
+ Output->>Output: accessibility attributes
+ Output->>Output: hover effects
+ Output->>Output: click handling
+ Output-->>User: rendered mindmap
+ deactivate Output
+
+ %% Configuration Details
+ Note over DB, Styles: Configuration Options
+ Note right of DB: Padding Calculations:
Base padding from config
RECT: ×2 padding
ROUNDED_RECT: ×2 padding
HEXAGON: ×2 padding
+ Note right of Styles: Section Management:
MAX_SECTIONS = 12
Dynamic color generation
Git theme integration
+ Note right of Renderer: Layout Parameters:
Cytoscape configuration
coseBilkent settings
Node spacing rules
\ No newline at end of file
diff --git a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts
index eb50d09bd..ed764f5ee 100644
--- a/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts
+++ b/packages/mermaid/src/rendering-util/rendering-elements/shapes/requirementBox.ts
@@ -54,7 +54,7 @@ export async function requirementBox(
if (isRequirementNode) {
const idHeight = await addText(
shapeSvg,
- `${requirementNode.requirementId ? `id: ${requirementNode.requirementId}` : ''}`,
+ `${requirementNode.requirementId ? `ID: ${requirementNode.requirementId}` : ''}`,
accumulativeHeight,
node.labelStyle
);
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 85424c1be..8be2d5aca 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -116,10 +116,10 @@ importers:
specifier: ^8.1.3
version: 8.1.3
eslint-plugin-jest:
- specifier: ^28.11.2
+ specifier: ^28.14.0
version: 28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3)
eslint-plugin-jsdoc:
- specifier: ^50.6.17
+ specifier: ^50.8.0
version: 50.8.0(eslint@9.26.0(jiti@2.4.2))
eslint-plugin-json:
specifier: ^4.0.1
@@ -203,7 +203,7 @@ importers:
specifier: ~5.7.3
version: 5.7.3
typescript-eslint:
- specifier: ^8.32.1
+ specifier: ^8.38.0
version: 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
vite:
specifier: ^7.0.3
@@ -449,8 +449,8 @@ importers:
packages/mermaid-zenuml:
dependencies:
'@zenuml/core':
- specifier: ^3.31.1
- version: 3.31.1(typescript@5.7.3)
+ specifier: ^3.35.2
+ version: 3.35.2
devDependencies:
mermaid:
specifier: workspace:^
@@ -2379,18 +2379,36 @@ packages:
'@fastify/merge-json-schemas@0.1.1':
resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==}
- '@floating-ui/core@1.6.9':
- resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==}
+ '@floating-ui/core@1.7.2':
+ resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==}
- '@floating-ui/dom@1.6.13':
- resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==}
+ '@floating-ui/dom@1.7.2':
+ resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==}
+
+ '@floating-ui/react-dom@2.1.4':
+ resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/react@0.26.28':
+ resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/react@0.27.14':
+ resolution: {integrity: sha512-aSf9JXfyXpRQWMbtuW+CJQrnhzHu4Hg1Th9AkvR1o+wSW/vCUVMrtgXaRY5ToV5Fh5w3I7lXJdvlKVvYrQrppw==}
+ peerDependencies:
+ react: '>=17.0.0'
+ react-dom: '>=17.0.0'
+
+ '@floating-ui/utils@0.2.10':
+ resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==}
'@floating-ui/utils@0.2.9':
resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==}
- '@floating-ui/vue@1.1.6':
- resolution: {integrity: sha512-XFlUzGHGv12zbgHNk5FN2mUB7ROul3oG2ENdTpWdE+qMFxyNxWSRmsoyhiEnpmabNm6WnUvR1OvJfUfN4ojC1A==}
-
'@gerrit0/mini-shiki@1.27.2':
resolution: {integrity: sha512-GeWyHz8ao2gBiUW4OJnQDxXQnFgZQwwQk05t/CVVgNBN7/rK8XZ7xY6YhLVv9tH3VppWWmr9DCl3MwemB/i+Og==}
@@ -2400,11 +2418,12 @@ packages:
'@hapi/topo@5.1.0':
resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
- '@headlessui-float/vue@0.14.4':
- resolution: {integrity: sha512-MSyWCxUTueeex+veRCf++q4KM/fa4HOe9HDttzGrtgVDBULkGduFK6ItJh7EHJp2U/dY7qpyDUqp2KCHpCEplw==}
+ '@headlessui/react@2.2.6':
+ resolution: {integrity: sha512-gN5CT8Kf4IWwL04GQOjZ/ZnHMFoeFHZmVSFoDKeTmbtmy9oFqQqJMthdBiO3Pl5LXk2w03fGFLpQV6EW84vjjQ==}
+ engines: {node: '>=10'}
peerDependencies:
- '@headlessui/vue': ^1.0.0
- vue: ^3.0.0
+ react: ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^18 || ^19 || ^19.0.0-rc
'@headlessui/tailwindcss@0.2.2':
resolution: {integrity: sha512-xNe42KjdyA4kfUKLLPGzME9zkH7Q3rOZ5huFihWNWOQFxnItxPB3/67yBI8/qBfY8nwBRx5GHn4VprsoluVMGw==}
@@ -2412,12 +2431,6 @@ packages:
peerDependencies:
tailwindcss: ^3.0 || ^4.0
- '@headlessui/vue@1.7.23':
- resolution: {integrity: sha512-JzdCNqurrtuu0YW6QaDtR2PIYCKPUWq28csDyMvN4zmGccmE7lz40Is6hc3LA4HFeCI7sekZ/PQMTNmn9I/4Wg==}
- engines: {node: '>=10'}
- peerDependencies:
- vue: ^3.2.0
-
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -2727,6 +2740,43 @@ packages:
'@polka/url@1.0.0-next.28':
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+ '@react-aria/focus@3.21.0':
+ resolution: {integrity: sha512-7NEGtTPsBy52EZ/ToVKCu0HSelE3kq9qeis+2eEq90XSuJOMaDHUQrA7RC2Y89tlEwQB31bud/kKRi9Qme1dkA==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/interactions@3.25.4':
+ resolution: {integrity: sha512-HBQMxgUPHrW8V63u9uGgBymkMfj6vdWbB0GgUJY49K9mBKMsypcHeWkWM6+bF7kxRO728/IK8bWDV6whDbqjHg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/ssr@3.9.10':
+ resolution: {integrity: sha512-hvTm77Pf+pMBhuBm760Li0BVIO38jv1IBws1xFm1NoL26PU+fe+FMW5+VZWyANR6nYL65joaJKZqOdTQMkO9IQ==}
+ engines: {node: '>= 12'}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-aria/utils@3.30.0':
+ resolution: {integrity: sha512-ydA6y5G1+gbem3Va2nczj/0G0W7/jUVo/cbN10WA5IizzWIwMP5qhFr7macgbKfHMkZ+YZC3oXnt2NNre5odKw==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+ react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-stately/flags@3.1.2':
+ resolution: {integrity: sha512-2HjFcZx1MyQXoPqcBGALwWWmgFVUk2TuKVIQxCbRq7fPyWXIl6VHcakCLurdtYC2Iks7zizvz0Idv48MQ38DWg==}
+
+ '@react-stately/utils@3.10.8':
+ resolution: {integrity: sha512-SN3/h7SzRsusVQjQ4v10LaVsDc81jyyR0DD5HnsQitm/I5WDpaSr2nRHtyloPFU48jlql1XX/S04T2DLQM7Y3g==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
+ '@react-types/shared@3.31.0':
+ resolution: {integrity: sha512-ua5U6V66gDcbLZe4P2QeyNgPp4YWD1ymGA6j3n+s8CGExtrCPe64v+g4mvpT8Bnb985R96e4zFT61+m0YCwqMg==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
+
'@rolldown/pluginutils@1.0.0-beta.19':
resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==}
@@ -3046,17 +3096,21 @@ packages:
'@surma/rollup-plugin-off-main-thread@2.2.3':
resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==}
+ '@swc/helpers@0.5.17':
+ resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==}
+
'@szmarczak/http-timer@4.0.6':
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
- '@tanstack/virtual-core@3.13.0':
- resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==}
-
- '@tanstack/vue-virtual@3.13.0':
- resolution: {integrity: sha512-EPgcTc41KGJAK2N2Ux2PeUnG3cPpdkldTib05nwq+0zdS2Ihpbq8BsWXz/eXPyNc5noDBh1GBgAe36yMYiW6WA==}
+ '@tanstack/react-virtual@3.13.12':
+ resolution: {integrity: sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA==}
peerDependencies:
- vue: ^2.7.0 || ^3.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
+ '@tanstack/virtual-core@3.13.12':
+ resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==}
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
@@ -3065,9 +3119,6 @@ packages:
'@tybys/wasm-util@0.9.0':
resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==}
- '@types/assert@1.5.11':
- resolution: {integrity: sha512-FjS1mxq2dlGr9N4z72/DO+XmyRS3ZZIoVn998MEopAN/OmyN28F4yumRL5pOw2z+hbFLuWGYuF2rrw5p11xM5A==}
-
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -3332,9 +3383,6 @@ packages:
'@types/qs@6.9.16':
resolution: {integrity: sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==}
- '@types/ramda@0.28.25':
- resolution: {integrity: sha512-HrQNqQAGcITpn9HAJFamDxm7iZeeXiP/95pN5OMbNniDjzCCeOHbBKNGmUy8NRi0fhYS+/cXeo91MFC+06gbow==}
-
'@types/range-parser@1.2.7':
resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==}
@@ -3432,10 +3480,6 @@ packages:
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/scope-manager@8.32.0':
- resolution: {integrity: sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/scope-manager@8.38.0':
resolution: {integrity: sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3457,10 +3501,6 @@ packages:
resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/types@8.32.0':
- resolution: {integrity: sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/types@8.38.0':
resolution: {integrity: sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3474,25 +3514,12 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@8.32.0':
- resolution: {integrity: sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <5.9.0'
-
'@typescript-eslint/typescript-estree@8.38.0':
resolution: {integrity: sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.9.0'
- '@typescript-eslint/utils@8.32.0':
- resolution: {integrity: sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.9.0'
-
'@typescript-eslint/utils@8.38.0':
resolution: {integrity: sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3504,10 +3531,6 @@ packages:
resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/visitor-keys@8.32.0':
- resolution: {integrity: sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/visitor-keys@8.38.0':
resolution: {integrity: sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3759,11 +3782,6 @@ packages:
'@vitest/utils@3.0.6':
resolution: {integrity: sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==}
- '@vue/compat@3.5.13':
- resolution: {integrity: sha512-Q3xRdTPN4l+kddxU98REyUBgvc0meAo9CefCWE2lW8Fg3dyPn3vSCce52b338ihrJAx1RQQhO5wMWhJ/PAKUpA==}
- peerDependencies:
- vue: 3.5.13
-
'@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
@@ -3776,9 +3794,6 @@ packages:
'@vue/compiler-ssr@3.5.13':
resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
- '@vue/devtools-api@6.6.4':
- resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
-
'@vue/devtools-api@7.7.2':
resolution: {integrity: sha512-1syn558KhyN+chO5SjlZIwJ8bV/bQ1nOVTG66t2RbG66ZGekyiYNmRO7X9BJCXQqPsFHlnksqvPhce2qpzxFnA==}
@@ -3968,9 +3983,9 @@ packages:
'@xtuc/long@4.2.2':
resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
- '@zenuml/core@3.31.1':
- resolution: {integrity: sha512-gfbCIp2+AmdT9tUmRiRmMtxWHhvlo0VieGICgxFkvmcJxfNXRokpUrlW1H2NDcD+n9vYy6KjNSoYAxiph/9Irw==}
- engines: {node: '>=12.0.0'}
+ '@zenuml/core@3.35.2':
+ resolution: {integrity: sha512-g9pX+id6xrZ+pgFiBvBJjol7KyqoHJPsVofiHThSn04bDBVdZLxHtA3KxwRdrggwyRDsK2DLLB1+YA0kITuKtQ==}
+ engines: {node: '>=20'}
JSONSelect@0.4.0:
resolution: {integrity: sha512-VRLR3Su35MH+XV2lrvh9O7qWoug/TUyj9tLDjn9rtpUCNnILLrHjgd/tB0KrhugCxUpj3UqoLqfYb3fLJdIQQQ==}
@@ -4578,6 +4593,9 @@ packages:
resolution: {integrity: sha512-vp42956Ax06WwaaheYEqEOgXZ3VKJxgccZ0gJL0HpyiupkIS9RVJFo5eDU1BPeQAOqz+cclndZg4DCqG1sJReQ==}
engines: {node: ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
clean-regexp@1.0.0:
resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
engines: {node: '>=4'}
@@ -4636,6 +4654,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
co@4.6.0:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
@@ -4656,9 +4678,17 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+ color-name@2.0.0:
+ resolution: {integrity: sha512-SbtvAMWvASO5TE2QP07jHBMXKafgdZz8Vrsrn96fiL+O92/FN/PLARzUW5sKt013fjAprK2d2iCn2hk2Xb5oow==}
+ engines: {node: '>=12.20'}
+
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
+ color-string@2.0.1:
+ resolution: {integrity: sha512-5z9FbYTZPAo8iKsNEqRNv+OlpBbDcoE+SY9GjLfDUHEfcNNV7tS9eSAlFHEaub/r5tBL9LtskAeq1l9SaoZ5tQ==}
+ engines: {node: '>=18'}
+
color@4.2.3:
resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==}
engines: {node: '>=12.5.0'}
@@ -5392,9 +5422,6 @@ packages:
dom-serializer@2.0.0:
resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
- dom-to-image-more@2.16.0:
- resolution: {integrity: sha512-RyjtkaM/zVy90uJ20lT+/G7MwBZx6l/ePliq5CQOeAnPeew7aUGS6IqRWBkHpstU+POmhaKA8A9H9qf476gisQ==}
-
domelementtype@2.3.0:
resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
@@ -5953,9 +5980,6 @@ packages:
resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==}
engines: {node: '>=18'}
- file-saver@2.0.5:
- resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==}
-
filelist@1.0.4:
resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==}
@@ -6496,6 +6520,9 @@ packages:
resolution: {integrity: sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA==}
engines: {node: '>= 4'}
+ immer@10.1.1:
+ resolution: {integrity: sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw==}
+
import-fresh@3.3.1:
resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
engines: {node: '>=6'}
@@ -7028,6 +7055,18 @@ packages:
joi@17.13.3:
resolution: {integrity: sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==}
+ jotai@2.12.5:
+ resolution: {integrity: sha512-G8m32HW3lSmcz/4mbqx0hgJIQ0ekndKWiYP7kWVKi0p6saLXdSoye+FZiOFyonnd7Q482LCzm8sMDl7Ar1NWDw==}
+ engines: {node: '>=12.20.0'}
+ peerDependencies:
+ '@types/react': '>=17.0.0'
+ react: '>=17.0.0'
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ react:
+ optional: true
+
jpeg-js@0.4.4:
resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==}
@@ -8004,6 +8043,9 @@ packages:
pako@1.0.11:
resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+ pako@2.1.0:
+ resolution: {integrity: sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==}
+
parent-module@1.0.1:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
@@ -8154,10 +8196,6 @@ packages:
resolution: {integrity: sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==}
hasBin: true
- pirates@4.0.6:
- resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
- engines: {node: '>= 6'}
-
pirates@4.0.7:
resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
engines: {node: '>= 6'}
@@ -8380,6 +8418,10 @@ packages:
quote-unquote@1.0.0:
resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==}
+ radash@12.1.1:
+ resolution: {integrity: sha512-h36JMxKRqrAxVD8201FrCpyeNuUY9Y5zZwujr20fFO77tpUtGa6EZzfKw/3WaiBX95fq7+MpsuMLNdSnORAwSA==}
+ engines: {node: '>=14.18.0'}
+
railroad-diagrams@1.0.0:
resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==}
@@ -8408,9 +8450,18 @@ packages:
resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
hasBin: true
+ react-dom@19.1.0:
+ resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==}
+ peerDependencies:
+ react: ^19.1.0
+
react-is@18.3.1:
resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+ react@19.1.0:
+ resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==}
+ engines: {node: '>=0.10.0'}
+
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -8695,6 +8746,9 @@ packages:
resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
engines: {node: '>=v12.22.7'}
+ scheduler@0.26.0:
+ resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==}
+
schema-utils@3.3.0:
resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==}
engines: {node: '>= 10.13.0'}
@@ -9169,6 +9223,9 @@ packages:
tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+ tailwind-merge@3.3.1:
+ resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==}
+
tailwindcss@3.4.17:
resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==}
engines: {node: '>=14.0.0'}
@@ -9370,9 +9427,6 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-toolbelt@6.15.5:
- resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==}
-
tsconfig-paths@4.2.0:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
@@ -9628,6 +9682,11 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ use-sync-external-store@1.5.0:
+ resolution: {integrity: sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@@ -9915,17 +9974,6 @@ packages:
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
- vue-demi@0.14.10:
- resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
- engines: {node: '>=12'}
- hasBin: true
- peerDependencies:
- '@vue/composition-api': ^1.0.0-rc.1
- vue: ^3.0.0-0 || ^2.6.0
- peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
-
vue-flow-layout@0.1.1:
resolution: {integrity: sha512-JdgRRUVrN0Y2GosA0M68DEbKlXMqJ7FQgsK8CjQD2vxvNSqAU6PZEpi4cfcTVtfM2GVOMjHo7GKKLbXxOBqDqA==}
peerDependencies:
@@ -9939,11 +9987,6 @@ packages:
typescript:
optional: true
- vuex@4.1.0:
- resolution: {integrity: sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==}
- peerDependencies:
- vue: ^3.2.0
-
w3c-xmlserializer@5.0.0:
resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
engines: {node: '>=18'}
@@ -10256,11 +10299,6 @@ packages:
engines: {node: '>= 14'}
hasBin: true
- yaml@2.7.1:
- resolution: {integrity: sha512-10ULxpnOCQXxJvBgxsn9ptjq6uviG/htZKk9veJGhlqn3w/DxQ631zFF+nlQXLwmImeS5amR2dl2U8sg6U9jsQ==}
- engines: {node: '>= 14'}
- hasBin: true
-
yaml@2.8.0:
resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==}
engines: {node: '>= 14.6'}
@@ -12698,7 +12736,7 @@ snapshots:
'@es-joy/jsdoccomment@0.50.2':
dependencies:
'@types/estree': 1.0.7
- '@typescript-eslint/types': 8.32.0
+ '@typescript-eslint/types': 8.38.0
comment-parser: 1.4.1
esquery: 1.6.0
jsdoc-type-pratt-parser: 4.1.0
@@ -12989,26 +13027,41 @@ snapshots:
dependencies:
fast-deep-equal: 3.1.3
- '@floating-ui/core@1.6.9':
+ '@floating-ui/core@1.7.2':
dependencies:
- '@floating-ui/utils': 0.2.9
+ '@floating-ui/utils': 0.2.10
- '@floating-ui/dom@1.6.13':
+ '@floating-ui/dom@1.7.2':
dependencies:
- '@floating-ui/core': 1.6.9
+ '@floating-ui/core': 1.7.2
+ '@floating-ui/utils': 0.2.10
+
+ '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@floating-ui/dom': 1.7.2
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@floating-ui/react@0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@floating-ui/utils': 0.2.9
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ tabbable: 6.2.0
+
+ '@floating-ui/react@0.27.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@floating-ui/utils': 0.2.10
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ tabbable: 6.2.0
+
+ '@floating-ui/utils@0.2.10': {}
'@floating-ui/utils@0.2.9': {}
- '@floating-ui/vue@1.1.6(vue@3.5.13(typescript@5.7.3))':
- dependencies:
- '@floating-ui/dom': 1.6.13
- '@floating-ui/utils': 0.2.9
- vue-demi: 0.14.10(vue@3.5.13(typescript@5.7.3))
- transitivePeerDependencies:
- - '@vue/composition-api'
- - vue
-
'@gerrit0/mini-shiki@1.27.2':
dependencies:
'@shikijs/engine-oniguruma': 1.29.2
@@ -13021,25 +13074,20 @@ snapshots:
dependencies:
'@hapi/hoek': 9.3.0
- '@headlessui-float/vue@0.14.4(@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))':
+ '@headlessui/react@2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
- '@floating-ui/core': 1.6.9
- '@floating-ui/dom': 1.6.13
- '@floating-ui/vue': 1.1.6(vue@3.5.13(typescript@5.7.3))
- '@headlessui/vue': 1.7.23(vue@3.5.13(typescript@5.7.3))
- vue: 3.5.13(typescript@5.7.3)
- transitivePeerDependencies:
- - '@vue/composition-api'
+ '@floating-ui/react': 0.26.28(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-aria/focus': 3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@tanstack/react-virtual': 3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ use-sync-external-store: 1.5.0(react@19.1.0)
'@headlessui/tailwindcss@0.2.2(tailwindcss@3.4.17)':
dependencies:
tailwindcss: 3.4.17
- '@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3))':
- dependencies:
- '@tanstack/vue-virtual': 3.13.0(vue@3.5.13(typescript@5.7.3))
- vue: 3.5.13(typescript@5.7.3)
-
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
@@ -13453,6 +13501,55 @@ snapshots:
'@polka/url@1.0.0-next.28': {}
+ '@react-aria/focus@3.21.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-aria/interactions': 3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-aria/utils': 3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-types/shared': 3.31.0(react@19.1.0)
+ '@swc/helpers': 0.5.17
+ clsx: 2.1.1
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@react-aria/interactions@3.25.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.1.0)
+ '@react-aria/utils': 3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@react-stately/flags': 3.1.2
+ '@react-types/shared': 3.31.0(react@19.1.0)
+ '@swc/helpers': 0.5.17
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@react-aria/ssr@3.9.10(react@19.1.0)':
+ dependencies:
+ '@swc/helpers': 0.5.17
+ react: 19.1.0
+
+ '@react-aria/utils@3.30.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
+ dependencies:
+ '@react-aria/ssr': 3.9.10(react@19.1.0)
+ '@react-stately/flags': 3.1.2
+ '@react-stately/utils': 3.10.8(react@19.1.0)
+ '@react-types/shared': 3.31.0(react@19.1.0)
+ '@swc/helpers': 0.5.17
+ clsx: 2.1.1
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@react-stately/flags@3.1.2':
+ dependencies:
+ '@swc/helpers': 0.5.17
+
+ '@react-stately/utils@3.10.8(react@19.1.0)':
+ dependencies:
+ '@swc/helpers': 0.5.17
+ react: 19.1.0
+
+ '@react-types/shared@3.31.0(react@19.1.0)':
+ dependencies:
+ react: 19.1.0
+
'@rolldown/pluginutils@1.0.0-beta.19': {}
'@rollup/plugin-babel@5.3.1(@babel/core@7.28.0)(@types/babel__core@7.20.5)(rollup@2.79.2)':
@@ -13718,16 +13815,21 @@ snapshots:
magic-string: 0.25.9
string.prototype.matchall: 4.0.12
+ '@swc/helpers@0.5.17':
+ dependencies:
+ tslib: 2.8.1
+
'@szmarczak/http-timer@4.0.6':
dependencies:
defer-to-connect: 2.0.1
- '@tanstack/virtual-core@3.13.0': {}
-
- '@tanstack/vue-virtual@3.13.0(vue@3.5.13(typescript@5.7.3))':
+ '@tanstack/react-virtual@3.13.12(react-dom@19.1.0(react@19.1.0))(react@19.1.0)':
dependencies:
- '@tanstack/virtual-core': 3.13.0
- vue: 3.5.13(typescript@5.7.3)
+ '@tanstack/virtual-core': 3.13.12
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+
+ '@tanstack/virtual-core@3.13.12': {}
'@tootallnate/once@2.0.0': {}
@@ -13736,8 +13838,6 @@ snapshots:
tslib: 2.8.1
optional: true
- '@types/assert@1.5.11': {}
-
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.27.2
@@ -14064,10 +14164,6 @@ snapshots:
'@types/qs@6.9.16': {}
- '@types/ramda@0.28.25':
- dependencies:
- ts-toolbelt: 6.15.5
-
'@types/range-parser@1.2.7': {}
'@types/resolve@1.20.2': {}
@@ -14183,11 +14279,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.32.0':
- dependencies:
- '@typescript-eslint/types': 8.32.0
- '@typescript-eslint/visitor-keys': 8.32.0
-
'@typescript-eslint/scope-manager@8.38.0':
dependencies:
'@typescript-eslint/types': 8.38.0
@@ -14211,8 +14302,6 @@ snapshots:
'@typescript-eslint/types@7.18.0': {}
- '@typescript-eslint/types@8.32.0': {}
-
'@typescript-eslint/types@8.38.0': {}
'@typescript-eslint/typescript-estree@7.18.0(typescript@5.7.3)':
@@ -14230,20 +14319,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.32.0(typescript@5.7.3)':
- dependencies:
- '@typescript-eslint/types': 8.32.0
- '@typescript-eslint/visitor-keys': 8.32.0
- debug: 4.4.1(supports-color@8.1.1)
- fast-glob: 3.3.3
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.7.2
- ts-api-utils: 2.1.0(typescript@5.7.3)
- typescript: 5.7.3
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/typescript-estree@8.38.0(typescript@5.7.3)':
dependencies:
'@typescript-eslint/project-service': 8.38.0(typescript@5.7.3)
@@ -14260,17 +14335,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2))
- '@typescript-eslint/scope-manager': 8.32.0
- '@typescript-eslint/types': 8.32.0
- '@typescript-eslint/typescript-estree': 8.32.0(typescript@5.7.3)
- eslint: 9.26.0(jiti@2.4.2)
- typescript: 5.7.3
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/utils@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.7.0(eslint@9.26.0(jiti@2.4.2))
@@ -14287,11 +14351,6 @@ snapshots:
'@typescript-eslint/types': 7.18.0
eslint-visitor-keys: 3.4.3
- '@typescript-eslint/visitor-keys@8.32.0':
- dependencies:
- '@typescript-eslint/types': 8.32.0
- eslint-visitor-keys: 4.2.0
-
'@typescript-eslint/visitor-keys@8.38.0':
dependencies:
'@typescript-eslint/types': 8.38.0
@@ -14587,13 +14646,6 @@ snapshots:
loupe: 3.1.3
tinyrainbow: 2.0.0
- '@vue/compat@3.5.13(vue@3.5.13(typescript@5.7.3))':
- dependencies:
- '@babel/parser': 7.27.2
- estree-walker: 2.0.2
- source-map-js: 1.2.1
- vue: 3.5.13(typescript@5.7.3)
-
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.27.2
@@ -14624,8 +14676,6 @@ snapshots:
'@vue/compiler-dom': 3.5.13
'@vue/shared': 3.5.13
- '@vue/devtools-api@6.6.4': {}
-
'@vue/devtools-api@7.7.2':
dependencies:
'@vue/devtools-kit': 7.7.2
@@ -14842,33 +14892,32 @@ snapshots:
'@xtuc/long@4.2.2': {}
- '@zenuml/core@3.31.1(typescript@5.7.3)':
+ '@zenuml/core@3.35.2':
dependencies:
- '@headlessui-float/vue': 0.14.4(@headlessui/vue@1.7.23(vue@3.5.13(typescript@5.7.3)))(vue@3.5.13(typescript@5.7.3))
+ '@floating-ui/react': 0.27.14(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
+ '@headlessui/react': 2.2.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0)
'@headlessui/tailwindcss': 0.2.2(tailwindcss@3.4.17)
- '@headlessui/vue': 1.7.23(vue@3.5.13(typescript@5.7.3))
- '@types/assert': 1.5.11
- '@types/ramda': 0.28.25
- '@vue/compat': 3.5.13(vue@3.5.13(typescript@5.7.3))
antlr4: 4.11.0
- color-string: 1.9.1
- dom-to-image-more: 2.16.0
+ class-variance-authority: 0.7.1
+ clsx: 2.1.1
+ color-string: 2.0.1
dompurify: 3.2.5
- file-saver: 2.0.5
highlight.js: 10.7.3
html-to-image: 1.11.13
- lodash: 4.17.21
+ immer: 10.1.1
+ jotai: 2.12.5(react@19.1.0)
marked: 4.3.0
+ pako: 2.1.0
pino: 8.21.0
- postcss: 8.5.3
+ radash: 12.1.1
ramda: 0.28.0
+ react: 19.1.0
+ react-dom: 19.1.0(react@19.1.0)
+ tailwind-merge: 3.3.1
tailwindcss: 3.4.17
- vue: 3.5.13(typescript@5.7.3)
- vuex: 4.1.0(vue@3.5.13(typescript@5.7.3))
transitivePeerDependencies:
- - '@vue/composition-api'
+ - '@types/react'
- ts-node
- - typescript
JSONSelect@0.4.0: {}
@@ -15543,6 +15592,10 @@ snapshots:
dependencies:
ansi-colors: 4.1.3
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
clean-regexp@1.0.0:
dependencies:
escape-string-regexp: 1.0.5
@@ -15609,6 +15662,8 @@ snapshots:
clone@1.0.4:
optional: true
+ clsx@2.1.1: {}
+
co@4.6.0: {}
collect-v8-coverage@1.0.2: {}
@@ -15625,11 +15680,17 @@ snapshots:
color-name@1.1.4: {}
+ color-name@2.0.0: {}
+
color-string@1.9.1:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
+ color-string@2.0.1:
+ dependencies:
+ color-name: 2.0.0
+
color@4.2.3:
dependencies:
color-convert: 2.0.1
@@ -16498,8 +16559,6 @@ snapshots:
domhandler: 5.0.3
entities: 4.5.0
- dom-to-image-more@2.16.0: {}
-
domelementtype@2.3.0: {}
domhandler@5.0.3:
@@ -16819,7 +16878,7 @@ snapshots:
eslint-plugin-jest@28.14.0(@typescript-eslint/eslint-plugin@8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(jest@30.0.4(@types/node@22.13.5))(typescript@5.7.3):
dependencies:
- '@typescript-eslint/utils': 8.32.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
+ '@typescript-eslint/utils': 8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
eslint: 9.26.0(jiti@2.4.2)
optionalDependencies:
'@typescript-eslint/eslint-plugin': 8.38.0(@typescript-eslint/parser@8.38.0(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3))(eslint@9.26.0(jiti@2.4.2))(typescript@5.7.3)
@@ -17282,8 +17341,6 @@ snapshots:
dependencies:
flat-cache: 5.0.0
- file-saver@2.0.5: {}
-
filelist@1.0.4:
dependencies:
minimatch: 5.1.6
@@ -17934,6 +17991,8 @@ snapshots:
ignore@7.0.3: {}
+ immer@10.1.1: {}
+
import-fresh@3.3.1:
dependencies:
parent-module: 1.0.1
@@ -18636,6 +18695,10 @@ snapshots:
'@sideway/formula': 3.0.1
'@sideway/pinpoint': 2.0.0
+ jotai@2.12.5(react@19.1.0):
+ optionalDependencies:
+ react: 19.1.0
+
jpeg-js@0.4.4: {}
js-base64@3.7.7: {}
@@ -19812,6 +19875,8 @@ snapshots:
pako@1.0.11: {}
+ pako@2.1.0: {}
+
parent-module@1.0.1:
dependencies:
callsites: 3.1.0
@@ -19956,8 +20021,6 @@ snapshots:
sonic-boom: 4.2.0
thread-stream: 3.1.0
- pirates@4.0.6: {}
-
pirates@4.0.7: {}
pixelmatch@5.3.0:
@@ -20007,28 +20070,28 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss-import@15.1.0(postcss@8.5.3):
+ postcss-import@15.1.0(postcss@8.5.6):
dependencies:
- postcss: 8.5.3
+ postcss: 8.5.6
postcss-value-parser: 4.2.0
read-cache: 1.0.0
resolve: 1.22.10
- postcss-js@4.0.1(postcss@8.5.3):
+ postcss-js@4.0.1(postcss@8.5.6):
dependencies:
camelcase-css: 2.0.1
- postcss: 8.5.3
+ postcss: 8.5.6
- postcss-load-config@4.0.2(postcss@8.5.3):
+ postcss-load-config@4.0.2(postcss@8.5.6):
dependencies:
lilconfig: 3.1.3
- yaml: 2.7.1
+ yaml: 2.8.0
optionalDependencies:
- postcss: 8.5.3
+ postcss: 8.5.6
- postcss-nested@6.2.0(postcss@8.5.3):
+ postcss-nested@6.2.0(postcss@8.5.6):
dependencies:
- postcss: 8.5.3
+ postcss: 8.5.6
postcss-selector-parser: 6.1.2
postcss-selector-parser@6.1.2:
@@ -20173,6 +20236,8 @@ snapshots:
quote-unquote@1.0.0: {}
+ radash@12.1.1: {}
+
railroad-diagrams@1.0.0: {}
ramda@0.28.0: {}
@@ -20206,8 +20271,15 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
+ react-dom@19.1.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+ scheduler: 0.26.0
+
react-is@18.3.1: {}
+ react@19.1.0: {}
+
read-cache@1.0.0:
dependencies:
pify: 2.3.0
@@ -20576,6 +20648,8 @@ snapshots:
dependencies:
xmlchars: 2.2.0
+ scheduler@0.26.0: {}
+
schema-utils@3.3.0:
dependencies:
'@types/json-schema': 7.0.15
@@ -21140,12 +21214,12 @@ snapshots:
sucrase@3.35.0:
dependencies:
- '@jridgewell/gen-mapping': 0.3.8
+ '@jridgewell/gen-mapping': 0.3.12
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
mz: 2.7.0
- pirates: 4.0.6
+ pirates: 4.0.7
ts-interface-checker: 0.1.13
superjson@2.2.2:
@@ -21176,6 +21250,8 @@ snapshots:
tabbable@6.2.0: {}
+ tailwind-merge@3.3.1: {}
+
tailwindcss@3.4.17:
dependencies:
'@alloc/quick-lru': 5.2.0
@@ -21192,11 +21268,11 @@ snapshots:
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.1.1
- postcss: 8.5.3
- postcss-import: 15.1.0(postcss@8.5.3)
- postcss-js: 4.0.1(postcss@8.5.3)
- postcss-load-config: 4.0.2(postcss@8.5.3)
- postcss-nested: 6.2.0(postcss@8.5.3)
+ postcss: 8.5.6
+ postcss-import: 15.1.0(postcss@8.5.6)
+ postcss-js: 4.0.1(postcss@8.5.6)
+ postcss-load-config: 4.0.2(postcss@8.5.6)
+ postcss-nested: 6.2.0(postcss@8.5.6)
postcss-selector-parser: 6.1.2
resolve: 1.22.10
sucrase: 3.35.0
@@ -21395,8 +21471,6 @@ snapshots:
ts-interface-checker@0.1.13: {}
- ts-toolbelt@6.15.5: {}
-
tsconfig-paths@4.2.0:
dependencies:
json5: 2.2.3
@@ -21714,6 +21788,10 @@ snapshots:
dependencies:
punycode: 2.3.1
+ use-sync-external-store@1.5.0(react@19.1.0):
+ dependencies:
+ react: 19.1.0
+
util-deprecate@1.0.2: {}
utils-merge@1.0.1: {}
@@ -21973,10 +22051,6 @@ snapshots:
vscode-uri@3.1.0: {}
- vue-demi@0.14.10(vue@3.5.13(typescript@5.7.3)):
- dependencies:
- vue: 3.5.13(typescript@5.7.3)
-
vue-flow-layout@0.1.1(vue@3.5.13(typescript@5.7.3)):
dependencies:
vue: 3.5.13(typescript@5.7.3)
@@ -21991,11 +22065,6 @@ snapshots:
optionalDependencies:
typescript: 5.7.3
- vuex@4.1.0(vue@3.5.13(typescript@5.7.3)):
- dependencies:
- '@vue/devtools-api': 6.6.4
- vue: 3.5.13(typescript@5.7.3)
-
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
@@ -22475,8 +22544,6 @@ snapshots:
yaml@2.7.0: {}
- yaml@2.7.1: {}
-
yaml@2.8.0: {}
yargs-parser@18.1.3: