From d913558c51b3c307211e98d13e99ec1c1b36bf2b Mon Sep 17 00:00:00 2001 From: Hunter Date: Wed, 11 Feb 2026 10:36:08 -0600 Subject: [PATCH 1/2] Update package dependencies and enhance documentation - Bump version from 0.1.0 to 0.1.1 in package.json and package-lock.json. - Replace deprecated `chartgpu` references with `@chartgpu/chartgpu` throughout the codebase. - Introduce new features in the ChartGPU component, including programmatic zoom control and improved event handling. - Update README and API documentation to reflect changes and provide clearer usage examples. - Add new assets for enhanced visual representation in documentation. --- README.md | 66 ++++++++++++------ docs/API.md | 32 +++++---- docs/api/chartgpu-component.md | 11 +-- docs/api/chartgpu-handle.md | 50 +++++++++++++- docs/api/hooks.md | 44 +++++++++--- docs/api/llm-context.md | 13 ++-- docs/assets/chartgpu.png | Bin 0 -> 112298 bytes docs/assets/powered-by-webgpu.svg | 1 + docs/recipes/chart-sync.md | 38 +++++++++-- docs/recipes/datazoom-basics.md | 5 +- examples/main.tsx | 2 +- package-lock.json | 20 +++--- package.json | 4 +- src/ChartGPU.tsx | 110 ++++++++++++++++++------------ src/ChartGPUChart.tsx | 2 +- src/createAnnotationAuthoring.ts | 2 +- src/index.ts | 42 +++++++++--- src/types.ts | 37 +++++++++- src/useChartGPU.ts | 4 +- src/useConnectCharts.ts | 53 ++++++++++---- vite.config.ts | 2 +- 21 files changed, 388 insertions(+), 150 deletions(-) create mode 100644 docs/assets/chartgpu.png create mode 100644 docs/assets/powered-by-webgpu.svg diff --git a/README.md b/README.md index 1d960ef..c6ae73f 100644 --- a/README.md +++ b/README.md @@ -1,30 +1,37 @@ -# chartgpu-react +

+ ChartGPU +

- React bindings for ChartGPU — WebGPU-powered charting for high-performance data visualization. + React bindings for ChartGPU — The fastest open-source charting library — 50M points at 60 FPS.

+[Powered by WebGPU](https://forthebadge.com) [![Documentation](https://img.shields.io/badge/Documentation-Getting%20Started-blue?style=for-the-badge)](https://github.com/chartgpu/chartgpu-react/blob/main/docs/GETTING_STARTED.md) [![API Reference](https://img.shields.io/badge/API-Reference-blue?style=for-the-badge)](https://github.com/chartgpu/chartgpu-react/blob/main/docs/API.md) [![Examples](https://img.shields.io/badge/Examples-Run%20Locally-blue?style=for-the-badge)](https://github.com/chartgpu/chartgpu-react/tree/main/examples) - [![npm version](https://img.shields.io/npm/v/chartgpu-react?style=for-the-badge&color=blue)](https://www.npmjs.com/package/chartgpu-react) [![NPM Downloads](https://img.shields.io/npm/dm/chartgpu-react?style=for-the-badge&color=%2368cc49)](https://www.npmjs.com/package/chartgpu-react) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=for-the-badge)](https://www.npmjs.com/package/chartgpu-react) +[Featured on Hacker News](https://news.ycombinator.com/item?id=46706528) + +[Featured in Awesome WebGPU](https://github.com/mikbry/awesome-webgpu) + +
-`chartgpu-react` is a **thin React + TypeScript wrapper** around the [`chartgpu`](https://www.npmjs.com/package/chartgpu) core library. +`chartgpu-react` is a **thin React + TypeScript wrapper** around the [`@chartgpu/chartgpu`](https://www.npmjs.com/package/@chartgpu/chartgpu) core library. ## Highlights - **`ChartGPU` component (recommended)**: async create/dispose lifecycle + debounced `ResizeObserver` sizing - **Event props**: `onClick`, `onCrosshairMove`, `onZoomChange`, etc. -- **Imperative `ref` API**: `ChartGPUHandle` (`getChart`, `getContainer`, `appendData`, `setOption`) -- **Hooks**: `useChartGPU(...)`, `useConnectCharts(...)` -- **Helper re-exports (from `chartgpu`)**: `createChart`, `connectCharts`, `createAnnotationAuthoring` +- **Imperative `ref` API**: `ChartGPUHandle` (`getChart`, `getContainer`, `appendData`, `setOption`, `setZoomRange`, `setInteractionX`, `getInteractionX`, `hitTest`) +- **Hooks**: `useChartGPU(...)`, `useConnectCharts(..., syncOptions?)` +- **Helper re-exports (from `@chartgpu/chartgpu`)**: `createChart`, `connectCharts`, `createAnnotationAuthoring` ## Quick start @@ -60,7 +67,7 @@ function MyChart() { ## Installation ```bash -npm install chartgpu-react chartgpu react react-dom +npm install chartgpu-react @chartgpu/chartgpu react react-dom ``` ### Requirements @@ -79,20 +86,20 @@ Check browser compatibility at [caniuse.com/webgpu](https://caniuse.com/webgpu). - lifecycle management (async create + dispose) - `ResizeObserver` resize (debounced) - event props: `onClick`, `onCrosshairMove`, `onZoomChange`, etc. - - imperative `ref` API: `ChartGPUHandle` (`getChart`, `getContainer`, `appendData`, `setOption`) + - imperative `ref` API: `ChartGPUHandle` (`getChart`, `getContainer`, `appendData`, `setOption`, `setZoomRange`, `setInteractionX`, `getInteractionX`, `hitTest`) - **Hooks** - `useChartGPU(containerRef, options)` — create/manage a chart instance - - `useConnectCharts([chartA, chartB, ...])` — sync crosshair/interaction-x across charts + - `useConnectCharts([chartA, chartB, ...], syncOptions?)` — sync crosshair/interaction-x (and optionally zoom) across charts - **Deprecated** - `ChartGPUChart` (legacy adapter; use `ChartGPU` instead) -- **Helper re-exports** (from peer dependency `chartgpu`) +- **Helper re-exports** (from peer dependency `@chartgpu/chartgpu`) - `createChart`, `connectCharts`, `createAnnotationAuthoring` For details, start with the [API reference](./docs/API.md). ## Feature snippets (ChartGPU core) -These snippets use helpers and events from the `chartgpu` core library (peer dependency of `chartgpu-react`). +These snippets use helpers and events from the `@chartgpu/chartgpu` core library (peer dependency of `chartgpu-react`). ### Crosshair / interaction X (`'crosshairMove'`) @@ -112,16 +119,19 @@ import type { ChartGPUCrosshairMovePayload } from 'chartgpu-react'; ### Connect charts (sync crosshair/tooltip) ```tsx -import { connectCharts } from 'chartgpu'; +import { connectCharts } from 'chartgpu-react'; // When you have two ChartGPUInstance objects: const disconnect = connectCharts([chartA, chartB]); +// With zoom sync: +// const disconnect = connectCharts([chartA, chartB], { syncZoom: true }); + // Later: disconnect(); ``` -If you prefer a hook-driven approach, you can use `onReady` (or `useChartGPU`) to capture instances, then call `connectCharts(...)` once both are available. +If you prefer a hook-driven approach, you can use `onReady` (or `useChartGPU`) to capture instances, then call `useConnectCharts(...)` once both are available. ### Annotation authoring UI (`createAnnotationAuthoring`) @@ -158,7 +168,7 @@ function AnnotationAuthoringExample() { import { useEffect, useRef } from 'react'; import { ChartGPU } from 'chartgpu-react'; import type { ChartGPUHandle, ChartGPUOptions } from 'chartgpu-react'; -import type { OHLCDataPoint } from 'chartgpu'; +import type { OHLCDataPoint } from 'chartgpu-react'; function CandlestickStreaming() { const ref = useRef(null); @@ -232,28 +242,28 @@ The dev server will start at `http://localhost:3000` and open the examples page ### Local development with linked ChartGPU -To develop `chartgpu-react` against a local version of the `chartgpu` package (useful for testing changes across both repositories): +To develop `chartgpu-react` against a local version of the `@chartgpu/chartgpu` package (useful for testing changes across both repositories): ```bash -# 1. Link the chartgpu package from the sibling repo +# 1. Link the @chartgpu/chartgpu package from the sibling repo cd ../chart-gpu npm link -# 2. Link chartgpu into this project +# 2. Link @chartgpu/chartgpu into this project cd ../chartgpu-react -npm link chartgpu +npm link @chartgpu/chartgpu # 3. Build and run - will use the linked local package npm run build npm run dev ``` -**Note:** After linking, `npm run build` and `npm run dev` will resolve imports to your local `chartgpu` package instead of the published version. This allows you to test changes in both repos simultaneously. +**Note:** After linking, `npm run build` and `npm run dev` will resolve imports to your local `@chartgpu/chartgpu` package instead of the published version. This allows you to test changes in both repos simultaneously. To unlink and return to the published package: ```bash -npm unlink chartgpu +npm unlink @chartgpu/chartgpu npm install ``` @@ -267,13 +277,25 @@ import type { ChartGPUOptions, ChartGPUEventPayload, ChartGPUCrosshairMovePayload, + ChartGPUZoomRangeChangePayload, + ChartGPUHitTestResult, + ChartGPUHitTestMatch, + ChartSyncOptions, AreaSeriesConfig, LineSeriesConfig, BarSeriesConfig, PieSeriesConfig, ScatterSeriesConfig, SeriesConfig, + LineStyleConfig, + AreaStyleConfig, DataPoint, + LegendConfig, + LegendPosition, + AnimationConfig, + TooltipConfig, + TooltipParams, + PerformanceMetrics, } from 'chartgpu-react'; ``` @@ -293,7 +315,7 @@ const checkSupport = async () => { ## Contributing -Issues and pull requests are welcome. If you’re planning a larger change, open an issue first so we can discuss direction. +Issues and pull requests are welcome. If you're planning a larger change, open an issue first so we can discuss direction. ## License diff --git a/docs/API.md b/docs/API.md index cf24e83..0be44cc 100644 --- a/docs/API.md +++ b/docs/API.md @@ -1,6 +1,6 @@ # API reference (chartgpu-react) -This package is a **React wrapper** around the `chartgpu` core library. Most runtime behavior lives in `chartgpu`; this repo primarily provides: +This package is a **React wrapper** around the `@chartgpu/chartgpu` core library. Most runtime behavior lives in `@chartgpu/chartgpu`; this repo primarily provides: - A React component (`ChartGPU`) with lifecycle + resize management - A small imperative ref API (`ChartGPUHandle`) @@ -19,11 +19,11 @@ For an LLM-oriented navigation entrypoint, see [`docs/api/llm-context.md`](./api ### Hooks - **`useChartGPU(containerRef, options)`** — create/manage an instance imperatively -- **`useConnectCharts([chartA, chartB, ...])`** — keep crosshair/interaction-x in sync +- **`useConnectCharts([chartA, chartB, ...], syncOptions?)`** — keep crosshair/interaction-x in sync (optionally sync zoom) See [`docs/api/hooks.md`](./api/hooks.md). -### Helper re-exports (from peer dependency `chartgpu`) +### Helper re-exports (from peer dependency `@chartgpu/chartgpu`) `chartgpu-react` exposes these helpers so you can often import everything from one package: @@ -31,8 +31,8 @@ See [`docs/api/hooks.md`](./api/hooks.md). - `connectCharts` - `createAnnotationAuthoring` -- `createChart` / `connectCharts` are re-exported directly from `chartgpu`. -- `createAnnotationAuthoring` is a thin wrapper around `chartgpu`’s helper that includes a small fix for `chartgpu@0.2.3`: the upstream authoring context menu hit-testing does not recognize `type: "text"` annotations, so **Edit** may not appear for text notes. +- `createChart` / `connectCharts` are re-exported directly from `@chartgpu/chartgpu`. +- `createAnnotationAuthoring` is a thin wrapper around `@chartgpu/chartgpu`'s helper that patches text-annotation context-menu hit-testing (broken in `chartgpu@0.2.3`). Upstream v0.2.5 fixes this natively; the wrapper is kept for API stability — the patch is harmless when running against v0.2.5+. ```ts import { connectCharts, createAnnotationAuthoring } from 'chartgpu-react'; @@ -56,13 +56,13 @@ From `src/types.ts`: - `ChartGPUProps` — props for the `ChartGPU` component - `ChartGPUHandle` — imperative ref API -- `ChartInstance` — alias for `chartgpu`’s `ChartGPUInstance` +- `ChartInstance` — alias for `@chartgpu/chartgpu`'s `ChartGPUInstance` - `ClickParams`, `MouseOverParams` — aliases for event payloads - `ZoomRange` — derived from `ChartGPUInstance['getZoomRange']` (non-null range) -### Re-exported core types (from peer dependency `chartgpu`) +### Re-exported core types (from peer dependency `@chartgpu/chartgpu`) -From `src/index.ts`, this package re-exports a curated set of `chartgpu` types so consumers can do: +From `src/index.ts`, this package re-exports a curated set of `@chartgpu/chartgpu` types so consumers can do: ```ts import type { ChartGPUOptions, ChartGPUInstance, DataPoint } from 'chartgpu-react'; @@ -71,11 +71,18 @@ import type { ChartGPUOptions, ChartGPUInstance, DataPoint } from 'chartgpu-reac Currently re-exported: - **Core**: `ChartGPUInstance`, `ChartGPUOptions` -- **Events**: `ChartGPUEventPayload`, `ChartGPUCrosshairMovePayload` +- **Events**: `ChartGPUEventPayload`, `ChartGPUCrosshairMovePayload`, `ChartGPUZoomRangeChangePayload` +- **Hit testing**: `ChartGPUHitTestResult`, `ChartGPUHitTestMatch` +- **Chart sync**: `ChartSyncOptions` - **Annotation authoring**: `AnnotationAuthoringInstance`, `AnnotationAuthoringOptions`, `AnnotationConfig` - **Series config**: `AreaSeriesConfig`, `LineSeriesConfig`, `BarSeriesConfig`, `PieSeriesConfig`, `ScatterSeriesConfig`, `CandlestickSeriesConfig`, `SeriesConfig` +- **Style config**: `LineStyleConfig`, `AreaStyleConfig` - **Data**: `DataPoint`, `OHLCDataPoint` - **Interaction/zoom**: `DataZoomConfig` +- **Legend**: `LegendConfig`, `LegendPosition` +- **Animation**: `AnimationConfig` +- **Tooltip**: `TooltipConfig`, `TooltipParams` +- **Performance**: `PerformanceMetrics` - **Themes**: `ThemeConfig`, `ThemeName` - **Layout**: `AxisConfig`, `GridConfig` @@ -109,10 +116,10 @@ See [`useChartGPU` docs](./api/hooks.md#usechartgpu). ### 4) Connecting charts (`useConnectCharts` / `connectCharts`) -To sync crosshair / interaction-x across multiple charts, use: +To sync crosshair / interaction-x (and optionally zoom) across multiple charts, use: -- `useConnectCharts([chartA, chartB, ...])` (React-friendly) -- or `connectCharts([chartA, chartB, ...])` (manual) +- `useConnectCharts([chartA, chartB, ...], syncOptions?)` (React-friendly) +- or `connectCharts([chartA, chartB, ...], syncOptions?)` (manual) See [Chart sync recipe](./recipes/chart-sync.md). @@ -126,4 +133,3 @@ Step-by-step guides for common use cases: - [Streaming](./recipes/streaming.md) — realtime data updates with `appendData` - [dataZoom basics](./recipes/datazoom-basics.md) — zoom and pan with `dataZoom` + `onZoomChange` - [Scatter density](./recipes/scatter-density.md) — density heatmaps for large scatter datasets - diff --git a/docs/api/chartgpu-component.md b/docs/api/chartgpu-component.md index b855da7..db388a9 100644 --- a/docs/api/chartgpu-component.md +++ b/docs/api/chartgpu-component.md @@ -31,7 +31,7 @@ The props type is `ChartGPUProps` (defined in `src/types.ts`). | `onMouseOver` | `(payload: ChartGPUEventPayload) => void` | | Wires to `chart.on('mouseover', ...)`. | | `onMouseOut` | `(payload: ChartGPUEventPayload) => void` | | Wires to `chart.on('mouseout', ...)`. | | `onCrosshairMove` | `(payload: ChartGPUCrosshairMovePayload) => void` | | Wires to `chart.on('crosshairMove', ...)`. | -| `onZoomChange` | `(range: ZoomRange) => void` | | Fires when `chart.getZoomRange()` changes (polled every 100ms). | +| `onZoomChange` | `(range: ZoomRange) => void` | | Fires on `zoomRangeChange` event. Also emits the current range once on subscribe (initial hydration). | ## Imperative ref (`ChartGPUHandle`) @@ -41,6 +41,10 @@ The props type is `ChartGPUProps` (defined in `src/types.ts`). - `getContainer()` - `appendData(seriesIndex, newPoints)` - `setOption(options)` +- `setZoomRange(start, end)` +- `setInteractionX(x, source?)` +- `getInteractionX()` +- `hitTest(e)` — note: React synthetic events require `e.nativeEvent` See [`ChartGPUHandle`](./chartgpu-handle.md). @@ -80,10 +84,9 @@ Resize calls are debounced (100ms). ### Zoom change events -If you provide `onZoomChange`, the component polls `chart.getZoomRange()` every 100ms and fires the callback when: +If you provide `onZoomChange`, the component subscribes to the upstream `zoomRangeChange` event and fires the callback whenever the zoom range changes. -- the zoom range transitions from `null` → non-null, or -- `start`/`end` values change. +On subscribe, the component also reads the current zoom range via `getZoomRange()` and fires `onZoomChange` once if the range is non-null. This ensures consumers can hydrate UI state without waiting for user interaction. If zoom is disabled (`null`), no callback is fired. diff --git a/docs/api/chartgpu-handle.md b/docs/api/chartgpu-handle.md index b54a2e6..f1ee9fa 100644 --- a/docs/api/chartgpu-handle.md +++ b/docs/api/chartgpu-handle.md @@ -6,12 +6,16 @@ - accessing the container element - streaming/append updates (`appendData`) - replacing options (`setOption`) +- programmatic zoom control (`setZoomRange`) +- programmatic crosshair/tooltip (`setInteractionX`, `getInteractionX`) +- hit testing (`hitTest`) Related: - [`ChartGPU` component](./chartgpu-component.md) - [Streaming recipe](../recipes/streaming.md) - [Annotation authoring recipe](../recipes/annotation-authoring.md) +- [dataZoom basics](../recipes/datazoom-basics.md) - LLM entrypoint: [`llm-context.md`](./llm-context.md) ## Import @@ -25,7 +29,7 @@ import type { ChartGPUHandle } from 'chartgpu-react'; ### `getChart(): ChartGPUInstance | null` -Returns the underlying `chartgpu` instance once initialized, otherwise `null`. +Returns the underlying `@chartgpu/chartgpu` instance once initialized, otherwise `null`. Notes: @@ -53,6 +57,49 @@ Replaces the chart options, delegating to `ChartGPUInstance.setOption(options)`. Important: `setOption` is treated as a **full replacement**, not a partial merge. +### `setZoomRange(start: number, end: number): void` + +Programmatically sets the zoom range in percent-space. + +- **`start`**: start of zoom range (0–100). +- **`end`**: end of zoom range (0–100). + +No-op when zoom is disabled on the chart (i.e. no `dataZoom` configured). + +### `setInteractionX(x: number | null, source?: unknown): void` + +Programmatically drives the crosshair / tooltip to a domain-space x value. Pass `null` to clear the crosshair. + +- **`x`**: domain-space x value, or `null` to clear. +- **`source`** (optional): source identifier, useful for sync disambiguation (e.g. avoiding echo loops with `connectCharts`). + +### `getInteractionX(): number | null` + +Reads the current crosshair / interaction x in domain units. Returns `null` when the crosshair is inactive. + +### `hitTest(e: PointerEvent | MouseEvent): ChartGPUHitTestResult` + +Performs hit-testing on a pointer or mouse event. Returns coordinates and any matched chart element. + +- **`e`**: a native `PointerEvent` or `MouseEvent` from the chart container. +- **Returns**: `ChartGPUHitTestResult` with pixel coordinates, domain-space coordinates, and an optional match object. +- If the chart is not initialized or disposed, returns a sentinel with `isInGrid: false` and `NaN` coordinates. + +**React ergonomics note**: React synthetic events (`React.PointerEvent`, `React.MouseEvent`) are not the same as native DOM events. Pass `e.nativeEvent` instead: + +```tsx +
{ + const result = chartRef.current?.hitTest(e.nativeEvent); + // ... +}} /> +``` + +Import the result type if needed: + +```ts +import type { ChartGPUHitTestResult } from 'chartgpu-react'; +``` + ## Example: streaming with `appendData` ```tsx @@ -98,4 +145,3 @@ export function StreamingCandles() { return ; } ``` - diff --git a/docs/api/hooks.md b/docs/api/hooks.md index a168259..cb8cf3e 100644 --- a/docs/api/hooks.md +++ b/docs/api/hooks.md @@ -3,7 +3,7 @@ This package provides two hooks: - `useChartGPU(containerRef, options)` — create/manage a `ChartGPUInstance` -- `useConnectCharts(charts)` — connect instances for synced crosshair/interaction-x +- `useConnectCharts(charts, syncOptions?)` — connect instances for synced crosshair/interaction-x (and optionally zoom) Related: @@ -13,7 +13,7 @@ Related: ## `useChartGPU(containerRef, options)` -Creates a `chartgpu` chart instance inside a DOM element that you control. +Creates a `@chartgpu/chartgpu` chart instance inside a DOM element that you control. ### Import @@ -81,9 +81,9 @@ export function HookChart() { } ``` -## `useConnectCharts(charts)` +## `useConnectCharts(charts, syncOptions?)` -Connects multiple `ChartGPUInstance`s so they share interaction state (crosshair/tooltip x). +Connects multiple `ChartGPUInstance`s so they share interaction state (crosshair/tooltip x). Optionally syncs zoom/pan across charts. This hook is a React-friendly wrapper around the upstream helper `connectCharts(...)`. @@ -91,26 +91,41 @@ This hook is a React-friendly wrapper around the upstream helper `connectCharts( ```ts import { useConnectCharts } from 'chartgpu-react'; -import type { ChartGPUInstance } from 'chartgpu-react'; +import type { ChartGPUInstance, ChartSyncOptions } from 'chartgpu-react'; ``` ### Signature ```ts function useConnectCharts( - charts: ReadonlyArray + charts: ReadonlyArray, + syncOptions?: ChartSyncOptions ): void; ``` +### `ChartSyncOptions` + +```ts +type ChartSyncOptions = Readonly<{ + syncCrosshair?: boolean; // default true + syncZoom?: boolean; // default false +}>; +``` + +- **`syncCrosshair`** (default `true`): sync crosshair + tooltip x across charts. +- **`syncZoom`** (default `false`): sync zoom/pan range across charts. + ### Behavior - Does nothing until all provided instances exist and are **not disposed** - Automatically disconnects when: - the hook unmounts, or - - the identity/disposed state of instances changes -- If `connectCharts(...)` throws, the hook logs an error and avoids crashing your component tree + - the identity/disposed state of instances changes, or + - `syncOptions` changes +- Reconnection is based on **option values**, not object identity — you can pass a new `syncOptions` object each render and the hook will only reconnect when the actual `syncCrosshair`/`syncZoom` values change +- If `connectCharts(...)` throws, the hook logs an error (dev builds only) and avoids crashing your component tree -### Example +### Example: synced crosshair (default) ```tsx import { useMemo, useState } from 'react'; @@ -151,3 +166,14 @@ export function SyncedCharts() { } ``` +### Example: synced zoom + +```tsx +useConnectCharts([a, b], { syncZoom: true }); +``` + +This syncs both crosshair and zoom across the connected charts. To sync only zoom without crosshair: + +```tsx +useConnectCharts([a, b], { syncCrosshair: false, syncZoom: true }); +``` diff --git a/docs/api/llm-context.md b/docs/api/llm-context.md index 90b13ba..9ea4c3c 100644 --- a/docs/api/llm-context.md +++ b/docs/api/llm-context.md @@ -1,6 +1,6 @@ # chartgpu-react — LLM / Context7 documentation entrypoint -This repository provides **React bindings** for the [`chartgpu`](https://www.npmjs.com/package/chartgpu) WebGPU charting library. +This repository provides **React bindings** for the [`@chartgpu/chartgpu`](https://www.npmjs.com/package/@chartgpu/chartgpu) WebGPU charting library. The goal of this `llm-context.md` file is to give Context7 (and other LLM tooling) a **single, stable entrypoint** that maps common tasks to the right documentation pages and source files. @@ -16,15 +16,15 @@ The goal of this `llm-context.md` file is to give Context7 (and other LLM toolin - `ChartGPUChart` (legacy / deprecated, thin adapter) - **Hooks** - `useChartGPU(containerRef, options)` — imperative hook for creating and managing a ChartGPU instance - - `useConnectCharts([chartA, chartB, ...])` — connect multiple charts for synced crosshair/tooltip + - `useConnectCharts([chartA, chartB, ...], syncOptions?)` — connect multiple charts for synced crosshair/tooltip (optionally sync zoom) - **Core helpers** - - `createChart` (re-exported from `chartgpu`) - - `connectCharts` (re-exported from `chartgpu`) - - `createAnnotationAuthoring` (wrapper around `chartgpu`’s helper; includes a fix for `chartgpu@0.2.3` text annotation context-menu hit-testing) + - `createChart` (re-exported from `@chartgpu/chartgpu`) + - `connectCharts` (re-exported from `@chartgpu/chartgpu`) + - `createAnnotationAuthoring` (wrapper around `@chartgpu/chartgpu`'s helper; includes a legacy fix for text annotation context-menu hit-testing, now fixed upstream in v0.2.5) - **Types** - Wrapper types: `ChartGPUProps`, `ChartGPUHandle`, `ZoomRange` - Re-exported core types: `ChartGPUOptions`, `ChartGPUInstance`, `ChartGPUEventPayload`, `ChartGPUCrosshairMovePayload`, - `DataPoint`, `OHLCDataPoint`, `AnnotationConfig`, `DataZoomConfig`, etc. + `ChartGPUZoomRangeChangePayload`, `ChartSyncOptions`, `ChartGPUHitTestResult`, `DataPoint`, `OHLCDataPoint`, `AnnotationConfig`, `DataZoomConfig`, etc. ## Task → doc page mapping @@ -58,4 +58,3 @@ The goal of this `llm-context.md` file is to give Context7 (and other LLM toolin - Legacy component: `src/ChartGPUChart.tsx` - Hooks: `src/useChartGPU.ts`, `src/useConnectCharts.ts` - Public wrapper types: `src/types.ts` - diff --git a/docs/assets/chartgpu.png b/docs/assets/chartgpu.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa0e5bd1a21d07f97e5254caab070d96981f354 GIT binary patch literal 112298 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 BYWEBGPU diff --git a/docs/recipes/chart-sync.md b/docs/recipes/chart-sync.md index 887caa0..342de60 100644 --- a/docs/recipes/chart-sync.md +++ b/docs/recipes/chart-sync.md @@ -7,10 +7,13 @@ You can do this: - manually with `connectCharts(...)`, or - with the React hook `useConnectCharts(...)` (recommended in React apps) +Both accept an optional `ChartSyncOptions` parameter to control what is synced. + Related: -- [`useConnectCharts`](../api/hooks.md#useconnectchartscharts) +- [`useConnectCharts`](../api/hooks.md#useconnectchartscharts-syncoptions) - [Crosshair move recipe](./crosshair-move.md) +- [dataZoom basics](./datazoom-basics.md) ## Option A: `useConnectCharts` (recommended) @@ -55,9 +58,23 @@ export function SyncedCharts() { } ``` +### Zoom sync + +To also sync zoom/pan across charts, pass `syncOptions`: + +```tsx +useConnectCharts([a, b], { syncZoom: true }); +``` + +This keeps both crosshair and zoom range in sync. To sync only zoom: + +```tsx +useConnectCharts([a, b], { syncCrosshair: false, syncZoom: true }); +``` + ## Option B: manual `connectCharts(...)` -`connectCharts` is a helper from the peer dependency `chartgpu`. `chartgpu-react` re-exports it for convenience: +`connectCharts` is a helper from the peer dependency `@chartgpu/chartgpu`. `chartgpu-react` re-exports it for convenience: ```ts import { connectCharts } from 'chartgpu-react'; @@ -77,7 +94,8 @@ export function ManualSync() { useEffect(() => { if (!a || a.disposed) return; if (!b || b.disposed) return; - const disconnect = connectCharts([a, b]); + // Pass syncOptions as the second argument (optional) + const disconnect = connectCharts([a, b], { syncZoom: true }); return () => disconnect(); }, [a, b]); @@ -101,8 +119,20 @@ export function ManualSync() { } ``` +## `ChartSyncOptions` + +```ts +type ChartSyncOptions = Readonly<{ + syncCrosshair?: boolean; // default true + syncZoom?: boolean; // default false +}>; +``` + +- **`syncCrosshair`** (default `true`): sync crosshair + tooltip x across charts. +- **`syncZoom`** (default `false`): sync zoom/pan range across charts. + ## Notes - Always disconnect on cleanup to avoid leaking listeners. - Only connect charts that are initialized and not disposed. - +- When `syncZoom` is enabled, all connected charts should have compatible `dataZoom` configs for best results. diff --git a/docs/recipes/datazoom-basics.md b/docs/recipes/datazoom-basics.md index a334fa5..47f2da5 100644 --- a/docs/recipes/datazoom-basics.md +++ b/docs/recipes/datazoom-basics.md @@ -5,6 +5,7 @@ Enable `dataZoom` to allow users to zoom/pan through data. The `ChartGPU` React Related: - [`ChartGPU` props](../api/chartgpu-component.md#props) +- [`ChartGPUHandle`](../api/chartgpu-handle.md) — programmatic zoom via `setZoomRange` - [Crosshair move recipe](./crosshair-move.md) ## Example @@ -54,6 +55,6 @@ export function DataZoomExample() { ## Notes -- `onZoomChange` is implemented by polling `chart.getZoomRange()` every 100ms and detecting changes. +- `onZoomChange` subscribes to the native `zoomRangeChange` event on the chart instance (introduced in ChartGPU v0.2.5). No polling is involved. - If zoom is disabled, `getZoomRange()` returns `null` and the callback will not fire. - +- You can programmatically control the zoom range via the imperative ref: `chartRef.current?.setZoomRange(start, end)` (percent-space, 0–100). See [`ChartGPUHandle.setZoomRange`](../api/chartgpu-handle.md#setzoomrangestart-number-end-number-void). diff --git a/examples/main.tsx b/examples/main.tsx index 32bb13b..43a6be0 100644 --- a/examples/main.tsx +++ b/examples/main.tsx @@ -8,7 +8,7 @@ import type { ChartGPUOptions, ScatterPointTuple, } from '../src'; -import type { OHLCDataPoint } from 'chartgpu'; +import type { OHLCDataPoint } from '@chartgpu/chartgpu'; type Candle = Extract< OHLCDataPoint, diff --git a/package-lock.json b/package-lock.json index b33c81d..313b76c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "chartgpu-react", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "chartgpu-react", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "devDependencies": { + "@chartgpu/chartgpu": "^0.2.5", "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@vitejs/plugin-react": "^4.2.1", - "chartgpu": "^0.2.3", "react": "^18.2.0", "react-dom": "^18.2.0", "typescript": "^5.3.3", @@ -20,7 +20,7 @@ "vite-plugin-dts": "^3.7.3" }, "peerDependencies": { - "chartgpu": ">=0.2.3 <0.3.0", + "@chartgpu/chartgpu": "^0.2.5", "react": ">=18.0.0", "react-dom": ">=18.0.0" } @@ -270,6 +270,13 @@ "node": ">=6.9.0" } }, + "node_modules/@chartgpu/chartgpu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@chartgpu/chartgpu/-/chartgpu-0.2.5.tgz", + "integrity": "sha512-PEe3m/NeJWtDyYVu81ozFTAmGo6JMYMWI1fmgCuDvenYBTdX832CT0+Ngs1jYBI2+cNhcfA0qRA00hu6N/F/ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", @@ -1547,11 +1554,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/chartgpu": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, "node_modules/commander": { "version": "9.5.0", "dev": true, diff --git a/package.json b/package.json index c1f17a9..87e92e5 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "preview": "vite preview" }, "peerDependencies": { - "chartgpu": ">=0.2.3 <0.3.0", + "@chartgpu/chartgpu": "^0.2.5", "react": ">=18.0.0", "react-dom": ">=18.0.0" }, @@ -38,7 +38,7 @@ "@types/react": "^18.2.66", "@types/react-dom": "^18.2.22", "@vitejs/plugin-react": "^4.2.1", - "chartgpu": "^0.2.3", + "@chartgpu/chartgpu": "^0.2.5", "react": "^18.2.0", "react-dom": "^18.2.0", "typescript": "^5.3.3", diff --git a/src/ChartGPU.tsx b/src/ChartGPU.tsx index e206edc..096a338 100644 --- a/src/ChartGPU.tsx +++ b/src/ChartGPU.tsx @@ -6,7 +6,7 @@ import { forwardRef, useCallback, } from 'react'; -import { ChartGPU as ChartGPULib } from 'chartgpu'; +import { ChartGPU as ChartGPULib } from '@chartgpu/chartgpu'; import type { ChartGPUProps, ChartGPUHandle, @@ -14,7 +14,7 @@ import type { ClickParams, MouseOverParams, } from './types'; -import type { ChartGPUOptions } from 'chartgpu'; +import type { ChartGPUOptions, ChartGPUZoomRangeChangePayload } from '@chartgpu/chartgpu'; /** * Debounce utility for throttling frequent calls. @@ -45,7 +45,7 @@ function debounce void>( * - Automatic resize handling via ResizeObserver * - Theme support with options override * - Declarative event handlers - * - Zoom change detection via polling + * - Zoom change detection via event subscription * - Imperative methods via forwardRef * * Example usage: @@ -82,12 +82,6 @@ export const ChartGPU = forwardRef( const [chart, setChart] = useState(null); const mountedRef = useRef(false); const resizeObserverRef = useRef(null); - const zoomPollIntervalRef = useRef | null>( - null - ); - const lastZoomRangeRef = useRef>( - null - ); // Expose imperative handle useImperativeHandle( @@ -107,6 +101,39 @@ export const ChartGPU = forwardRef( instance.setOption(newOptions); } }, + setZoomRange: (start: number, end: number) => { + const instance = instanceRef.current; + if (instance && !instance.disposed) { + instance.setZoomRange(start, end); + } + }, + setInteractionX: (x: number | null, source?: unknown) => { + const instance = instanceRef.current; + if (instance && !instance.disposed) { + instance.setInteractionX(x, source); + } + }, + getInteractionX: () => { + const instance = instanceRef.current; + if (instance && !instance.disposed) { + return instance.getInteractionX(); + } + return null; + }, + hitTest: (e: PointerEvent | MouseEvent) => { + const instance = instanceRef.current; + if (!instance || instance.disposed) { + return { + isInGrid: false, + canvasX: NaN, + canvasY: NaN, + gridX: NaN, + gridY: NaN, + match: null, + }; + } + return instance.hitTest(e); + }, }), [] ); @@ -190,8 +217,10 @@ export const ChartGPU = forwardRef( instance.on('click', handler); return () => { - if (instance && !instance.disposed) { + try { instance.off('click', handler); + } catch { + // instance may already be disposed; swallow } }; }, [chart, onClick]); @@ -208,8 +237,10 @@ export const ChartGPU = forwardRef( instance.on('mouseover', handler); return () => { - if (instance && !instance.disposed) { + try { instance.off('mouseover', handler); + } catch { + // instance may already be disposed; swallow } }; }, [chart, onMouseOver]); @@ -226,8 +257,10 @@ export const ChartGPU = forwardRef( instance.on('mouseout', handler); return () => { - if (instance && !instance.disposed) { + try { instance.off('mouseout', handler); + } catch { + // instance may already be disposed; swallow } }; }, [chart, onMouseOut]); @@ -244,8 +277,10 @@ export const ChartGPU = forwardRef( instance.on('crosshairMove', handler); return () => { - if (instance && !instance.disposed) { + try { instance.off('crosshairMove', handler); + } catch { + // instance may already be disposed; swallow } }; }, [chart, onCrosshairMove]); @@ -277,49 +312,34 @@ export const ChartGPU = forwardRef( // eslint-disable-next-line react-hooks/exhaustive-deps }, [chart]); // Re-run when instance changes - // Set up zoom change polling (100ms interval) + // Register/unregister zoomRangeChange event handler. + // Also emits the current zoom range once on subscribe (initial hydration) + // so consumers don't need to wait for user interaction to receive the first value. useEffect(() => { const instance = chart; if (!instance || instance.disposed || !onZoomChange) return; - const checkZoomChange = () => { - if (!instance || instance.disposed) return; - - const currentRange = instance.getZoomRange(); - const lastRange = lastZoomRangeRef.current; - - // Check if zoom range changed - if (currentRange !== null) { - if ( - lastRange === null || - lastRange.start !== currentRange.start || - lastRange.end !== currentRange.end - ) { - lastZoomRangeRef.current = currentRange; - onZoomChange(currentRange); - } - } else { - // Range is null (no zoom), reset last range - if (lastRange !== null) { - lastZoomRangeRef.current = null; - } - } + const handler = (payload: ChartGPUZoomRangeChangePayload) => { + // Map upstream payload to ZoomRange (strip `source`) + onZoomChange({ start: payload.start, end: payload.end }); }; - const intervalId = setInterval(checkZoomChange, 100); - zoomPollIntervalRef.current = intervalId; + instance.on('zoomRangeChange', handler); - // Initial check - checkZoomChange(); + // Hydrate: fire once with the current zoom range (if non-null) + const current = instance.getZoomRange(); + if (current) { + onZoomChange({ start: current.start, end: current.end }); + } return () => { - if (zoomPollIntervalRef.current) { - clearInterval(zoomPollIntervalRef.current); - zoomPollIntervalRef.current = null; + try { + instance.off('zoomRangeChange', handler); + } catch { + // instance may already be disposed; swallow } - lastZoomRangeRef.current = null; }; - }, [chart, onZoomChange]); // Re-run when instance or callback changes + }, [chart, onZoomChange]); return (
; diff --git a/src/index.ts b/src/index.ts index b34e708..7a30b1b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,20 +36,28 @@ export { ChartGPUChart } from './ChartGPUChart'; export type { ChartGPUChartProps } from './ChartGPUChart'; // Re-export chartgpu helpers (avoid colliding with our `ChartGPU` React component) -export { createChart, connectCharts } from 'chartgpu'; +export { createChart, connectCharts } from '@chartgpu/chartgpu'; export { createAnnotationAuthoring } from './createAnnotationAuthoring'; -// Re-export types from chartgpu for convenience +// Re-export types from @chartgpu/chartgpu for convenience // This provides a single import point for all ChartGPU types export type { // Core instance and options ChartGPUInstance, ChartGPUOptions, - + // Event payloads ChartGPUEventPayload, ChartGPUCrosshairMovePayload, - + ChartGPUZoomRangeChangePayload, + + // Hit testing + ChartGPUHitTestResult, + ChartGPUHitTestMatch, + + // Chart sync + ChartSyncOptions, + // Annotation authoring AnnotationAuthoringInstance, AnnotationAuthoringOptions, @@ -63,20 +71,38 @@ export type { ScatterSeriesConfig, CandlestickSeriesConfig, SeriesConfig, - + + // Style configurations + LineStyleConfig, + AreaStyleConfig, + // Data types DataPoint, OHLCDataPoint, ScatterPointTuple, - + // Zoom / interaction DataZoomConfig, + // Legend + LegendConfig, + LegendPosition, + + // Animation + AnimationConfig, + + // Tooltip + TooltipConfig, + TooltipParams, + + // Performance + PerformanceMetrics, + // Theme configuration ThemeConfig, ThemeName, - + // Axis and grid configurations AxisConfig, GridConfig, -} from 'chartgpu'; +} from '@chartgpu/chartgpu'; diff --git a/src/types.ts b/src/types.ts index 745b77a..8bea7b6 100644 --- a/src/types.ts +++ b/src/types.ts @@ -8,10 +8,11 @@ import type { ChartGPUOptions, ChartGPUInstance, ChartGPUEventPayload, + ChartGPUHitTestResult, DataPoint, OHLCDataPoint, ChartGPUCrosshairMovePayload, -} from 'chartgpu'; +} from '@chartgpu/chartgpu'; /** * Bivariant callback helper (matches React's event handler variance behavior). @@ -163,6 +164,38 @@ export interface ChartGPUHandle { * @param options - New complete chart configuration */ setOption(options: ChartGPUOptions): void; + + /** + * Programmatically set the zoom range (percent-space). + * No-op when zoom is disabled on the chart. + * + * @param start - Start of zoom range (0-100) + * @param end - End of zoom range (0-100) + */ + setZoomRange(start: number, end: number): void; + + /** + * Programmatically drive the crosshair / tooltip to a domain-space x value. + * Passing `null` clears the crosshair. + * + * @param x - Domain-space x value, or null to clear + * @param source - Optional source identifier (useful for sync disambiguation) + */ + setInteractionX(x: number | null, source?: unknown): void; + + /** + * Read the current interaction x (domain units), or `null` when inactive. + */ + getInteractionX(): number | null; + + /** + * Perform hit-testing on a pointer or mouse event. + * Returns coordinates and matched chart element (if any). + * + * @param e - Pointer or mouse event to test + * @returns Hit-test result with coordinates and optional match + */ + hitTest(e: PointerEvent | MouseEvent): ChartGPUHitTestResult; } /** @@ -176,4 +209,4 @@ export type { ChartGPUCrosshairMovePayload, DataPoint, OHLCDataPoint, -} from 'chartgpu'; +} from '@chartgpu/chartgpu'; diff --git a/src/useChartGPU.ts b/src/useChartGPU.ts index d7934bb..5ed43a4 100644 --- a/src/useChartGPU.ts +++ b/src/useChartGPU.ts @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from 'react'; -import { ChartGPU as ChartGPULib } from 'chartgpu'; -import type { ChartGPUOptions } from 'chartgpu'; +import { ChartGPU as ChartGPULib } from '@chartgpu/chartgpu'; +import type { ChartGPUOptions } from '@chartgpu/chartgpu'; import type { ChartInstance } from './types'; /** diff --git a/src/useConnectCharts.ts b/src/useConnectCharts.ts index 4153611..37c9c97 100644 --- a/src/useConnectCharts.ts +++ b/src/useConnectCharts.ts @@ -1,18 +1,23 @@ import { useEffect, useRef } from 'react'; -import { connectCharts } from 'chartgpu'; -import type { ChartGPUInstance } from 'chartgpu'; +import { connectCharts } from '@chartgpu/chartgpu'; +import type { ChartGPUInstance, ChartSyncOptions } from '@chartgpu/chartgpu'; type DisconnectCharts = ReturnType; /** - * React hook to connect multiple ChartGPU instances for synced crosshair/tooltip x. + * React hook to connect multiple ChartGPU instances for synced interactions. + * + * Supports optional `syncOptions` to control which interactions are synced: + * - `syncCrosshair` (default `true`): sync crosshair + tooltip x across charts + * - `syncZoom` (default `false`): sync zoom/pan across charts * * Safety: * - Will not connect until all instances exist and are not disposed. - * - Automatically disconnects on unmount and when the set of instances changes. + * - Automatically disconnects on unmount and when the set of instances or options change. */ export function useConnectCharts( - charts: ReadonlyArray + charts: ReadonlyArray, + syncOptions?: ChartSyncOptions ): void { const disconnectRef = useRef(null); const idsRef = useRef>(new WeakMap()); @@ -27,13 +32,18 @@ export function useConnectCharts( }; // Build a stable signature so callers can pass new arrays without forcing reconnect. - const signature = charts - .map((c) => { - if (!c) return 'null'; - const id = getId(c); - return `${id}:${c.disposed ? 1 : 0}`; - }) - .join('|'); + // Include syncOptions so changes to them trigger reconnection. + const optionsSig = syncOptions + ? `cr=${syncOptions.syncCrosshair ?? ''},zm=${syncOptions.syncZoom ?? ''}` + : ''; + const signature = + charts + .map((c) => { + if (!c) return 'null'; + const id = getId(c); + return `${id}:${c.disposed ? 1 : 0}`; + }) + .join('|') + `|${optionsSig}`; useEffect(() => { // Always tear down any previous connection first. @@ -51,7 +61,7 @@ export function useConnectCharts( } try { - const disconnect = connectCharts(resolved); + const disconnect = connectCharts(resolved, syncOptions); disconnectRef.current = disconnect; return () => { disconnect(); @@ -60,10 +70,23 @@ export function useConnectCharts( } catch (err) { // Avoid crashing render trees if upstream throws (e.g. mismatched chart state). // Consumers can still manually call connectCharts if they need error handling. - console.error('useConnectCharts: failed to connect charts', err); + // Only log in development; tree-shaken in production builds + try { + if ( + // @ts-expect-error -- process may not exist in browser environments + typeof process === 'undefined' || process.env?.NODE_ENV !== 'production' + ) { + // eslint-disable-next-line no-console + console.error('useConnectCharts: failed to connect charts', err); + } + } catch { + // process access threw; assume dev + // eslint-disable-next-line no-console + console.error('useConnectCharts: failed to connect charts', err); + } return; } - // `charts` is intentionally not a dependency; `signature` captures identity + disposed state. + // `charts` is intentionally not a dependency; `signature` captures identity + disposed state + options. // eslint-disable-next-line react-hooks/exhaustive-deps }, [signature]); } diff --git a/vite.config.ts b/vite.config.ts index 47cd046..c1d090a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -34,7 +34,7 @@ export default defineConfig(({ command }) => { fileName: () => 'index.js', }, rollupOptions: { - external: ['react', 'react-dom', 'react/jsx-runtime', 'chartgpu'], + external: ['react', 'react-dom', 'react/jsx-runtime', '@chartgpu/chartgpu'], output: { preserveModules: false, }, From bffed10ae8f7ef3c767e7ec8164020ead6f826d2 Mon Sep 17 00:00:00 2001 From: Hunter Date: Wed, 11 Feb 2026 10:36:57 -0600 Subject: [PATCH 2/2] version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 87e92e5..988891f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chartgpu-react", - "version": "0.1.1", + "version": "0.1.2", "description": "React bindings for ChartGPU - WebGPU-powered charting library", "license": "MIT", "author": "",