{"version":3,"sources":["../src/KLineChartContext.ts","../src/hooks/useKLineChart.ts","../src/hooks/useIndicator.ts","../src/components/Indicator.tsx","../src/hooks/useOverlay.ts","../src/components/Overlay.tsx","../src/components/Widget.tsx","../src/hooks/useYAxis.ts","../src/components/YAxis.tsx","../src/subscribeChartAction.ts","../src/KLineChart.tsx","../src/hooks/useChartEvent.ts","../src/hooks/useCrosshair.ts","../src/hooks/useVisibleRange.ts","../src/hooks/useBarSpace.ts","../src/hooks/useDataList.ts","../src/hooks/usePane.ts","../src/hooks/useYAxes.ts"],"names":["createContext","useContext","useRef","useId","useEffect","useState","createPortal","forwardRef","init","dispose","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["import { createContext } from \"react\";\nimport type { Chart } from \"klinecharts\";\n\nexport interface KLineChartContextValue {\n  chart: Chart | null;\n}\n\nexport const KLineChartContext = createContext<KLineChartContextValue>({\n  chart: null,\n});\n","import { useContext } from \"react\";\nimport type { Chart } from \"klinecharts\";\nimport { KLineChartContext } from \"../KLineChartContext\";\n\n/**\n * Access the KlineCharts `Chart` instance from any descendant of `<KLineChart>`.\n * Returns `null` before the chart has initialized.\n */\nexport function useKLineChart(): Chart | null {\n  const { chart } = useContext(KLineChartContext);\n  return chart;\n}\n","import { useEffect, useId, useRef } from \"react\";\nimport type {\n  IndicatorCreate,\n  PaneOptions,\n  YAxisOverride,\n  Nullable,\n} from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\n\nexport interface UseIndicatorOptions {\n  /** Indicator name or full creation config. */\n  value: string | IndicatorCreate;\n  /** Whether to stack on existing indicators in the same pane. */\n  isStack?: boolean;\n  /** Options applied to the indicator pane via `setPaneOptions`. */\n  pane?: Partial<PaneOptions>;\n  /**\n   * Y axis configuration for the indicator pane. Applied via `createYAxis`\n   * (idempotent in KLineCharts v10).\n   */\n  yAxis?: YAxisOverride;\n  /**\n   * Options applied to the indicator pane.\n   * @deprecated Renamed to `pane` to match KLineCharts v10. Use `pane` instead.\n   */\n  paneOptions?: Partial<PaneOptions>;\n}\n\n/**\n * Manages the lifecycle of a technical indicator.\n *\n * In KLineCharts v10, `createIndicator(value, isStack?)` no longer accepts a\n * separate options object: `paneId`/`yAxisId` live on the `IndicatorCreate`\n * value itself. This hook therefore:\n * 1. Creates the indicator (optionally passing a stable `paneId`/`id`).\n * 2. Applies `pane` to the resulting pane via `setPaneOptions`.\n * 3. Configures the pane's Y axis via `createYAxis` when `yAxis` is provided.\n *\n * @returns The indicator id, or `null`.\n */\nexport function useIndicator(options: UseIndicatorOptions): Nullable<string> {\n  const chart = useKLineChart();\n  const indicatorIdRef = useRef<Nullable<string>>(null);\n  const { value, isStack, pane, paneOptions, yAxis } = options;\n\n  // Stable unique ID per component instance — survives re-renders,\n  // guarantees cleanup removes exactly the indicator we created.\n  const indicatorId = useId();\n\n  // Name is the base identity. If this changes, we must recreate.\n  const indicatorName = typeof value === \"string\" ? value : value.name;\n\n  // Serialize value for dependency comparison (small config objects)\n  const valueKey = typeof value === \"string\" ? value : JSON.stringify(value);\n\n  // Recreate the indicator only when its *identity* changes — the indicator\n  // name, the stacking flag, or the target pane id. Pane *options* (height,\n  // state, ...) are applied live via setPaneOptions below and must NOT trigger\n  // a full recreation.\n  const paneIdKey = pane?.id ?? paneOptions?.id ?? \"\";\n  const yAxisKey = yAxis ? JSON.stringify(yAxis) : \"\";\n\n  useEffect(() => {\n    if (!chart || !indicatorName) return;\n\n    const create: IndicatorCreate =\n      typeof value === \"string\"\n        ? { name: value, id: indicatorId }\n        : { ...value, id: indicatorId };\n\n    indicatorIdRef.current = chart.createIndicator(create, isStack);\n\n    return () => {\n      chart.removeIndicator({ id: indicatorId });\n      indicatorIdRef.current = null;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, indicatorName, isStack, indicatorId, paneIdKey, yAxisKey]);\n\n  // Apply pane options to the indicator pane. `setPaneOptions` in v10 accepts a\n  // `Partial<PaneOptions>` and targets the pane whose id matches `options.id`.\n  // Re-run whenever the full pane config changes so live tweaks (height, ...)\n  // take effect without recreating the indicator.\n  const paneOptionsKey =\n    (pane ?? paneOptions) ? JSON.stringify(pane ?? paneOptions) : \"\";\n  useEffect(() => {\n    if (!chart || !indicatorIdRef.current) return;\n    const resolvedPane = pane ?? paneOptions;\n    if (!resolvedPane) return;\n\n    const indicator = chart\n      .getIndicators({ id: indicatorIdRef.current })\n      .find((i) => i.id === indicatorIdRef.current);\n    if (!indicator) return;\n\n    chart.setPaneOptions({ id: indicator.paneId, ...resolvedPane });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, paneOptionsKey, paneIdKey]);\n\n  // Configure the indicator pane's Y axis. `createIndicator` already creates an\n  // axis for the indicator, so `createYAxis` would be a no-op here. Use\n  // `overrideYAxis` instead, which resolves the existing axis by id and applies\n  // the config. Re-run after (re)creation so a freshly created indicator's axis\n  // is configured too.\n  useEffect(() => {\n    if (!chart || !indicatorIdRef.current || !yAxis) return;\n\n    const indicator = chart\n      .getIndicators({ id: indicatorIdRef.current })\n      .find((i) => i.id === indicatorIdRef.current);\n    if (!indicator) return;\n\n    chart.overrideYAxis({\n      ...yAxis,\n      paneId: indicator.paneId,\n      id: indicator.yAxisId,\n    });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, yAxisKey, paneIdKey]);\n\n  // Override indicator config when the value object changes.\n  // We must skip the first run: the create-effect above already applied the\n  // initial value, so overriding immediately would be a redundant call.\n  const firstOverrideRef = useRef(true);\n  useEffect(() => {\n    if (!chart || typeof value === \"string\") return;\n    if (firstOverrideRef.current) {\n      firstOverrideRef.current = false;\n      return;\n    }\n    chart.overrideIndicator({ ...value, id: indicatorId });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, valueKey, indicatorId]);\n\n  return indicatorIdRef.current;\n}\n","import { useIndicator } from \"../hooks/useIndicator\";\nimport type { UseIndicatorOptions } from \"../hooks/useIndicator\";\n\nexport type IndicatorProps = UseIndicatorOptions;\n\n/**\n * Declarative indicator management as a child of `<KLineChart>`.\n * Renders nothing — purely manages the indicator lifecycle.\n *\n * @example\n * ```tsx\n * <KLineChart data={data}>\n *   <KLineChart.Indicator value={{ name: \"MA\", calcParams: [5, 10, 30] }} />\n *   <KLineChart.Indicator value=\"VOL\" pane={{ height: 80 }} />\n * </KLineChart>\n * ```\n */\nexport function Indicator(props: IndicatorProps): null {\n  useIndicator(props);\n  return null;\n}\n\nIndicator.displayName = \"KLineChart.Indicator\";\n","import { useEffect, useRef, useId } from \"react\";\nimport type { OverlayCreate, Nullable } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\n\nexport interface UseOverlayOptions {\n  /** Overlay name, creation config, or an array for batch creation. */\n  value: string | OverlayCreate | Array<string | OverlayCreate>;\n}\n\n/**\n * Manages the lifecycle of overlay(s) (drawing tools).\n * Creates on mount, removes on unmount, and overrides config on change.\n *\n * @returns The overlay ID(s), or `null`.\n */\nexport function useOverlay(\n  options: UseOverlayOptions\n): Nullable<string> | Array<Nullable<string>> {\n  const chart = useKLineChart();\n  const idsRef = useRef<Nullable<string> | Array<Nullable<string>>>(null);\n  const { value } = options;\n\n  const valueKey = typeof value === \"string\" ? value : JSON.stringify(value);\n\n  const overlayId = useId();\n  const isBatch = Array.isArray(value);\n  const isString = typeof value === \"string\";\n  const baseName = isString\n    ? value\n    : isBatch\n      ? \"batch\"\n      : (value as OverlayCreate).name;\n\n  useEffect(() => {\n    if (!chart || !baseName) return;\n\n    let createConfig = value;\n    // Inject stable ID for single object configs so we can override them later\n    if (!isBatch && !isString) {\n      createConfig = { ...(value as OverlayCreate), id: overlayId };\n    }\n\n    idsRef.current = chart.createOverlay(createConfig);\n\n    return () => {\n      if (!chart) return;\n      const ids = Array.isArray(idsRef.current)\n        ? idsRef.current\n        : [idsRef.current];\n      ids.forEach((id) => {\n        if (id) chart.removeOverlay({ id });\n      });\n      idsRef.current = null;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, baseName, isBatch, overlayId]);\n\n  // Override when value config changes (only for single object configs).\n  // Skip the first run: the create-effect above already applied the value.\n  const firstOverrideRef = useRef(true);\n  useEffect(() => {\n    if (!chart || isString || isBatch) return;\n    if (firstOverrideRef.current) {\n      firstOverrideRef.current = false;\n      return;\n    }\n    chart.overrideOverlay({ ...(value as OverlayCreate), id: overlayId });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, valueKey, isString, isBatch, overlayId]);\n\n  return idsRef.current;\n}\n","import { useOverlay } from \"../hooks/useOverlay\";\nimport type { UseOverlayOptions } from \"../hooks/useOverlay\";\n\nexport type OverlayProps = UseOverlayOptions;\n\n/**\n * Declarative overlay management as a child of `<KLineChart>`.\n * Renders nothing — purely manages the overlay lifecycle.\n *\n * @example\n * ```tsx\n * <KLineChart data={data}>\n *   <KLineChart.Overlay value=\"segment\" />\n *   <KLineChart.Overlay value={{ name: \"priceLine\", points: [{ value: 100 }] }} />\n * </KLineChart>\n * ```\n */\nexport function Overlay(props: OverlayProps): null {\n  useOverlay(props);\n  return null;\n}\n\nOverlay.displayName = \"KLineChart.Overlay\";\n","import { useState, useEffect, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { DomPosition } from \"klinecharts\";\nimport { useKLineChart } from \"../hooks/useKLineChart\";\n\nexport interface WidgetProps {\n  paneId?: string;\n  position?: DomPosition;\n  children?: ReactNode;\n}\n\n/**\n * A declarative component that injects React elements into specific chart DOM\n * layers using portals. Uses `chart.getDom(paneId, position)` under the hood.\n *\n * If the target DOM node does not exist yet (e.g. an indicator pane that has\n * not been laid out), the component retries on the next animation frame until\n * it resolves the node, then renders its children into it via a portal.\n */\nexport function Widget({ paneId, position = \"main\", children }: WidgetProps) {\n  const chart = useKLineChart();\n  const [targetDom, setTargetDom] = useState<HTMLElement | null>(null);\n\n  useEffect(() => {\n    if (!chart) {\n      setTargetDom(null);\n      return;\n    }\n\n    let rafId: number | null = null;\n    let cancelled = false;\n\n    const resolve = () => {\n      if (cancelled) return;\n      const dom = chart.getDom(paneId, position);\n      if (dom) {\n        setTargetDom(dom);\n      } else {\n        // The pane may not be laid out yet (e.g. an indicator pane that is\n        // created after this effect runs). Retry on the next frame.\n        rafId = requestAnimationFrame(resolve);\n      }\n    };\n\n    resolve();\n\n    return () => {\n      cancelled = true;\n      if (rafId !== null) cancelAnimationFrame(rafId);\n    };\n  }, [chart, paneId, position]);\n\n  if (!targetDom || !children) {\n    return null;\n  }\n\n  return createPortal(children, targetDom);\n}\n","import { useEffect, useId, useRef } from \"react\";\nimport type { YAxisOverride, Nullable } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\n\nexport interface UseYAxisOptions {\n  /**\n   * Y axis configuration. `createYAxis` in KLineCharts v10 is idempotent: if a\n   * Y axis with the same `id` already exists on the pane, the call is a no-op.\n   */\n  value: YAxisOverride;\n}\n\n/**\n * Manages the lifecycle of a standalone Y axis.\n *\n * KLineCharts v10 introduced explicit multi-YAxis support. This hook creates a\n * Y axis on mount, overrides its config when `value` changes, and removes it on\n * unmount. The axis is identified by a stable `useId()`-generated id so cleanup\n * always targets exactly the axis it created.\n *\n * @returns The Y axis id, or `null`.\n */\nexport function useYAxis(options: UseYAxisOptions): Nullable<string> {\n  const chart = useKLineChart();\n  const yAxisIdRef = useRef<Nullable<string>>(null);\n  const { value } = options;\n\n  // Stable unique ID per component instance — survives re-renders,\n  // guarantees cleanup removes exactly the Y axis we created.\n  const yAxisId = useId();\n\n  // Serialize value for dependency comparison. paneId/name are the base\n  // identity: changing them recreates the axis (klinecharts cannot reassign an\n  // existing axis to a different pane).\n  const valueKey = JSON.stringify(value);\n  const paneIdKey = value.paneId ?? \"\";\n  const nameKey = value.name ?? \"\";\n\n  useEffect(() => {\n    if (!chart) return;\n\n    yAxisIdRef.current = chart.createYAxis({ ...value, id: yAxisId });\n\n    return () => {\n      chart.removeYAxis({ id: yAxisId });\n      yAxisIdRef.current = null;\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, yAxisId, paneIdKey, nameKey]);\n\n  // Override the Y axis config when `value` changes.\n  // Skip the first run: the create-effect above already applied the value.\n  const firstOverrideRef = useRef(true);\n  useEffect(() => {\n    if (!chart) return;\n    if (firstOverrideRef.current) {\n      firstOverrideRef.current = false;\n      return;\n    }\n    chart.overrideYAxis({ ...value, id: yAxisId });\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, valueKey, yAxisId]);\n\n  return yAxisIdRef.current;\n}\n","import { useYAxis } from \"../hooks/useYAxis\";\nimport type { UseYAxisOptions } from \"../hooks/useYAxis\";\n\nexport type YAxisProps = UseYAxisOptions;\n\n/**\n * Declarative Y axis management as a child of `<KLineChart>`.\n * Renders nothing — purely manages the Y axis lifecycle.\n *\n * KLineCharts v10 supports multiple Y axes per pane. Use this to add an extra\n * axis to a pane (e.g. a secondary price scale on an indicator pane).\n *\n * @example\n * ```tsx\n * <KLineChart data={data}>\n *   <KLineChart.YAxis value={{ paneId: \"pane_indicator_1\", position: \"left\" }} />\n * </KLineChart>\n * ```\n */\nexport function YAxis(props: YAxisProps): null {\n  useYAxis(props);\n  return null;\n}\n\nYAxis.displayName = \"KLineChart.YAxis\";\n","import type { ActionCallback, ActionType, Chart } from \"klinecharts\";\n\n/**\n * Subscribes `handler` to the given chart action and returns a cleanup\n * function that unsubscribes it. Returns a no-op when `chart` is null.\n *\n * The handler is invoked through a stable wrapper so callers can pass a\n * ref-stored callback without re-subscribing on every render.\n */\nexport function subscribeChartAction(\n  chart: Chart | null,\n  type: ActionType,\n  handler: ActionCallback\n): () => void {\n  if (!chart) return () => {};\n  chart.subscribeAction(type, handler);\n  return () => {\n    chart.unsubscribeAction(type, handler);\n  };\n}\n","import { forwardRef, useEffect, useRef, useState, type Ref } from \"react\";\nimport {\n  init,\n  dispose,\n  type ActionCallback,\n  type Chart,\n  type ActionType,\n} from \"klinecharts\";\n\nimport { KLineChartContext } from \"./KLineChartContext\";\nimport { Indicator } from \"./components/Indicator\";\nimport { Overlay } from \"./components/Overlay\";\nimport { Widget } from \"./components/Widget\";\nimport { YAxis } from \"./components/YAxis\";\nimport { subscribeChartAction } from \"./subscribeChartAction\";\nimport type { ActionPayloadMap } from \"./events\";\nimport type { KLineChartProps } from \"./types\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction updateForwardedRef(ref: Ref<Chart> | undefined, chart: Chart | null) {\n  if (!ref) return;\n  if (typeof ref === \"function\") {\n    ref(chart);\n  } else {\n    (ref as React.MutableRefObject<Chart | null>).current = chart;\n  }\n}\n\n/**\n * Subscribes to a chart action using a stable handler.\n * The latest callback is always read from a ref to avoid re-subscribing on\n * every render.\n */\nfunction useActionSubscription<T extends ActionType>(\n  chart: Chart | null,\n  actionType: T,\n  callback: ((data: ActionPayloadMap[T]) => void) | undefined\n) {\n  const callbackRef = useRef(callback);\n  callbackRef.current = callback;\n\n  useEffect(() => {\n    if (!chart) return;\n\n    const handler: ActionCallback = (data) => {\n      // klinecharts emits payloads of type ActionPayloadMap[T]; cast back\n      // from the loose `unknown` the ActionCallback signature uses.\n      callbackRef.current?.(data as ActionPayloadMap[T]);\n    };\n\n    return subscribeChartAction(chart, actionType, handler);\n  }, [chart, actionType]);\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nconst KLineChartInner = forwardRef<Chart, KLineChartProps>(\n  (\n    {\n      // Init-only\n      options,\n\n      // Data\n      data,\n      dataLoader,\n      symbol,\n      period,\n\n      // Reactive\n      styles,\n      locale,\n      timezone,\n      formatter,\n      thousandsSeparator,\n      decimalFold,\n      zoomEnabled,\n      scrollEnabled,\n      zoomAnchor,\n      offsetRightDistance,\n      maxOffsetLeftDistance,\n      maxOffsetRightDistance,\n      leftMinVisibleBarCount,\n      rightMinVisibleBarCount,\n      barSpace,\n      hotkey,\n      layoutOptions,\n      xAxis,\n      yAxis,\n\n      // Events\n      onReady,\n      onZoom,\n      onChartScroll,\n      onVisibleRangeChange,\n      onCrosshairChange,\n      onCandleBarClick,\n      onPaneDrag,\n      onCandleTooltipFeatureClick,\n      onIndicatorTooltipFeatureClick,\n      onCrosshairFeatureClick,\n\n      // Children (sub-components)\n      children,\n\n      // HTML div passthrough\n      ...divProps\n    },\n    ref\n  ) => {\n    const chartRef = useRef<Chart | null>(null);\n    const containerRef = useRef<HTMLDivElement>(null);\n    const [chart, setChart] = useState<Chart | null>(null);\n\n    // Keep a stable ref to onReady so we don't re-trigger init\n    const onReadyRef = useRef(onReady);\n    onReadyRef.current = onReady;\n\n    // ---- Initialization (mount-only, StrictMode-safe) ----\n    // In React 18+ StrictMode (dev), React runs the effect, then its cleanup,\n    // then the effect again. Because the cleanup below disposes the chart and\n    // nulls chartRef, the second run always starts from a clean state, so no\n    // explicit \"dispose previous\" guard is needed here.\n    useEffect(() => {\n      const container = containerRef.current;\n      if (!container) return;\n\n      const instance = init(container, options);\n      if (!instance) return;\n\n      chartRef.current = instance;\n      setChart(instance);\n      updateForwardedRef(ref, instance);\n      onReadyRef.current?.(instance);\n\n      return () => {\n        dispose(container);\n        chartRef.current = null;\n        setChart(null);\n        updateForwardedRef(ref, null);\n      };\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, []);\n\n    // ---- Ref sync ----\n    useEffect(() => {\n      updateForwardedRef(ref, chartRef.current);\n    }, [ref]);\n\n    // ---- Data ----\n    // Symbol and period use serialized keys instead of object references\n    // to avoid unnecessary data reloads when consumers pass inline objects.\n    const symbolKey = symbol ? JSON.stringify(symbol) : \"\";\n    const periodKey = period ? JSON.stringify(period) : \"\";\n\n    useEffect(() => {\n      if (!chart) return;\n      if (dataLoader) {\n        // When a real loader is supplied, let klinecharts own the data flow.\n        chart.setDataLoader(dataLoader);\n      } else if (data) {\n        // Wrap the static array in a minimal loader. `more: { forward: false }`\n        // tells klinecharts there is no older history to load on scroll-left.\n        chart.setDataLoader({\n          getBars: ({ callback }) => {\n            callback(data, { forward: false, backward: false });\n          },\n        });\n      }\n    }, [chart, data, dataLoader]);\n\n    useEffect(() => {\n      if (!chart || !symbol) return;\n      chart.setSymbol(symbol);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [chart, symbolKey]);\n\n    useEffect(() => {\n      if (!chart || !period) return;\n      chart.setPeriod(period);\n      // eslint-disable-next-line react-hooks/exhaustive-deps\n    }, [chart, periodKey]);\n\n    // ---- Reactive props ----\n    useEffect(() => {\n      if (!chart || styles === undefined) return;\n      chart.setStyles(styles);\n    }, [chart, styles]);\n\n    useEffect(() => {\n      if (!chart || locale === undefined) return;\n      chart.setLocale(locale);\n    }, [chart, locale]);\n\n    useEffect(() => {\n      if (!chart || timezone === undefined) return;\n      chart.setTimezone(timezone);\n    }, [chart, timezone]);\n\n    useEffect(() => {\n      if (!chart || formatter === undefined) return;\n      chart.setFormatter(formatter);\n    }, [chart, formatter]);\n\n    useEffect(() => {\n      if (!chart || thousandsSeparator === undefined) return;\n      chart.setThousandsSeparator(thousandsSeparator);\n    }, [chart, thousandsSeparator]);\n\n    useEffect(() => {\n      if (!chart || decimalFold === undefined) return;\n      chart.setDecimalFold(decimalFold);\n    }, [chart, decimalFold]);\n\n    useEffect(() => {\n      if (!chart || zoomEnabled === undefined) return;\n      chart.setZoomEnabled(zoomEnabled);\n    }, [chart, zoomEnabled]);\n\n    useEffect(() => {\n      if (!chart || scrollEnabled === undefined) return;\n      chart.setScrollEnabled(scrollEnabled);\n    }, [chart, scrollEnabled]);\n\n    useEffect(() => {\n      // Pass-through: klinecharts' setZoomAnchor already accepts both the\n      // string form and the partial object form, so do not impose defaults.\n      if (!chart || zoomAnchor === undefined) return;\n      chart.setZoomAnchor(zoomAnchor);\n    }, [chart, zoomAnchor]);\n\n    useEffect(() => {\n      if (!chart || offsetRightDistance === undefined) return;\n      chart.setOffsetRightDistance(offsetRightDistance);\n    }, [chart, offsetRightDistance]);\n\n    useEffect(() => {\n      if (!chart || maxOffsetLeftDistance === undefined) return;\n      chart.setMaxOffsetLeftDistance(maxOffsetLeftDistance);\n    }, [chart, maxOffsetLeftDistance]);\n\n    useEffect(() => {\n      if (!chart || maxOffsetRightDistance === undefined) return;\n      chart.setMaxOffsetRightDistance(maxOffsetRightDistance);\n    }, [chart, maxOffsetRightDistance]);\n\n    useEffect(() => {\n      if (!chart || leftMinVisibleBarCount === undefined) return;\n      chart.setLeftMinVisibleBarCount(leftMinVisibleBarCount);\n    }, [chart, leftMinVisibleBarCount]);\n\n    useEffect(() => {\n      if (!chart || rightMinVisibleBarCount === undefined) return;\n      chart.setRightMinVisibleBarCount(rightMinVisibleBarCount);\n    }, [chart, rightMinVisibleBarCount]);\n\n    useEffect(() => {\n      if (!chart || barSpace === undefined) return;\n      chart.setBarSpace(barSpace);\n    }, [chart, barSpace]);\n\n    useEffect(() => {\n      if (!chart || hotkey === undefined) return;\n      chart.setHotkey(hotkey);\n    }, [chart, hotkey]);\n\n    useEffect(() => {\n      if (!chart || layoutOptions === undefined) return;\n      chart.setLayoutOptions(layoutOptions);\n    }, [chart, layoutOptions]);\n\n    useEffect(() => {\n      if (!chart || xAxis === undefined) return;\n      chart.overrideXAxis(xAxis);\n    }, [chart, xAxis]);\n\n    useEffect(() => {\n      if (!chart || yAxis === undefined) return;\n      chart.overrideYAxis(yAxis);\n    }, [chart, yAxis]);\n\n    // ---- Event subscriptions ----\n    useActionSubscription(chart, \"onZoom\", onZoom);\n    useActionSubscription(chart, \"onScroll\", onChartScroll);\n    useActionSubscription(chart, \"onVisibleRangeChange\", onVisibleRangeChange);\n    useActionSubscription(chart, \"onCrosshairChange\", onCrosshairChange);\n    useActionSubscription(chart, \"onCandleBarClick\", onCandleBarClick);\n    useActionSubscription(chart, \"onPaneDrag\", onPaneDrag);\n    useActionSubscription(\n      chart,\n      \"onCandleTooltipFeatureClick\",\n      onCandleTooltipFeatureClick\n    );\n    useActionSubscription(\n      chart,\n      \"onIndicatorTooltipFeatureClick\",\n      onIndicatorTooltipFeatureClick\n    );\n    useActionSubscription(\n      chart,\n      \"onCrosshairFeatureClick\",\n      onCrosshairFeatureClick\n    );\n\n    // ---- Render ----\n    return (\n      <KLineChartContext.Provider value={{ chart }}>\n        <div {...divProps} ref={containerRef} />\n        {!!chart && children}\n      </KLineChartContext.Provider>\n    );\n  }\n);\n\nKLineChartInner.displayName = \"KLineChart\";\n\n// Attach sub-components as static properties\nexport const KLineChart = Object.assign(KLineChartInner, {\n  Indicator,\n  Overlay,\n  Widget,\n  YAxis,\n});\n","import { useEffect, useRef } from \"react\";\nimport type { ActionCallback, ActionType } from \"klinecharts\";\nimport type { ActionPayloadMap, TypedActionCallback } from \"../events\";\nimport { useKLineChart } from \"./useKLineChart\";\n\n/**\n * Subscribe to a chart action event.\n * Uses a stable ref-based handler to avoid re-subscribing when the callback\n * identity changes between renders.\n *\n * The callback is strongly typed based on the action type, so e.g.\n * `useChartEvent(\"onCrosshairChange\", (crosshair) => ...)` receives a\n * {@link Crosshair} instead of `unknown`.\n *\n * @example\n * ```ts\n * useChartEvent(\"onCrosshairChange\", (crosshair) => {\n *   console.log(crosshair.x, crosshair.y);\n * });\n * ```\n */\nexport function useChartEvent<T extends ActionType>(\n  type: T,\n  callback: TypedActionCallback<T>\n): void {\n  const chart = useKLineChart();\n  const callbackRef = useRef<ActionCallback | undefined>(undefined);\n  // Keep the ref pointing at the latest callback without changing its\n  // identity in a way that would re-trigger the subscription effect.\n  callbackRef.current = callback as ActionCallback;\n\n  useEffect(() => {\n    if (!chart) return;\n\n    const handler: ActionCallback = (data) => {\n      callbackRef.current?.(data);\n    };\n\n    chart.subscribeAction(type, handler);\n    return () => {\n      chart.unsubscribeAction(type, handler);\n    };\n  }, [chart, type]);\n}\n\nexport type { ActionPayloadMap };\n","import { useState } from \"react\";\nimport type { Crosshair } from \"klinecharts\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Tracks the current crosshair state.\n *\n * Returns the latest `Crosshair` (which may be `null` when the crosshair\n * leaves the chart) and re-renders the host component whenever it changes.\n *\n * @example\n * ```tsx\n * function CrosshairInfo() {\n *   const crosshair = useCrosshair();\n *   if (!crosshair?.kLineData) return <span>Hover the chart</span>;\n *   return <span>{crosshair.kLineData.close}</span>;\n * }\n * ```\n */\nexport function useCrosshair(): Crosshair | null {\n  const [crosshair, setCrosshair] = useState<Crosshair | null>(null);\n  useChartEvent(\"onCrosshairChange\", (data) => {\n    // klinecharts emits the chart's crosshair (which is null when the\n    // pointer leaves the pane), so reflect that directly.\n    setCrosshair(data as Crosshair);\n  });\n  return crosshair;\n}\n","import { useEffect, useState } from \"react\";\nimport type { VisibleRange } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Tracks the currently visible data range.\n *\n * Re-renders the host component whenever the visible range changes\n * (zoom, scroll, data load, etc.). Returns `null` before the chart has\n * laid out for the first time.\n *\n * @example\n * ```tsx\n * function RangeInfo() {\n *   const range = useVisibleRange();\n *   return <span>{range ? `${range.from}..${range.to}` : \"—\"}</span>;\n * }\n * ```\n */\nexport function useVisibleRange(): VisibleRange | null {\n  const chart = useKLineChart();\n  const [range, setRange] = useState<VisibleRange | null>(null);\n\n  // Seed from the current chart whenever the chart instance changes.\n  useEffect(() => {\n    setRange(chart?.getVisibleRange() ?? null);\n  }, [chart]);\n\n  useChartEvent(\"onVisibleRangeChange\", (data) => {\n    setRange(data as VisibleRange);\n  });\n\n  return range;\n}\n","import { useEffect, useState } from \"react\";\nimport type { BarSpace } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Tracks the current bar spacing.\n *\n * klinecharts does not emit a dedicated \"bar space changed\" action, so this\n * hook recomputes on every visible-range change (which is fired on zoom,\n * resize, and data load — i.e. exactly when bar space can change) and on\n * chart instance change.\n *\n * @example\n * ```tsx\n * function BarSpaceInfo() {\n *   const bs = useBarSpace();\n *   return <span>{bs ? `${bs.bar}px / bar` : \"—\"}</span>;\n * }\n * ```\n */\nexport function useBarSpace(): BarSpace | null {\n  const chart = useKLineChart();\n  const [barSpace, setBarSpace] = useState<BarSpace | null>(null);\n\n  useEffect(() => {\n    setBarSpace(chart?.getBarSpace() ?? null);\n  }, [chart]);\n\n  useChartEvent(\"onVisibleRangeChange\", () => {\n    setBarSpace(chart?.getBarSpace() ?? null);\n  });\n\n  return barSpace;\n}\n","import { useEffect, useState } from \"react\";\nimport type { KLineData } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Tracks the chart's full data list.\n *\n * Re-renders the host component whenever the data changes (initial load,\n * scroll-back pagination, realtime update). Returns `null` before the chart\n * has been initialized. The returned array is a snapshot reference; mutating\n * it has no effect on the chart.\n *\n * @example\n * ```tsx\n * function LastClose() {\n *   const list = useDataList();\n *   const last = list?.[list.length - 1];\n *   return <span>{last ? last.close : \"—\"}</span>;\n * }\n * ```\n */\nexport function useDataList(): KLineData[] | null {\n  const chart = useKLineChart();\n  const [dataList, setDataList] = useState<KLineData[] | null>(null);\n\n  useEffect(() => {\n    setDataList(chart ? chart.getDataList() : null);\n  }, [chart]);\n\n  // klinecharts fires onVisibleRangeChange after data mutations, so it is a\n  // reliable signal that the data list reference may have changed.\n  useChartEvent(\"onVisibleRangeChange\", () => {\n    setDataList(chart ? chart.getDataList() : null);\n  });\n\n  return dataList;\n}\n","import { useEffect, useState } from \"react\";\nimport type { Nullable, PaneOptions } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Reads pane options from the chart.\n *\n * - If `id` is provided, returns the options for that pane (or `null` if it\n *   does not exist).\n * - Otherwise returns the array of all pane options.\n *\n * The hook re-reads on chart instance change and on visible-range change\n * (which is emitted whenever layout-affecting operations complete).\n *\n * @example\n * ```tsx\n * function PaneHeights() {\n *   const panes = usePane();\n *   // panes is PaneOptions[]\n * }\n *\n * function CandlePaneHeight() {\n *   const opts = usePane(\"candle\");\n *   return <span>{opts?.height ?? \"auto\"}</span>;\n * }\n * ```\n */\nexport function usePane(): PaneOptions[];\nexport function usePane(id: string): Nullable<PaneOptions>;\nexport function usePane(id?: string): Nullable<PaneOptions> | PaneOptions[] {\n  const chart = useKLineChart();\n  const [value, setValue] = useState<Nullable<PaneOptions> | PaneOptions[]>(\n    id == null ? [] : null\n  );\n\n  useEffect(() => {\n    if (!chart) {\n      setValue(id == null ? [] : null);\n      return;\n    }\n    setValue(chart.getPaneOptions(id));\n  }, [chart, id]);\n\n  useChartEvent(\"onVisibleRangeChange\", () => {\n    if (!chart) return;\n    setValue(chart.getPaneOptions(id));\n  });\n\n  return value;\n}\n","import { useEffect, useState } from \"react\";\nimport type { YAxis, YAxisFilter } from \"klinecharts\";\nimport { useKLineChart } from \"./useKLineChart\";\nimport { useChartEvent } from \"./useChartEvent\";\n\n/**\n * Tracks the chart's Y axes.\n *\n * Reads `chart.getYAxes(filter)` and re-reads on visible-range change (which\n * fires after axis-affecting operations such as indicator creation, axis\n * override, and layout). Returns an empty array before the chart initializes.\n *\n * @example\n * ```tsx\n * function AxisList() {\n *   const axes = useYAxes({ paneId: \"candle\" });\n *   return <span>{axes.map((a) => a.id).join(\", \")}</span>;\n * }\n * ```\n */\nexport function useYAxes(filter?: YAxisFilter): YAxis[] {\n  const chart = useKLineChart();\n  const [axes, setAxes] = useState<YAxis[]>([]);\n\n  const filterKey = filter ? JSON.stringify(filter) : \"\";\n\n  useEffect(() => {\n    if (!chart) {\n      setAxes([]);\n      return;\n    }\n    setAxes(chart.getYAxes(filter ?? {}));\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [chart, filterKey]);\n\n  useChartEvent(\"onVisibleRangeChange\", () => {\n    if (!chart) return;\n    setAxes(chart.getYAxes(filter ?? {}));\n  });\n\n  return axes;\n}\n"]}