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.cjs CHANGED
@@ -337,7 +337,8 @@ function ChartToolbar({
337
337
  activeDrawingTool = null,
338
338
  onDrawingToolToggle,
339
339
  hasDrawings = false,
340
- onClearDrawingsRequest
340
+ onClearDrawingsRequest,
341
+ disableDrawings = false
341
342
  }) {
342
343
  return /* @__PURE__ */ import_react.default.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__ */ import_react.default.createElement(
343
344
  ToolbarAction,
@@ -356,7 +357,7 @@ function ChartToolbar({
356
357
  active: rectangleZoomActive
357
358
  },
358
359
  /* @__PURE__ */ import_react.default.createElement(import_react2.MagnifyingGlassPlusIcon, { size: 16, weight: "bold" })
359
- ), hasDrawings ? /* @__PURE__ */ import_react.default.createElement(
360
+ ), !disableDrawings && hasDrawings ? /* @__PURE__ */ import_react.default.createElement(
360
361
  ToolbarAction,
361
362
  {
362
363
  title: "Clear drawings",
@@ -364,7 +365,7 @@ function ChartToolbar({
364
365
  onClick: onClearDrawingsRequest
365
366
  },
366
367
  /* @__PURE__ */ import_react.default.createElement(import_react2.BroomIcon, { size: 16, weight: "bold" })
367
- ) : null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full" }), /* @__PURE__ */ import_react.default.createElement(
368
+ ) : null, !disableDrawings ? /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, /* @__PURE__ */ import_react.default.createElement("div", { className: "my-1 h-px w-full" }), /* @__PURE__ */ import_react.default.createElement(
368
369
  ToolbarAction,
369
370
  {
370
371
  title: "Draw trendline",
@@ -400,7 +401,7 @@ function ChartToolbar({
400
401
  active: activeDrawingTool === "pin"
401
402
  },
402
403
  /* @__PURE__ */ import_react.default.createElement(import_react2.MapPinIcon, { size: 16, weight: "bold" })
403
- ), /* @__PURE__ */ import_react.default.createElement(
404
+ )) : null, !disableDrawings ? /* @__PURE__ */ import_react.default.createElement(
404
405
  ToolbarAction,
405
406
  {
406
407
  title: "Toggle moving average",
@@ -409,7 +410,7 @@ function ChartToolbar({
409
410
  active: movingAverageActive
410
411
  },
411
412
  /* @__PURE__ */ import_react.default.createElement(import_react2.WaveSineIcon, { size: 16, weight: "bold" })
412
- ));
413
+ ) : null);
413
414
  }
414
415
 
415
416
  // src/react/DrawingOptionsToolbar.jsx
@@ -1767,6 +1768,11 @@ var getYRange = (chart, xMin, xMax, width) => {
1767
1768
  if (!Number.isFinite(minY) || !Number.isFinite(maxY)) {
1768
1769
  return { minY: 0, maxY: 1, renderedPoints, bucketSize };
1769
1770
  }
1771
+ const fixedMinY = Number(chart.yRange?.min);
1772
+ const fixedMaxY = Number(chart.yRange?.max);
1773
+ if (Number.isFinite(fixedMinY) && Number.isFinite(fixedMaxY) && fixedMinY < fixedMaxY) {
1774
+ return { minY: fixedMinY, maxY: fixedMaxY, renderedPoints, bucketSize };
1775
+ }
1770
1776
  if (minY === maxY) {
1771
1777
  minY -= 1;
1772
1778
  maxY += 1;
@@ -2016,9 +2022,12 @@ function ChartCell({
2016
2022
  onDrawingToolToggle,
2017
2023
  hasDrawings = false,
2018
2024
  onClearDrawingsRequest,
2025
+ disableDrawings = false,
2019
2026
  height = CHART_HEIGHT,
2020
2027
  isFullscreen = false,
2021
- backgroundColor = DEFAULT_CHART_BACKGROUND
2028
+ backgroundColor = DEFAULT_CHART_BACKGROUND,
2029
+ formatXTick = formatCompactNumber,
2030
+ formatYValue = formatNumber
2022
2031
  }) {
2023
2032
  const headerBackground = withAlpha(backgroundColor, 0.82);
2024
2033
  const controlBackground = withAlpha(backgroundColor, 0.78);
@@ -2095,7 +2104,8 @@ function ChartCell({
2095
2104
  activeDrawingTool,
2096
2105
  onDrawingToolToggle,
2097
2106
  hasDrawings,
2098
- onClearDrawingsRequest: () => onClearDrawingsRequest?.(chart.id)
2107
+ onClearDrawingsRequest: () => onClearDrawingsRequest?.(chart.id),
2108
+ disableDrawings
2099
2109
  }
2100
2110
  ) : null,
2101
2111
  /* @__PURE__ */ import_react9.default.createElement("div", { className: "pointer-events-none absolute inset-y-8 left-9 border-l border-border/40" }),
@@ -2134,7 +2144,7 @@ function ChartCell({
2134
2144
  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",
2135
2145
  style: { top: tick.top }
2136
2146
  },
2137
- formatNumber(tick.value)
2147
+ formatYValue(tick.value)
2138
2148
  )),
2139
2149
  axisOverlay?.latestValues.map((latest) => /* @__PURE__ */ import_react9.default.createElement(
2140
2150
  "div",
@@ -2147,7 +2157,7 @@ function ChartCell({
2147
2157
  color: latest.textColor
2148
2158
  }
2149
2159
  },
2150
- formatNumber(latest.value)
2160
+ formatYValue(latest.value)
2151
2161
  ))
2152
2162
  ),
2153
2163
  /* @__PURE__ */ import_react9.default.createElement(
@@ -2169,7 +2179,7 @@ function ChartCell({
2169
2179
  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",
2170
2180
  style: { left: tick.left }
2171
2181
  },
2172
- formatCompactNumber(tick.value)
2182
+ formatXTick(tick.value)
2173
2183
  ))
2174
2184
  )
2175
2185
  );
@@ -2177,7 +2187,9 @@ function ChartCell({
2177
2187
  function CrosshairOverlay({
2178
2188
  crosshair,
2179
2189
  height = "100%",
2180
- xAxisLabel = "STEP"
2190
+ xAxisLabel = "STEP",
2191
+ formatXValue = formatNumber,
2192
+ formatYValue = formatNumber
2181
2193
  }) {
2182
2194
  if (!crosshair) return null;
2183
2195
  return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, /* @__PURE__ */ import_react9.default.createElement(
@@ -2216,7 +2228,7 @@ function CrosshairOverlay({
2216
2228
  top: crosshair.tooltipY
2217
2229
  }
2218
2230
  },
2219
- /* @__PURE__ */ import_react9.default.createElement("div", { className: "mb-1 font-medium" }, xAxisLabel, ": ", formatNumber(crosshair.xValue)),
2231
+ /* @__PURE__ */ import_react9.default.createElement("div", { className: "mb-1 font-medium" }, xAxisLabel, ": ", formatXValue(crosshair.xValue)),
2220
2232
  crosshair.points.map((point) => /* @__PURE__ */ import_react9.default.createElement(
2221
2233
  "div",
2222
2234
  {
@@ -2230,7 +2242,7 @@ function CrosshairOverlay({
2230
2242
  style: { backgroundColor: point.color }
2231
2243
  }
2232
2244
  ),
2233
- /* @__PURE__ */ import_react9.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "truncate text-muted-foreground" }, point.name), /* @__PURE__ */ import_react9.default.createElement("div", { className: "tabular-nums" }, formatNumber(point.yValue)))
2245
+ /* @__PURE__ */ import_react9.default.createElement("div", { className: "min-w-0" }, /* @__PURE__ */ import_react9.default.createElement("div", { className: "truncate text-muted-foreground" }, point.name), /* @__PURE__ */ import_react9.default.createElement("div", { className: "tabular-nums" }, formatYValue(point.yValue)))
2234
2246
  ))
2235
2247
  ));
2236
2248
  }
@@ -2609,7 +2621,7 @@ var drawChartLayouts = ({
2609
2621
  }
2610
2622
  return nextAxisOverlays;
2611
2623
  };
2612
- function LeanChartFullscreenOverlay({
2624
+ function ChartFullscreenOverlay({
2613
2625
  chart,
2614
2626
  dataRevision,
2615
2627
  renderRevision,
@@ -2640,7 +2652,11 @@ function LeanChartFullscreenOverlay({
2640
2652
  onClearDrawingsRequest,
2641
2653
  onChartContextMenu,
2642
2654
  topMarkers = EMPTY_ARRAY,
2643
- onTopMarkerClick
2655
+ onTopMarkerClick,
2656
+ disableDrawings = false,
2657
+ formatXTick = formatCompactNumber,
2658
+ formatXValue = formatNumber,
2659
+ formatYValue = formatNumber
2644
2660
  }) {
2645
2661
  const containerRef = (0, import_react9.useRef)(null);
2646
2662
  const chartRef = (0, import_react9.useRef)(null);
@@ -2660,6 +2676,9 @@ function LeanChartFullscreenOverlay({
2660
2676
  const [visible, setVisible] = (0, import_react9.useState)(false);
2661
2677
  const [rectangleZoomActive, setRectangleZoomActive] = (0, import_react9.useState)(false);
2662
2678
  const [rectangleZoomRect, setRectangleZoomRect] = (0, import_react9.useState)(null);
2679
+ const chartDrawings = disableDrawings ? EMPTY_ARRAY : drawings;
2680
+ const chartActiveDrawingTool = disableDrawings ? null : activeDrawingTool;
2681
+ const chartSelectedDrawingId = disableDrawings ? null : selectedDrawingId;
2663
2682
  const requestRender = (0, import_react9.useCallback)(() => {
2664
2683
  setRevision((value) => value + 1);
2665
2684
  }, []);
@@ -2681,11 +2700,11 @@ function LeanChartFullscreenOverlay({
2681
2700
  finishEditDrawing,
2682
2701
  deleteSelectedDrawing
2683
2702
  } = useDrawingInteractions({
2684
- drawings,
2685
- onDrawingsChange,
2686
- activeDrawingTool,
2703
+ drawings: chartDrawings,
2704
+ onDrawingsChange: disableDrawings ? void 0 : onDrawingsChange,
2705
+ activeDrawingTool: chartActiveDrawingTool,
2687
2706
  onActiveDrawingToolChange,
2688
- selectedDrawingId,
2707
+ selectedDrawingId: chartSelectedDrawingId,
2689
2708
  onSelectedDrawingIdChange,
2690
2709
  createDrawingId,
2691
2710
  onModeChange: () => {
@@ -2702,9 +2721,9 @@ function LeanChartFullscreenOverlay({
2702
2721
  onActiveDrawingToolChange?.(null);
2703
2722
  }, [clearDraft, onActiveDrawingToolChange]);
2704
2723
  const toggleSelectedDrawingExtend = (0, import_react9.useCallback)(() => {
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,
@@ -2712,12 +2731,12 @@ function LeanChartFullscreenOverlay({
2712
2731
  }
2713
2732
  }))
2714
2733
  );
2715
- }, [drawings, onDrawingsChange, selectedDrawingId]);
2734
+ }, [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]);
2716
2735
  const updateSelectedDrawingColor = (0, import_react9.useCallback)(
2717
2736
  (color) => {
2718
- if (!selectedDrawingId || !onDrawingsChange) return;
2737
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
2719
2738
  onDrawingsChange(
2720
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
2739
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
2721
2740
  ...drawing,
2722
2741
  style: {
2723
2742
  ...drawing.style,
@@ -2726,13 +2745,13 @@ function LeanChartFullscreenOverlay({
2726
2745
  }))
2727
2746
  );
2728
2747
  },
2729
- [drawings, onDrawingsChange, selectedDrawingId]
2748
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
2730
2749
  );
2731
2750
  const updateSelectedDrawingText = (0, import_react9.useCallback)(
2732
2751
  (text) => {
2733
- if (!selectedDrawingId || !onDrawingsChange) return;
2752
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
2734
2753
  onDrawingsChange(
2735
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
2754
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
2736
2755
  ...drawing,
2737
2756
  style: {
2738
2757
  ...drawing.style,
@@ -2741,7 +2760,7 @@ function LeanChartFullscreenOverlay({
2741
2760
  }))
2742
2761
  );
2743
2762
  },
2744
- [drawings, onDrawingsChange, selectedDrawingId]
2763
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
2745
2764
  );
2746
2765
  (0, import_react9.useEffect)(() => {
2747
2766
  const frame = requestAnimationFrame(() => setVisible(true));
@@ -2940,7 +2959,7 @@ function LeanChartFullscreenOverlay({
2940
2959
  const layout = getLayout();
2941
2960
  if (!point || !layout) return;
2942
2961
  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;
2943
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
2962
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
2944
2963
  if (!inPlot || event.button !== 0) return;
2945
2964
  event.preventDefault();
2946
2965
  const dataPoint = screenPointToDataPoint({
@@ -2952,10 +2971,10 @@ function LeanChartFullscreenOverlay({
2952
2971
  yScaleRef,
2953
2972
  yCenterOffsetRef
2954
2973
  });
2955
- if (activeDrawingTool === "hline" || activeDrawingTool === "vline" || activeDrawingTool === "pin") {
2974
+ if (chartActiveDrawingTool === "hline" || chartActiveDrawingTool === "vline" || chartActiveDrawingTool === "pin") {
2956
2975
  commitDrawing({
2957
2976
  chartId: chart.id,
2958
- type: activeDrawingTool,
2977
+ type: chartActiveDrawingTool,
2959
2978
  start: dataPoint,
2960
2979
  end: dataPoint
2961
2980
  });
@@ -2978,12 +2997,12 @@ function LeanChartFullscreenOverlay({
2978
2997
  });
2979
2998
  return;
2980
2999
  }
2981
- if (inPlot && Array.isArray(drawings) && drawings.length > 0) {
2982
- const chartDrawings = getDrawingsForChart(drawings, chart.id);
2983
- for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {
3000
+ if (inPlot && Array.isArray(chartDrawings) && chartDrawings.length > 0) {
3001
+ const hitDrawings = getDrawingsForChart(chartDrawings, chart.id);
3002
+ for (let i = hitDrawings.length - 1; i >= 0; i -= 1) {
2984
3003
  const hit = hitTestDrawing({
2985
3004
  point,
2986
- drawing: chartDrawings[i],
3005
+ drawing: hitDrawings[i],
2987
3006
  layout,
2988
3007
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
2989
3008
  point: dataPoint,
@@ -3074,10 +3093,9 @@ function LeanChartFullscreenOverlay({
3074
3093
  getLayout,
3075
3094
  getLocalPoint,
3076
3095
  initialVisiblePoints,
3077
- activeDrawingTool,
3078
- chart,
3096
+ chartActiveDrawingTool,
3097
+ chartDrawings,
3079
3098
  commitDrawing,
3080
- drawings,
3081
3099
  onSelectedDrawingIdChange,
3082
3100
  rectangleZoomActive,
3083
3101
  viewStateRef,
@@ -3103,7 +3121,7 @@ function LeanChartFullscreenOverlay({
3103
3121
  yCenterOffsetRef
3104
3122
  });
3105
3123
  const edit = drawingEditRef.current;
3106
- const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {
3124
+ const nextDrawings = updateDrawingById(chartDrawings, edit.id, (drawing) => {
3107
3125
  if (drawing.type === "hline") {
3108
3126
  const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;
3109
3127
  return {
@@ -3130,7 +3148,7 @@ function LeanChartFullscreenOverlay({
3130
3148
  onDrawingsChange?.(nextDrawings);
3131
3149
  return;
3132
3150
  }
3133
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
3151
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
3134
3152
  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) {
3135
3153
  return;
3136
3154
  }
@@ -3143,11 +3161,11 @@ function LeanChartFullscreenOverlay({
3143
3161
  yScaleRef,
3144
3162
  yCenterOffsetRef
3145
3163
  });
3146
- const startPoint = activeDrawingTool === "trendline" ? drawingSessionRef.current.startPoint : dataPoint;
3147
- if (startPoint || activeDrawingTool !== "trendline") {
3164
+ const startPoint = chartActiveDrawingTool === "trendline" ? drawingSessionRef.current.startPoint : dataPoint;
3165
+ if (startPoint || chartActiveDrawingTool !== "trendline") {
3148
3166
  updateDraftDrawing({
3149
3167
  chartId: chart.id,
3150
- type: activeDrawingTool,
3168
+ type: chartActiveDrawingTool,
3151
3169
  start: startPoint || dataPoint,
3152
3170
  end: dataPoint
3153
3171
  });
@@ -3220,8 +3238,8 @@ function LeanChartFullscreenOverlay({
3220
3238
  [
3221
3239
  chart.id,
3222
3240
  chart,
3223
- activeDrawingTool,
3224
- drawings,
3241
+ chartActiveDrawingTool,
3242
+ chartDrawings,
3225
3243
  getLayout,
3226
3244
  getLocalPoint,
3227
3245
  initialVisiblePoints,
@@ -3384,27 +3402,27 @@ function LeanChartFullscreenOverlay({
3384
3402
  toggleRectangleZoom();
3385
3403
  return;
3386
3404
  }
3387
- if (event.key.toLowerCase() === "m") {
3405
+ if (!disableDrawings && event.key.toLowerCase() === "m") {
3388
3406
  event.preventDefault();
3389
3407
  onMovingAverageToggle?.(chart.id);
3390
3408
  requestRender();
3391
3409
  return;
3392
3410
  }
3393
- if (["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
3411
+ if (!disableDrawings && ["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
3394
3412
  event.preventDefault();
3395
3413
  const toolByKey = { t: "trendline", h: "hline", v: "vline", p: "pin" };
3396
3414
  toggleDrawingTool(toolByKey[event.key.toLowerCase()]);
3397
3415
  return;
3398
3416
  }
3399
3417
  if (event.key === "Delete" || event.key === "Backspace") {
3400
- if (!selectedDrawingId) return;
3418
+ if (disableDrawings || !chartSelectedDrawingId) return;
3401
3419
  event.preventDefault();
3402
3420
  deleteSelectedDrawing();
3403
3421
  return;
3404
3422
  }
3405
3423
  if (event.key === "Escape" || event.key.toLowerCase() === "f") {
3406
3424
  event.preventDefault();
3407
- if (activeDrawingTool || draftDrawing || drawingEditRef.current) {
3425
+ if (chartActiveDrawingTool || draftDrawing || drawingEditRef.current) {
3408
3426
  cancelDrawing();
3409
3427
  return;
3410
3428
  }
@@ -3422,23 +3440,24 @@ function LeanChartFullscreenOverlay({
3422
3440
  }, [
3423
3441
  chart.id,
3424
3442
  closeWithTransition,
3425
- activeDrawingTool,
3443
+ chartActiveDrawingTool,
3444
+ chartSelectedDrawingId,
3426
3445
  cancelDrawing,
3427
3446
  deleteSelectedDrawing,
3447
+ disableDrawings,
3428
3448
  draftDrawing,
3429
3449
  onReset,
3430
3450
  onMovingAverageToggle,
3431
3451
  rectangleZoomActive,
3432
3452
  requestRender,
3433
3453
  toggleRectangleZoom,
3434
- toggleDrawingTool,
3435
- selectedDrawingId
3454
+ toggleDrawingTool
3436
3455
  ]);
3437
3456
  const fullscreenLayout = getLayout();
3438
3457
  const selectedDrawingLayout = getSelectedDrawingLayout(
3439
3458
  fullscreenLayout ? [fullscreenLayout] : [],
3440
- drawings,
3441
- selectedDrawingId
3459
+ chartDrawings,
3460
+ chartSelectedDrawingId
3442
3461
  );
3443
3462
  return /* @__PURE__ */ import_react9.default.createElement(
3444
3463
  "div",
@@ -3451,7 +3470,7 @@ function LeanChartFullscreenOverlay({
3451
3470
  ref: containerRef,
3452
3471
  className: `relative h-full overflow-hidden transition-transform duration-150 ${visible ? "scale-100" : "scale-[0.985]"}`,
3453
3472
  style: {
3454
- cursor: rectangleZoomActive || activeDrawingTool ? "crosshair" : void 0
3473
+ cursor: rectangleZoomActive || chartActiveDrawingTool ? "crosshair" : void 0
3455
3474
  },
3456
3475
  onPointerDown: handlePointerDown,
3457
3476
  onPointerMove: handlePointerMove,
@@ -3484,12 +3503,15 @@ function LeanChartFullscreenOverlay({
3484
3503
  onJumpLatest,
3485
3504
  onRectangleZoomToggle: toggleRectangleZoom,
3486
3505
  rectangleZoomActive,
3487
- movingAverage: movingAverageByChart?.[chart.id],
3506
+ movingAverage: disableDrawings ? null : movingAverageByChart?.[chart.id],
3488
3507
  onMovingAverageToggle,
3489
- activeDrawingTool,
3508
+ activeDrawingTool: chartActiveDrawingTool,
3490
3509
  onDrawingToolToggle: toggleDrawingTool,
3491
- hasDrawings: getDrawingsForChart(drawings, chart.id).length > 0,
3510
+ hasDrawings: getDrawingsForChart(chartDrawings, chart.id).length > 0,
3492
3511
  onClearDrawingsRequest,
3512
+ disableDrawings,
3513
+ formatXTick,
3514
+ formatYValue,
3493
3515
  setRef: (node) => {
3494
3516
  chartRef.current = node;
3495
3517
  }
@@ -3499,9 +3521,9 @@ function LeanChartFullscreenOverlay({
3499
3521
  DrawingOverlay,
3500
3522
  {
3501
3523
  layouts: fullscreenLayout ? [fullscreenLayout] : [],
3502
- drawings,
3503
- draftDrawing,
3504
- selectedDrawingId,
3524
+ drawings: chartDrawings,
3525
+ draftDrawing: disableDrawings ? null : draftDrawing,
3526
+ selectedDrawingId: chartSelectedDrawingId,
3505
3527
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
3506
3528
  point: dataPoint,
3507
3529
  layout: targetLayout,
@@ -3539,7 +3561,7 @@ function LeanChartFullscreenOverlay({
3539
3561
  onTextChange: updateSelectedDrawingText
3540
3562
  }
3541
3563
  ) : null,
3542
- fullscreenLayout && movingAverageByChart?.[chart.id]?.enabled ? /* @__PURE__ */ import_react9.default.createElement(
3564
+ !disableDrawings && fullscreenLayout && movingAverageByChart?.[chart.id]?.enabled ? /* @__PURE__ */ import_react9.default.createElement(
3543
3565
  MovingAverageOptionsToolbar,
3544
3566
  {
3545
3567
  movingAverage: movingAverageByChart[chart.id],
@@ -3552,7 +3574,9 @@ function LeanChartFullscreenOverlay({
3552
3574
  {
3553
3575
  crosshair,
3554
3576
  height: "100%",
3555
- xAxisLabel
3577
+ xAxisLabel,
3578
+ formatXValue,
3579
+ formatYValue
3556
3580
  }
3557
3581
  ),
3558
3582
  /* @__PURE__ */ import_react9.default.createElement(RectangleZoomOverlay, { rect: rectangleZoomRect })
@@ -3585,7 +3609,11 @@ function ChartGrid({
3585
3609
  seriesOrderByChart = EMPTY_OBJECT,
3586
3610
  topMarkers = EMPTY_ARRAY,
3587
3611
  onTopMarkerClick,
3588
- xAxisLabel = "STEP"
3612
+ xAxisLabel = "STEP",
3613
+ disableDrawings = false,
3614
+ formatXTick = formatCompactNumber,
3615
+ formatXValue = formatNumber,
3616
+ formatYValue = formatNumber
3589
3617
  }) {
3590
3618
  const containerRef = (0, import_react9.useRef)(null);
3591
3619
  const gridRef = (0, import_react9.useRef)(null);
@@ -3613,6 +3641,9 @@ function ChartGrid({
3613
3641
  const [fullscreenChartId, setFullscreenChartId] = (0, import_react9.useState)(null);
3614
3642
  const [rectangleZoomChartId, setRectangleZoomChartId] = (0, import_react9.useState)(null);
3615
3643
  const [rectangleZoomRect, setRectangleZoomRect] = (0, import_react9.useState)(null);
3644
+ const chartDrawings = disableDrawings ? EMPTY_ARRAY : drawings;
3645
+ const chartActiveDrawingTool = disableDrawings ? null : activeDrawingTool;
3646
+ const chartSelectedDrawingId = disableDrawings ? null : selectedDrawingId;
3616
3647
  const requestRender = (0, import_react9.useCallback)(() => {
3617
3648
  setRevision((value) => value + 1);
3618
3649
  }, []);
@@ -3630,11 +3661,11 @@ function ChartGrid({
3630
3661
  finishEditDrawing,
3631
3662
  deleteSelectedDrawing
3632
3663
  } = useDrawingInteractions({
3633
- drawings,
3634
- onDrawingsChange,
3635
- activeDrawingTool,
3664
+ drawings: chartDrawings,
3665
+ onDrawingsChange: disableDrawings ? void 0 : onDrawingsChange,
3666
+ activeDrawingTool: chartActiveDrawingTool,
3636
3667
  onActiveDrawingToolChange,
3637
- selectedDrawingId,
3668
+ selectedDrawingId: chartSelectedDrawingId,
3638
3669
  onSelectedDrawingIdChange,
3639
3670
  createDrawingId,
3640
3671
  focusedChartId,
@@ -3688,9 +3719,9 @@ function ChartGrid({
3688
3719
  ]
3689
3720
  );
3690
3721
  const toggleSelectedDrawingExtend = (0, import_react9.useCallback)(() => {
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,
@@ -3698,12 +3729,12 @@ function ChartGrid({
3698
3729
  }
3699
3730
  }))
3700
3731
  );
3701
- }, [drawings, onDrawingsChange, selectedDrawingId]);
3732
+ }, [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]);
3702
3733
  const updateSelectedDrawingColor = (0, import_react9.useCallback)(
3703
3734
  (color) => {
3704
- if (!selectedDrawingId || !onDrawingsChange) return;
3735
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
3705
3736
  onDrawingsChange(
3706
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
3737
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
3707
3738
  ...drawing,
3708
3739
  style: {
3709
3740
  ...drawing.style,
@@ -3712,13 +3743,13 @@ function ChartGrid({
3712
3743
  }))
3713
3744
  );
3714
3745
  },
3715
- [drawings, onDrawingsChange, selectedDrawingId]
3746
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
3716
3747
  );
3717
3748
  const updateSelectedDrawingText = (0, import_react9.useCallback)(
3718
3749
  (text) => {
3719
- if (!selectedDrawingId || !onDrawingsChange) return;
3750
+ if (disableDrawings || !chartSelectedDrawingId || !onDrawingsChange) return;
3720
3751
  onDrawingsChange(
3721
- updateDrawingById(drawings, selectedDrawingId, (drawing) => ({
3752
+ updateDrawingById(chartDrawings, chartSelectedDrawingId, (drawing) => ({
3722
3753
  ...drawing,
3723
3754
  style: {
3724
3755
  ...drawing.style,
@@ -3727,7 +3758,7 @@ function ChartGrid({
3727
3758
  }))
3728
3759
  );
3729
3760
  },
3730
- [drawings, onDrawingsChange, selectedDrawingId]
3761
+ [chartDrawings, chartSelectedDrawingId, disableDrawings, onDrawingsChange]
3731
3762
  );
3732
3763
  const { getAppendAnimatedPoint } = useAppendAnimations({
3733
3764
  charts,
@@ -4179,7 +4210,7 @@ function ChartGrid({
4179
4210
  const point = getLocalPoint(event);
4180
4211
  if (!point) return;
4181
4212
  const drawingLayout = findLayoutAt(point.x, point.y);
4182
- if (drawingLayout && activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
4213
+ if (drawingLayout && chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
4183
4214
  if (event.button !== 0) return;
4184
4215
  event.preventDefault();
4185
4216
  setFocusedChartId(drawingLayout.chart.id);
@@ -4192,10 +4223,10 @@ function ChartGrid({
4192
4223
  yScaleRef,
4193
4224
  yCenterOffsetRef
4194
4225
  });
4195
- if (activeDrawingTool === "hline" || activeDrawingTool === "vline" || activeDrawingTool === "pin") {
4226
+ if (chartActiveDrawingTool === "hline" || chartActiveDrawingTool === "vline" || chartActiveDrawingTool === "pin") {
4196
4227
  commitDrawing({
4197
4228
  chartId: drawingLayout.chart.id,
4198
- type: activeDrawingTool,
4229
+ type: chartActiveDrawingTool,
4199
4230
  start: dataPoint,
4200
4231
  end: dataPoint
4201
4232
  });
@@ -4219,15 +4250,15 @@ function ChartGrid({
4219
4250
  });
4220
4251
  return;
4221
4252
  }
4222
- if (drawingLayout && Array.isArray(drawings) && drawings.length > 0) {
4223
- const chartDrawings = getDrawingsForChart(
4224
- drawings,
4253
+ if (drawingLayout && Array.isArray(chartDrawings) && chartDrawings.length > 0) {
4254
+ const hitDrawings = getDrawingsForChart(
4255
+ chartDrawings,
4225
4256
  drawingLayout.chart.id
4226
4257
  );
4227
- for (let i = chartDrawings.length - 1; i >= 0; i -= 1) {
4258
+ for (let i = hitDrawings.length - 1; i >= 0; i -= 1) {
4228
4259
  const hit = hitTestDrawing({
4229
4260
  point,
4230
- drawing: chartDrawings[i],
4261
+ drawing: hitDrawings[i],
4231
4262
  layout: drawingLayout,
4232
4263
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
4233
4264
  point: dataPoint,
@@ -4333,9 +4364,9 @@ function ChartGrid({
4333
4364
  initialVisiblePoints,
4334
4365
  fullscreenChartId,
4335
4366
  rectangleZoomChartId,
4336
- activeDrawingTool,
4367
+ chartActiveDrawingTool,
4368
+ chartDrawings,
4337
4369
  commitDrawing,
4338
- drawings,
4339
4370
  onSelectedDrawingIdChange
4340
4371
  ]
4341
4372
  );
@@ -4347,7 +4378,7 @@ function ChartGrid({
4347
4378
  if (drawingPoint) {
4348
4379
  if (drawingEditRef.current) {
4349
4380
  const editLayout = getChartLayout().find(
4350
- (layout) => getDrawingsForChart(drawings, layout.chart.id).some(
4381
+ (layout) => getDrawingsForChart(chartDrawings, layout.chart.id).some(
4351
4382
  (drawing) => drawing.id === drawingEditRef.current.id
4352
4383
  )
4353
4384
  );
@@ -4362,7 +4393,7 @@ function ChartGrid({
4362
4393
  yCenterOffsetRef
4363
4394
  });
4364
4395
  const edit = drawingEditRef.current;
4365
- const nextDrawings = updateDrawingById(drawings, edit.id, (drawing) => {
4396
+ const nextDrawings = updateDrawingById(chartDrawings, edit.id, (drawing) => {
4366
4397
  if (drawing.type === "hline") {
4367
4398
  const deltaX = (drawing.end?.x ?? drawing.start.x) - drawing.start.x;
4368
4399
  return {
@@ -4390,7 +4421,7 @@ function ChartGrid({
4390
4421
  }
4391
4422
  return;
4392
4423
  }
4393
- if (activeDrawingTool && DRAWING_TOOLS.has(activeDrawingTool)) {
4424
+ if (chartActiveDrawingTool && DRAWING_TOOLS.has(chartActiveDrawingTool)) {
4394
4425
  const drawingLayout = findLayoutAt(drawingPoint.x, drawingPoint.y);
4395
4426
  if (!drawingLayout) return;
4396
4427
  const dataPoint = screenPointToDataPoint({
@@ -4403,11 +4434,11 @@ function ChartGrid({
4403
4434
  yCenterOffsetRef
4404
4435
  });
4405
4436
  const session = drawingSessionRef.current;
4406
- const startPoint = activeDrawingTool === "trendline" && session.chartId === drawingLayout.chart.id ? session.startPoint : dataPoint;
4407
- if (startPoint || activeDrawingTool !== "trendline") {
4437
+ const startPoint = chartActiveDrawingTool === "trendline" && session.chartId === drawingLayout.chart.id ? session.startPoint : dataPoint;
4438
+ if (startPoint || chartActiveDrawingTool !== "trendline") {
4408
4439
  updateDraftDrawing({
4409
4440
  chartId: drawingLayout.chart.id,
4410
- type: activeDrawingTool,
4441
+ type: chartActiveDrawingTool,
4411
4442
  start: startPoint || dataPoint,
4412
4443
  end: dataPoint
4413
4444
  });
@@ -4480,8 +4511,8 @@ function ChartGrid({
4480
4511
  },
4481
4512
  [
4482
4513
  fullscreenChartId,
4483
- activeDrawingTool,
4484
- drawings,
4514
+ chartActiveDrawingTool,
4515
+ chartDrawings,
4485
4516
  findLayoutAt,
4486
4517
  getChartLayout,
4487
4518
  getLocalPoint,
@@ -4686,24 +4717,24 @@ function ChartGrid({
4686
4717
  toggleRectangleZoom(focusedChartId);
4687
4718
  return;
4688
4719
  }
4689
- if (event.key.toLowerCase() === "m") {
4720
+ if (!disableDrawings && event.key.toLowerCase() === "m") {
4690
4721
  event.preventDefault();
4691
4722
  toggleMovingAverage(focusedChartId);
4692
4723
  return;
4693
4724
  }
4694
- if (["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
4725
+ if (!disableDrawings && ["t", "h", "v", "p"].includes(event.key.toLowerCase())) {
4695
4726
  event.preventDefault();
4696
4727
  const toolByKey = { t: "trendline", h: "hline", v: "vline", p: "pin" };
4697
4728
  toggleDrawingTool(toolByKey[event.key.toLowerCase()]);
4698
4729
  return;
4699
4730
  }
4700
4731
  if (event.key === "Delete" || event.key === "Backspace") {
4701
- if (!selectedDrawingId) return;
4732
+ if (disableDrawings || !chartSelectedDrawingId) return;
4702
4733
  event.preventDefault();
4703
4734
  deleteSelectedDrawing();
4704
4735
  return;
4705
4736
  }
4706
- if (event.key === "Escape" && (activeDrawingTool || draftDrawing || drawingEditRef.current)) {
4737
+ if (event.key === "Escape" && (chartActiveDrawingTool || draftDrawing || drawingEditRef.current)) {
4707
4738
  event.preventDefault();
4708
4739
  cancelDrawing();
4709
4740
  return;
@@ -4726,15 +4757,16 @@ function ChartGrid({
4726
4757
  }, [
4727
4758
  focusedChartId,
4728
4759
  fullscreenChartId,
4729
- activeDrawingTool,
4760
+ chartActiveDrawingTool,
4761
+ chartSelectedDrawingId,
4730
4762
  cancelDrawing,
4731
4763
  deleteSelectedDrawing,
4764
+ disableDrawings,
4732
4765
  draftDrawing,
4733
4766
  focusChartByKeyboard,
4734
4767
  openFullscreen,
4735
4768
  rectangleZoomChartId,
4736
4769
  resetChartView,
4737
- selectedDrawingId,
4738
4770
  toggleMovingAverage,
4739
4771
  toggleDrawingTool,
4740
4772
  toggleRectangleZoom
@@ -4743,8 +4775,8 @@ function ChartGrid({
4743
4775
  const chartLayouts = fullscreenChart ? [] : getChartLayout();
4744
4776
  const selectedDrawingLayout = getSelectedDrawingLayout(
4745
4777
  chartLayouts,
4746
- drawings,
4747
- selectedDrawingId
4778
+ chartDrawings,
4779
+ chartSelectedDrawingId
4748
4780
  );
4749
4781
  return /* @__PURE__ */ import_react9.default.createElement(
4750
4782
  "div",
@@ -4752,7 +4784,7 @@ function ChartGrid({
4752
4784
  ref: containerRef,
4753
4785
  className: `aliencharts-root relative h-full overflow-y-auto ${className}`,
4754
4786
  style: {
4755
- cursor: rectangleZoomChartId || activeDrawingTool ? "crosshair" : void 0
4787
+ cursor: rectangleZoomChartId || chartActiveDrawingTool ? "crosshair" : void 0
4756
4788
  },
4757
4789
  onPointerDown: handlePointerDown,
4758
4790
  onPointerMove: handlePointerMove,
@@ -4794,12 +4826,15 @@ function ChartGrid({
4794
4826
  onJumpLatest: jumpChartToLatest,
4795
4827
  onRectangleZoomToggle: toggleRectangleZoom,
4796
4828
  rectangleZoomActive: rectangleZoomChartId === chart.id,
4797
- movingAverage: movingAverageByChart?.[chart.id],
4829
+ movingAverage: disableDrawings ? null : movingAverageByChart?.[chart.id],
4798
4830
  onMovingAverageToggle: toggleMovingAverage,
4799
- activeDrawingTool: focusedChartId === chart.id ? activeDrawingTool : null,
4831
+ activeDrawingTool: focusedChartId === chart.id ? chartActiveDrawingTool : null,
4800
4832
  onDrawingToolToggle: toggleDrawingTool,
4801
- hasDrawings: getDrawingsForChart(drawings, chart.id).length > 0,
4833
+ hasDrawings: getDrawingsForChart(chartDrawings, chart.id).length > 0,
4802
4834
  onClearDrawingsRequest,
4835
+ disableDrawings,
4836
+ formatXTick,
4837
+ formatYValue,
4803
4838
  setRef: (node) => {
4804
4839
  if (node) chartRefs.current.set(chart.id, node);
4805
4840
  else chartRefs.current.delete(chart.id);
@@ -4812,16 +4847,18 @@ function ChartGrid({
4812
4847
  {
4813
4848
  crosshair: fullscreenChart ? null : crosshair,
4814
4849
  height: containerRef.current?.scrollHeight ?? "100%",
4815
- xAxisLabel
4850
+ xAxisLabel,
4851
+ formatXValue,
4852
+ formatYValue
4816
4853
  }
4817
4854
  ),
4818
4855
  /* @__PURE__ */ import_react9.default.createElement(
4819
4856
  DrawingOverlay,
4820
4857
  {
4821
4858
  layouts: chartLayouts,
4822
- drawings,
4823
- draftDrawing: fullscreenChart ? null : draftDrawing,
4824
- selectedDrawingId,
4859
+ drawings: chartDrawings,
4860
+ draftDrawing: fullscreenChart || disableDrawings ? null : draftDrawing,
4861
+ selectedDrawingId: chartSelectedDrawingId,
4825
4862
  projectPoint: (dataPoint, targetLayout) => projectDataPointToScreenPoint({
4826
4863
  point: dataPoint,
4827
4864
  layout: targetLayout,
@@ -4854,7 +4891,7 @@ function ChartGrid({
4854
4891
  onTextChange: updateSelectedDrawingText
4855
4892
  }
4856
4893
  ) : null,
4857
- !fullscreenChart && focusedChartId && movingAverageByChart?.[focusedChartId]?.enabled ? (() => {
4894
+ !disableDrawings && !fullscreenChart && focusedChartId && movingAverageByChart?.[focusedChartId]?.enabled ? (() => {
4858
4895
  const layout = chartLayouts.find(
4859
4896
  (candidate) => candidate.chart.id === focusedChartId
4860
4897
  );
@@ -4870,7 +4907,7 @@ function ChartGrid({
4870
4907
  })() : null,
4871
4908
  /* @__PURE__ */ import_react9.default.createElement(RectangleZoomOverlay, { rect: fullscreenChart ? null : rectangleZoomRect }),
4872
4909
  fullscreenChart ? /* @__PURE__ */ import_react9.default.createElement(
4873
- LeanChartFullscreenOverlay,
4910
+ ChartFullscreenOverlay,
4874
4911
  {
4875
4912
  chart: fullscreenChart,
4876
4913
  dataRevision,
@@ -4892,17 +4929,21 @@ function ChartGrid({
4892
4929
  onReset: resetChartView,
4893
4930
  onJumpLatest: jumpChartToLatest,
4894
4931
  xAxisLabel,
4895
- drawings,
4932
+ drawings: chartDrawings,
4896
4933
  onDrawingsChange,
4897
- activeDrawingTool,
4934
+ activeDrawingTool: chartActiveDrawingTool,
4898
4935
  onActiveDrawingToolChange,
4899
- selectedDrawingId,
4936
+ selectedDrawingId: chartSelectedDrawingId,
4900
4937
  onSelectedDrawingIdChange,
4901
4938
  createDrawingId,
4902
4939
  onClearDrawingsRequest,
4903
4940
  onChartContextMenu,
4904
4941
  topMarkers,
4905
- onTopMarkerClick
4942
+ onTopMarkerClick,
4943
+ disableDrawings,
4944
+ formatXTick,
4945
+ formatXValue,
4946
+ formatYValue
4906
4947
  }
4907
4948
  ) : null
4908
4949
  );