hyperprop-charting-library 0.1.142 → 0.1.143

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.
@@ -369,26 +369,45 @@ var getSeriesFingerprint = (data) => {
369
369
  var withCachedSeries = (key, data, compute) => {
370
370
  const fingerprint = getSeriesFingerprint(data);
371
371
  const existing = builtInSeriesCache.get(key);
372
- if (existing && existing.fingerprint === fingerprint) {
373
- return existing.values;
372
+ const shape = getSeriesShape(data);
373
+ if (existing) {
374
+ const unchanged = existing.fingerprint === fingerprint;
375
+ const liveTickWithinThrottle = !unchanged && indicatorLiveThrottleMs > 0 && existing.shape === shape && Date.now() - existing.computedAt < indicatorLiveThrottleMs;
376
+ if (unchanged || liveTickWithinThrottle) {
377
+ return existing.values;
378
+ }
374
379
  }
375
380
  const values = compute();
376
- builtInSeriesCache.set(key, { fingerprint, values });
381
+ builtInSeriesCache.set(key, { fingerprint, values, shape, computedAt: Date.now() });
377
382
  return values;
378
383
  };
379
384
  var builtInComputationCache = /* @__PURE__ */ new Map();
385
+ var indicatorLiveThrottleMs = 80;
386
+ var setIndicatorLiveThrottleMs = (ms) => {
387
+ indicatorLiveThrottleMs = Math.max(0, ms);
388
+ };
389
+ var getSeriesShape = (data) => {
390
+ const length = data.length;
391
+ const last = length > 0 ? data[length - 1] : void 0;
392
+ return last ? `${length}|${last.time.getTime()}` : "empty";
393
+ };
380
394
  var COMPUTATION_CACHE_MAX_ENTRIES = 128;
381
395
  var withCachedComputation = (key, data, compute) => {
382
396
  const fingerprint = getSeriesFingerprint(data);
383
397
  const existing = builtInComputationCache.get(key);
384
- if (existing && existing.fingerprint === fingerprint) {
385
- builtInComputationCache.delete(key);
386
- builtInComputationCache.set(key, existing);
387
- return existing.value;
398
+ const shape = getSeriesShape(data);
399
+ if (existing) {
400
+ const unchanged = existing.fingerprint === fingerprint;
401
+ const liveTickWithinThrottle = !unchanged && indicatorLiveThrottleMs > 0 && existing.shape === shape && Date.now() - existing.computedAt < indicatorLiveThrottleMs;
402
+ if (unchanged || liveTickWithinThrottle) {
403
+ builtInComputationCache.delete(key);
404
+ builtInComputationCache.set(key, existing);
405
+ return existing.value;
406
+ }
388
407
  }
389
408
  const value = compute();
390
409
  builtInComputationCache.delete(key);
391
- builtInComputationCache.set(key, { fingerprint, value });
410
+ builtInComputationCache.set(key, { fingerprint, value, shape, computedAt: Date.now() });
392
411
  while (builtInComputationCache.size > COMPUTATION_CACHE_MAX_ENTRIES) {
393
412
  const oldest = builtInComputationCache.keys().next().value;
394
413
  if (oldest === void 0) break;
@@ -2958,7 +2977,23 @@ var DEFAULT_OPTIONS = {
2958
2977
  accessibility: { label: "Price chart", description: "", focusable: true },
2959
2978
  downsampling: { enabled: true, thresholdPx: 1.5 },
2960
2979
  touch: { hitToleranceScale: 2.2, longPressTooltip: true, longPressMs: 400 },
2980
+ dataLine: {
2981
+ visible: false,
2982
+ symbol: "",
2983
+ interval: "",
2984
+ exchange: "",
2985
+ showOhlc: true,
2986
+ showChange: true,
2987
+ showVolume: false,
2988
+ details: [],
2989
+ statusColor: "",
2990
+ fontSize: 0,
2991
+ symbolColor: "",
2992
+ textColor: ""
2993
+ },
2961
2994
  datafeedOptions: { prefetchThresholdBars: 150, cooldownMs: 1200, chunkBars: 1500 },
2995
+ animation: { viewportTransitions: true, durationMs: 260 },
2996
+ indicatorUpdate: { liveThrottleMs: 80 },
2962
2997
  crosshair: DEFAULT_CROSSHAIR_OPTIONS,
2963
2998
  grid: DEFAULT_GRID_OPTIONS,
2964
2999
  watermark: DEFAULT_WATERMARK_OPTIONS,
@@ -3017,6 +3052,18 @@ var mergeChartOptions = (baseOptions, options = {}) => ({
3017
3052
  ...baseOptions.touch,
3018
3053
  ...options.touch ?? {}
3019
3054
  },
3055
+ dataLine: {
3056
+ ...baseOptions.dataLine,
3057
+ ...options.dataLine ?? {}
3058
+ },
3059
+ animation: {
3060
+ ...baseOptions.animation,
3061
+ ...options.animation ?? {}
3062
+ },
3063
+ indicatorUpdate: {
3064
+ ...baseOptions.indicatorUpdate,
3065
+ ...options.indicatorUpdate ?? {}
3066
+ },
3020
3067
  datafeedOptions: {
3021
3068
  ...baseOptions.datafeedOptions,
3022
3069
  ...options.datafeedOptions ?? {}
@@ -3276,6 +3323,7 @@ function createChart(element, options = {}) {
3276
3323
  let crosshairPoint = null;
3277
3324
  let doubleClickEnabled = mergedOptions.doubleClickEnabled;
3278
3325
  let doubleClickAction = mergedOptions.doubleClickAction;
3326
+ setIndicatorLiveThrottleMs(mergedOptions.indicatorUpdate?.liveThrottleMs ?? 80);
3279
3327
  let noOverlappingLineLabels = DEFAULT_LABELS_OPTIONS.noOverlapping;
3280
3328
  let rightAxisLabelSlots = [];
3281
3329
  let plotLabelSlots = [];
@@ -3517,21 +3565,69 @@ function createChart(element, options = {}) {
3517
3565
  Math.min(highCenter, count + maxPanBars)
3518
3566
  );
3519
3567
  };
3520
- const fitXViewport = () => {
3521
- const count = data.length;
3522
- if (count === 0) {
3523
- xCenter = 0;
3524
- xSpan = 60;
3525
- return;
3568
+ let viewportTweenRaf = null;
3569
+ const cancelViewportTween = () => {
3570
+ if (viewportTweenRaf !== null) {
3571
+ cancelAnimationFrame(viewportTweenRaf);
3572
+ viewportTweenRaf = null;
3573
+ }
3574
+ };
3575
+ const prefersReducedMotion = () => typeof window !== "undefined" && typeof window.matchMedia === "function" && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
3576
+ const animateViewportTo = (targetCenter, targetSpan, onComplete) => {
3577
+ const animation = mergedOptions.animation ?? DEFAULT_OPTIONS.animation;
3578
+ const duration = Math.max(0, animation?.durationMs ?? 260);
3579
+ const startCenter = xCenter;
3580
+ const startSpan = xSpan;
3581
+ const centerDelta = targetCenter - startCenter;
3582
+ const spanRatio = startSpan > 0 ? targetSpan / startSpan : 1;
3583
+ const negligible = Math.abs(centerDelta) < 0.5 && Math.abs(spanRatio - 1) < 0.01;
3584
+ if (animation?.viewportTransitions === false || duration === 0 || negligible || prefersReducedMotion() || typeof requestAnimationFrame !== "function") {
3585
+ xCenter = targetCenter;
3586
+ xSpan = targetSpan;
3587
+ clampXViewport();
3588
+ onComplete?.();
3589
+ emitViewportChange();
3590
+ scheduleDraw();
3591
+ return false;
3526
3592
  }
3593
+ cancelViewportTween();
3594
+ const startedAt = performance.now();
3595
+ const step = (now) => {
3596
+ const t = clamp((now - startedAt) / duration, 0, 1);
3597
+ const eased = 1 - Math.pow(1 - t, 3);
3598
+ xCenter = startCenter + centerDelta * eased;
3599
+ xSpan = startSpan * Math.pow(spanRatio, eased);
3600
+ clampXViewport();
3601
+ scheduleDraw();
3602
+ if (t < 1) {
3603
+ viewportTweenRaf = requestAnimationFrame(step);
3604
+ return;
3605
+ }
3606
+ viewportTweenRaf = null;
3607
+ xCenter = targetCenter;
3608
+ xSpan = targetSpan;
3609
+ clampXViewport();
3610
+ onComplete?.();
3611
+ emitViewportChange();
3612
+ scheduleDraw();
3613
+ };
3614
+ viewportTweenRaf = requestAnimationFrame(step);
3615
+ return true;
3616
+ };
3617
+ const getFitXTarget = () => {
3618
+ const count = data.length;
3619
+ if (count === 0) return { center: 0, span: 60 };
3527
3620
  const maxSpan = Math.min(maxVisibleBars, Math.max(minVisibleBars, count + maxPanBars * 2));
3528
- const requestedVisibleBars = clamp(Math.floor(mergedOptions.initialVisibleBars), minVisibleBars, maxSpan);
3529
- xSpan = requestedVisibleBars;
3530
- if (mergedOptions.initialViewport === "center") {
3531
- xCenter = count / 2;
3532
- } else {
3533
- xCenter = count - xSpan / 2 + rightEdgePaddingBars;
3534
- }
3621
+ const span = clamp(Math.floor(mergedOptions.initialVisibleBars), minVisibleBars, maxSpan);
3622
+ return {
3623
+ center: mergedOptions.initialViewport === "center" ? count / 2 : count - span / 2 + rightEdgePaddingBars,
3624
+ span
3625
+ };
3626
+ };
3627
+ const fitXViewport = () => {
3628
+ const target = getFitXTarget();
3629
+ xSpan = target.span;
3630
+ xCenter = target.center;
3535
3631
  clampXViewport();
3536
3632
  };
3537
3633
  const getYBounds = () => {
@@ -6928,6 +7024,73 @@ function createChart(element, options = {}) {
6928
7024
  for (const orderLine of orderLines) {
6929
7025
  drawOrderLine(orderLine, yFromPrice, chartLeft, chartTop, chartRight, chartBottom);
6930
7026
  }
7027
+ let dataLineBottom = chartTop;
7028
+ const dataLine = mergedOptions.dataLine;
7029
+ if (dataLine?.visible && data.length > 0) {
7030
+ const hoverIndex = crosshairPoint && getHitRegion(crosshairPoint.x, crosshairPoint.y) === "plot" ? indexFromCanvasX(crosshairPoint.x) : null;
7031
+ const barIndex = hoverIndex !== null && hoverIndex >= 0 && hoverIndex < data.length ? hoverIndex : data.length - 1;
7032
+ const bar = data[barIndex];
7033
+ if (bar) {
7034
+ const prevFont = ctx.font;
7035
+ const fontSize = Math.max(9, dataLine.fontSize || axis.fontSize);
7036
+ ctx.font = `${fontSize}px ${mergedOptions.fontFamily}`;
7037
+ ctx.textBaseline = "top";
7038
+ ctx.textAlign = "left";
7039
+ const symbolColor = dataLine.symbolColor || axis.textColor;
7040
+ const textColor = dataLine.textColor || labels.indicatorTextColor;
7041
+ const changeAbs = bar.c - bar.o;
7042
+ const changeColor = changeAbs >= 0 ? mergedOptions.upColor : mergedOptions.downColor;
7043
+ const rowY = chartTop + 6;
7044
+ let cursorX = chartLeft + 10;
7045
+ if (dataLine.statusColor) {
7046
+ const dotRadius = Math.max(2.5, fontSize / 4);
7047
+ ctx.fillStyle = dataLine.statusColor;
7048
+ ctx.beginPath();
7049
+ ctx.arc(cursorX + dotRadius, rowY + fontSize / 2, dotRadius, 0, Math.PI * 2);
7050
+ ctx.fill();
7051
+ cursorX += dotRadius * 2 + 6;
7052
+ }
7053
+ const headline = [dataLine.symbol, dataLine.interval, dataLine.exchange].filter((part) => part && part.length > 0).join(" \xB7 ");
7054
+ if (headline) {
7055
+ ctx.fillStyle = symbolColor;
7056
+ ctx.fillText(headline, cursorX, rowY);
7057
+ cursorX += measureTextWidth(headline) + 10;
7058
+ }
7059
+ if (dataLine.showOhlc !== false) {
7060
+ const ohlc = `O${formatPrice(bar.o)} H${formatPrice(bar.h)} L${formatPrice(bar.l)} C${formatPrice(bar.c)}`;
7061
+ ctx.fillStyle = changeColor;
7062
+ ctx.fillText(ohlc, cursorX, rowY);
7063
+ cursorX += measureTextWidth(ohlc) + 8;
7064
+ }
7065
+ if (dataLine.showChange !== false) {
7066
+ const pct = bar.o !== 0 ? changeAbs / bar.o * 100 : 0;
7067
+ const changeText = `${changeAbs >= 0 ? "+" : ""}${formatPrice(changeAbs)} (${changeAbs >= 0 ? "+" : ""}${pct.toFixed(2)}%)`;
7068
+ ctx.fillStyle = changeColor;
7069
+ ctx.fillText(changeText, cursorX, rowY);
7070
+ cursorX += measureTextWidth(changeText) + 10;
7071
+ }
7072
+ if (dataLine.showVolume && bar.v !== void 0) {
7073
+ const volumeText = `Vol ${bar.v >= 1e6 ? `${(bar.v / 1e6).toFixed(2)}M` : bar.v >= 1e3 ? `${(bar.v / 1e3).toFixed(1)}K` : String(Math.round(bar.v))}`;
7074
+ ctx.fillStyle = textColor;
7075
+ ctx.fillText(volumeText, cursorX, rowY);
7076
+ cursorX += measureTextWidth(volumeText) + 10;
7077
+ }
7078
+ for (const detail of dataLine.details ?? []) {
7079
+ const text = detail.label ? `${detail.label} ${detail.value}` : detail.value;
7080
+ const width2 = measureTextWidth(text);
7081
+ if (cursorX + width2 > chartRight - 4) break;
7082
+ if (detail.background) {
7083
+ ctx.fillStyle = detail.background;
7084
+ fillRoundedRect(cursorX - 4, rowY - 2, width2 + 8, fontSize + 4, 3);
7085
+ }
7086
+ ctx.fillStyle = detail.color || textColor;
7087
+ ctx.fillText(text, cursorX, rowY);
7088
+ cursorX += width2 + 12;
7089
+ }
7090
+ dataLineBottom = rowY + fontSize + 4;
7091
+ ctx.font = prevFont;
7092
+ }
7093
+ }
6931
7094
  if (labels.visible && (labels.showIndicatorNames || labels.showIndicatorValues)) {
6932
7095
  const isLegendInputValue = (value) => {
6933
7096
  if (typeof value === "number" || typeof value === "boolean") {
@@ -6956,7 +7119,7 @@ function createChart(element, options = {}) {
6956
7119
  const isRight = position === "top-right" || position === "bottom-right";
6957
7120
  const isBottom = position === "bottom-left" || position === "bottom-right";
6958
7121
  const legendX = isRight ? chartRight - offsetX : chartLeft + offsetX;
6959
- const legendY = isBottom ? chartBottom - offsetY : chartTop + offsetY;
7122
+ const legendY = isBottom ? chartBottom - offsetY : Math.max(chartTop + offsetY, dataLineBottom);
6960
7123
  drawText(legendText, legendX, legendY, isRight ? "right" : "left", isBottom ? "bottom" : "top", labels.indicatorTextColor);
6961
7124
  ctx.font = prevFont;
6962
7125
  }
@@ -7497,27 +7660,24 @@ function createChart(element, options = {}) {
7497
7660
  scheduleDraw();
7498
7661
  };
7499
7662
  const fitContent = () => {
7500
- fitXViewport();
7501
- updateFollowLatest(true);
7502
- emitViewportChange();
7503
- scheduleDraw();
7663
+ const target = getFitXTarget();
7664
+ animateViewportTo(target.center, target.span, () => updateFollowLatest(true));
7504
7665
  };
7505
7666
  const resetViewport = () => {
7506
7667
  cancelKineticPan();
7507
- fitXViewport();
7668
+ const target = getFitXTarget();
7508
7669
  resetYViewport();
7509
- updateFollowLatest(true);
7510
- emitViewportChange();
7511
- scheduleDraw();
7670
+ animateViewportTo(target.center, target.span, () => updateFollowLatest(true));
7512
7671
  };
7513
7672
  const isFollowingLatest = () => followLatest;
7514
7673
  const setFollowingLatest = (follow) => {
7515
7674
  if (follow && data.length > 0) {
7516
7675
  cancelKineticPan();
7517
- xCenter = data.length - xSpan / 2 + rightEdgePaddingBars;
7518
- clampXViewport();
7519
- updateFollowLatest(true);
7520
- scheduleDraw();
7676
+ animateViewportTo(
7677
+ data.length - xSpan / 2 + rightEdgePaddingBars,
7678
+ xSpan,
7679
+ () => updateFollowLatest(true)
7680
+ );
7521
7681
  } else {
7522
7682
  updateFollowLatest(follow);
7523
7683
  }
@@ -8800,6 +8960,7 @@ function createChart(element, options = {}) {
8800
8960
  canvas.focus({ preventScroll: true });
8801
8961
  }
8802
8962
  cancelKineticPan();
8963
+ cancelViewportTween();
8803
8964
  panVelocitySamples.length = 0;
8804
8965
  magnetModifierActive = event.metaKey || event.ctrlKey;
8805
8966
  shiftKeyActive = event.shiftKey;
@@ -9464,6 +9625,7 @@ function createChart(element, options = {}) {
9464
9625
  return;
9465
9626
  }
9466
9627
  cancelKineticPan();
9628
+ cancelViewportTween();
9467
9629
  const point = getCanvasPoint(event);
9468
9630
  const region = getHitRegion(point.x, point.y);
9469
9631
  if (region === "outside") {
@@ -9741,6 +9903,7 @@ function createChart(element, options = {}) {
9741
9903
  resetRightMarginCache();
9742
9904
  doubleClickEnabled = mergedOptions.doubleClickEnabled;
9743
9905
  doubleClickAction = mergedOptions.doubleClickAction;
9906
+ setIndicatorLiveThrottleMs(mergedOptions.indicatorUpdate?.liveThrottleMs ?? 80);
9744
9907
  applyAccessibilityAttributes();
9745
9908
  const isTickerSmoothingEnabled = mergedOptions.tickerLine?.smoothing ?? false;
9746
9909
  if (!isTickerSmoothingEnabled) {
@@ -10219,6 +10382,7 @@ function createChart(element, options = {}) {
10219
10382
  return canvas.toDataURL(options2.type ?? "image/png", options2.quality);
10220
10383
  };
10221
10384
  const destroy = () => {
10385
+ cancelViewportTween();
10222
10386
  cancelLongPressTimer();
10223
10387
  datafeedUnsubscribe?.();
10224
10388
  datafeedUnsubscribe = null;
@@ -83,6 +83,9 @@ interface ChartOptions {
83
83
  downsampling?: DownsamplingOptions;
84
84
  touch?: TouchOptions;
85
85
  datafeedOptions?: DatafeedOptions;
86
+ dataLine?: DataLineOptions;
87
+ animation?: AnimationOptions;
88
+ indicatorUpdate?: IndicatorUpdateOptions;
86
89
  crosshair?: CrosshairOptions;
87
90
  grid?: GridOptions;
88
91
  watermark?: WatermarkOptions;
@@ -636,6 +639,67 @@ interface ChartTheme {
636
639
  labelBackground: string;
637
640
  }
638
641
  type ChartThemeName = "midnight" | "light" | "brand" | "dark" | "high-contrast";
642
+ /**
643
+ * The symbol/OHLC line drawn inside the top-left of the plot, like
644
+ * TradingView's data line. Values follow the crosshair while hovering and fall
645
+ * back to the latest bar otherwise. Opt-in, because hosts that already render
646
+ * their own DOM overlay shouldn't suddenly get two.
647
+ */
648
+ interface DataLineOptions {
649
+ /** Default false. */
650
+ visible?: boolean;
651
+ /** e.g. "NQU6" — drawn first, in the emphasis color. */
652
+ symbol?: string;
653
+ /** e.g. "1h". */
654
+ interval?: string;
655
+ /** e.g. "CME". */
656
+ exchange?: string;
657
+ /** O/H/L/C values for the hovered (or latest) bar. Default true. */
658
+ showOhlc?: boolean;
659
+ /** Absolute and percent change of that bar, colored by direction. Default true. */
660
+ showChange?: boolean;
661
+ /** Bar volume. Default false. */
662
+ showVolume?: boolean;
663
+ /**
664
+ * Extra chips after the values — session, currency, a "Closed" badge. Each
665
+ * renders as `label value` with an optional color and pill background.
666
+ */
667
+ details?: Array<{
668
+ label?: string;
669
+ value: string;
670
+ color?: string;
671
+ background?: string;
672
+ }>;
673
+ /** Colored dot before the symbol, e.g. green when the market is open. */
674
+ statusColor?: string;
675
+ fontSize?: number;
676
+ /** Symbol color. Defaults to the axis text color. */
677
+ symbolColor?: string;
678
+ /** Everything after the symbol. Defaults to the indicator legend color. */
679
+ textColor?: string;
680
+ }
681
+ interface IndicatorUpdateOptions {
682
+ /**
683
+ * While only the forming bar is ticking, recompute indicator series at most
684
+ * this often (ms) rather than on every frame. Values are always exact — this
685
+ * changes how often the live bar's output refreshes, not how it's computed,
686
+ * and anything structural (a bar closing, history loading, inputs changing)
687
+ * recomputes immediately. Default 80; set 0 to recompute every frame.
688
+ */
689
+ liveThrottleMs?: number;
690
+ }
691
+ interface AnimationOptions {
692
+ /**
693
+ * Ease the big viewport jumps — reset, fit-all, scroll-to-realtime — instead
694
+ * of teleporting, so it stays obvious which way the chart moved. Continuous
695
+ * gestures (drag, wheel, pinch) are never animated; they already follow the
696
+ * hand. Default true, and always skipped when the OS asks for reduced
697
+ * motion.
698
+ */
699
+ viewportTransitions?: boolean;
700
+ /** Transition length in ms. Default 260. */
701
+ durationMs?: number;
702
+ }
639
703
  /** Touch ergonomics. Fingers are blunter than a mouse cursor. */
640
704
  interface TouchOptions {
641
705
  /**
@@ -1078,4 +1142,4 @@ declare const CHART_THEME_NAMES: ChartThemeName[];
1078
1142
 
1079
1143
  declare function createChart(element: HTMLElement, options?: ChartOptions): ChartInstance;
1080
1144
 
1081
- export { type AccessibilityOptions, type AxisOptions, type BuiltInIndicatorInfo, CHART_THEMES, CHART_THEME_NAMES, type ChartClickEvent, type ChartContextMenuEvent, type ChartContextMenuRegion, type ChartDatafeed, type ChartInstance, type ChartKeyboardAction, type ChartKeyboardShortcutEvent, type ChartLongPressEvent, type ChartOptions, type ChartSavedState, type ChartTheme, type ChartThemeName, type ChartType, type CompareSeriesOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type DatafeedBarsRequest, type DatafeedOptions, type DownsamplingOptions, type DrawingBounds, type DrawingDefaults, type DrawingHoverEvent, type DrawingObjectOptions, type DrawingPoint, type DrawingSelectEvent, type DrawingSelectionChangeEvent, type DrawingToolType, FIB_DEFAULT_PALETTE, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneActionEvent, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneHeightChangeEvent, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type KeyboardOptions, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, POSITION_DEFAULT_COLORS, type PriceLineOptions, type PriceScaleMode, type PriceScaleOptions, SCRIPT_SOURCE_INPUT_VALUES, type ScriptComputeResult, type ScriptIndicatorDefinition, type ScriptIndicatorInputDef, type ScriptInputHelper, type ScriptInputOptions, type ScriptPlotSpec, type TickerLineOptions, type TouchOptions, type TradeMarkerOptions, type ViewportState, type WatermarkOptions, compileScriptIndicator, createChart, extractScriptInputs, validateScriptSource };
1145
+ export { type AccessibilityOptions, type AnimationOptions, type AxisOptions, type BuiltInIndicatorInfo, CHART_THEMES, CHART_THEME_NAMES, type ChartClickEvent, type ChartContextMenuEvent, type ChartContextMenuRegion, type ChartDatafeed, type ChartInstance, type ChartKeyboardAction, type ChartKeyboardShortcutEvent, type ChartLongPressEvent, type ChartOptions, type ChartSavedState, type ChartTheme, type ChartThemeName, type ChartType, type CompareSeriesOptions, type CrosshairMoveEvent, type CrosshairOptions, type CrosshairPriceActionEvent, type DashPatternOptions, type DataLineOptions, type DatafeedBarsRequest, type DatafeedOptions, type DownsamplingOptions, type DrawingBounds, type DrawingDefaults, type DrawingHoverEvent, type DrawingObjectOptions, type DrawingPoint, type DrawingSelectEvent, type DrawingSelectionChangeEvent, type DrawingToolType, FIB_DEFAULT_PALETTE, type GridOptions, type IndicatorInstanceOptions, type IndicatorPane, type IndicatorPaneActionEvent, type IndicatorPaneAxisOptions, type IndicatorPaneGuideLine, type IndicatorPaneHeightChangeEvent, type IndicatorPaneRenderInfo, type IndicatorPaneValue, type IndicatorPaneValueLabel, type IndicatorPlugin, type IndicatorRenderContext, type IndicatorUpdateOptions, type KeyboardOptions, type LabelsOptions, type OhlcDataPoint, type OrderActionButton, type OrderActionEvent, type OrderLineOptions, POSITION_DEFAULT_COLORS, type PriceLineOptions, type PriceScaleMode, type PriceScaleOptions, SCRIPT_SOURCE_INPUT_VALUES, type ScriptComputeResult, type ScriptIndicatorDefinition, type ScriptIndicatorInputDef, type ScriptInputHelper, type ScriptInputOptions, type ScriptPlotSpec, type TickerLineOptions, type TouchOptions, type TradeMarkerOptions, type ViewportState, type WatermarkOptions, compileScriptIndicator, createChart, extractScriptInputs, validateScriptSource };