hyperprop-charting-library 0.1.54 → 0.1.55
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.
- package/dist/hyperprop-charting-library.cjs +294 -2
- package/dist/hyperprop-charting-library.d.ts +35 -1
- package/dist/hyperprop-charting-library.js +294 -2
- package/dist/index.cjs +294 -2
- package/dist/index.d.cts +35 -1
- package/dist/index.d.ts +35 -1
- package/dist/index.js +294 -2
- package/docs/API.md +43 -0
- package/docs/RECIPES.md +28 -0
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -214,7 +214,8 @@ var DEFAULT_OPTIONS = {
|
|
|
214
214
|
},
|
|
215
215
|
labels: DEFAULT_LABELS_OPTIONS,
|
|
216
216
|
dashPatterns: DEFAULT_DASH_PATTERNS,
|
|
217
|
-
indicators: []
|
|
217
|
+
indicators: [],
|
|
218
|
+
drawings: []
|
|
218
219
|
};
|
|
219
220
|
var mergeChartOptions = (baseOptions, options = {}) => ({
|
|
220
221
|
...baseOptions,
|
|
@@ -905,6 +906,7 @@ function createChart(element, options = {}) {
|
|
|
905
906
|
let generatedPriceLineId = 1;
|
|
906
907
|
let generatedOrderLineId = 1;
|
|
907
908
|
let generatedIndicatorId = 1;
|
|
909
|
+
let generatedDrawingId = 1;
|
|
908
910
|
const indicatorRegistry = /* @__PURE__ */ new Map();
|
|
909
911
|
for (const indicator of BUILTIN_INDICATORS) {
|
|
910
912
|
indicatorRegistry.set(indicator.id, indicator);
|
|
@@ -927,7 +929,41 @@ function createChart(element, options = {}) {
|
|
|
927
929
|
}
|
|
928
930
|
};
|
|
929
931
|
};
|
|
932
|
+
const normalizeDrawingState = (drawing) => ({
|
|
933
|
+
id: drawing.id ?? `drawing-${generatedDrawingId++}`,
|
|
934
|
+
type: drawing.type,
|
|
935
|
+
points: drawing.points.map((point) => ({
|
|
936
|
+
index: Number(point.index) || 0,
|
|
937
|
+
price: Number(point.price) || 0,
|
|
938
|
+
...point.time ? { time: point.time } : {}
|
|
939
|
+
})),
|
|
940
|
+
visible: drawing.visible ?? true,
|
|
941
|
+
color: drawing.color ?? "#94a3b8",
|
|
942
|
+
style: drawing.style ?? "dotted",
|
|
943
|
+
width: Math.max(1, Number(drawing.width) || 1),
|
|
944
|
+
locked: drawing.locked ?? false,
|
|
945
|
+
...drawing.label === void 0 ? {} : { label: drawing.label }
|
|
946
|
+
});
|
|
947
|
+
const serializeDrawing = (drawing) => ({
|
|
948
|
+
id: drawing.id,
|
|
949
|
+
type: drawing.type,
|
|
950
|
+
points: drawing.points.map((point) => ({ ...point })),
|
|
951
|
+
visible: drawing.visible,
|
|
952
|
+
color: drawing.color,
|
|
953
|
+
style: drawing.style,
|
|
954
|
+
width: drawing.width,
|
|
955
|
+
locked: drawing.locked,
|
|
956
|
+
...drawing.label === void 0 ? {} : { label: drawing.label }
|
|
957
|
+
});
|
|
930
958
|
let indicators = (options.indicators ?? []).map((indicator) => normalizeIndicatorState(indicator));
|
|
959
|
+
let drawings = (options.drawings ?? []).map((drawing) => normalizeDrawingState(drawing));
|
|
960
|
+
let activeDrawingTool = null;
|
|
961
|
+
let draftDrawing = null;
|
|
962
|
+
let drawingsChangeHandler = null;
|
|
963
|
+
let drawingSelectHandler = null;
|
|
964
|
+
const emitDrawingsChange = () => {
|
|
965
|
+
drawingsChangeHandler?.(drawings.map((drawing) => serializeDrawing(drawing)));
|
|
966
|
+
};
|
|
931
967
|
const orderWidgetWidthById = /* @__PURE__ */ new Map();
|
|
932
968
|
const orderPriceTagWidthById = /* @__PURE__ */ new Map();
|
|
933
969
|
let xCenter = 0;
|
|
@@ -1981,6 +2017,55 @@ function createChart(element, options = {}) {
|
|
|
1981
2017
|
const yFromPrice = (price) => {
|
|
1982
2018
|
return chartBottom - (price - yMin) / yRange * chartHeight;
|
|
1983
2019
|
};
|
|
2020
|
+
const xFromDrawingPoint = (point) => chartLeft + (point.index + 0.5 - xStart) / xSpan * chartWidth;
|
|
2021
|
+
const drawDrawingHandle = (x, y, color) => {
|
|
2022
|
+
ctx.save();
|
|
2023
|
+
ctx.setLineDash([]);
|
|
2024
|
+
ctx.fillStyle = mergedOptions.backgroundColor;
|
|
2025
|
+
ctx.strokeStyle = color;
|
|
2026
|
+
ctx.lineWidth = 2;
|
|
2027
|
+
ctx.beginPath();
|
|
2028
|
+
ctx.arc(x, y, 5, 0, Math.PI * 2);
|
|
2029
|
+
ctx.fill();
|
|
2030
|
+
ctx.stroke();
|
|
2031
|
+
ctx.restore();
|
|
2032
|
+
};
|
|
2033
|
+
const drawDrawing = (drawing, draft = false) => {
|
|
2034
|
+
if (!drawing.visible) {
|
|
2035
|
+
return;
|
|
2036
|
+
}
|
|
2037
|
+
ctx.save();
|
|
2038
|
+
ctx.strokeStyle = drawing.color;
|
|
2039
|
+
ctx.lineWidth = drawing.width;
|
|
2040
|
+
ctx.globalAlpha = draft ? 0.72 : 1;
|
|
2041
|
+
applyDashPattern(drawing.style, dashPatterns.dotted, dashPatterns.dashed);
|
|
2042
|
+
if (drawing.type === "horizontal-line") {
|
|
2043
|
+
const point = drawing.points[0];
|
|
2044
|
+
if (point) {
|
|
2045
|
+
const y = clamp(yFromPrice(point.price), chartTop + 1, chartBottom - 1);
|
|
2046
|
+
ctx.beginPath();
|
|
2047
|
+
ctx.moveTo(crisp(chartLeft), crisp(y));
|
|
2048
|
+
ctx.lineTo(crisp(chartRight), crisp(y));
|
|
2049
|
+
ctx.stroke();
|
|
2050
|
+
}
|
|
2051
|
+
} else if (drawing.type === "trendline") {
|
|
2052
|
+
const first = drawing.points[0];
|
|
2053
|
+
const second = drawing.points[1];
|
|
2054
|
+
if (first && second) {
|
|
2055
|
+
const firstX = xFromDrawingPoint(first);
|
|
2056
|
+
const firstY = yFromPrice(first.price);
|
|
2057
|
+
const secondX = xFromDrawingPoint(second);
|
|
2058
|
+
const secondY = yFromPrice(second.price);
|
|
2059
|
+
ctx.beginPath();
|
|
2060
|
+
ctx.moveTo(firstX, firstY);
|
|
2061
|
+
ctx.lineTo(secondX, secondY);
|
|
2062
|
+
ctx.stroke();
|
|
2063
|
+
drawDrawingHandle(firstX, firstY, drawing.color);
|
|
2064
|
+
drawDrawingHandle(secondX, secondY, drawing.color);
|
|
2065
|
+
}
|
|
2066
|
+
}
|
|
2067
|
+
ctx.restore();
|
|
2068
|
+
};
|
|
1984
2069
|
if (watermark.visible && watermark.imageSrc.trim().length > 0) {
|
|
1985
2070
|
ensureWatermarkImage(watermark.imageSrc.trim());
|
|
1986
2071
|
if (watermarkImageReady && watermarkImage) {
|
|
@@ -2152,6 +2237,10 @@ function createChart(element, options = {}) {
|
|
|
2152
2237
|
);
|
|
2153
2238
|
});
|
|
2154
2239
|
}
|
|
2240
|
+
drawings.forEach((drawing) => drawDrawing(drawing));
|
|
2241
|
+
if (draftDrawing) {
|
|
2242
|
+
drawDrawing(draftDrawing, true);
|
|
2243
|
+
}
|
|
2155
2244
|
const crosshair = { ...DEFAULT_CROSSHAIR_OPTIONS, ...mergedOptions.crosshair ?? {} };
|
|
2156
2245
|
if (crosshair.visible && crosshairPoint) {
|
|
2157
2246
|
const cx = clamp(crosshairPoint.x, chartLeft, chartRight);
|
|
@@ -2988,6 +3077,66 @@ function createChart(element, options = {}) {
|
|
|
2988
3077
|
const ratio = clamp((drawState.chartBottom - y) / drawState.chartHeight, 0, 1);
|
|
2989
3078
|
return drawState.yMin + ratio * (drawState.yMax - drawState.yMin);
|
|
2990
3079
|
};
|
|
3080
|
+
const drawingPointFromCanvas = (x, y) => {
|
|
3081
|
+
if (!drawState) {
|
|
3082
|
+
return null;
|
|
3083
|
+
}
|
|
3084
|
+
const ratio = clamp((x - drawState.chartLeft) / drawState.chartWidth, 0, 1);
|
|
3085
|
+
const index = drawState.xStart + ratio * drawState.xSpan - 0.5;
|
|
3086
|
+
const nearestIndex = Math.round(index);
|
|
3087
|
+
const time = getTimeForIndex(nearestIndex);
|
|
3088
|
+
return {
|
|
3089
|
+
index,
|
|
3090
|
+
price: roundToPricePrecision(priceFromCanvasY(y)),
|
|
3091
|
+
...time ? { time: time.toISOString() } : {}
|
|
3092
|
+
};
|
|
3093
|
+
};
|
|
3094
|
+
const canvasXFromDrawingPoint = (point) => {
|
|
3095
|
+
if (!drawState) return 0;
|
|
3096
|
+
return drawState.chartLeft + (point.index + 0.5 - drawState.xStart) / drawState.xSpan * drawState.chartWidth;
|
|
3097
|
+
};
|
|
3098
|
+
const canvasYFromDrawingPrice = (price) => {
|
|
3099
|
+
if (!drawState) return 0;
|
|
3100
|
+
const range = drawState.yMax - drawState.yMin || 1;
|
|
3101
|
+
return drawState.chartBottom - (price - drawState.yMin) / range * drawState.chartHeight;
|
|
3102
|
+
};
|
|
3103
|
+
const distanceToSegment = (x, y, x1, y1, x2, y2) => {
|
|
3104
|
+
const dx = x2 - x1;
|
|
3105
|
+
const dy = y2 - y1;
|
|
3106
|
+
const lengthSq = dx * dx + dy * dy;
|
|
3107
|
+
if (lengthSq === 0) return Math.hypot(x - x1, y - y1);
|
|
3108
|
+
const t = clamp(((x - x1) * dx + (y - y1) * dy) / lengthSq, 0, 1);
|
|
3109
|
+
return Math.hypot(x - (x1 + t * dx), y - (y1 + t * dy));
|
|
3110
|
+
};
|
|
3111
|
+
const getDrawingHit = (x, y) => {
|
|
3112
|
+
for (let index = drawings.length - 1; index >= 0; index -= 1) {
|
|
3113
|
+
const drawing = drawings[index];
|
|
3114
|
+
if (!drawing?.visible) continue;
|
|
3115
|
+
if (drawing.type === "horizontal-line") {
|
|
3116
|
+
const point = drawing.points[0];
|
|
3117
|
+
if (!point) continue;
|
|
3118
|
+
const lineY = canvasYFromDrawingPrice(point.price);
|
|
3119
|
+
if (Math.abs(y - lineY) <= 7) {
|
|
3120
|
+
return { drawing, target: "line" };
|
|
3121
|
+
}
|
|
3122
|
+
} else if (drawing.type === "trendline") {
|
|
3123
|
+
const first = drawing.points[0];
|
|
3124
|
+
const second = drawing.points[1];
|
|
3125
|
+
if (!first || !second) continue;
|
|
3126
|
+
const x1 = canvasXFromDrawingPoint(first);
|
|
3127
|
+
const y1 = canvasYFromDrawingPrice(first.price);
|
|
3128
|
+
const x2 = canvasXFromDrawingPoint(second);
|
|
3129
|
+
const y2 = canvasYFromDrawingPrice(second.price);
|
|
3130
|
+
if (Math.hypot(x - x1, y - y1) <= 8 || Math.hypot(x - x2, y - y2) <= 8) {
|
|
3131
|
+
return { drawing, target: "handle" };
|
|
3132
|
+
}
|
|
3133
|
+
if (distanceToSegment(x, y, x1, y1, x2, y2) <= 6) {
|
|
3134
|
+
return { drawing, target: "line" };
|
|
3135
|
+
}
|
|
3136
|
+
}
|
|
3137
|
+
}
|
|
3138
|
+
return null;
|
|
3139
|
+
};
|
|
2991
3140
|
const indexFromCanvasX = (x) => {
|
|
2992
3141
|
if (!drawState) {
|
|
2993
3142
|
return null;
|
|
@@ -3040,6 +3189,53 @@ function createChart(element, options = {}) {
|
|
|
3040
3189
|
}
|
|
3041
3190
|
return "outside";
|
|
3042
3191
|
};
|
|
3192
|
+
const handleDrawingToolPointerDown = (x, y) => {
|
|
3193
|
+
if (!activeDrawingTool || !drawState) {
|
|
3194
|
+
return false;
|
|
3195
|
+
}
|
|
3196
|
+
const point = drawingPointFromCanvas(x, y);
|
|
3197
|
+
if (!point) {
|
|
3198
|
+
return false;
|
|
3199
|
+
}
|
|
3200
|
+
if (activeDrawingTool === "horizontal-line") {
|
|
3201
|
+
drawings.push(
|
|
3202
|
+
normalizeDrawingState({
|
|
3203
|
+
type: "horizontal-line",
|
|
3204
|
+
points: [point],
|
|
3205
|
+
color: "#38bdf8",
|
|
3206
|
+
style: "dotted",
|
|
3207
|
+
width: 1
|
|
3208
|
+
})
|
|
3209
|
+
);
|
|
3210
|
+
emitDrawingsChange();
|
|
3211
|
+
draw();
|
|
3212
|
+
return true;
|
|
3213
|
+
}
|
|
3214
|
+
if (activeDrawingTool === "trendline") {
|
|
3215
|
+
if (draftDrawing?.type === "trendline") {
|
|
3216
|
+
const completed = normalizeDrawingState({
|
|
3217
|
+
...serializeDrawing(draftDrawing),
|
|
3218
|
+
points: [draftDrawing.points[0], point]
|
|
3219
|
+
});
|
|
3220
|
+
drawings.push(completed);
|
|
3221
|
+
draftDrawing = null;
|
|
3222
|
+
activeDrawingTool = null;
|
|
3223
|
+
emitDrawingsChange();
|
|
3224
|
+
draw();
|
|
3225
|
+
return true;
|
|
3226
|
+
}
|
|
3227
|
+
draftDrawing = normalizeDrawingState({
|
|
3228
|
+
type: "trendline",
|
|
3229
|
+
points: [point, point],
|
|
3230
|
+
color: "#2563eb",
|
|
3231
|
+
style: "solid",
|
|
3232
|
+
width: 2
|
|
3233
|
+
});
|
|
3234
|
+
draw();
|
|
3235
|
+
return true;
|
|
3236
|
+
}
|
|
3237
|
+
return false;
|
|
3238
|
+
};
|
|
3043
3239
|
let isDragging = false;
|
|
3044
3240
|
let dragMode = null;
|
|
3045
3241
|
let lastPointerX = 0;
|
|
@@ -3165,6 +3361,25 @@ function createChart(element, options = {}) {
|
|
|
3165
3361
|
if (region === "outside") {
|
|
3166
3362
|
return;
|
|
3167
3363
|
}
|
|
3364
|
+
if (region === "plot" && !activeDrawingTool) {
|
|
3365
|
+
const drawingHit = getDrawingHit(point.x, point.y);
|
|
3366
|
+
if (drawingHit) {
|
|
3367
|
+
drawingSelectHandler?.({
|
|
3368
|
+
drawing: serializeDrawing(drawingHit.drawing),
|
|
3369
|
+
target: drawingHit.target,
|
|
3370
|
+
x: point.x,
|
|
3371
|
+
y: point.y
|
|
3372
|
+
});
|
|
3373
|
+
setCrosshairPoint(null);
|
|
3374
|
+
canvas.style.cursor = "pointer";
|
|
3375
|
+
return;
|
|
3376
|
+
}
|
|
3377
|
+
}
|
|
3378
|
+
if (region === "plot" && handleDrawingToolPointerDown(point.x, point.y)) {
|
|
3379
|
+
setCrosshairPoint(null);
|
|
3380
|
+
canvas.style.cursor = "crosshair";
|
|
3381
|
+
return;
|
|
3382
|
+
}
|
|
3168
3383
|
isDragging = true;
|
|
3169
3384
|
dragMode = region;
|
|
3170
3385
|
activePointerId = event.pointerId;
|
|
@@ -3196,6 +3411,18 @@ function createChart(element, options = {}) {
|
|
|
3196
3411
|
pointerDownInfo.moved = true;
|
|
3197
3412
|
}
|
|
3198
3413
|
}
|
|
3414
|
+
if (draftDrawing && activeDrawingTool === "trendline") {
|
|
3415
|
+
const nextPoint = drawingPointFromCanvas(point.x, point.y);
|
|
3416
|
+
if (nextPoint) {
|
|
3417
|
+
draftDrawing = {
|
|
3418
|
+
...draftDrawing,
|
|
3419
|
+
points: [draftDrawing.points[0], nextPoint]
|
|
3420
|
+
};
|
|
3421
|
+
canvas.style.cursor = "crosshair";
|
|
3422
|
+
draw();
|
|
3423
|
+
return;
|
|
3424
|
+
}
|
|
3425
|
+
}
|
|
3199
3426
|
if (orderDragState) {
|
|
3200
3427
|
if (activePointerId !== null && event.pointerId !== activePointerId) {
|
|
3201
3428
|
return;
|
|
@@ -3266,9 +3493,14 @@ function createChart(element, options = {}) {
|
|
|
3266
3493
|
setCrosshairPoint(null);
|
|
3267
3494
|
return;
|
|
3268
3495
|
}
|
|
3496
|
+
if (!activeDrawingTool && getDrawingHit(point.x, point.y)) {
|
|
3497
|
+
canvas.style.cursor = "pointer";
|
|
3498
|
+
setCrosshairPoint(null);
|
|
3499
|
+
return;
|
|
3500
|
+
}
|
|
3269
3501
|
const hoverRegion = getHitRegion(point.x, point.y);
|
|
3270
3502
|
if (hoverRegion === "plot") {
|
|
3271
|
-
canvas.style.cursor = doubleClickEnabled ? "default" : "crosshair";
|
|
3503
|
+
canvas.style.cursor = activeDrawingTool ? "crosshair" : doubleClickEnabled ? "default" : "crosshair";
|
|
3272
3504
|
setCrosshairPoint(point);
|
|
3273
3505
|
emitCrosshairMove(point.x, point.y, "plot");
|
|
3274
3506
|
} else if (hoverRegion === "x-axis") {
|
|
@@ -3667,6 +3899,56 @@ function createChart(element, options = {}) {
|
|
|
3667
3899
|
indicators = indicators.filter((indicator) => indicator.id !== id);
|
|
3668
3900
|
draw();
|
|
3669
3901
|
};
|
|
3902
|
+
const setActiveDrawingTool = (tool) => {
|
|
3903
|
+
activeDrawingTool = tool;
|
|
3904
|
+
draftDrawing = null;
|
|
3905
|
+
canvas.style.cursor = tool ? "crosshair" : "default";
|
|
3906
|
+
draw();
|
|
3907
|
+
};
|
|
3908
|
+
const getActiveDrawingTool = () => activeDrawingTool;
|
|
3909
|
+
const getDrawings = () => drawings.map((drawing) => serializeDrawing(drawing));
|
|
3910
|
+
const setDrawings = (nextDrawings) => {
|
|
3911
|
+
drawings = nextDrawings.map((drawing) => normalizeDrawingState(drawing));
|
|
3912
|
+
draftDrawing = null;
|
|
3913
|
+
emitDrawingsChange();
|
|
3914
|
+
draw();
|
|
3915
|
+
};
|
|
3916
|
+
const addDrawing = (drawing) => {
|
|
3917
|
+
const next = normalizeDrawingState(drawing);
|
|
3918
|
+
drawings.push(next);
|
|
3919
|
+
emitDrawingsChange();
|
|
3920
|
+
draw();
|
|
3921
|
+
return next.id;
|
|
3922
|
+
};
|
|
3923
|
+
const updateDrawing = (id, patch) => {
|
|
3924
|
+
drawings = drawings.map(
|
|
3925
|
+
(drawing) => drawing.id === id ? normalizeDrawingState({
|
|
3926
|
+
...serializeDrawing(drawing),
|
|
3927
|
+
...patch,
|
|
3928
|
+
id,
|
|
3929
|
+
points: patch.points ?? drawing.points
|
|
3930
|
+
}) : drawing
|
|
3931
|
+
);
|
|
3932
|
+
emitDrawingsChange();
|
|
3933
|
+
draw();
|
|
3934
|
+
};
|
|
3935
|
+
const removeDrawing = (id) => {
|
|
3936
|
+
drawings = drawings.filter((drawing) => drawing.id !== id);
|
|
3937
|
+
emitDrawingsChange();
|
|
3938
|
+
draw();
|
|
3939
|
+
};
|
|
3940
|
+
const clearDrawings = () => {
|
|
3941
|
+
drawings = [];
|
|
3942
|
+
draftDrawing = null;
|
|
3943
|
+
emitDrawingsChange();
|
|
3944
|
+
draw();
|
|
3945
|
+
};
|
|
3946
|
+
const onDrawingsChange = (handler) => {
|
|
3947
|
+
drawingsChangeHandler = handler;
|
|
3948
|
+
};
|
|
3949
|
+
const onDrawingSelect = (handler) => {
|
|
3950
|
+
drawingSelectHandler = handler;
|
|
3951
|
+
};
|
|
3670
3952
|
const destroy = () => {
|
|
3671
3953
|
if (smoothingRafId !== null) {
|
|
3672
3954
|
cancelAnimationFrame(smoothingRafId);
|
|
@@ -3710,6 +3992,16 @@ function createChart(element, options = {}) {
|
|
|
3710
3992
|
getViewport,
|
|
3711
3993
|
setViewport,
|
|
3712
3994
|
onViewportChange,
|
|
3995
|
+
setActiveDrawingTool,
|
|
3996
|
+
getActiveDrawingTool,
|
|
3997
|
+
setDrawings,
|
|
3998
|
+
getDrawings,
|
|
3999
|
+
addDrawing,
|
|
4000
|
+
updateDrawing,
|
|
4001
|
+
removeDrawing,
|
|
4002
|
+
clearDrawings,
|
|
4003
|
+
onDrawingsChange,
|
|
4004
|
+
onDrawingSelect,
|
|
3713
4005
|
setDoubleClickEnabled,
|
|
3714
4006
|
setDoubleClickAction,
|
|
3715
4007
|
registerIndicator,
|
package/dist/index.d.cts
CHANGED
|
@@ -40,8 +40,32 @@ interface ChartOptions {
|
|
|
40
40
|
labels?: LabelsOptions;
|
|
41
41
|
dashPatterns?: Partial<DashPatternOptions>;
|
|
42
42
|
indicators?: IndicatorInstanceOptions[];
|
|
43
|
+
drawings?: DrawingObjectOptions[];
|
|
43
44
|
}
|
|
44
45
|
type IndicatorPane = "overlay" | "separate";
|
|
46
|
+
type DrawingToolType = "horizontal-line" | "trendline";
|
|
47
|
+
interface DrawingPoint {
|
|
48
|
+
index: number;
|
|
49
|
+
price: number;
|
|
50
|
+
time?: string;
|
|
51
|
+
}
|
|
52
|
+
interface DrawingObjectOptions {
|
|
53
|
+
id?: string;
|
|
54
|
+
type: DrawingToolType;
|
|
55
|
+
points: DrawingPoint[];
|
|
56
|
+
visible?: boolean;
|
|
57
|
+
color?: string;
|
|
58
|
+
style?: "solid" | "dotted" | "dashed";
|
|
59
|
+
width?: number;
|
|
60
|
+
label?: string;
|
|
61
|
+
locked?: boolean;
|
|
62
|
+
}
|
|
63
|
+
interface DrawingSelectEvent {
|
|
64
|
+
drawing: DrawingObjectOptions;
|
|
65
|
+
target: "line" | "handle";
|
|
66
|
+
x: number;
|
|
67
|
+
y: number;
|
|
68
|
+
}
|
|
45
69
|
interface IndicatorInstanceOptions<TInputs extends Record<string, unknown> = Record<string, unknown>> {
|
|
46
70
|
id?: string;
|
|
47
71
|
type: string;
|
|
@@ -363,6 +387,16 @@ interface ChartInstance {
|
|
|
363
387
|
getViewport: () => ViewportState;
|
|
364
388
|
setViewport: (viewport: Partial<ViewportState>) => void;
|
|
365
389
|
onViewportChange: (handler: ((viewport: ViewportState) => void) | null) => void;
|
|
390
|
+
setActiveDrawingTool: (tool: DrawingToolType | null) => void;
|
|
391
|
+
getActiveDrawingTool: () => DrawingToolType | null;
|
|
392
|
+
setDrawings: (nextDrawings: DrawingObjectOptions[]) => void;
|
|
393
|
+
getDrawings: () => DrawingObjectOptions[];
|
|
394
|
+
addDrawing: (drawing: DrawingObjectOptions) => string;
|
|
395
|
+
updateDrawing: (id: string, patch: Partial<DrawingObjectOptions>) => void;
|
|
396
|
+
removeDrawing: (id: string) => void;
|
|
397
|
+
clearDrawings: () => void;
|
|
398
|
+
onDrawingsChange: (handler: ((drawings: DrawingObjectOptions[]) => void) | null) => void;
|
|
399
|
+
onDrawingSelect: (handler: ((event: DrawingSelectEvent) => void) | null) => void;
|
|
366
400
|
setDoubleClickEnabled: (enabled: boolean) => void;
|
|
367
401
|
setDoubleClickAction: (action: "reset" | "placeLimitOrder") => void;
|
|
368
402
|
registerIndicator: (plugin: IndicatorPlugin<any>) => void;
|
|
@@ -398,4 +432,4 @@ interface ViewportState {
|
|
|
398
432
|
}
|
|
399
433
|
declare function createChart(element: HTMLElement, options?: ChartOptions): ChartInstance;
|
|
400
434
|
|
|
401
|
-
export { type AxisOptions, type BuiltInIndicatorInfo, type ChartClickEvent, type ChartInstance, type ChartOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, type PriceLineOptions, type TickerLineOptions, type ViewportState, type WatermarkOptions, createChart };
|
|
435
|
+
export { type AxisOptions, type BuiltInIndicatorInfo, type ChartClickEvent, type ChartInstance, type ChartOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type DrawingObjectOptions, type DrawingPoint, type DrawingSelectEvent, type DrawingToolType, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, type PriceLineOptions, type TickerLineOptions, type ViewportState, type WatermarkOptions, createChart };
|
package/dist/index.d.ts
CHANGED
|
@@ -40,8 +40,32 @@ interface ChartOptions {
|
|
|
40
40
|
labels?: LabelsOptions;
|
|
41
41
|
dashPatterns?: Partial<DashPatternOptions>;
|
|
42
42
|
indicators?: IndicatorInstanceOptions[];
|
|
43
|
+
drawings?: DrawingObjectOptions[];
|
|
43
44
|
}
|
|
44
45
|
type IndicatorPane = "overlay" | "separate";
|
|
46
|
+
type DrawingToolType = "horizontal-line" | "trendline";
|
|
47
|
+
interface DrawingPoint {
|
|
48
|
+
index: number;
|
|
49
|
+
price: number;
|
|
50
|
+
time?: string;
|
|
51
|
+
}
|
|
52
|
+
interface DrawingObjectOptions {
|
|
53
|
+
id?: string;
|
|
54
|
+
type: DrawingToolType;
|
|
55
|
+
points: DrawingPoint[];
|
|
56
|
+
visible?: boolean;
|
|
57
|
+
color?: string;
|
|
58
|
+
style?: "solid" | "dotted" | "dashed";
|
|
59
|
+
width?: number;
|
|
60
|
+
label?: string;
|
|
61
|
+
locked?: boolean;
|
|
62
|
+
}
|
|
63
|
+
interface DrawingSelectEvent {
|
|
64
|
+
drawing: DrawingObjectOptions;
|
|
65
|
+
target: "line" | "handle";
|
|
66
|
+
x: number;
|
|
67
|
+
y: number;
|
|
68
|
+
}
|
|
45
69
|
interface IndicatorInstanceOptions<TInputs extends Record<string, unknown> = Record<string, unknown>> {
|
|
46
70
|
id?: string;
|
|
47
71
|
type: string;
|
|
@@ -363,6 +387,16 @@ interface ChartInstance {
|
|
|
363
387
|
getViewport: () => ViewportState;
|
|
364
388
|
setViewport: (viewport: Partial<ViewportState>) => void;
|
|
365
389
|
onViewportChange: (handler: ((viewport: ViewportState) => void) | null) => void;
|
|
390
|
+
setActiveDrawingTool: (tool: DrawingToolType | null) => void;
|
|
391
|
+
getActiveDrawingTool: () => DrawingToolType | null;
|
|
392
|
+
setDrawings: (nextDrawings: DrawingObjectOptions[]) => void;
|
|
393
|
+
getDrawings: () => DrawingObjectOptions[];
|
|
394
|
+
addDrawing: (drawing: DrawingObjectOptions) => string;
|
|
395
|
+
updateDrawing: (id: string, patch: Partial<DrawingObjectOptions>) => void;
|
|
396
|
+
removeDrawing: (id: string) => void;
|
|
397
|
+
clearDrawings: () => void;
|
|
398
|
+
onDrawingsChange: (handler: ((drawings: DrawingObjectOptions[]) => void) | null) => void;
|
|
399
|
+
onDrawingSelect: (handler: ((event: DrawingSelectEvent) => void) | null) => void;
|
|
366
400
|
setDoubleClickEnabled: (enabled: boolean) => void;
|
|
367
401
|
setDoubleClickAction: (action: "reset" | "placeLimitOrder") => void;
|
|
368
402
|
registerIndicator: (plugin: IndicatorPlugin<any>) => void;
|
|
@@ -398,4 +432,4 @@ interface ViewportState {
|
|
|
398
432
|
}
|
|
399
433
|
declare function createChart(element: HTMLElement, options?: ChartOptions): ChartInstance;
|
|
400
434
|
|
|
401
|
-
export { type AxisOptions, type BuiltInIndicatorInfo, type ChartClickEvent, type ChartInstance, type ChartOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, type PriceLineOptions, type TickerLineOptions, type ViewportState, type WatermarkOptions, createChart };
|
|
435
|
+
export { type AxisOptions, type BuiltInIndicatorInfo, type ChartClickEvent, type ChartInstance, type ChartOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type DrawingObjectOptions, type DrawingPoint, type DrawingSelectEvent, type DrawingToolType, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, type PriceLineOptions, type TickerLineOptions, type ViewportState, type WatermarkOptions, createChart };
|