npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

react-klinecharts

v0.1.0

Published

A flexible React wrapper for KlineCharts with hooks, declarative sub-components, and full TypeScript support

Readme

react-klinecharts

A flexible React wrapper for KlineCharts with hooks, declarative sub-components, and full TypeScript support.

Live Demo

  • Declarative props for all reactive chart settings
  • <KLineChart.Indicator> and <KLineChart.Overlay> sub-components
  • useKLineChart, useIndicator, useOverlay, useChartEvent hooks
  • Full imperative access via ref
  • Re-exports all klinecharts types and utilities
  • Zero extra dependencies (native ResizeObserver)

Installation

pnpm add react-klinecharts
# or
npm install react-klinecharts

Peer dependencies: react >= 17, react-dom >= 17.

Quick Start

import { KLineChart, type Chart } from "react-klinecharts";
import { useRef } from "react";

function App() {
  const chartRef = useRef<Chart>(null);

  const data = [
    { timestamp: 1680000000000, open: 28000, high: 28500, low: 27800, close: 28200, volume: 100 },
    // ...
  ]

  return (
    <KLineChart
      ref={chartRef}
      data={data}
      symbol={{ ticker: "BTC/USDT" }}
      period={{ type: "minute", span: 15 }}
      style={{ width: "100%", height: 600 }}
    >
      <KLineChart.Indicator value={{ name: "MA", calcParams: [5, 10, 30] }} />
      <KLineChart.Indicator value="VOL" paneOptions={{ height: 80 }} />
    </KLineChart>
  );
}

API Reference

<KLineChart>

The core component. Manages chart lifecycle, provides context for hooks and sub-components.

All standard HTML div attributes (className, style, id, etc.) are passed through to the container element.

Init-only Props

| Prop | Type | Description | |------|------|-------------| | options | Options | Chart initialization options. Applied once on mount. |

Data Props

| Prop | Type | Description | |------|------|-------------| | data | KLineData[] | Static data array to apply to the chart. | | dataLoader | DataLoader | Data loader with getBars, subscribeBar, unsubscribeBar. Calls setDataLoader. | | symbol | SymbolInfo | Symbol info (ticker, precision). Calls setSymbol. | | period | Period | Time period ({ type, span }). Calls setPeriod. |

Reactive Props

These props are synced to the chart instance via useEffect. Changing them updates the chart without re-initialization.

| Prop | Type | Chart Method | |------|------|-------------| | styles | string \| DeepPartial<Styles> | setStyles() | | locale | string | setLocale() | | timezone | string | setTimezone() | | formatter | Partial<Formatter> | setFormatter() | | thousandsSeparator | Partial<ThousandsSeparator> | setThousandsSeparator() | | decimalFold | Partial<DecimalFold> | setDecimalFold() | | zoomEnabled | boolean | setZoomEnabled() | | scrollEnabled | boolean | setScrollEnabled() | | zoomAnchor | ZoomAnchorType \| Partial<ZoomAnchor> | setZoomAnchor() | | offsetRightDistance | number | setOffsetRightDistance() | | maxOffsetLeftDistance | number | setMaxOffsetLeftDistance() | | maxOffsetRightDistance | number | setMaxOffsetRightDistance() | | leftMinVisibleBarCount | number | setLeftMinVisibleBarCount() | | rightMinVisibleBarCount | number | setRightMinVisibleBarCount() | | barSpace | number | setBarSpace() |

Event Callbacks

| Prop | Description | |------|-------------| | onReady | (chart: Chart) => void — fired after chart initialization | | onZoom | Chart zoom event | | onScroll | Chart scroll event | | onVisibleRangeChange | Visible data range changed | | onCrosshairChange | Crosshair position changed | | onCandleBarClick | Candle bar clicked | | onPaneDrag | Pane drag event | | onCandleTooltipFeatureClick | Candle tooltip feature clicked | | onIndicatorTooltipFeatureClick | Indicator tooltip feature clicked | | onCrosshairFeatureClick | Crosshair feature clicked |

<KLineChart.Indicator>

Declarative indicator management. Renders nothing — purely manages indicator lifecycle.

<KLineChart.Indicator
  value={{ name: "MA", calcParams: [5, 10, 30] }}
  isStack={false}
  paneOptions={{ height: 100 }}
/>

// Or simply by name:
<KLineChart.Indicator value="VOL" />

| Prop | Type | Description | |------|------|-------------| | value | string \| IndicatorCreate | Indicator name or full config | | isStack | boolean | Stack on existing indicators in same pane | | paneOptions | PaneOptions | Options for the indicator pane |

<KLineChart.Overlay>

Declarative overlay (drawing tool) management. Renders nothing — purely manages overlay lifecycle.

<KLineChart.Overlay
  value={{
    name: "segment",
    points: [
      { timestamp: 1234567890000, value: 100 },
      { timestamp: 1234567900000, value: 200 },
    ],
  }}
/>

| Prop | Type | Description | |------|------|-------------| | value | string \| OverlayCreate \| Array<string \| OverlayCreate> | Overlay config(s) |

<KLineChart.Widget>

Declarative portal component that injects standard HTML/React elements directly into the chart DOM utilizing createPortal and the native chart.getDom() method.

<KLineChart.Widget paneId="candle" position="main">
  <div className="custom-tooltip">My interactive React tooltip!</div>
</KLineChart.Widget>

| Prop | Type | Description | |------|------|-------------| | paneId | string | ID of the pane to inject into (e.g. "candle", "xAxis", or custom indicator pane IDs). If undefined, binds to root container. | | position | "root" \| "main" \| "yAxis" | Layer position relative to the pane. Default is "main". |

Hooks

useKLineChart()

Access the Chart instance from any descendant of <KLineChart>.

function MyComponent() {
  const chart = useKLineChart();
  // chart is Chart | null
  return <button onClick={() => chart?.scrollToRealTime()}>Go to now</button>;
}

useIndicator(options)

Manages indicator lifecycle. Creates on mount, removes on unmount, overrides on config change.

function MyIndicator() {
  const paneId = useIndicator({
    value: { name: "RSI", calcParams: [14] },
    paneOptions: { height: 80 },
  });
  return null;
}

useOverlay(options)

Manages overlay lifecycle. Creates on mount, removes on unmount, overrides on config change.

function MyOverlay() {
  const id = useOverlay({
    value: { name: "priceLine", points: [{ value: 50000 }] },
  });
  return null;
}

useChartEvent(type, callback)

Subscribe to chart action events with a stable ref-based handler.

function Logger() {
  useChartEvent("onCrosshairChange", (data) => {
    console.log("Crosshair:", data);
  });
  return null;
}

Available event types: "onZoom", "onScroll", "onVisibleRangeChange", "onCrosshairChange", "onCandleBarClick", "onPaneDrag", "onCandleTooltipFeatureClick", "onIndicatorTooltipFeatureClick", "onCrosshairFeatureClick".

Imperative API (ref)

For operations not covered by declarative props, use the Chart ref:

const chartRef = useRef<Chart>(null);

// Navigation
chartRef.current?.scrollToRealTime(300);
chartRef.current?.scrollToTimestamp(timestamp);
chartRef.current?.zoomAtCoordinate(1.5);

// Data queries
chartRef.current?.getDataList();
chartRef.current?.getVisibleRange();
chartRef.current?.getBarSpace();

// Coordinate conversion
chartRef.current?.convertToPixel(points, filter);
chartRef.current?.convertFromPixel(coordinates, filter);

// Export
chartRef.current?.getConvertPictureUrl(true, "png");

// DOM access
chartRef.current?.getDom(paneId, position);
chartRef.current?.getSize(paneId, position);

// Pane management
chartRef.current?.setPaneOptions(options);
chartRef.current?.getPaneOptions(id);

// Imperative indicator/overlay operations
chartRef.current?.createIndicator(value, isStack, paneOptions);
chartRef.current?.getIndicators(filter);
chartRef.current?.createOverlay(value);
chartRef.current?.getOverlays(filter);

See the full KlineCharts API documentation for all available methods.

Registration Functions

Module-level registration functions are re-exported from klinecharts:

import {
  registerIndicator,
  registerOverlay,
  registerFigure,
  registerLocale,
  registerStyles,
  registerXAxis,
  registerYAxis,
} from "react-klinecharts";

// Register a custom indicator
registerIndicator({
  name: "MyIndicator",
  calc: (dataList) => {
    return dataList.map((d) => ({ value: d.close }));
  },
  figures: [{ key: "value", title: "VAL: ", type: "line" }],
});

Type Re-exports

All klinecharts types are re-exported for convenience:

import type {
  Chart,
  KLineData,
  Styles,
  Options,
  Indicator,
  IndicatorCreate,
  Overlay,
  OverlayCreate,
  Crosshair,
  ActionType,
  ActionCallback,
  DataLoader,
  SymbolInfo,
  Period,
  // ... all klinecharts types
} from "react-klinecharts";

Examples

Custom Indicator with Hooks

function BollingerBands({ period = 20 }: { period?: number }) {
  useIndicator({
    value: { name: "BOLL", calcParams: [period, 2] },
  });
  return null;
}

function App() {
  const [period, setPeriod] = useState(20);

  return (
    <KLineChart dataLoader={loader} symbol={symbol} period={period_}>
      <BollingerBands period={period} />
    </KLineChart>
  );
}

Theming

<KLineChart
  dataLoader={loader}
  symbol={symbol}
  period={period}
  styles={{
    grid: { show: false },
    candle: {
      type: "area",
      area: {
        lineColor: "#2196F3",
        backgroundColor: [
          { offset: 0, color: "rgba(33, 150, 243, 0.3)" },
          { offset: 1, color: "rgba(33, 150, 243, 0)" },
        ],
      },
    },
  }}
/>

Custom Locale

import { registerLocale } from "react-klinecharts";

registerLocale("ru-RU", {
  time: "Время",
  open: "Откр.",
  high: "Макс.",
  low: "Мин.",
  close: "Закр.",
  volume: "Объём",
  change: "Изм.",
  turnover: "Оборот",
  second: "сек",
  minute: "мин",
  hour: "час",
  day: "дн",
  week: "нед",
  month: "мес",
  year: "год",
});

<KLineChart locale="ru-RU" ... />

Architecture

src/
  index.ts                    # Public API barrel export
  types.ts                    # React-specific types
  KLineChartContext.ts        # React context for chart instance
  KLineChart.tsx              # Core component
  hooks/
    useKLineChart.ts          # Context-based chart access
    useChartEvent.ts          # Event subscription hook
    useIndicator.ts           # Indicator lifecycle hook
    useOverlay.ts             # Overlay lifecycle hook
  components/
    Indicator.tsx             # <KLineChart.Indicator>
    Overlay.tsx               # <KLineChart.Overlay>

Design principles:

  • Thin wrapper — never re-implements what klinecharts already does
  • Reactive props drive useEffect calls to chart methods
  • Ref escape hatch exposes the full Chart instance for imperative operations
  • Context enables hooks and sub-components in descendants
  • Stable event subscriptions — callbacks stored in refs, no re-subscribe churn
  • Natural cleanup order — React unmounts children before parent, so indicators/overlays clean up before dispose()

Development

pnpm install
pnpm build          # Build library
pnpm dev            # Build in watch mode
pnpm typecheck      # TypeScript type check

# Run example
cd example
pnpm install
pnpm dev

License

MIT