CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/npm-vue-flow--minimap

Vue Flow minimap component that provides an overview of the graph and enables navigation within complex flow diagrams

Pending
Overview
Eval results
Files

Vue Flow MiniMap

Vue Flow MiniMap is a Vue 3 component that provides a bird's-eye view of large flow diagrams, enabling users to navigate complex node graphs efficiently. It displays a scaled-down representation of the entire flow with a viewport indicator showing the currently visible area, supporting both visual overview and direct navigation through clicking or dragging within the minimap.

Package Information

  • Package Name: @vue-flow/minimap
  • Package Type: npm
  • Language: TypeScript
  • Installation: npm install @vue-flow/minimap

Core Imports

import { MiniMap, MiniMapNode } from "@vue-flow/minimap";
import type { 
  MiniMapProps, MiniMapNodeProps, MiniMapEmits, MiniMapNodeEmits,
  MiniMapSlots, MiniMapNodeFunc, ShapeRendering 
} from "@vue-flow/minimap";

For CommonJS:

const { MiniMap, MiniMapNode } = require("@vue-flow/minimap");

Basic Usage

<script setup>
import { VueFlow } from '@vue-flow/core'
import { MiniMap } from '@vue-flow/minimap'

// Import default minimap styles
import '@vue-flow/minimap/dist/style.css'

const elements = ref([
  { id: '1', type: 'input', data: { label: 'Node 1' }, position: { x: 100, y: 100 } },
  { id: '2', data: { label: 'Node 2' }, position: { x: 300, y: 200 } },
])
</script>

<template>
  <VueFlow v-model="elements" class="vue-flow-basic-example">
    <MiniMap 
      :nodeColor="'#e2e2e2'"
      :nodeStrokeColor="'transparent'"
      :pannable="true"
      :zoomable="true"
      position="bottom-right"
    />
  </VueFlow>
</template>

Architecture

Vue Flow MiniMap is built around several key components:

  • MiniMap Component: Main minimap component that renders the overview and handles user interactions
  • MiniMapNode Component: Individual node representation within the minimap, supports custom rendering via slots
  • D3 Integration: Uses d3-zoom and d3-selection for smooth pan/zoom interactions
  • Vue Flow Integration: Connects to Vue Flow's core state management and viewport system
  • Responsive Design: Automatically scales and positions based on the flow's bounding box

Capabilities

MiniMap Component

Main Vue component that renders the minimap overview with navigation capabilities.

/**
 * Vue Flow minimap component providing overview and navigation
 */
interface MiniMapComponent {
  props: MiniMapProps;
  emits: MiniMapEmits;
  slots: MiniMapSlots;
}

interface MiniMapProps {
  /** Node color, can be either a string or a string func that receives the current node */
  nodeColor?: string | MiniMapNodeFunc;
  /** Node stroke color, can be either a string or a string func that receives the current node */
  nodeStrokeColor?: string | MiniMapNodeFunc;
  /** Additional node class name, can be either a string or a string func that receives the current node */
  nodeClassName?: string | MiniMapNodeFunc;
  /** Node border radius */
  nodeBorderRadius?: number;
  /** Node stroke width */
  nodeStrokeWidth?: number;
  /** Background color of minimap mask */
  maskColor?: string;
  /** Border color of minimap mask */
  maskStrokeColor?: string;
  /** Border width of minimap mask */
  maskStrokeWidth?: number;
  /** Position of the minimap */
  position?: PanelPositionType | PanelPosition;
  /** Enable drag minimap to drag viewport */
  pannable?: boolean;
  /** Enable zoom minimap to zoom viewport */
  zoomable?: boolean;
  /** Width of minimap */
  width?: number;
  /** Height of minimap */
  height?: number;
  /** ARIA label for accessibility */
  ariaLabel?: string | null;
  /** Enable inverse panning, i.e. drag minimap to move viewport in opposite direction */
  inversePan?: boolean;
  /** Specify zoom step */
  zoomStep?: number;
  /** Specify minimap scale */
  offsetScale?: number;
  /** Mask border radius */
  maskBorderRadius?: number;
}

interface MiniMapEmits {
  /** Emitted when minimap is clicked */
  (event: 'click', params: { event: MouseEvent; position: { x: number; y: number } }): void;
  /** Emitted when a node in the minimap is clicked */
  (event: 'nodeClick', params: NodeMouseEvent): void;
  /** Emitted when a node in the minimap is double-clicked */
  (event: 'nodeDblclick', params: NodeMouseEvent): void;
  /** Emitted when mouse enters a node in the minimap */
  (event: 'nodeMouseenter', params: NodeMouseEvent): void;
  /** Emitted when mouse moves over a node in the minimap */
  (event: 'nodeMousemove', params: NodeMouseEvent): void;
  /** Emitted when mouse leaves a node in the minimap */
  (event: 'nodeMouseleave', params: NodeMouseEvent): void;
}

interface MiniMapSlots extends Record<`node-${string}`, (nodeProps: MiniMapNodeProps) => any> {}

Default Values:

// Default prop values from the component
const defaultProps = {
  nodeColor: '#e2e2e2',
  nodeStrokeColor: 'transparent',
  nodeBorderRadius: 5,
  nodeStrokeWidth: 2,
  maskColor: 'rgb(240, 240, 240, 0.6)',
  position: 'bottom-right',
  maskStrokeColor: 'none',
  maskStrokeWidth: 1,
  maskBorderRadius: 0,
  pannable: false,
  zoomable: false,
  ariaLabel: 'Vue Flow mini map',
  inversePan: false,
  zoomStep: 1,
  offsetScale: 5
};

Usage Examples:

<!-- Basic minimap -->
<MiniMap />

<!-- Customized minimap with styling -->
<MiniMap 
  :nodeColor="(node) => node.selected ? '#ff6b6b' : '#e2e2e2'"
  :nodeStrokeColor="'#333'"
  :nodeStrokeWidth="2"
  :nodeBorderRadius="8"
  :maskColor="'rgba(240, 240, 240, 0.8)'"
  position="top-left"
  :pannable="true"
  :zoomable="true"
  :width="250"
  :height="180"
/>

<!-- With event handlers -->
<MiniMap 
  @nodeClick="handleNodeClick"
  @click="handleMinimapClick"
/>

MiniMapNode Component

Individual node representation within the minimap, supports custom rendering via slots.

/**
 * Vue component representing individual nodes in the minimap
 */
interface MiniMapNodeComponent {
  props: MiniMapNodeProps;
  emits: MiniMapNodeEmits;
}

interface MiniMapNodeProps {
  /** Node identifier */
  id: string;
  /** Node type */
  type: string;
  /** Whether node is selected */
  selected?: boolean;
  /** Whether node is being dragged */
  dragging?: boolean;
  /** Node position coordinates */
  position: XYPosition;
  /** Node dimensions */
  dimensions: Dimensions;
  /** Border radius */
  borderRadius?: number;
  /** Node color */
  color?: string;
  /** Shape rendering mode */
  shapeRendering?: ShapeRendering;
  /** Stroke color */
  strokeColor?: string;
  /** Stroke width */
  strokeWidth?: number;
  /** Whether node is hidden */
  hidden?: boolean;
}

interface MiniMapNodeEmits {
  /** Emitted when node is clicked */
  (event: 'click', params: MouseEvent): void;
  /** Emitted when node is double-clicked */
  (event: 'dblclick', params: MouseEvent): void;
  /** Emitted when mouse enters node */
  (event: 'mouseenter', params: MouseEvent): void;
  /** Emitted when mouse moves over node */
  (event: 'mousemove', params: MouseEvent): void;
  /** Emitted when mouse leaves node */
  (event: 'mouseleave', params: MouseEvent): void;
}

Usage Examples:

<!-- Custom node rendering via slots -->
<MiniMap>
  <template #node-custom="nodeProps">
    <circle
      :cx="nodeProps.position.x + nodeProps.dimensions.width / 2"
      :cy="nodeProps.position.y + nodeProps.dimensions.height / 2"
      :r="Math.min(nodeProps.dimensions.width, nodeProps.dimensions.height) / 2"
      :fill="nodeProps.color"
      :stroke="nodeProps.strokeColor"
      :stroke-width="nodeProps.strokeWidth"
    />
  </template>
</MiniMap>

Node Color Functions

Functions that determine node colors based on node properties.

/**
 * Function that receives a node and returns a color value
 */
type MiniMapNodeFunc = (node: GraphNode) => string;

Usage Examples:

// Color nodes based on type
const nodeColorFunc: MiniMapNodeFunc = (node) => {
  switch (node.type) {
    case 'input': return '#4CAF50';
    case 'output': return '#f44336';
    case 'process': return '#2196F3';
    default: return '#e2e2e2';
  }
};

// Color nodes based on selection state
const selectionColorFunc: MiniMapNodeFunc = (node) => 
  node.selected ? '#ff6b6b' : '#e2e2e2';

Types

/** Vue Flow core types used by minimap */
interface XYPosition {
  x: number;
  y: number;
}

interface Dimensions {
  width: number;
  height: number;
}

interface GraphNode {
  id: string;
  type: string;
  selected?: boolean;
  dragging?: boolean;
  hidden?: boolean;
  position: XYPosition;
  dimensions: Dimensions;
  style?: CSSProperties;
  data?: any;
}

interface NodeMouseEvent {
  event: MouseEvent;
  node: GraphNode;
  connectedEdges: Edge[];
}

interface Edge<Data = any, CustomEvents = any, Type extends string = string> {
  /** Unique edge id */
  id: string;
  /** Edge source node id */
  source: string;
  /** Edge target node id */
  target: string;
  /** Source handle id */
  sourceHandle?: string | null;
  /** Target handle id */
  targetHandle?: string | null;
  /** Edge type */
  type?: Type;
  /** Edge label */
  label?: string;
  /** Animated edge */
  animated?: boolean;
  /** Whether edge is selected */
  selected?: boolean;
  /** Whether edge is hidden */
  hidden?: boolean;
  /** Additional edge data */
  data?: Data;
}

/** Panel positioning types */
type PanelPositionType = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';

interface PanelPosition {
  x: number;
  y: number;
}

/** SVG shape rendering mode */
type ShapeRendering = CSSProperties['shapeRendering'];

/** Vue injection key for minimap slots */
const Slots: InjectionKey<MiniMapSlots>;

CSS Styling

The minimap includes default CSS classes for styling:

/* Import default styles */
@import '@vue-flow/minimap/dist/style.css';

/* Available CSS classes */
.vue-flow__minimap {
  /* Main minimap container */
}

.vue-flow__minimap.pannable {
  /* Minimap when pannable is enabled */
  cursor: grab;
}

.vue-flow__minimap.zoomable {
  /* Minimap when zoomable is enabled */
}

.vue-flow__minimap-node {
  /* Individual minimap node */
}

.vue-flow__minimap-node.selected {
  /* Selected minimap node */
}

.vue-flow__minimap-node.dragging {
  /* Dragging minimap node */
}

.vue-flow__minimap-mask {
  /* Viewport mask overlay */
}

Error Handling

The minimap component handles common edge cases gracefully:

  • No nodes: Displays empty minimap when no nodes are present
  • Hidden nodes: Automatically excludes hidden nodes from minimap calculations
  • Zero dimensions: Skips rendering nodes with zero width or height
  • Invalid positions: Uses fallback positioning for nodes with invalid coordinates

Browser Compatibility

  • Chrome/Chromium: Full support, automatically uses crispEdges shape rendering for optimal performance
  • Firefox/Safari: Full support, automatically uses geometricPrecision shape rendering for better quality
  • IE/Edge Legacy: Requires Vue 3 compatibility mode
  • Mobile browsers: Touch interaction support for pan and zoom gestures

Shape Rendering: The component automatically selects the optimal shape rendering mode based on the browser:

  • Chrome-based browsers: crispEdges for sharp, pixelated rendering
  • Other browsers: geometricPrecision for smooth, anti-aliased rendering

Install with Tessl CLI

npx tessl i tessl/npm-vue-flow--minimap
Workspace
tessl
Visibility
Public
Created
Last updated
Describes
npmpkg:npm/@vue-flow/minimap@1.5.x