aliencharts 0.1.1 → 0.1.3

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/index.js CHANGED
@@ -309,7 +309,8 @@ function ChartToolbar({
309
309
  activeDrawingTool = null,
310
310
  onDrawingToolToggle,
311
311
  hasDrawings = false,
312
- onClearDrawingsRequest
312
+ onClearDrawingsRequest,
313
+ disableDrawings = false
313
314
  }) {
314
315
  return /* @__PURE__ */ React.createElement("div", { className: "absolute left-2 top-12 z-30 flex flex-col gap-0.5 rounded-sm bg-background/80 p-0 pr-3 text-foreground shadow-sm backdrop-blur" }, /* @__PURE__ */ React.createElement(
315
316
  ToolbarAction,
@@ -328,7 +329,7 @@ function ChartToolbar({
328
329
  active: rectangleZoomActive
329
330
  },
330
331
  /* @__PURE__ */ React.createElement(MagnifyingGlassPlusIcon, { size: 16, weight: "bold" })
331
- ), hasDrawings ? /* @__PURE__ */ React.createElement(
332
+ ), !disableDrawings && hasDrawings ? /* @__PURE__ */ React.createElement(
332
333
  ToolbarAction,
333
334
  {
334
335
  title: "Clear drawings",
@@ -336,7 +337,7 @@ function ChartToolbar({
336
337
  onClick: onClearDrawingsRequest
337
338
  },
338
339
  /* @__PURE__ */ React.createElement(BroomIcon, { size: 16, weight: "bold" })
339
- ) : null, /* @__PURE__ */ React.createElement("div", { className: "my-1 h-px w-full" }), /* @__PURE__ */ React.createElement(
340
+ ) : null, !disableDrawings ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("div", { className: "my-1 h-px w-full" }), /* @__PURE__ */ React.createElement(
340
341
  ToolbarAction,
341
342
  {
342
343
  title: "Draw trendline",
@@ -372,7 +373,7 @@ function ChartToolbar({
372
373
  active: activeDrawingTool === "pin"
373
374
  },
374
375
  /* @__PURE__ */ React.createElement(MapPinIcon, { size: 16, weight: "bold" })
375
- ), /* @__PURE__ */ React.createElement(
376
+ )) : null, !disableDrawings ? /* @__PURE__ */ React.createElement(
376
377
  ToolbarAction,
377
378
  {
378
379
  title: "Toggle moving average",
@@ -381,7 +382,7 @@ function ChartToolbar({
381
382
  active: movingAverageActive
382
383
  },
383
384
  /* @__PURE__ */ React.createElement(WaveSineIcon, { size: 16, weight: "bold" })
384
- ));
385
+ ) : null);
385
386
  }
386
387
 
387
388
  // src/react/DrawingOptionsToolbar.jsx
@@ -1739,6 +1740,11 @@ var getYRange = (chart, xMin, xMax, width) => {
1739
1740
  if (!Number.isFinite(minY) || !Number.isFinite(maxY)) {
1740
1741
  return { minY: 0, maxY: 1, renderedPoints, bucketSize };
1741
1742
  }
1743
+ const fixedMinY = Number(chart.yRange?.min);
1744
+ const fixedMaxY = Number(chart.yRange?.max);
1745
+ if (Number.isFinite(fixedMinY) && Number.isFinite(fixedMaxY) && fixedMinY < fixedMaxY) {
1746
+ return { minY: fixedMinY, maxY: fixedMaxY, renderedPoints, bucketSize };
1747
+ }
1742
1748
  if (minY === maxY) {
1743
1749
  minY -= 1;
1744
1750
  maxY += 1;
@@ -1988,9 +1994,12 @@ function ChartCell({
1988
1994
  onDrawingToolToggle,
1989
1995
  hasDrawings = false,
1990
1996
  onClearDrawingsRequest,
1997
+ disableDrawings = false,
1991
1998
  height = CHART_HEIGHT,
1992
1999
  isFullscreen = false,
1993
- backgroundColor = DEFAULT_CHART_BACKGROUND
2000
+ backgroundColor = DEFAULT_CHART_BACKGROUND,
2001
+ formatXTick = formatCompactNumber,
2002
+ formatYValue = formatNumber
1994
2003
  }) {
1995
2004
  const headerBackground = withAlpha(backgroundColor, 0.82);
1996
2005
  const controlBackground = withAlpha(backgroundColor, 0.78);
@@ -2067,7 +2076,8 @@ function ChartCell({
2067
2076
  activeDrawingTool,
2068
2077
  onDrawingToolToggle,
2069
2078
  hasDrawings,
2070
- onClearDrawingsRequest: () => onClearDrawingsRequest?.(chart.id)
2079
+ onClearDrawingsRequest: () => onClearDrawingsRequest?.(chart.id),
2080
+ disableDrawings
2071
2081
  }
2072
2082
  ) : null,
2073
2083
  /* @__PURE__ */ React5.createElement("div", { className: "pointer-events-none absolute inset-y-8 left-9 border-l border-border/40" }),
@@ -2106,7 +2116,7 @@ function ChartCell({
2106
2116
  className: "pointer-events-none absolute left-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70 dark:text-foreground/80",
2107
2117
  style: { top: tick.top }
2108
2118
  },
2109
- formatNumber(tick.value)
2119
+ formatYValue(tick.value)
2110
2120
  )),
2111
2121
  axisOverlay?.latestValues.map((latest) => /* @__PURE__ */ React5.createElement(
2112
2122
  "div",
@@ -2119,7 +2129,7 @@ function ChartCell({
2119
2129
  color: latest.textColor
2120
2130
  }
2121
2131
  },
2122
- formatNumber(latest.value)
2132
+ formatYValue(latest.value)
2123
2133
  ))
2124
2134
  ),
2125
2135
  /* @__PURE__ */ React5.createElement(
@@ -2141,7 +2151,7 @@ function ChartCell({
2141
2151
  className: "pointer-events-none absolute top-1/2 -translate-x-1/2 -translate-y-1/2 text-center text-[11px] font-medium tabular-nums text-foreground/70 dark:text-foreground/80",
2142
2152
  style: { left: tick.left }
2143
2153
  },
2144
- formatCompactNumber(tick.value)
2154
+ formatXTick(tick.value)
2145
2155
  ))
2146
2156
  )
2147
2157
  );
@@ -2149,7 +2159,9 @@ function ChartCell({
2149
2159
  function CrosshairOverlay({
2150
2160
  crosshair,
2151
2161
  height = "100%",
2152
- xAxisLabel = "STEP"
2162
+ xAxisLabel = "STEP",
2163
+ formatXValue = formatNumber,
2164
+ formatYValue = formatNumber
2153
2165
  }) {
2154
2166
  if (!crosshair) return null;
2155
2167
  return /* @__PURE__ */ React5.createElement(React5.Fragment, null, /* @__PURE__ */ React5.createElement(
@@ -2188,7 +2200,7 @@ function CrosshairOverlay({
2188
2200
  top: crosshair.tooltipY
2189
2201
  }
2190
2202
  },
2191
- /* @__PURE__ */ React5.createElement("div", { className: "mb-1 font-medium" }, xAxisLabel, ": ", formatNumber(crosshair.xValue)),
2203
+ /* @__PURE__ */ React5.createElement("div", { className: "mb-1 font-medium" }, xAxisLabel, ": ", formatXValue(crosshair.xValue)),
2192
2204
  crosshair.points.map((point) => /* @__PURE__ */ React5.createElement(
2193
2205
  "div",
2194
2206
  {
@@ -2202,7 +2214,7 @@ function CrosshairOverlay({
2202
2214
  style: { backgroundColor: point.color }
2203
2215
  }
2204
2216
  ),
2205
- /* @__PURE__ */ React5.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React5.createElement("div", { className: "truncate text-muted-foreground" }, point.name), /* @__PURE__ */ React5.createElement("div", { className: "tabular-nums" }, formatNumber(point.yValue)))
2217
+ /* @__PURE__ */ React5.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ React5.createElement("div", { className: "truncate text-muted-foreground" }, point.name), /* @__PURE__ */ React5.createElement("div", { className: "tabular-nums" }, formatYValue(point.yValue)))
2206
2218
  ))
2207
2219
  ));
2208
2220
  }
@@ -2581,7 +2593,7 @@ var drawChartLayouts = ({
2581
2593
  }
2582
2594
  return nextAxisOverlays;
2583
2595
  };
2584
- function LeanChartFullscreenOverlay({
2596
+ function ChartFullscreenOverlay({
2585
2597
  chart,
2586
2598
  dataRevision,
2587
2599
  renderRevision,
@@ -2612,7 +2624,11 @@ function LeanChartFullscreenOverlay({
2612
2624
  onClearDrawingsRequest,
2613
2625
  onChartContextMenu,
2614
2626
  topMarkers = EMPTY_ARRAY,
2615
- onTopMarkerClick
2627
+ onTopMarkerClick,
2628
+ disableDrawings = false,
2629
+ formatXTick = formatCompactNumber,
2630
+ formatXValue = formatNumber,
2631
+ formatYValue = formatNumber
2616
2632
  }) {
2617
2633
  const containerRef = useRef4(null);
2618
2634
  const chartRef = useRef4(null);
@@ -2632,6 +2648,9 @@ function LeanChartFullscreenOverlay({
2632
2648
  const [visible, setVisible] = useState2(false);
2633
2649
  const [rectangleZoomActive, setRectangleZoomActive] = useState2(false);
2634
2650
  const [rectangleZoomRect, setRectangleZoomRect] = useState2(null);
2651
+ const chartDrawings = disableDrawings ? EMPTY_ARRAY : drawings;
2652
+ const chartActiveDrawingTool = disableDrawings ? null : activeDrawingTool;
2653
+ const chartSelectedDrawingId = disableDrawings ? null : selectedDrawingId;
2635
2654
  const requestRender = useCallback3(() => {
2636
2655
  setRevision((value) => value + 1);
2637
2656
  }, []);
@@ -2653,11 +2672,11 @@ function LeanChartFullscreenOverlay({
2653
2672
  finishEditDrawing,
2654
2673
  deleteSelectedDrawing
2655
2674
  } = useDrawingInteractions({
2656
- drawings,
2657
- onDrawingsChange,
2658
- activeDrawingTool,
2675
+ drawings: chartDrawings,
2676
+ onDrawingsChange: disableDrawings ? void 0 : onDrawingsChange,
2677
+ activeDrawingTool: chartActiveDrawingTool,
2659
2678
  onActiveDrawingToolChange,
2660
- selectedDrawingId,
2679
+ selectedDrawingId: chartSelectedDrawingId,
2661
2680
  onSelectedDrawingIdChange,
2662
2681
  createDrawingId,
2663
2682
  onModeChange: () => {
@@ -2674,9 +2693,9 @@ function LeanChartFullscreenOverlay({
2674
2693
  onActiveDrawingToolChange?.(null);
2675
2694
  }, [clearDraft, onActiveDrawingToolChange]);
2676
2695
  const toggleSelectedDrawingExtend = useCallback3(() => {
2677
- if (!selectedDrawingId || !onDrawingsChange) return;
2696
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
2678
2697
  onDrawingsChange(
2679
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
2698
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
2680
2699
  ...drawing,
2681
2700
  style: {
2682
2701
  ...drawing.style,
@@ -2684,12 +2703,12 @@ function LeanChartFullscreenOverlay({
2684
2703
  }
2685
2704
  }))
2686
2705
  );
2687
- }, [drawings, onDrawingsChange, selectedDrawingId]);
2706
+ }, [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]);
2688
2707
  const updateSelectedDrawingColor = useCallback3(
2689
2708
  (color) => {
2690
- if (!selectedDrawingId || !onDrawingsChange) return;
2709
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
2691
2710
  onDrawingsChange(
2692
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
2711
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
2693
2712
  ...drawing,
2694
2713
  style: {
2695
2714
  ...drawing.style,
@@ -2698,13 +2717,13 @@ function LeanChartFullscreenOverlay({
2698
2717
  }))
2699
2718
  );
2700
2719
  },
2701
- [drawings, onDrawingsChange, selectedDrawingId]
2720
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
2702
2721
  );
2703
2722
  const updateSelectedDrawingText = useCallback3(
2704
2723
  (text) => {
2705
- if (!selectedDrawingId || !onDrawingsChange) return;
2724
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
2706
2725
  onDrawingsChange(
2707
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
2726
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
2708
2727
  ...drawing,
2709
2728
  style: {
2710
2729
  ...drawing.style,
@@ -2713,7 +2732,7 @@ function LeanChartFullscreenOverlay({
2713
2732
  }))
2714
2733
  );
2715
2734
  },
2716
- [drawings, onDrawingsChange, selectedDrawingId]
2735
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
2717
2736
  );
2718
2737
  useEffect3(() => {
2719
2738
  const frame = requestAnimationFrame(() => setVisible(true));
@@ -2912,7 +2931,7 @@ function LeanChartFullscreenOverlay({
2912
2931
  const layout = getLayout();
2913
2932
  if (!point || !layout) return;
2914
2933
  const inPlot = point.x >= layout.plot.x && point.x <= layout.plot.x + layout.plot.width && point.y >= layout.plot.y && point.y <= layout.plot.y + layout.plot.height;
2915
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
2934
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
2916
2935
  if (!inPlot || event.button !== 0) return;
2917
2936
  event.preventDefault();
2918
2937
  const dataPoint = screenPointToDataPoint({
@@ -2924,10 +2943,10 @@ function LeanChartFullscreenOverlay({
2924
2943
  yScaleRef,
2925
2944
  yCenterOffsetRef
2926
2945
  });
2927
- if (activeDrawingTool === "hline" || activeDrawingTool === "vline" || activeDrawingTool === "pin") {
2946
+ if (chartActiveDrawingTool === "hline" || chartActiveDrawingTool === "vline" || chartActiveDrawingTool === "pin") {
2928
2947
  commitDrawing({
2929
2948
  chartId: chart.id,
2930
- type: activeDrawingTool,
2949
+ type: chartActiveDrawingTool,
2931
2950
  start: dataPoint,
2932
2951
  end: dataPoint
2933
2952
  });
@@ -2950,12 +2969,12 @@ function LeanChartFullscreenOverlay({
2950
2969
  });
2951
2970
  return;
2952
2971
  }
2953
- if (inPlot && Array.isArray(drawings) && drawings.length > 0) {
2954
- const chartDrawings = getDrawingsForChart(drawings, chart.id);
2955
- for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {
2972
+ if (inPlot && Array.isArray(chartDrawings) && chartDrawings.length > 0) {
2973
+ const hitDrawings = getDrawingsForChart(chartDrawings, chart.id);
2974
+ for (let i = hitDrawings.length - 1; i >= 0; i -= 1) {
2956
2975
  const hit = hitTestDrawing({
2957
2976
  point,
2958
- drawing: chartDrawings[i],
2977
+ drawing: hitDrawings[i],
2959
2978
  layout,
2960
2979
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
2961
2980
  point: dataPoint,
@@ -3046,10 +3065,9 @@ function LeanChartFullscreenOverlay({
3046
3065
  getLayout,
3047
3066
  getLocalPoint,
3048
3067
  initialVisiblePoints,
3049
- activeDrawingTool,
3050
- chart,
3068
+ chartActiveDrawingTool,
3069
+ chartDrawings,
3051
3070
  commitDrawing,
3052
- drawings,
3053
3071
  onSelectedDrawingIdChange,
3054
3072
  rectangleZoomActive,
3055
3073
  viewStateRef,
@@ -3075,7 +3093,7 @@ function LeanChartFullscreenOverlay({
3075
3093
  yCenterOffsetRef
3076
3094
  });
3077
3095
  const edit = drawingEditRef.current;
3078
- const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {
3096
+ const nextDrawings = updateDrawingById(chartDrawings, edit.id, (drawing) => {
3079
3097
  if (drawing.type === "hline") {
3080
3098
  const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;
3081
3099
  return {
@@ -3102,7 +3120,7 @@ function LeanChartFullscreenOverlay({
3102
3120
  onDrawingsChange?.(nextDrawings);
3103
3121
  return;
3104
3122
  }
3105
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
3123
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
3106
3124
  if (drawingPoint.x < drawingLayout.plot.x || drawingPoint.x > drawingLayout.plot.x + drawingLayout.plot.width || drawingPoint.y < drawingLayout.plot.y || drawingPoint.y > drawingLayout.plot.y + drawingLayout.plot.height) {
3107
3125
  return;
3108
3126
  }
@@ -3115,11 +3133,11 @@ function LeanChartFullscreenOverlay({
3115
3133
  yScaleRef,
3116
3134
  yCenterOffsetRef
3117
3135
  });
3118
- const startPoint = activeDrawingTool === "trendline" ? drawingSessionRef.current.startPoint : dataPoint;
3119
- if (startPoint || activeDrawingTool !== "trendline") {
3136
+ const startPoint = chartActiveDrawingTool === "trendline" ? drawingSessionRef.current.startPoint : dataPoint;
3137
+ if (startPoint || chartActiveDrawingTool !== "trendline") {
3120
3138
  updateDraftDrawing({
3121
3139
  chartId: chart.id,
3122
- type: activeDrawingTool,
3140
+ type: chartActiveDrawingTool,
3123
3141
  start: startPoint || dataPoint,
3124
3142
  end: dataPoint
3125
3143
  });
@@ -3192,8 +3210,8 @@ function LeanChartFullscreenOverlay({
3192
3210
  [
3193
3211
  chart.id,
3194
3212
  chart,
3195
- activeDrawingTool,
3196
- drawings,
3213
+ chartActiveDrawingTool,
3214
+ chartDrawings,
3197
3215
  getLayout,
3198
3216
  getLocalPoint,
3199
3217
  initialVisiblePoints,
@@ -3356,27 +3374,27 @@ function LeanChartFullscreenOverlay({
3356
3374
  toggleRectangleZoom();
3357
3375
  return;
3358
3376
  }
3359
- if (event.key.toLowerCase() === "m") {
3377
+ if (!disableDrawings && event.key.toLowerCase() === "m") {
3360
3378
  event.preventDefault();
3361
3379
  onMovingAverageToggle?.(chart.id);
3362
3380
  requestRender();
3363
3381
  return;
3364
3382
  }
3365
- if (["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
3383
+ if (!disableDrawings && ["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
3366
3384
  event.preventDefault();
3367
3385
  const toolByKey = { t: "trendline", h: "hline", v: "vline", p: "pin" };
3368
3386
  toggleDrawingTool(toolByKey[event.key.toLowerCase()]);
3369
3387
  return;
3370
3388
  }
3371
3389
  if (event.key === "Delete" || event.key === "Backspace") {
3372
- if (!selectedDrawingId) return;
3390
+ if (disableDrawings || !chartSelectedDrawingId) return;
3373
3391
  event.preventDefault();
3374
3392
  deleteSelectedDrawing();
3375
3393
  return;
3376
3394
  }
3377
3395
  if (event.key === "Escape" || event.key.toLowerCase() === "f") {
3378
3396
  event.preventDefault();
3379
- if (activeDrawingTool || draftDrawing || drawingEditRef.current) {
3397
+ if (chartActiveDrawingTool || draftDrawing || drawingEditRef.current) {
3380
3398
  cancelDrawing();
3381
3399
  return;
3382
3400
  }
@@ -3394,23 +3412,24 @@ function LeanChartFullscreenOverlay({
3394
3412
  }, [
3395
3413
  chart.id,
3396
3414
  closeWithTransition,
3397
- activeDrawingTool,
3415
+ chartActiveDrawingTool,
3416
+ chartSelectedDrawingId,
3398
3417
  cancelDrawing,
3399
3418
  deleteSelectedDrawing,
3419
+ disableDrawings,
3400
3420
  draftDrawing,
3401
3421
  onReset,
3402
3422
  onMovingAverageToggle,
3403
3423
  rectangleZoomActive,
3404
3424
  requestRender,
3405
3425
  toggleRectangleZoom,
3406
- toggleDrawingTool,
3407
- selectedDrawingId
3426
+ toggleDrawingTool
3408
3427
  ]);
3409
3428
  const fullscreenLayout = getLayout();
3410
3429
  const selectedDrawingLayout = getSelectedDrawingLayout(
3411
3430
  fullscreenLayout ? [fullscreenLayout] : [],
3412
- drawings,
3413
- selectedDrawingId
3431
+ chartDrawings,
3432
+ chartSelectedDrawingId
3414
3433
  );
3415
3434
  return /* @__PURE__ */ React5.createElement(
3416
3435
  "div",
@@ -3423,7 +3442,7 @@ function LeanChartFullscreenOverlay({
3423
3442
  ref: containerRef,
3424
3443
  className: `relative h-full overflow-hidden transition-transform duration-150 ${visible ? "scale-100" : "scale-[0.985]"}`,
3425
3444
  style: {
3426
- cursor: rectangleZoomActive || activeDrawingTool ? "crosshair" : void 0
3445
+ cursor: rectangleZoomActive || chartActiveDrawingTool ? "crosshair" : void 0
3427
3446
  },
3428
3447
  onPointerDown: handlePointerDown,
3429
3448
  onPointerMove: handlePointerMove,
@@ -3456,12 +3475,15 @@ function LeanChartFullscreenOverlay({
3456
3475
  onJumpLatest,
3457
3476
  onRectangleZoomToggle: toggleRectangleZoom,
3458
3477
  rectangleZoomActive,
3459
- movingAverage: movingAverageByChart?.[chart.id],
3478
+ movingAverage: disableDrawings ? null : movingAverageByChart?.[chart.id],
3460
3479
  onMovingAverageToggle,
3461
- activeDrawingTool,
3480
+ activeDrawingTool: chartActiveDrawingTool,
3462
3481
  onDrawingToolToggle: toggleDrawingTool,
3463
- hasDrawings: getDrawingsForChart(drawings, chart.id).length > 0,
3482
+ hasDrawings: getDrawingsForChart(chartDrawings, chart.id).length > 0,
3464
3483
  onClearDrawingsRequest,
3484
+ disableDrawings,
3485
+ formatXTick,
3486
+ formatYValue,
3465
3487
  setRef: (node) => {
3466
3488
  chartRef.current = node;
3467
3489
  }
@@ -3471,9 +3493,9 @@ function LeanChartFullscreenOverlay({
3471
3493
  DrawingOverlay,
3472
3494
  {
3473
3495
  layouts: fullscreenLayout ? [fullscreenLayout] : [],
3474
- drawings,
3475
- draftDrawing,
3476
- selectedDrawingId,
3496
+ drawings: chartDrawings,
3497
+ draftDrawing: disableDrawings ? null : draftDrawing,
3498
+ selectedDrawingId: chartSelectedDrawingId,
3477
3499
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
3478
3500
  point: dataPoint,
3479
3501
  layout: targetLayout,
@@ -3511,7 +3533,7 @@ function LeanChartFullscreenOverlay({
3511
3533
  onTextChange: updateSelectedDrawingText
3512
3534
  }
3513
3535
  ) : null,
3514
- fullscreenLayout && movingAverageByChart?.[chart.id]?.enabled ? /* @__PURE__ */ React5.createElement(
3536
+ !disableDrawings && fullscreenLayout && movingAverageByChart?.[chart.id]?.enabled ? /* @__PURE__ */ React5.createElement(
3515
3537
  MovingAverageOptionsToolbar,
3516
3538
  {
3517
3539
  movingAverage: movingAverageByChart[chart.id],
@@ -3524,7 +3546,9 @@ function LeanChartFullscreenOverlay({
3524
3546
  {
3525
3547
  crosshair,
3526
3548
  height: "100%",
3527
- xAxisLabel
3549
+ xAxisLabel,
3550
+ formatXValue,
3551
+ formatYValue
3528
3552
  }
3529
3553
  ),
3530
3554
  /* @__PURE__ */ React5.createElement(RectangleZoomOverlay, { rect: rectangleZoomRect })
@@ -3557,7 +3581,11 @@ function ChartGrid({
3557
3581
  seriesOrderByChart = EMPTY_OBJECT,
3558
3582
  topMarkers = EMPTY_ARRAY,
3559
3583
  onTopMarkerClick,
3560
- xAxisLabel = "STEP"
3584
+ xAxisLabel = "STEP",
3585
+ disableDrawings = false,
3586
+ formatXTick = formatCompactNumber,
3587
+ formatXValue = formatNumber,
3588
+ formatYValue = formatNumber
3561
3589
  }) {
3562
3590
  const containerRef = useRef4(null);
3563
3591
  const gridRef = useRef4(null);
@@ -3585,6 +3613,9 @@ function ChartGrid({
3585
3613
  const [fullscreenChartId, setFullscreenChartId] = useState2(null);
3586
3614
  const [rectangleZoomChartId, setRectangleZoomChartId] = useState2(null);
3587
3615
  const [rectangleZoomRect, setRectangleZoomRect] = useState2(null);
3616
+ const chartDrawings = disableDrawings ? EMPTY_ARRAY : drawings;
3617
+ const chartActiveDrawingTool = disableDrawings ? null : activeDrawingTool;
3618
+ const chartSelectedDrawingId = disableDrawings ? null : selectedDrawingId;
3588
3619
  const requestRender = useCallback3(() => {
3589
3620
  setRevision((value) => value + 1);
3590
3621
  }, []);
@@ -3602,11 +3633,11 @@ function ChartGrid({
3602
3633
  finishEditDrawing,
3603
3634
  deleteSelectedDrawing
3604
3635
  } = useDrawingInteractions({
3605
- drawings,
3606
- onDrawingsChange,
3607
- activeDrawingTool,
3636
+ drawings: chartDrawings,
3637
+ onDrawingsChange: disableDrawings ? void 0 : onDrawingsChange,
3638
+ activeDrawingTool: chartActiveDrawingTool,
3608
3639
  onActiveDrawingToolChange,
3609
- selectedDrawingId,
3640
+ selectedDrawingId: chartSelectedDrawingId,
3610
3641
  onSelectedDrawingIdChange,
3611
3642
  createDrawingId,
3612
3643
  focusedChartId,
@@ -3660,9 +3691,9 @@ function ChartGrid({
3660
3691
  ]
3661
3692
  );
3662
3693
  const toggleSelectedDrawingExtend = useCallback3(() => {
3663
- if (!selectedDrawingId || !onDrawingsChange) return;
3694
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
3664
3695
  onDrawingsChange(
3665
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
3696
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
3666
3697
  ...drawing,
3667
3698
  style: {
3668
3699
  ...drawing.style,
@@ -3670,12 +3701,12 @@ function ChartGrid({
3670
3701
  }
3671
3702
  }))
3672
3703
  );
3673
- }, [drawings, onDrawingsChange, selectedDrawingId]);
3704
+ }, [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]);
3674
3705
  const updateSelectedDrawingColor = useCallback3(
3675
3706
  (color) => {
3676
- if (!selectedDrawingId || !onDrawingsChange) return;
3707
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
3677
3708
  onDrawingsChange(
3678
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
3709
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
3679
3710
  ...drawing,
3680
3711
  style: {
3681
3712
  ...drawing.style,
@@ -3684,13 +3715,13 @@ function ChartGrid({
3684
3715
  }))
3685
3716
  );
3686
3717
  },
3687
- [drawings, onDrawingsChange, selectedDrawingId]
3718
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
3688
3719
  );
3689
3720
  const updateSelectedDrawingText = useCallback3(
3690
3721
  (text) => {
3691
- if (!selectedDrawingId || !onDrawingsChange) return;
3722
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
3692
3723
  onDrawingsChange(
3693
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
3724
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
3694
3725
  ...drawing,
3695
3726
  style: {
3696
3727
  ...drawing.style,
@@ -3699,7 +3730,7 @@ function ChartGrid({
3699
3730
  }))
3700
3731
  );
3701
3732
  },
3702
- [drawings, onDrawingsChange, selectedDrawingId]
3733
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
3703
3734
  );
3704
3735
  const { getAppendAnimatedPoint } = useAppendAnimations({
3705
3736
  charts,
@@ -4151,7 +4182,7 @@ function ChartGrid({
4151
4182
  const point = getLocalPoint(event);
4152
4183
  if (!point) return;
4153
4184
  const drawingLayout = findLayoutAt(point.x, point.y);
4154
- if (drawingLayout && activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
4185
+ if (drawingLayout && chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
4155
4186
  if (event.button !== 0) return;
4156
4187
  event.preventDefault();
4157
4188
  setFocusedChartId(drawingLayout.chart.id);
@@ -4164,10 +4195,10 @@ function ChartGrid({
4164
4195
  yScaleRef,
4165
4196
  yCenterOffsetRef
4166
4197
  });
4167
- if (activeDrawingTool === "hline" || activeDrawingTool === "vline" || activeDrawingTool === "pin") {
4198
+ if (chartActiveDrawingTool === "hline" || chartActiveDrawingTool === "vline" || chartActiveDrawingTool === "pin") {
4168
4199
  commitDrawing({
4169
4200
  chartId: drawingLayout.chart.id,
4170
- type: activeDrawingTool,
4201
+ type: chartActiveDrawingTool,
4171
4202
  start: dataPoint,
4172
4203
  end: dataPoint
4173
4204
  });
@@ -4191,15 +4222,15 @@ function ChartGrid({
4191
4222
  });
4192
4223
  return;
4193
4224
  }
4194
- if (drawingLayout && Array.isArray(drawings) && drawings.length > 0) {
4195
- const chartDrawings = getDrawingsForChart(
4196
- drawings,
4225
+ if (drawingLayout && Array.isArray(chartDrawings) && chartDrawings.length > 0) {
4226
+ const hitDrawings = getDrawingsForChart(
4227
+ chartDrawings,
4197
4228
  drawingLayout.chart.id
4198
4229
  );
4199
- for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {
4230
+ for (let i = hitDrawings.length - 1; i >= 0; i -= 1) {
4200
4231
  const hit = hitTestDrawing({
4201
4232
  point,
4202
- drawing: chartDrawings[i],
4233
+ drawing: hitDrawings[i],
4203
4234
  layout: drawingLayout,
4204
4235
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
4205
4236
  point: dataPoint,
@@ -4305,9 +4336,9 @@ function ChartGrid({
4305
4336
  initialVisiblePoints,
4306
4337
  fullscreenChartId,
4307
4338
  rectangleZoomChartId,
4308
- activeDrawingTool,
4339
+ chartActiveDrawingTool,
4340
+ chartDrawings,
4309
4341
  commitDrawing,
4310
- drawings,
4311
4342
  onSelectedDrawingIdChange
4312
4343
  ]
4313
4344
  );
@@ -4319,7 +4350,7 @@ function ChartGrid({
4319
4350
  if (drawingPoint) {
4320
4351
  if (drawingEditRef.current) {
4321
4352
  const editLayout = getChartLayout().find(
4322
- (layout) => getDrawingsForChart(drawings, layout.chart.id).some(
4353
+ (layout) => getDrawingsForChart(chartDrawings, layout.chart.id).some(
4323
4354
  (drawing) => drawing.id === drawingEditRef.current.id
4324
4355
  )
4325
4356
  );
@@ -4334,7 +4365,7 @@ function ChartGrid({
4334
4365
  yCenterOffsetRef
4335
4366
  });
4336
4367
  const edit = drawingEditRef.current;
4337
- const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {
4368
+ const nextDrawings = updateDrawingById(chartDrawings, edit.id, (drawing) => {
4338
4369
  if (drawing.type === "hline") {
4339
4370
  const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;
4340
4371
  return {
@@ -4362,7 +4393,7 @@ function ChartGrid({
4362
4393
  }
4363
4394
  return;
4364
4395
  }
4365
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
4396
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
4366
4397
  const drawingLayout = findLayoutAt(drawingPoint.x, drawingPoint.y);
4367
4398
  if (!drawingLayout) return;
4368
4399
  const dataPoint = screenPointToDataPoint({
@@ -4375,11 +4406,11 @@ function ChartGrid({
4375
4406
  yCenterOffsetRef
4376
4407
  });
4377
4408
  const session = drawingSessionRef.current;
4378
- const startPoint = activeDrawingTool === "trendline" && session.chartId === drawingLayout.chart.id ? session.startPoint : dataPoint;
4379
- if (startPoint || activeDrawingTool !== "trendline") {
4409
+ const startPoint = chartActiveDrawingTool === "trendline" && session.chartId === drawingLayout.chart.id ? session.startPoint : dataPoint;
4410
+ if (startPoint || chartActiveDrawingTool !== "trendline") {
4380
4411
  updateDraftDrawing({
4381
4412
  chartId: drawingLayout.chart.id,
4382
- type: activeDrawingTool,
4413
+ type: chartActiveDrawingTool,
4383
4414
  start: startPoint || dataPoint,
4384
4415
  end: dataPoint
4385
4416
  });
@@ -4452,8 +4483,8 @@ function ChartGrid({
4452
4483
  },
4453
4484
  [
4454
4485
  fullscreenChartId,
4455
- activeDrawingTool,
4456
- drawings,
4486
+ chartActiveDrawingTool,
4487
+ chartDrawings,
4457
4488
  findLayoutAt,
4458
4489
  getChartLayout,
4459
4490
  getLocalPoint,
@@ -4658,24 +4689,24 @@ function ChartGrid({
4658
4689
  toggleRectangleZoom(focusedChartId);
4659
4690
  return;
4660
4691
  }
4661
- if (event.key.toLowerCase() === "m") {
4692
+ if (!disableDrawings && event.key.toLowerCase() === "m") {
4662
4693
  event.preventDefault();
4663
4694
  toggleMovingAverage(focusedChartId);
4664
4695
  return;
4665
4696
  }
4666
- if (["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
4697
+ if (!disableDrawings && ["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
4667
4698
  event.preventDefault();
4668
4699
  const toolByKey = { t: "trendline", h: "hline", v: "vline", p: "pin" };
4669
4700
  toggleDrawingTool(toolByKey[event.key.toLowerCase()]);
4670
4701
  return;
4671
4702
  }
4672
4703
  if (event.key === "Delete" || event.key === "Backspace") {
4673
- if (!selectedDrawingId) return;
4704
+ if (disableDrawings || !chartSelectedDrawingId) return;
4674
4705
  event.preventDefault();
4675
4706
  deleteSelectedDrawing();
4676
4707
  return;
4677
4708
  }
4678
- if (event.key === "Escape" && (activeDrawingTool || draftDrawing || drawingEditRef.current)) {
4709
+ if (event.key === "Escape" && (chartActiveDrawingTool || draftDrawing || drawingEditRef.current)) {
4679
4710
  event.preventDefault();
4680
4711
  cancelDrawing();
4681
4712
  return;
@@ -4698,15 +4729,16 @@ function ChartGrid({
4698
4729
  }, [
4699
4730
  focusedChartId,
4700
4731
  fullscreenChartId,
4701
- activeDrawingTool,
4732
+ chartActiveDrawingTool,
4733
+ chartSelectedDrawingId,
4702
4734
  cancelDrawing,
4703
4735
  deleteSelectedDrawing,
4736
+ disableDrawings,
4704
4737
  draftDrawing,
4705
4738
  focusChartByKeyboard,
4706
4739
  openFullscreen,
4707
4740
  rectangleZoomChartId,
4708
4741
  resetChartView,
4709
- selectedDrawingId,
4710
4742
  toggleMovingAverage,
4711
4743
  toggleDrawingTool,
4712
4744
  toggleRectangleZoom
@@ -4715,8 +4747,8 @@ function ChartGrid({
4715
4747
  const chartLayouts = fullscreenChart ? [] : getChartLayout();
4716
4748
  const selectedDrawingLayout = getSelectedDrawingLayout(
4717
4749
  chartLayouts,
4718
- drawings,
4719
- selectedDrawingId
4750
+ chartDrawings,
4751
+ chartSelectedDrawingId
4720
4752
  );
4721
4753
  return /* @__PURE__ */ React5.createElement(
4722
4754
  "div",
@@ -4724,7 +4756,7 @@ function ChartGrid({
4724
4756
  ref: containerRef,
4725
4757
  className: `aliencharts-root relative h-full overflow-y-auto ${className}`,
4726
4758
  style: {
4727
- cursor: rectangleZoomChartId || activeDrawingTool ? "crosshair" : void 0
4759
+ cursor: rectangleZoomChartId || chartActiveDrawingTool ? "crosshair" : void 0
4728
4760
  },
4729
4761
  onPointerDown: handlePointerDown,
4730
4762
  onPointerMove: handlePointerMove,
@@ -4766,12 +4798,15 @@ function ChartGrid({
4766
4798
  onJumpLatest: jumpChartToLatest,
4767
4799
  onRectangleZoomToggle: toggleRectangleZoom,
4768
4800
  rectangleZoomActive: rectangleZoomChartId === chart.id,
4769
- movingAverage: movingAverageByChart?.[chart.id],
4801
+ movingAverage: disableDrawings ? null : movingAverageByChart?.[chart.id],
4770
4802
  onMovingAverageToggle: toggleMovingAverage,
4771
- activeDrawingTool: focusedChartId === chart.id ? activeDrawingTool : null,
4803
+ activeDrawingTool: focusedChartId === chart.id ? chartActiveDrawingTool : null,
4772
4804
  onDrawingToolToggle: toggleDrawingTool,
4773
- hasDrawings: getDrawingsForChart(drawings, chart.id).length > 0,
4805
+ hasDrawings: getDrawingsForChart(chartDrawings, chart.id).length > 0,
4774
4806
  onClearDrawingsRequest,
4807
+ disableDrawings,
4808
+ formatXTick,
4809
+ formatYValue,
4775
4810
  setRef: (node) => {
4776
4811
  if (node) chartRefs.current.set(chart.id, node);
4777
4812
  else chartRefs.current.delete(chart.id);
@@ -4784,16 +4819,18 @@ function ChartGrid({
4784
4819
  {
4785
4820
  crosshair: fullscreenChart ? null : crosshair,
4786
4821
  height: containerRef.current?.scrollHeight ?? "100%",
4787
- xAxisLabel
4822
+ xAxisLabel,
4823
+ formatXValue,
4824
+ formatYValue
4788
4825
  }
4789
4826
  ),
4790
4827
  /* @__PURE__ */ React5.createElement(
4791
4828
  DrawingOverlay,
4792
4829
  {
4793
4830
  layouts: chartLayouts,
4794
- drawings,
4795
- draftDrawing: fullscreenChart ? null : draftDrawing,
4796
- selectedDrawingId,
4831
+ drawings: chartDrawings,
4832
+ draftDrawing: fullscreenChart || disableDrawings ? null : draftDrawing,
4833
+ selectedDrawingId: chartSelectedDrawingId,
4797
4834
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
4798
4835
  point: dataPoint,
4799
4836
  layout: targetLayout,
@@ -4826,7 +4863,7 @@ function ChartGrid({
4826
4863
  onTextChange: updateSelectedDrawingText
4827
4864
  }
4828
4865
  ) : null,
4829
- !fullscreenChart && focusedChartId && movingAverageByChart?.[focusedChartId]?.enabled ? (() => {
4866
+ !disableDrawings && !fullscreenChart && focusedChartId && movingAverageByChart?.[focusedChartId]?.enabled ? (() => {
4830
4867
  const layout = chartLayouts.find(
4831
4868
  (candidate) => candidate.chart.id === focusedChartId
4832
4869
  );
@@ -4842,7 +4879,7 @@ function ChartGrid({
4842
4879
  })() : null,
4843
4880
  /* @__PURE__ */ React5.createElement(RectangleZoomOverlay, { rect: fullscreenChart ? null : rectangleZoomRect }),
4844
4881
  fullscreenChart ? /* @__PURE__ */ React5.createElement(
4845
- LeanChartFullscreenOverlay,
4882
+ ChartFullscreenOverlay,
4846
4883
  {
4847
4884
  chart: fullscreenChart,
4848
4885
  dataRevision,
@@ -4864,17 +4901,21 @@ function ChartGrid({
4864
4901
  onReset: resetChartView,
4865
4902
  onJumpLatest: jumpChartToLatest,
4866
4903
  xAxisLabel,
4867
- drawings,
4904
+ drawings: chartDrawings,
4868
4905
  onDrawingsChange,
4869
- activeDrawingTool,
4906
+ activeDrawingTool: chartActiveDrawingTool,
4870
4907
  onActiveDrawingToolChange,
4871
- selectedDrawingId,
4908
+ selectedDrawingId: chartSelectedDrawingId,
4872
4909
  onSelectedDrawingIdChange,
4873
4910
  createDrawingId,
4874
4911
  onClearDrawingsRequest,
4875
4912
  onChartContextMenu,
4876
4913
  topMarkers,
4877
- onTopMarkerClick
4914
+ onTopMarkerClick,
4915
+ disableDrawings,
4916
+ formatXTick,
4917
+ formatXValue,
4918
+ formatYValue
4878
4919
  }
4879
4920
  ) : null
4880
4921
  );