@dwlf/charting 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/README.md +184 -19
  2. package/dist/charting/__tests__/chartSpec.test.d.ts +1 -0
  3. package/dist/charting/scales.d.ts +14 -0
  4. package/dist/charting/types.d.ts +454 -0
  5. package/dist/charting.css +1 -1
  6. package/dist/components/DWLFChart.d.ts +119 -0
  7. package/dist/components/index.d.ts +2 -0
  8. package/dist/components/overlays/AlertLineAnnotationView.d.ts +14 -0
  9. package/dist/components/overlays/AnnotationLayer.d.ts +55 -0
  10. package/dist/components/overlays/ArrowAnnotationView.d.ts +24 -0
  11. package/dist/components/overlays/BosLineAnnotationView.d.ts +22 -0
  12. package/dist/components/overlays/BrushAnnotationView.d.ts +20 -0
  13. package/dist/components/overlays/ChannelAnnotationView.d.ts +23 -0
  14. package/dist/components/overlays/CrossLineAnnotationView.d.ts +29 -0
  15. package/dist/components/overlays/DiagonalLineOverlay.d.ts +31 -0
  16. package/dist/components/overlays/EmojiAnnotationView.d.ts +22 -0
  17. package/dist/components/overlays/FairValueGapAnnotationView.d.ts +23 -0
  18. package/dist/components/overlays/FibExtensionAnnotationView.d.ts +19 -0
  19. package/dist/components/overlays/FibRetracementAnnotationView.d.ts +19 -0
  20. package/dist/components/overlays/HLineAnnotationView.d.ts +15 -0
  21. package/dist/components/overlays/HorizontalLineOverlay.d.ts +23 -0
  22. package/dist/components/overlays/MarkerOverlay.d.ts +66 -0
  23. package/dist/components/overlays/MeasureAnnotationView.d.ts +25 -0
  24. package/dist/components/overlays/MessageBubbleOverlay.d.ts +55 -0
  25. package/dist/components/overlays/OrderBlockAnnotationView.d.ts +23 -0
  26. package/dist/components/overlays/PitchforkAnnotationView.d.ts +19 -0
  27. package/dist/components/overlays/PositionOverlay.d.ts +52 -0
  28. package/dist/components/overlays/RayAnnotationView.d.ts +30 -0
  29. package/dist/components/overlays/RectangleAnnotationView.d.ts +23 -0
  30. package/dist/components/overlays/SMAOverlay.d.ts +20 -0
  31. package/dist/components/overlays/TextAnnotationView.d.ts +24 -0
  32. package/dist/components/overlays/TimeRangeAnnotationView.d.ts +22 -0
  33. package/dist/components/overlays/TrendLineAnnotationView.d.ts +23 -0
  34. package/dist/components/overlays/VLineAnnotationView.d.ts +26 -0
  35. package/dist/components/overlays/annotationConstants.d.ts +21 -0
  36. package/dist/components/overlays/annotationUtils.d.ts +13 -0
  37. package/dist/components/overlays/useAnnotationDrag.d.ts +18 -0
  38. package/dist/components/overlays/usePointAnnotationDrag.d.ts +23 -0
  39. package/dist/hooks/useCandlestickChart.d.ts +18 -0
  40. package/dist/hooks/useChartAnimations.d.ts +49 -0
  41. package/dist/hooks/useChartLayout.d.ts +12 -0
  42. package/dist/hooks/useChartPanZoom.d.ts +7 -0
  43. package/dist/hooks/useChartPanZoomVirtual.d.ts +24 -0
  44. package/dist/hooks/useContainerSize.d.ts +4 -0
  45. package/dist/hooks/useOverlayToggles.d.ts +19 -0
  46. package/dist/index.cjs +1 -1
  47. package/dist/index.d.ts +56 -0
  48. package/dist/index.js +13 -13
  49. package/dist/utils/indicators.d.ts +40 -0
  50. package/package.json +4 -1
@@ -0,0 +1,23 @@
1
+ import { default as React } from 'react';
2
+ import { TrendLineAnnotation, PaneComputedScale, XScale } from '../../charting/types';
3
+ export interface TrendLineAnnotationViewProps {
4
+ annotation: TrendLineAnnotation;
5
+ xScale: XScale;
6
+ yScale: PaneComputedScale;
7
+ chartWidth: number;
8
+ paneHeight: number;
9
+ darkMode?: boolean;
10
+ selected?: boolean;
11
+ onSelect?: (id: string | null) => void;
12
+ onMove?: (id: string, update: Partial<TrendLineAnnotation>) => void;
13
+ /** Convert raw timestamp to index when compressGaps is enabled */
14
+ timeToIndex?: (time: number) => number | undefined;
15
+ /** Convert index back to raw timestamp when compressGaps is enabled */
16
+ indexToTime?: (index: number) => number;
17
+ /** Number of data points */
18
+ dataLength?: number;
19
+ /** Pre-computed compressed times array */
20
+ compressedTimes?: number[];
21
+ }
22
+ declare const TrendLineAnnotationView: React.FC<TrendLineAnnotationViewProps>;
23
+ export default TrendLineAnnotationView;
@@ -0,0 +1,26 @@
1
+ import { default as React } from 'react';
2
+ import { VLineAnnotation, PaneComputedScale, XScale } from '../../charting/types';
3
+ export interface VLineAnnotationViewProps {
4
+ annotation: VLineAnnotation;
5
+ xScale: XScale;
6
+ yScale: PaneComputedScale;
7
+ chartWidth: number;
8
+ paneHeight: number;
9
+ darkMode?: boolean;
10
+ selected?: boolean;
11
+ onSelect?: (id: string | null) => void;
12
+ onDoubleClick?: (id: string) => void;
13
+ onMove?: (id: string, newTime: number) => void;
14
+ /** Convert raw timestamp to index when compressGaps is enabled */
15
+ timeToIndex?: (time: number) => number | undefined;
16
+ /** Convert index back to raw timestamp when compressGaps is enabled */
17
+ indexToTime?: (index: number) => number;
18
+ /** Number of data points */
19
+ dataLength?: number;
20
+ /** Pre-computed compressed times array */
21
+ compressedTimes?: number[];
22
+ /** Optional time formatter for the label */
23
+ timeFormatter?: (t: number) => string;
24
+ }
25
+ declare const VLineAnnotationView: React.FC<VLineAnnotationViewProps>;
26
+ export default VLineAnnotationView;
@@ -0,0 +1,21 @@
1
+ export declare const LINE_STYLE_MAP: Record<string, string | undefined>;
2
+ /** Radius for circular endpoint handles (e.g., trendline endpoints) */
3
+ export declare const HANDLE_RADIUS = 12;
4
+ /** Radius for smaller secondary handles (e.g., midpoint drag) */
5
+ export declare const HANDLE_RADIUS_SMALL = 10;
6
+ /** Size for square corner handles (e.g., rectangle corners) */
7
+ export declare const CORNER_SIZE = 16;
8
+ /** Width of invisible hit area for line-based annotations */
9
+ export declare const HIT_AREA_WIDTH = 32;
10
+ /** Padding around rectangular annotations for easier click target */
11
+ export declare const RECT_HIT_PADDING = 8;
12
+ /** Size of rectangular drag handles (e.g., HLine drag grip) */
13
+ export declare const DRAG_HANDLE_SIZE = 24;
14
+ /** Offset from edge where drag handles are positioned */
15
+ export declare const HANDLE_EDGE_OFFSET = 4;
16
+ /**
17
+ * Indicator line positioning - derived from DRAG_HANDLE_SIZE for consistency.
18
+ * Lines span the middle 50% of the handle for a clean centered appearance.
19
+ */
20
+ export declare const INDICATOR_LINE_START: number;
21
+ export declare const INDICATOR_LINE_END: number;
@@ -0,0 +1,13 @@
1
+ import { LineStyle, XScale } from '../../charting/types';
2
+ /** Maps LineStyle values to SVG stroke-dasharray patterns */
3
+ export declare const LINE_STYLE_MAP: Record<LineStyle, string | undefined>;
4
+ export declare const findClosestIndex: (time: number, times: number[] | undefined, timeToIndex: ((t: number) => number | undefined) | undefined) => number | undefined;
5
+ /**
6
+ * Resolve a time value to an x-pixel coordinate, handling compressGaps mode.
7
+ */
8
+ export declare const resolveX: (time: number, xScale: XScale, timeToIndex: ((t: number) => number | undefined) | undefined, indexToTime: ((i: number) => number) | undefined, dataLength: number, compressedTimes: number[] | undefined) => number | undefined;
9
+ /**
10
+ * Resolve a time value to an x-pixel coordinate, with linear extrapolation
11
+ * when the time is outside the visible data range.
12
+ */
13
+ export declare const resolveXWithExtrapolation: (time: number, xScale: XScale, timeToIndex: ((t: number) => number | undefined) | undefined, indexToTime: ((i: number) => number) | undefined, dataLength: number, compressedTimes: number[] | undefined, chartWidth?: number) => number | undefined;
@@ -0,0 +1,18 @@
1
+ import { MouseEvent as ReactMouseEvent } from 'react';
2
+ type DragStartHandler = (event: ReactMouseEvent) => void;
3
+ type DragMoveHandler = (event: MouseEvent) => void;
4
+ type DragEndHandler = () => void;
5
+ type DragStartCheck = (event: ReactMouseEvent) => boolean;
6
+ interface UseAnnotationDragOptions {
7
+ onDragMove: DragMoveHandler;
8
+ onDragStart?: DragStartHandler;
9
+ onDragEnd?: DragEndHandler;
10
+ shouldStart?: DragStartCheck;
11
+ stopPropagation?: boolean;
12
+ preventDefault?: boolean;
13
+ }
14
+ declare const useAnnotationDrag: ({ onDragMove, onDragStart, onDragEnd, shouldStart, stopPropagation, preventDefault, }: UseAnnotationDragOptions) => {
15
+ isDragging: boolean;
16
+ handleMouseDown: (event: ReactMouseEvent) => void;
17
+ };
18
+ export default useAnnotationDrag;
@@ -0,0 +1,23 @@
1
+ import { PaneComputedScale, XScale } from '../../charting/types';
2
+ interface UsePointAnnotationDragOptions {
3
+ annotationId: string;
4
+ time: number;
5
+ price: number;
6
+ xScale: XScale;
7
+ yScale: PaneComputedScale;
8
+ onMove?: (id: string, newTime: number, newPrice: number) => void;
9
+ /** Convert raw timestamp to index when compressGaps is enabled */
10
+ timeToIndex?: (time: number) => number | undefined;
11
+ /** Convert index back to raw timestamp when compressGaps is enabled */
12
+ indexToTime?: (index: number) => number;
13
+ /** Number of data points (required for closest index search when compressGaps enabled) */
14
+ dataLength?: number;
15
+ /** Precomputed array of raw timestamps for each compressed index */
16
+ compressedTimes?: number[];
17
+ }
18
+ declare const usePointAnnotationDrag: ({ annotationId, time, price, xScale, yScale, onMove, timeToIndex, indexToTime, dataLength, compressedTimes, }: UsePointAnnotationDragOptions) => {
19
+ handleMouseDown: (event: import('react').MouseEvent) => void;
20
+ indexValue: number | undefined;
21
+ isDragging: boolean;
22
+ };
23
+ export default usePointAnnotationDrag;
@@ -0,0 +1,18 @@
1
+ export default function useCandlestickChart(data: any, width: any, height: any, timeframe?: string, compressGaps?: boolean): {
2
+ xScale: (Date[] & d3.ScaleTime<number, number, never>) | {
3
+ (value: any): number;
4
+ invert(px: any): number;
5
+ };
6
+ yScale: number[] & d3.ScaleLinear<number, number, never>;
7
+ getCandleProps: (d: any) => {
8
+ x: number;
9
+ y: number;
10
+ height: number;
11
+ width: number;
12
+ color: string;
13
+ };
14
+ xBandwidth: number;
15
+ _compressed: boolean;
16
+ _indexToDate: any;
17
+ };
18
+ import * as d3 from 'd3';
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Chart animation phase types
3
+ */
4
+ export type ChartAnimationPhase = 'idle' | 'background' | 'candles' | 'indicators' | 'events' | 'annotations' | 'complete';
5
+ /**
6
+ * Animation state interface
7
+ */
8
+ export interface ChartAnimationState {
9
+ phase: ChartAnimationPhase;
10
+ candleRevealIndex: number;
11
+ layerOpacities: Record<string, number>;
12
+ staggerDelay: number;
13
+ isReducedMotion: boolean;
14
+ }
15
+ /**
16
+ * Animation control interface
17
+ */
18
+ export interface ChartAnimationControls {
19
+ startAnimation: () => void;
20
+ skipToEnd: () => void;
21
+ resetAnimation: () => void;
22
+ setAnimationSpeed: (multiplier: number) => void;
23
+ }
24
+ /**
25
+ * Hook options
26
+ */
27
+ export interface UseChartAnimationsOptions {
28
+ totalCandles?: number;
29
+ animationSpeed?: number;
30
+ autoStart?: boolean;
31
+ staggerDelay?: number;
32
+ onPhaseChange?: (phase: ChartAnimationPhase) => void;
33
+ onAnimationComplete?: () => void;
34
+ }
35
+ /**
36
+ * Default indicator animation order
37
+ */
38
+ export declare const INDICATOR_ANIMATION_ORDER: readonly ["ema-10", "ema-20", "sma-10", "sma-20", "bollinger-upper", "bollinger-middle", "bollinger-lower", "ema-50", "sma-50", "ema-200", "sma-200"];
39
+ /**
40
+ * Hook for managing chart animation state and controls.
41
+ *
42
+ * Architecture: A simple phase state machine driven by effects.
43
+ * Each phase schedules the next via setTimeout or RAF, with proper cleanup.
44
+ * No pause/resume complexity — skip-to-end handles interruption.
45
+ */
46
+ export default function useChartAnimations(options?: UseChartAnimationsOptions): {
47
+ animationState: ChartAnimationState;
48
+ controls: ChartAnimationControls;
49
+ };
@@ -0,0 +1,12 @@
1
+ export default function useChartLayout({ width, height, margin }: {
2
+ width: any;
3
+ height: any;
4
+ margin: any;
5
+ }): {
6
+ margin: any;
7
+ fullWidth: any;
8
+ fullHeight: any;
9
+ innerWidth: number;
10
+ innerHeight: number;
11
+ chartTransform: string;
12
+ };
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Hook for handling chart panning and zooming
3
+ * @param {Array} data - Full dataset
4
+ * @param {number} initialVisibleCount - Initial number of visible data points
5
+ * @returns {Object} - Viewport state and handlers
6
+ */
7
+ export default function useChartPanZoom(data: any[], initialVisibleCount?: number): Object;
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Pan/Zoom hook that keeps a fixed number of blank "virtual" slots after the
3
+ * last real candle. This gives a permanent right-hand gap without any pixel
4
+ * offset tricks, so zooming never clips candles.
5
+ */
6
+ export default function useChartPanZoomVirtual(data: any, initialVisibleCount?: number, extraSlots?: number, timeframe?: string): {
7
+ visibleData: any[];
8
+ viewportStart: number;
9
+ viewportEnd: any;
10
+ visibleCount: number;
11
+ mouseHandlers: {
12
+ onMouseDown: (e: any) => void;
13
+ onMouseMove: (e: any) => void;
14
+ onMouseUp: () => void;
15
+ onMouseLeave: () => void;
16
+ };
17
+ chartElementRef: (el: any) => void;
18
+ zoomIn: () => void;
19
+ zoomOut: () => void;
20
+ resetView: () => void;
21
+ panToStart: () => void;
22
+ panToEnd: () => void;
23
+ isPanning: boolean;
24
+ };
@@ -0,0 +1,4 @@
1
+ export default function useContainerSize(): (import('react').MutableRefObject<null> | {
2
+ width: number;
3
+ height: number;
4
+ })[];
@@ -0,0 +1,19 @@
1
+ export const overlayDefinitions: {
2
+ id: string;
3
+ label: string;
4
+ generator: (data: any, smaData: any) => {
5
+ type: string;
6
+ label: string;
7
+ data: any;
8
+ color: string;
9
+ };
10
+ }[];
11
+ export default useOverlayToggles;
12
+ declare function useOverlayToggles(sampleData: any, smaData?: {}): {
13
+ overlayDefinitions: {};
14
+ activeKeys: Set<any>;
15
+ overlays: any[];
16
+ toggleOverlay: (key: any) => void;
17
+ toggleOverlayById: (id: any) => void;
18
+ isOverlayActive: (key: any) => boolean;
19
+ };