hyperprop-charting-library 0.1.90 → 0.1.92

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.
@@ -4855,6 +4855,22 @@ function createChart(element, options = {}) {
4855
4855
  canvas.addEventListener("wheel", onWheel, { passive: false });
4856
4856
  canvas.addEventListener("dblclick", onDoubleClick);
4857
4857
  canvas.addEventListener("contextmenu", onContextMenu);
4858
+ const onModifierKeyChange = (event) => {
4859
+ const active = event.metaKey || event.ctrlKey;
4860
+ if (active !== magnetModifierActive) {
4861
+ magnetModifierActive = active;
4862
+ if (draftDrawing) draw();
4863
+ }
4864
+ };
4865
+ const onWindowBlurMagnet = () => {
4866
+ magnetModifierActive = false;
4867
+ };
4868
+ const hasWindow = typeof window !== "undefined";
4869
+ if (hasWindow) {
4870
+ window.addEventListener("keydown", onModifierKeyChange);
4871
+ window.addEventListener("keyup", onModifierKeyChange);
4872
+ window.addEventListener("blur", onWindowBlurMagnet);
4873
+ }
4858
4874
  const updateOptions = (nextOptions) => {
4859
4875
  const wasTickerSmoothingEnabled = mergedOptions.tickerLine?.smoothing ?? false;
4860
4876
  const previousWidth = width;
@@ -5094,6 +5110,14 @@ function createChart(element, options = {}) {
5094
5110
  draw();
5095
5111
  };
5096
5112
  const getActiveDrawingTool = () => activeDrawingTool;
5113
+ const cancelDrawing = () => {
5114
+ if (draftDrawing) {
5115
+ draftDrawing = null;
5116
+ draw();
5117
+ return true;
5118
+ }
5119
+ return false;
5120
+ };
5097
5121
  const setMagnetMode = (mode) => {
5098
5122
  magnetMode = mode;
5099
5123
  };
@@ -5163,6 +5187,11 @@ function createChart(element, options = {}) {
5163
5187
  canvas.removeEventListener("wheel", onWheel);
5164
5188
  canvas.removeEventListener("dblclick", onDoubleClick);
5165
5189
  canvas.removeEventListener("contextmenu", onContextMenu);
5190
+ if (hasWindow) {
5191
+ window.removeEventListener("keydown", onModifierKeyChange);
5192
+ window.removeEventListener("keyup", onModifierKeyChange);
5193
+ window.removeEventListener("blur", onWindowBlurMagnet);
5194
+ }
5166
5195
  element.innerHTML = "";
5167
5196
  };
5168
5197
  draw();
@@ -5208,6 +5237,7 @@ function createChart(element, options = {}) {
5208
5237
  onDrawingEditText,
5209
5238
  setMagnetMode,
5210
5239
  getMagnetMode,
5240
+ cancelDrawing,
5211
5241
  setSelectedDrawing,
5212
5242
  onDrawingHover,
5213
5243
  setDrawingDefaults,
@@ -432,6 +432,7 @@ interface ChartInstance {
432
432
  onDrawingEditText: (handler: ((event: DrawingSelectEvent) => void) | null) => void;
433
433
  setMagnetMode: (mode: "none" | "weak" | "strong") => void;
434
434
  getMagnetMode: () => "none" | "weak" | "strong";
435
+ cancelDrawing: () => boolean;
435
436
  onDrawingHover: (handler: ((event: DrawingHoverEvent) => void) | null) => void;
436
437
  setDrawingDefaults: (tool: DrawingToolType, defaults: DrawingDefaults | null) => void;
437
438
  setSelectedDrawing: (id: string | null) => void;
@@ -4829,6 +4829,22 @@ function createChart(element, options = {}) {
4829
4829
  canvas.addEventListener("wheel", onWheel, { passive: false });
4830
4830
  canvas.addEventListener("dblclick", onDoubleClick);
4831
4831
  canvas.addEventListener("contextmenu", onContextMenu);
4832
+ const onModifierKeyChange = (event) => {
4833
+ const active = event.metaKey || event.ctrlKey;
4834
+ if (active !== magnetModifierActive) {
4835
+ magnetModifierActive = active;
4836
+ if (draftDrawing) draw();
4837
+ }
4838
+ };
4839
+ const onWindowBlurMagnet = () => {
4840
+ magnetModifierActive = false;
4841
+ };
4842
+ const hasWindow = typeof window !== "undefined";
4843
+ if (hasWindow) {
4844
+ window.addEventListener("keydown", onModifierKeyChange);
4845
+ window.addEventListener("keyup", onModifierKeyChange);
4846
+ window.addEventListener("blur", onWindowBlurMagnet);
4847
+ }
4832
4848
  const updateOptions = (nextOptions) => {
4833
4849
  const wasTickerSmoothingEnabled = mergedOptions.tickerLine?.smoothing ?? false;
4834
4850
  const previousWidth = width;
@@ -5068,6 +5084,14 @@ function createChart(element, options = {}) {
5068
5084
  draw();
5069
5085
  };
5070
5086
  const getActiveDrawingTool = () => activeDrawingTool;
5087
+ const cancelDrawing = () => {
5088
+ if (draftDrawing) {
5089
+ draftDrawing = null;
5090
+ draw();
5091
+ return true;
5092
+ }
5093
+ return false;
5094
+ };
5071
5095
  const setMagnetMode = (mode) => {
5072
5096
  magnetMode = mode;
5073
5097
  };
@@ -5137,6 +5161,11 @@ function createChart(element, options = {}) {
5137
5161
  canvas.removeEventListener("wheel", onWheel);
5138
5162
  canvas.removeEventListener("dblclick", onDoubleClick);
5139
5163
  canvas.removeEventListener("contextmenu", onContextMenu);
5164
+ if (hasWindow) {
5165
+ window.removeEventListener("keydown", onModifierKeyChange);
5166
+ window.removeEventListener("keyup", onModifierKeyChange);
5167
+ window.removeEventListener("blur", onWindowBlurMagnet);
5168
+ }
5140
5169
  element.innerHTML = "";
5141
5170
  };
5142
5171
  draw();
@@ -5182,6 +5211,7 @@ function createChart(element, options = {}) {
5182
5211
  onDrawingEditText,
5183
5212
  setMagnetMode,
5184
5213
  getMagnetMode,
5214
+ cancelDrawing,
5185
5215
  setSelectedDrawing,
5186
5216
  onDrawingHover,
5187
5217
  setDrawingDefaults,
package/dist/index.cjs CHANGED
@@ -4855,6 +4855,22 @@ function createChart(element, options = {}) {
4855
4855
  canvas.addEventListener("wheel", onWheel, { passive: false });
4856
4856
  canvas.addEventListener("dblclick", onDoubleClick);
4857
4857
  canvas.addEventListener("contextmenu", onContextMenu);
4858
+ const onModifierKeyChange = (event) => {
4859
+ const active = event.metaKey || event.ctrlKey;
4860
+ if (active !== magnetModifierActive) {
4861
+ magnetModifierActive = active;
4862
+ if (draftDrawing) draw();
4863
+ }
4864
+ };
4865
+ const onWindowBlurMagnet = () => {
4866
+ magnetModifierActive = false;
4867
+ };
4868
+ const hasWindow = typeof window !== "undefined";
4869
+ if (hasWindow) {
4870
+ window.addEventListener("keydown", onModifierKeyChange);
4871
+ window.addEventListener("keyup", onModifierKeyChange);
4872
+ window.addEventListener("blur", onWindowBlurMagnet);
4873
+ }
4858
4874
  const updateOptions = (nextOptions) => {
4859
4875
  const wasTickerSmoothingEnabled = mergedOptions.tickerLine?.smoothing ?? false;
4860
4876
  const previousWidth = width;
@@ -5094,6 +5110,14 @@ function createChart(element, options = {}) {
5094
5110
  draw();
5095
5111
  };
5096
5112
  const getActiveDrawingTool = () => activeDrawingTool;
5113
+ const cancelDrawing = () => {
5114
+ if (draftDrawing) {
5115
+ draftDrawing = null;
5116
+ draw();
5117
+ return true;
5118
+ }
5119
+ return false;
5120
+ };
5097
5121
  const setMagnetMode = (mode) => {
5098
5122
  magnetMode = mode;
5099
5123
  };
@@ -5163,6 +5187,11 @@ function createChart(element, options = {}) {
5163
5187
  canvas.removeEventListener("wheel", onWheel);
5164
5188
  canvas.removeEventListener("dblclick", onDoubleClick);
5165
5189
  canvas.removeEventListener("contextmenu", onContextMenu);
5190
+ if (hasWindow) {
5191
+ window.removeEventListener("keydown", onModifierKeyChange);
5192
+ window.removeEventListener("keyup", onModifierKeyChange);
5193
+ window.removeEventListener("blur", onWindowBlurMagnet);
5194
+ }
5166
5195
  element.innerHTML = "";
5167
5196
  };
5168
5197
  draw();
@@ -5208,6 +5237,7 @@ function createChart(element, options = {}) {
5208
5237
  onDrawingEditText,
5209
5238
  setMagnetMode,
5210
5239
  getMagnetMode,
5240
+ cancelDrawing,
5211
5241
  setSelectedDrawing,
5212
5242
  onDrawingHover,
5213
5243
  setDrawingDefaults,
package/dist/index.d.cts CHANGED
@@ -432,6 +432,7 @@ interface ChartInstance {
432
432
  onDrawingEditText: (handler: ((event: DrawingSelectEvent) => void) | null) => void;
433
433
  setMagnetMode: (mode: "none" | "weak" | "strong") => void;
434
434
  getMagnetMode: () => "none" | "weak" | "strong";
435
+ cancelDrawing: () => boolean;
435
436
  onDrawingHover: (handler: ((event: DrawingHoverEvent) => void) | null) => void;
436
437
  setDrawingDefaults: (tool: DrawingToolType, defaults: DrawingDefaults | null) => void;
437
438
  setSelectedDrawing: (id: string | null) => void;
package/dist/index.d.ts CHANGED
@@ -432,6 +432,7 @@ interface ChartInstance {
432
432
  onDrawingEditText: (handler: ((event: DrawingSelectEvent) => void) | null) => void;
433
433
  setMagnetMode: (mode: "none" | "weak" | "strong") => void;
434
434
  getMagnetMode: () => "none" | "weak" | "strong";
435
+ cancelDrawing: () => boolean;
435
436
  onDrawingHover: (handler: ((event: DrawingHoverEvent) => void) | null) => void;
436
437
  setDrawingDefaults: (tool: DrawingToolType, defaults: DrawingDefaults | null) => void;
437
438
  setSelectedDrawing: (id: string | null) => void;
package/dist/index.js CHANGED
@@ -4829,6 +4829,22 @@ function createChart(element, options = {}) {
4829
4829
  canvas.addEventListener("wheel", onWheel, { passive: false });
4830
4830
  canvas.addEventListener("dblclick", onDoubleClick);
4831
4831
  canvas.addEventListener("contextmenu", onContextMenu);
4832
+ const onModifierKeyChange = (event) => {
4833
+ const active = event.metaKey || event.ctrlKey;
4834
+ if (active !== magnetModifierActive) {
4835
+ magnetModifierActive = active;
4836
+ if (draftDrawing) draw();
4837
+ }
4838
+ };
4839
+ const onWindowBlurMagnet = () => {
4840
+ magnetModifierActive = false;
4841
+ };
4842
+ const hasWindow = typeof window !== "undefined";
4843
+ if (hasWindow) {
4844
+ window.addEventListener("keydown", onModifierKeyChange);
4845
+ window.addEventListener("keyup", onModifierKeyChange);
4846
+ window.addEventListener("blur", onWindowBlurMagnet);
4847
+ }
4832
4848
  const updateOptions = (nextOptions) => {
4833
4849
  const wasTickerSmoothingEnabled = mergedOptions.tickerLine?.smoothing ?? false;
4834
4850
  const previousWidth = width;
@@ -5068,6 +5084,14 @@ function createChart(element, options = {}) {
5068
5084
  draw();
5069
5085
  };
5070
5086
  const getActiveDrawingTool = () => activeDrawingTool;
5087
+ const cancelDrawing = () => {
5088
+ if (draftDrawing) {
5089
+ draftDrawing = null;
5090
+ draw();
5091
+ return true;
5092
+ }
5093
+ return false;
5094
+ };
5071
5095
  const setMagnetMode = (mode) => {
5072
5096
  magnetMode = mode;
5073
5097
  };
@@ -5137,6 +5161,11 @@ function createChart(element, options = {}) {
5137
5161
  canvas.removeEventListener("wheel", onWheel);
5138
5162
  canvas.removeEventListener("dblclick", onDoubleClick);
5139
5163
  canvas.removeEventListener("contextmenu", onContextMenu);
5164
+ if (hasWindow) {
5165
+ window.removeEventListener("keydown", onModifierKeyChange);
5166
+ window.removeEventListener("keyup", onModifierKeyChange);
5167
+ window.removeEventListener("blur", onWindowBlurMagnet);
5168
+ }
5140
5169
  element.innerHTML = "";
5141
5170
  };
5142
5171
  draw();
@@ -5182,6 +5211,7 @@ function createChart(element, options = {}) {
5182
5211
  onDrawingEditText,
5183
5212
  setMagnetMode,
5184
5213
  getMagnetMode,
5214
+ cancelDrawing,
5185
5215
  setSelectedDrawing,
5186
5216
  onDrawingHover,
5187
5217
  setDrawingDefaults,
package/docs/API.md CHANGED
@@ -484,6 +484,7 @@ Use `getDrawings()` / `setDrawings()` for persistence.
484
484
  - `setSelectedDrawing(id: string | null): void` (marks a drawing selected; only the selected/drafted drawing renders its handles, and position tools render their lines/labels only while selected)
485
485
  - `onDrawingDoubleClick(handler): void` (fires when a drawing is double-clicked; use it to open a settings dialog, e.g. for position tools)
486
486
  - `onDrawingEditText(handler): void` (fires when a `text`/`note` tool is placed or double-clicked; use it to show an inline text editor at `{x, y}` and write the result back via `updateDrawing(id, { label })`). `text`/`note` drawings store their content in `label` and size in `fontSize`.
487
+ - `cancelDrawing(): boolean` — abort an in-progress multi-click drawing (between the first click and the final point, e.g. a half-drawn trendline/ray/fib). Returns `true` if a draft was cancelled. Wire it to Escape.
487
488
  - `setMagnetMode(mode): void` / `getMagnetMode()` — magnet/snap for all drawing tools. `"none"` off, `"weak"` snaps to a candle's OHLC only when the cursor is near a value, `"strong"` always snaps to the nearest OHLC of the bar under the cursor. Holding Cmd/Ctrl while drawing/dragging forces strong snapping regardless of the mode.
488
489
  - `setActiveDrawingTool(tool: DrawingToolType | null): void` (`DrawingToolType` = `"horizontal-line" | "vertical-line" | "trendline" | "ray" | "fib-retracement"`)
489
490
  - `getActiveDrawingTool(): DrawingToolType | null`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hyperprop-charting-library",
3
- "version": "0.1.90",
3
+ "version": "0.1.92",
4
4
  "description": "Lightweight TypeScript charting core",
5
5
  "type": "module",
6
6
  "main": "./dist/hyperprop-charting-library.cjs",