--- name: excalidraw description: Create and edit Excalidraw diagrams programmatically. Use when the user asks to create diagrams, flowcharts, architecture diagrams, wireframes, or any visual drawings in Excalidraw format (.excalidraw files). --- # Excalidraw Diagram Creation This skill enables you to create beautiful, hand-drawn style diagrams in the Excalidraw JSON format. ## File Format Overview Excalidraw files (`.excalidraw`) are JSON with this structure: ```json { "type": "excalidraw", "version": 2, "source": "https://excalidraw.com", "elements": [], "appState": { "viewBackgroundColor": "#ffffff", "gridSize": null }, "files": {} } ``` ## Quick Start - Creating Elements Every element needs at minimum: `type`, `id`, `x`, `y`, and styling properties. ### Minimal Rectangle ```json { "type": "rectangle", "id": "rect-1", "x": 100, "y": 100, "width": 200, "height": 100, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "seed": 1234, "version": 1, "versionNonce": 1234, "isDeleted": false, "groupIds": [], "boundElements": null, "link": null, "locked": false, "roundness": { "type": 3 } } ``` ### Text Element ```json { "type": "text", "id": "text-1", "x": 120, "y": 130, "width": 160, "height": 25, "text": "Hello World", "fontSize": 20, "fontFamily": 1, "textAlign": "center", "verticalAlign": "middle", "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "seed": 5678, "version": 1, "versionNonce": 5678, "isDeleted": false, "groupIds": [], "boundElements": null, "link": null, "locked": false, "containerId": null, "originalText": "Hello World", "autoResize": true, "lineHeight": 1.25 } ``` ### Arrow Element ```json { "type": "arrow", "id": "arrow-1", "x": 300, "y": 150, "width": 100, "height": 0, "points": [[0, 0], [100, 0]], "startArrowhead": null, "endArrowhead": "arrow", "startBinding": null, "endBinding": null, "angle": 0, "strokeColor": "#1e1e1e", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 1, "opacity": 100, "seed": 9012, "version": 1, "versionNonce": 9012, "isDeleted": false, "groupIds": [], "boundElements": null, "link": null, "locked": false } ``` ## Element Types | Type | Use For | |------|---------| | `rectangle` | Boxes, containers, cards | | `ellipse` | Circles, ovals, nodes | | `diamond` | Decision points, conditions | | `text` | Labels, descriptions | | `arrow` | Connections, flow direction | | `line` | Connectors without arrowheads | | `freedraw` | Hand-drawn paths | | `image` | Embedded images | | `frame` | Grouping/framing elements | ## Color Palette (Recommended) ### Backgrounds - `#a5d8ff` - Light blue - `#b2f2bb` - Light green - `#ffec99` - Light yellow - `#ffc9c9` - Light red/pink - `#e9ecef` - Light gray - `#d0bfff` - Light purple - `#99e9f2` - Light cyan ### Strokes - `#1e1e1e` - Default black - `#1971c2` - Blue - `#2f9e44` - Green - `#f08c00` - Orange - `#e03131` - Red - `#9c36b5` - Purple ## Styling Properties | Property | Values | Description | |----------|--------|-------------| | `fillStyle` | `"solid"`, `"hachure"`, `"cross-hatch"` | Fill pattern | | `strokeWidth` | `1`, `2`, `4` | Line thickness | | `strokeStyle` | `"solid"`, `"dashed"`, `"dotted"` | Line style | | `roughness` | `0`, `1`, `2` | Hand-drawn feel (0=smooth, 2=rough) | | `opacity` | `0-100` | Transparency | | `roundness` | `{ "type": 3 }` | Rounded corners | ## Connecting Elements with Arrows To connect shapes with arrows, use bindings: ```json { "type": "arrow", "id": "arrow-1", "startBinding": { "elementId": "rect-1", "focus": 0, "gap": 5 }, "endBinding": { "elementId": "rect-2", "focus": 0, "gap": 5 }, "points": [[0, 0], [200, 0]] } ``` Also add `boundElements` to the connected shapes: ```json { "type": "rectangle", "id": "rect-1", "boundElements": [{ "id": "arrow-1", "type": "arrow" }] } ``` ## Font Families | Value | Font | |-------|------| | `1` | Hand-drawn (Virgil) | | `2` | Normal (Helvetica) | | `3` | Code (Cascadia) | ## Best Practices 1. **Generate unique IDs** - Use descriptive prefixes like `rect-1`, `arrow-2`, `text-header` 2. **Use random seeds** - Each element needs a unique `seed` for consistent rendering 3. **Space elements well** - Leave 50-100px between elements 4. **Align elements** - Use consistent x/y coordinates for visual alignment 5. **Group related items** - Use matching `groupIds` arrays 6. **Use the color palette** - Stick to Excalidraw's built-in colors for consistency ## Diagram Types You Can Create | Type | Description | |------|-------------| | **Flowcharts** | Process flows, algorithms, decision trees | | **Sequence Diagrams** | API calls, user interactions, message flows | | **Architecture Diagrams** | System design, microservices, infrastructure | | **Mind Maps** | Brainstorming, concept mapping, idea organization | | **Data Flow Diagrams** | Data movement, system analysis | | **ERD** | Database schemas, entity relationships | | **Wireframes** | UI mockups, layout sketches | ## Reference Documentation - **[diagram-patterns.md](diagram-patterns.md)** - Professional patterns for each diagram type (flowcharts, sequence diagrams, mind maps, architecture, etc.) - **[examples.md](examples.md)** - Complete working JSON examples you can use as templates - **[element-reference.md](element-reference.md)** - Full property reference for all element types - **[best-practices.md](best-practices.md)** - Design tips, color theory, typography guidelines ## Quick Tips for Beautiful Diagrams 1. **Use `roughness: 0`** for formal/technical diagrams, `roughness: 1` for friendly sketches 2. **Use `fontFamily: 2`** (Helvetica) for professional look, `fontFamily: 1` (Virgil) only when casual look is requested 3. **Consistent spacing** - 100px between major elements, 50px for related items 4. **Color semantics** - Blue for info/input, Green for success/data, Yellow for decisions, Red for errors 5. **Arrow conventions** - Solid for actions, Dashed for responses/async