UNPKG

@ichigo_san/graphing

Version:

A lightweight UML-style diagram editor built with React Flow and Tailwind CSS

2,084 lines (2,081 loc) 88.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.searchShapes = exports.getShapesByCategory = exports.getShapeDefinition = exports.getAllCategories = exports.SHAPE_DEFINITIONS = exports.SHAPE_CATEGORIES = void 0; /** * Shape Library Definitions * Comprehensive shape definitions for the shape library system */ const SHAPE_DEFINITIONS = exports.SHAPE_DEFINITIONS = { // =================== BASIC SHAPES =================== 'basic-rectangle': { id: 'basic-rectangle', name: 'Rectangle', category: 'basic', tags: ['box', 'container', 'basic', 'rectangle'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2, borderRadius: '4px' }, icon: '⬜' }, 'basic-circle': { id: 'basic-circle', name: 'Circle', category: 'basic', tags: ['circle', 'round', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2, borderRadius: '50%' }, icon: '⭕' }, 'basic-triangle': { id: 'basic-triangle', name: 'Triangle', category: 'basic', tags: ['triangle', 'arrow', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L70,60 L10,60 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '🔺' }, 'basic-diamond': { id: 'basic-diamond', name: 'Diamond', category: 'basic', tags: ['diamond', 'decision', 'basic'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M50,10 L90,40 L50,70 L10,40 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '♦️' }, 'basic-hexagon': { id: 'basic-hexagon', name: 'Hexagon', category: 'basic', tags: ['hexagon', 'six-sided', 'basic'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M25,10 L75,10 L90,40 L75,70 L25,70 L10,40 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬢' }, 'basic-oval': { id: 'basic-oval', name: 'Oval', category: 'basic', tags: ['oval', 'ellipse', 'basic'], defaultSize: { width: 120, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2, borderRadius: '50%' }, icon: '⭕' }, 'basic-pentagon': { id: 'basic-pentagon', name: 'Pentagon', category: 'basic', tags: ['pentagon', 'five-sided', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L70,30 L60,65 L20,65 L10,30 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬟' }, 'basic-octagon': { id: 'basic-octagon', name: 'Octagon', category: 'basic', tags: ['octagon', 'eight-sided', 'basic', 'stop'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M25,10 L55,10 L70,25 L70,55 L55,70 L25,70 L10,55 L10,25 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬟' }, 'basic-star': { id: 'basic-star', name: 'Star', category: 'basic', tags: ['star', 'favorite', 'rating', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L47,27 L65,27 L52,38 L58,55 L40,45 L22,55 L28,38 L15,27 L33,27 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⭐' }, 'basic-heart': { id: 'basic-heart', name: 'Heart', category: 'basic', tags: ['heart', 'love', 'favorite', 'basic'], defaultSize: { width: 80, height: 70 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,60 C32,45 10,35 10,20 Q10,5 25,5 Q40,5 40,20 Q40,5 55,5 Q70,5 70,20 C70,35 48,45 40,60 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '♥️' }, 'basic-arrow-right': { id: 'basic-arrow-right', name: 'Arrow Right', category: 'basic', tags: ['arrow', 'right', 'direction', 'basic'], defaultSize: { width: 100, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,20 L60,20 L60,10 L90,30 L60,50 L60,40 L10,40 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '➡️' }, 'basic-arrow-left': { id: 'basic-arrow-left', name: 'Arrow Left', category: 'basic', tags: ['arrow', 'left', 'direction', 'basic'], defaultSize: { width: 100, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M90,20 L40,20 L40,10 L10,30 L40,50 L40,40 L90,40 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬅️' }, 'basic-arrow-up': { id: 'basic-arrow-up', name: 'Arrow Up', category: 'basic', tags: ['arrow', 'up', 'direction', 'basic'], defaultSize: { width: 60, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,90 L20,40 L10,40 L30,10 L50,40 L40,40 L40,90 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬆️' }, 'basic-arrow-down': { id: 'basic-arrow-down', name: 'Arrow Down', category: 'basic', tags: ['arrow', 'down', 'direction', 'basic'], defaultSize: { width: 60, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L20,60 L10,60 L30,90 L50,60 L40,60 L40,10 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬇️' }, 'basic-arrow-double': { id: 'basic-arrow-double', name: 'Double Arrow', category: 'basic', tags: ['arrow', 'double', 'bidirectional', 'basic'], defaultSize: { width: 120, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,30 L25,15 L25,25 L95,25 L95,15 L110,30 L95,45 L95,35 L25,35 L25,45 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '↔️' }, 'basic-cross': { id: 'basic-cross', name: 'Cross', category: 'basic', tags: ['cross', 'plus', 'medical', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M30,10 L50,10 L50,30 L70,30 L70,50 L50,50 L50,70 L30,70 L30,50 L10,50 L10,30 L30,30 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '➕' }, 'basic-plus': { id: 'basic-plus', name: 'Plus', category: 'basic', tags: ['plus', 'add', 'positive', 'basic'], defaultSize: { width: 60, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M25,10 L35,10 L35,25 L50,25 L50,35 L35,35 L35,50 L25,50 L25,35 L10,35 L10,25 L25,25 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '✚' }, 'basic-minus': { id: 'basic-minus', name: 'Minus', category: 'basic', tags: ['minus', 'subtract', 'negative', 'basic'], defaultSize: { width: 60, height: 20 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,5 L50,5 L50,15 L10,15 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '➖' }, 'basic-parallelogram': { id: 'basic-parallelogram', name: 'Parallelogram', category: 'basic', tags: ['parallelogram', 'slant', 'basic'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L100,10 L80,70 L0,70 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '▱' }, 'basic-trapezoid': { id: 'basic-trapezoid', name: 'Trapezoid', category: 'basic', tags: ['trapezoid', 'basic'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M30,10 L70,10 L90,70 L10,70 Z', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '⬢' }, 'basic-cylinder': { id: 'basic-cylinder', name: 'Cylinder', category: 'basic', tags: ['cylinder', '3d', 'database', 'basic'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,20 Q10,10 40,10 Q70,10 70,20 L70,80 Q70,90 40,90 Q10,90 10,80 Z M10,20 Q10,30 40,30 Q70,30 70,20', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '🗄️' }, 'basic-cube': { id: 'basic-cube', name: 'Cube', category: 'basic', tags: ['cube', '3d', 'box', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,25 L10,65 L50,65 L50,80 L70,60 L70,20 L30,20 L10,25 Z M10,25 L30,5 L70,5 L70,20 M50,65 L70,45 L70,20 M30,20 L30,5', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '🎲' }, 'basic-pyramid': { id: 'basic-pyramid', name: 'Pyramid', category: 'basic', tags: ['pyramid', '3d', 'triangle', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L70,70 L10,70 Z M40,10 L55,70 M40,30 L10,70', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '🔺' }, 'basic-cone': { id: 'basic-cone', name: 'Cone', category: 'basic', tags: ['cone', '3d', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L10,70 Q40,80 70,70 Z M10,70 Q40,60 70,70', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2 }, icon: '🔸' }, 'basic-sphere': { id: 'basic-sphere', name: 'Sphere', category: 'basic', tags: ['sphere', '3d', 'ball', 'basic'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#ffffff', stroke: '#000000', strokeWidth: 2, borderRadius: '50%' }, icon: '🔮' }, // =================== FLOWCHART SHAPES =================== 'flowchart-process': { id: 'flowchart-process', name: 'Process', category: 'flowchart', tags: ['process', 'action', 'step', 'operation'], defaultSize: { width: 140, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '⚙️' }, 'flowchart-decision': { id: 'flowchart-decision', name: 'Decision', category: 'flowchart', tags: ['decision', 'choice', 'condition', 'if'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M60,10 L110,40 L60,70 L10,40 Z', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2 }, icon: '❓' }, 'flowchart-terminator': { id: 'flowchart-terminator', name: 'Start/End', category: 'flowchart', tags: ['start', 'end', 'terminator', 'begin', 'finish'], defaultSize: { width: 120, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M30,10 L90,10 Q110,10 110,30 Q110,50 90,50 L30,50 Q10,50 10,30 Q10,10 30,10 Z', style: { fill: '#e8f5e8', stroke: '#388e3c', strokeWidth: 2 }, icon: '⭕' }, 'flowchart-document': { id: 'flowchart-document', name: 'Document', category: 'flowchart', tags: ['document', 'file', 'paper', 'output'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L110,10 L110,60 Q60,80 10,60 Z', style: { fill: '#fce4ec', stroke: '#c2185b', strokeWidth: 2 }, icon: '📄' }, 'flowchart-data': { id: 'flowchart-data', name: 'Data', category: 'flowchart', tags: ['data', 'input', 'output', 'io'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L100,10 L110,40 L100,70 L20,70 L10,40 Z', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2 }, icon: '📊' }, 'flowchart-connector': { id: 'flowchart-connector', name: 'Connector', category: 'flowchart', tags: ['connector', 'junction', 'flow'], defaultSize: { width: 30, height: 30 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#e8f5e8', stroke: '#388e3c', strokeWidth: 2, borderRadius: '50%' }, icon: '⚪' }, 'flowchart-predefined-process': { id: 'flowchart-predefined-process', name: 'Predefined Process', category: 'flowchart', tags: ['predefined', 'process', 'subroutine'], defaultSize: { width: 140, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L130,10 L130,70 L10,70 Z M20,10 L20,70 M120,10 L120,70', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2 }, icon: '📦' }, 'flowchart-manual-input': { id: 'flowchart-manual-input', name: 'Manual Input', category: 'flowchart', tags: ['manual', 'input', 'keyboard'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,25 L110,10 L110,70 L10,70 Z', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2 }, icon: '⌨️' }, 'flowchart-manual-operation': { id: 'flowchart-manual-operation', name: 'Manual Operation', category: 'flowchart', tags: ['manual', 'operation', 'hand'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L100,10 L110,70 L10,70 Z', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2 }, icon: '✋' }, 'flowchart-preparation': { id: 'flowchart-preparation', name: 'Preparation', category: 'flowchart', tags: ['preparation', 'setup', 'initialize'], defaultSize: { width: 140, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L120,10 L130,40 L120,70 L20,70 L10,40 Z', style: { fill: '#e8f5e8', stroke: '#388e3c', strokeWidth: 2 }, icon: '🛠️' }, 'flowchart-or': { id: 'flowchart-or', name: 'Or', category: 'flowchart', tags: ['or', 'logic', 'junction'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'default', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '50%' }, icon: '∨' }, 'flowchart-sum-junction': { id: 'flowchart-sum-junction', name: 'Sum Junction', category: 'flowchart', tags: ['sum', 'junction', 'merge'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L70,40 L40,70 L10,40 Z M25,25 L55,55 M25,55 L55,25', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2 }, icon: '⊕' }, 'flowchart-database': { id: 'flowchart-database', name: 'Database', category: 'flowchart', tags: ['database', 'storage', 'data'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,20 Q10,10 40,10 Q70,10 70,20 L70,60 Q70,70 40,70 Q10,70 10,60 Z M10,20 Q10,30 40,30 Q70,30 70,20', style: { fill: '#bbdefb', stroke: '#1976d2', strokeWidth: 2 }, icon: '🗄️' }, 'flowchart-internal-storage': { id: 'flowchart-internal-storage', name: 'Internal Storage', category: 'flowchart', tags: ['internal', 'storage', 'memory'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L110,10 L110,70 L10,70 Z M20,10 L20,70 M10,20 L110,20', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2 }, icon: '💾' }, 'flowchart-extract': { id: 'flowchart-extract', name: 'Extract', category: 'flowchart', tags: ['extract', 'separate', 'filter'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M20,10 L80,10 L70,70 L30,70 Z', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2 }, icon: '🔽' }, 'flowchart-merge': { id: 'flowchart-merge', name: 'Merge', category: 'flowchart', tags: ['merge', 'combine', 'join'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M30,10 L70,10 L80,70 L20,70 Z', style: { fill: '#e8f5e8', stroke: '#388e3c', strokeWidth: 2 }, icon: '🔼' }, 'flowchart-sort': { id: 'flowchart-sort', name: 'Sort', category: 'flowchart', tags: ['sort', 'order', 'arrange'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M40,10 L70,40 L40,70 L10,40 Z M25,40 L55,40', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2 }, icon: '🔢' }, 'flowchart-multidocument': { id: 'flowchart-multidocument', name: 'Multiple Documents', category: 'flowchart', tags: ['multiple', 'documents', 'files'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M15,15 L105,15 L105,55 Q65,75 15,55 Z M20,10 L110,10 L110,50 Q70,70 20,50 Z M10,20 L100,20 L100,60 Q60,80 10,60 Z', style: { fill: '#fce4ec', stroke: '#c2185b', strokeWidth: 2 }, icon: '📄' }, 'flowchart-display': { id: 'flowchart-display', name: 'Display', category: 'flowchart', tags: ['display', 'output', 'show'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L100,10 Q120,10 120,40 Q120,70 100,70 L10,70 Z', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2 }, icon: '📺' }, 'flowchart-delay': { id: 'flowchart-delay', name: 'Delay', category: 'flowchart', tags: ['delay', 'wait', 'pause'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L70,10 Q90,10 90,40 Q90,70 70,70 L10,70 Z', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2 }, icon: '⏱️' }, 'flowchart-alternate-process': { id: 'flowchart-alternate-process', name: 'Alternate Process', category: 'flowchart', tags: ['alternate', 'process', 'backup'], defaultSize: { width: 140, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L130,10 L130,70 L10,70 Z M10,10 Q20,0 30,10 M110,10 Q120,0 130,10 M10,70 Q20,80 30,70 M110,70 Q120,80 130,70', style: { fill: '#e8f5e8', stroke: '#388e3c', strokeWidth: 2 }, icon: '⚙️' }, 'flowchart-annotation': { id: 'flowchart-annotation', name: 'Annotation', category: 'flowchart', tags: ['annotation', 'comment', 'note'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,10 L10,70 M10,40 L110,40', style: { fill: 'none', stroke: '#424242', strokeWidth: 2 }, icon: '📝' }, 'flowchart-card': { id: 'flowchart-card', name: 'Card', category: 'flowchart', tags: ['card', 'punch card', 'data'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,25 L25,10 L110,10 L110,70 L10,70 Z', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2 }, icon: '💳' }, 'flowchart-punched-tape': { id: 'flowchart-punched-tape', name: 'Punched Tape', category: 'flowchart', tags: ['punched', 'tape', 'storage'], defaultSize: { width: 120, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,20 Q10,10 20,10 L100,10 Q110,10 110,20 L110,60 Q110,70 100,70 L20,70 Q10,70 10,60 Z', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2 }, icon: '📼' }, 'flowchart-off-page-connector': { id: 'flowchart-off-page-connector', name: 'Off-Page Connector', category: 'flowchart', tags: ['off-page', 'connector', 'reference'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,15 L70,15 L70,45 L55,60 L40,45 L25,60 L10,45 Z', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2 }, icon: '🔗' }, // =================== INFRASTRUCTURE SHAPES =================== 'infra-router': { id: 'infra-router', name: 'Router', category: 'infrastructure', tags: ['router', 'gateway', 'internet', 'wan', 'network'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '📡' }, 'infra-switch': { id: 'infra-switch', name: 'Network Switch', category: 'infrastructure', tags: ['switch', 'network', 'ethernet', 'lan'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '🔌' }, 'infra-firewall': { id: 'infra-firewall', name: 'Firewall', category: 'infrastructure', tags: ['firewall', 'security', 'protection', 'shield'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '8px' }, icon: '🛡️' }, 'infra-load-balancer': { id: 'infra-load-balancer', name: 'Load Balancer', category: 'infrastructure', tags: ['load balancer', 'lb', 'traffic', 'distribution'], defaultSize: { width: 100, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '⚖️' }, 'infra-proxy': { id: 'infra-proxy', name: 'Proxy Server', category: 'infrastructure', tags: ['proxy', 'server', 'intermediary', 'cache'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '🔄' }, 'infra-gateway': { id: 'infra-gateway', name: 'Gateway', category: 'infrastructure', tags: ['gateway', 'network', 'bridge', 'access'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '🚪' }, 'infra-bridge': { id: 'infra-bridge', name: 'Bridge', category: 'infrastructure', tags: ['bridge', 'network', 'connection', 'link'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '🌉' }, 'infra-hub': { id: 'infra-hub', name: 'Hub', category: 'infrastructure', tags: ['hub', 'network', 'concentrator', 'central'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '🔗' }, 'infra-repeater': { id: 'infra-repeater', name: 'Repeater', category: 'infrastructure', tags: ['repeater', 'amplifier', 'signal', 'extender'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '📶' }, 'infra-modem': { id: 'infra-modem', name: 'Modem', category: 'infrastructure', tags: ['modem', 'internet', 'connection', 'isp'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '📞' }, 'infra-wireless-router': { id: 'infra-wireless-router', name: 'Wireless Router', category: 'infrastructure', tags: ['wireless', 'router', 'wifi', 'access point'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '📶' }, 'infra-access-point': { id: 'infra-access-point', name: 'Access Point', category: 'infrastructure', tags: ['access point', 'wifi', 'wireless', 'ap'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '📡' }, 'infra-vpn-concentrator': { id: 'infra-vpn-concentrator', name: 'VPN Concentrator', category: 'infrastructure', tags: ['vpn', 'concentrator', 'security', 'tunnel'], defaultSize: { width: 100, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '4px' }, icon: '🔐' }, 'infra-nat-gateway': { id: 'infra-nat-gateway', name: 'NAT Gateway', category: 'infrastructure', tags: ['nat', 'gateway', 'translation', 'address'], defaultSize: { width: 100, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '🌐' }, 'infra-dns-server': { id: 'infra-dns-server', name: 'DNS Server', category: 'infrastructure', tags: ['dns', 'server', 'domain', 'name'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '🌐' }, 'infra-dhcp-server': { id: 'infra-dhcp-server', name: 'DHCP Server', category: 'infrastructure', tags: ['dhcp', 'server', 'ip', 'address'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '🔢' }, 'infra-radius-server': { id: 'infra-radius-server', name: 'RADIUS Server', category: 'infrastructure', tags: ['radius', 'server', 'authentication', 'aaa'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '4px' }, icon: '🔑' }, 'infra-ntp-server': { id: 'infra-ntp-server', name: 'NTP Server', category: 'infrastructure', tags: ['ntp', 'server', 'time', 'sync'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '🕒' }, 'infra-syslog-server': { id: 'infra-syslog-server', name: 'Syslog Server', category: 'infrastructure', tags: ['syslog', 'server', 'logging', 'audit'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '📋' }, 'infra-monitoring-server': { id: 'infra-monitoring-server', name: 'Monitoring Server', category: 'infrastructure', tags: ['monitoring', 'server', 'metrics', 'alerts'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '📊' }, 'infra-backup-server': { id: 'infra-backup-server', name: 'Backup Server', category: 'infrastructure', tags: ['backup', 'server', 'storage', 'recovery'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '💾' }, 'infra-file-server': { id: 'infra-file-server', name: 'File Server', category: 'infrastructure', tags: ['file', 'server', 'storage', 'nas'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '📁' }, 'infra-web-server': { id: 'infra-web-server', name: 'Web Server', category: 'infrastructure', tags: ['web', 'server', 'http', 'apache', 'nginx'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '🌐' }, 'infra-app-server': { id: 'infra-app-server', name: 'Application Server', category: 'infrastructure', tags: ['application', 'server', 'app', 'middleware'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '4px' }, icon: '⚙️' }, 'infra-mail-server': { id: 'infra-mail-server', name: 'Mail Server', category: 'infrastructure', tags: ['mail', 'server', 'email', 'smtp', 'exchange'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '📧' }, // =================== COMPUTERS SHAPES =================== 'computers-server': { id: 'computers-server', name: 'Server', category: 'computers', tags: ['server', 'computer', 'host', 'machine'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '🖥️' }, 'computers-workstation': { id: 'computers-workstation', name: 'Workstation', category: 'computers', tags: ['workstation', 'desktop', 'computer', 'pc'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '💻' }, 'computers-laptop': { id: 'computers-laptop', name: 'Laptop', category: 'computers', tags: ['laptop', 'notebook', 'portable', 'computer'], defaultSize: { width: 70, height: 50 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '💻' }, 'computers-tablet': { id: 'computers-tablet', name: 'Tablet', category: 'computers', tags: ['tablet', 'mobile', 'device', 'touch'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-mobile': { id: 'computers-mobile', name: 'Mobile Phone', category: 'computers', tags: ['mobile', 'phone', 'smartphone', 'device'], defaultSize: { width: 40, height: 70 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fce4ec', stroke: '#c2185b', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-desktop': { id: 'computers-desktop', name: 'Desktop Computer', category: 'computers', tags: ['desktop', 'pc', 'computer', 'workstation'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '🖥️' }, 'computers-imac': { id: 'computers-imac', name: 'iMac', category: 'computers', tags: ['imac', 'apple', 'mac', 'desktop'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '🖥️' }, 'computers-macbook': { id: 'computers-macbook', name: 'MacBook', category: 'computers', tags: ['macbook', 'apple', 'mac', 'laptop'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '💻' }, 'computers-ipad': { id: 'computers-ipad', name: 'iPad', category: 'computers', tags: ['ipad', 'apple', 'tablet', 'ios'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-iphone': { id: 'computers-iphone', name: 'iPhone', category: 'computers', tags: ['iphone', 'apple', 'smartphone', 'ios'], defaultSize: { width: 40, height: 70 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-android-phone': { id: 'computers-android-phone', name: 'Android Phone', category: 'computers', tags: ['android', 'phone', 'smartphone', 'google'], defaultSize: { width: 40, height: 70 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-android-tablet': { id: 'computers-android-tablet', name: 'Android Tablet', category: 'computers', tags: ['android', 'tablet', 'google', 'device'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '8px' }, icon: '📱' }, 'computers-chromebook': { id: 'computers-chromebook', name: 'Chromebook', category: 'computers', tags: ['chromebook', 'google', 'chrome', 'laptop'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '💻' }, 'computers-surface': { id: 'computers-surface', name: 'Microsoft Surface', category: 'computers', tags: ['surface', 'microsoft', 'tablet', 'laptop'], defaultSize: { width: 70, height: 70 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '📱' }, 'computers-watch': { id: 'computers-watch', name: 'Smart Watch', category: 'computers', tags: ['watch', 'smartwatch', 'wearable', 'apple watch'], defaultSize: { width: 50, height: 50 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '8px' }, icon: '⌚' }, 'computers-mainframe': { id: 'computers-mainframe', name: 'Mainframe', category: 'computers', tags: ['mainframe', 'legacy', 'enterprise', 'big iron'], defaultSize: { width: 100, height: 120 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '🖥️' }, 'computers-terminal': { id: 'computers-terminal', name: 'Terminal', category: 'computers', tags: ['terminal', 'console', 'command line', 'cli'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '⌨️' }, 'computers-thin-client': { id: 'computers-thin-client', name: 'Thin Client', category: 'computers', tags: ['thin client', 'terminal', 'remote', 'virtual'], defaultSize: { width: 70, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '4px' }, icon: '🖥️' }, 'computers-kiosk': { id: 'computers-kiosk', name: 'Kiosk', category: 'computers', tags: ['kiosk', 'self service', 'terminal', 'public'], defaultSize: { width: 80, height: 100 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '🏧' }, 'computers-pos': { id: 'computers-pos', name: 'POS Terminal', category: 'computers', tags: ['pos', 'point of sale', 'retail', 'payment'], defaultSize: { width: 70, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '4px' }, icon: '💳' }, 'computers-scanner': { id: 'computers-scanner', name: 'Scanner', category: 'computers', tags: ['scanner', 'document', 'digitize', 'office'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5', stroke: '#7b1fa2', strokeWidth: 2, borderRadius: '4px' }, icon: '📃' }, 'computers-printer': { id: 'computers-printer', name: 'Printer', category: 'computers', tags: ['printer', 'print', 'paper', 'office'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e1f5fe', stroke: '#0277bd', strokeWidth: 2, borderRadius: '4px' }, icon: '🖨️' }, 'computers-projector': { id: 'computers-projector', name: 'Projector', category: 'computers', tags: ['projector', 'display', 'presentation', 'meeting'], defaultSize: { width: 80, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '4px' }, icon: '📽️' }, 'computers-webcam': { id: 'computers-webcam', name: 'Webcam', category: 'computers', tags: ['webcam', 'camera', 'video', 'conference'], defaultSize: { width: 60, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#ffebee', stroke: '#d32f2f', strokeWidth: 2, borderRadius: '8px' }, icon: '📹' }, 'computers-headset': { id: 'computers-headset', name: 'Headset', category: 'computers', tags: ['headset', 'audio', 'microphone', 'call'], defaultSize: { width: 60, height: 60 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '4px' }, icon: '🎧' }, // =================== PEOPLE SHAPES =================== 'people-user': { id: 'people-user', name: 'User', category: 'people', tags: ['user', 'person', 'human', 'actor'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M30,10 Q35,5 35,15 Q35,25 30,20 Q25,25 25,15 Q25,5 30,10 M30,20 L30,50 M20,30 L40,30 M30,50 L20,70 M30,50 L40,70', style: { fill: 'none', stroke: '#424242', strokeWidth: 2 }, icon: '👤' }, 'people-admin': { id: 'people-admin', name: 'Administrator', category: 'people', tags: ['admin', 'administrator', 'manager', 'supervisor'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e3f2fd', stroke: '#1976d2', strokeWidth: 2, borderRadius: '50%' }, icon: '👨‍💼' }, 'people-developer': { id: 'people-developer', name: 'Developer', category: 'people', tags: ['developer', 'programmer', 'coder', 'engineer'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '50%' }, icon: '👨‍💻' }, 'people-analyst': { id: 'people-analyst', name: 'Analyst', category: 'people', tags: ['analyst', 'business analyst', 'data analyst'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '50%' }, icon: '👩‍💼' }, 'people-customer': { id: 'people-customer', name: 'Customer', category: 'people', tags: ['customer', 'client', 'end user', 'consumer'], defaultSize: { width: 60, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fce4ec', stroke: '#c2185b', strokeWidth: 2, borderRadius: '50%' }, icon: '👤' }, // =================== DATABASE SHAPES =================== 'database-sql': { id: 'database-sql', name: 'SQL Database', category: 'database', tags: ['sql', 'database', 'rdbms', 'mysql', 'postgresql'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'svg', svgPath: 'M10,20 Q10,10 40,10 Q70,10 70,20 L70,60 Q70,70 40,70 Q10,70 10,60 Z M10,20 Q10,30 40,30 Q70,30 70,20', style: { fill: '#bbdefb', stroke: '#1976d2', strokeWidth: 2 }, icon: '🗄️' }, 'database-nosql': { id: 'database-nosql', name: 'NoSQL Database', category: 'database', tags: ['nosql', 'mongodb', 'cassandra', 'document'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#e8f5e8', stroke: '#2e7d32', strokeWidth: 2, borderRadius: '8px' }, icon: '📊' }, 'database-cache': { id: 'database-cache', name: 'Cache', category: 'database', tags: ['cache', 'redis', 'memcached', 'memory'], defaultSize: { width: 80, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#fff3e0', stroke: '#f57c00', strokeWidth: 2, borderRadius: '8px' }, icon: '⚡' }, 'database-warehouse': { id: 'database-warehouse', name: 'Data Warehouse', category: 'database', tags: ['warehouse', 'big data', 'analytics', 'bi'], defaultSize: { width: 100, height: 80 }, connectionPoints: ['top', 'right', 'bottom', 'left'], renderType: 'icon', style: { fill: '#f3e5f5',