Overview
VibeTrader provides a framework for creating interactive drawing tools that users can add to charts. Custom drawings extend the baseDrawing class and implement click-and-drag interaction patterns.
Architecture
Base Drawing Class
All drawings inherit from the abstractDrawing class defined in src/lib/charting/drawing/Drawing.tsx:14:
src/lib/charting/drawing/Drawing.tsx
Drawing Lifecycle
- Creation - User selects drawing tool
- Anchoring - User clicks to place handles
- Stretching - Mouse moves to stretch current handle
- Completion - Final handle placed, drawing locked
- Selection - User can select and modify completed drawings
Creating a Custom Drawing
Simple Line Drawing
TheLineDrawing class (src/lib/charting/drawing/LineDrawing.tsx:5) demonstrates the basics:
src/lib/charting/drawing/LineDrawing.tsx
Key Methods
init()
init()
Initialize the drawing by setting For variable-length drawings (like polylines), leave
nHandles:nHandles undefined.plotDrawing()
plotDrawing()
Return an array of SVG segments to render:Use helper methods:
this.xt(handle)- Get X coordinatethis.yv(handle)- Get Y coordinatethis.bt(handle)- Get bar index
hits(x, y)
hits(x, y)
Detect if mouse cursor is over the drawing:Used for selection and hover interactions.
Handle Management
TPoint Type
Handles store points in time-value coordinates:src/lib/charting/drawing/Drawing.tsx:9
Handle Class
Handles are rendered as draggable circles:src/lib/charting/drawing/Drawing.tsx:271
Coordinate Conversion
Use these helper methods for coordinate transformation:Interaction Patterns
Anchoring Handles
TheanchorHandle method is called when the user clicks:
src/lib/charting/drawing/Drawing.tsx:78
Stretching During Creation
src/lib/charting/drawing/Drawing.tsx:131
Dragging Completed Drawings
src/lib/charting/drawing/Drawing.tsx:158
Advanced Examples
Fibonacci Retracement
Complex drawings can use multiple paths and text labels:Polyline (Variable Handles)
Registering Drawings
Add your custom drawing to the factory function insrc/lib/charting/drawing/Drawings.ts:11:
src/lib/charting/drawing/Drawings.ts
SVG Primitives
VibeTrader provides SVG building blocks:Helper Methods
TheDrawing base class provides geometry utilities:
src/lib/charting/drawing/Drawing.tsx
Rendering States
Drawings can be rendered in different states:src/lib/charting/drawing/Drawing.tsx:205
Best Practices
Performance
Performance
- Minimize calculations in
plotDrawing()- called on every render - Cache computed values when possible
- Use simple hit detection for
hits()method - Limit number of SVG segments
User Experience
User Experience
- Provide visual feedback during creation (stretching)
- Use appropriate hit detection thresholds (4-8 pixels)
- Show handles when selected
- Support keyboard shortcuts (Delete, Escape)
Code Organization
Code Organization
- One drawing class per file
- Import SVG primitives as needed
- Use TypeScript types for type safety
- Document complex geometry calculations
Next Steps
PineScript Integration
Combine drawings with PineScript indicators
Custom Indicators
Create indicators that complement your drawings