@particle-academy/fancy-echarts 4.0.0 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @particle-academy/fancy-echarts
2
2
 
3
+ [![Fancified](art/fancified.svg)](https://particle.academy)
4
+
3
5
  Typed React wrapper around [Apache ECharts](https://echarts.apache.org/) — every chart type from a single `<EChart>` component, lazy module registration, four built-in themes.
4
6
 
5
7
  > **Breaking change in 4.0** — the hand-rolled diagram subsystem (`<Diagram>`, `<DataDiagram>`, `<OrgChart>`, `<Mindmap>`, `<Flowchart>` and their types) is removed. ECharts and react-flow each own their domain: charts here, node-edge graphs in [`@particle-academy/fancy-flow`](https://github.com/Particle-Academy/fancy-flow). If you used the diagram presets, migrate to fancy-flow — its `<FlowEditor>` + `defineNode` + `<NodePort>` covers org charts, flowcharts, ERDs, and mindmaps cleanly. Real Sankey / sunburst / radial visualizations stay here as proper ECharts series.
@@ -31,6 +33,14 @@ npm install echarts-gl
31
33
 
32
34
  ## Quick Start
33
35
 
36
+ > **Registration is module-scoped per bundle entry.** Call `registerAll()` (or
37
+ > `registerCharts(...)`) once in **every** independent bundle entry that renders
38
+ > charts — a second entry (e.g. a separate Vite/Inertia entry) that doesn't run
39
+ > the first entry's code won't have registered anything. If a chart/component
40
+ > type isn't registered, `<EChart>` now throws a clear
41
+ > `[fancy-echarts] … is likely not registered. Call registerAll()…` error
42
+ > (instead of echarts' cryptic `_u[o] is not a constructor`).
43
+
34
44
  ```tsx
35
45
  import { EChart, registerAll } from "@particle-academy/fancy-echarts";
36
46
 
@@ -79,12 +89,12 @@ This is consumer responsibility — the wrapper does not introspect `option` to
79
89
 
80
90
  `fancy-echarts` is a thin wrapper — every interaction surface is reachable through `onEvents`, `useECharts().instance`, and `tooltip.formatter`. These recipes cover the patterns that hold up across charts.
81
91
 
82
- ### Wrap any chart with a Popover, ContextMenu, and Action button
92
+ ### Wrap any chart with a Popover, ContextMenu, and Button
83
93
 
84
94
  The pattern that scales: a single `ChartFrame` wrapper that gives every chart an info popover next to the title, action buttons in the header, and a right-click context menu on the body. Build it once, reuse for every chart type:
85
95
 
86
96
  ```tsx
87
- import { Card, Popover, Action, Badge, ContextMenu, Icon, useToast } from "@particle-academy/react-fancy";
97
+ import { Card, Popover, Button, Badge, ContextMenu, Icon, useToast } from "@particle-academy/react-fancy";
88
98
 
89
99
  function ChartFrame({ title, info, actions = [], onExport, extraMenu, children }) {
90
100
  const { toast } = useToast();
@@ -104,7 +114,7 @@ function ChartFrame({ title, info, actions = [], onExport, extraMenu, children }
104
114
  </Popover>
105
115
  </div>
106
116
  <div className="flex gap-2">
107
- {actions.map((a) => <Action key={a.label} size="sm" onClick={a.onClick}>{a.label}</Action>)}
117
+ {actions.map((a) => <Button key={a.label} size="sm" onClick={a.onClick}>{a.label}</Button>)}
108
118
  </div>
109
119
  </div>
110
120
  </Card.Header>
@@ -233,9 +243,9 @@ Pass `theme="dark-preset"` (after `registerBuiltinThemes()`) or `theme="light"`
233
243
  ```tsx
234
244
  const [theme, setTheme] = useState<"light" | "dark-preset">("light");
235
245
 
236
- <Action onClick={() => setTheme((t) => t === "light" ? "dark-preset" : "light")}>
246
+ <Button onClick={() => setTheme((t) => t === "light" ? "dark-preset" : "light")}>
237
247
  Toggle theme
238
- </Action>
248
+ </Button>
239
249
  <EChart theme={theme} option={option} />
240
250
  ```
241
251
 
@@ -424,3 +434,9 @@ registerBuiltinThemes(); // Registers "dark-preset", "vintage", "pastel"
424
434
  ## License
425
435
 
426
436
  MIT
437
+
438
+ ---
439
+
440
+ ## ⭐ Star Fancy UI
441
+
442
+ If this package is useful to you, a quick ⭐ on the repo really helps us build a better kit. Thank you!
package/dist/index.cjs CHANGED
@@ -36,6 +36,34 @@ function useDarkMode() {
36
36
  () => false
37
37
  );
38
38
  }
39
+ function collectOptionTypes(option) {
40
+ const types = /* @__PURE__ */ new Set();
41
+ const o = option;
42
+ const series = o.series;
43
+ const arr = Array.isArray(series) ? series : series ? [series] : [];
44
+ for (const s of arr) {
45
+ const t = s?.type;
46
+ if (typeof t === "string") types.add(`series:${t}`);
47
+ }
48
+ for (const key of [
49
+ "radar",
50
+ "polar",
51
+ "geo",
52
+ "parallel",
53
+ "calendar",
54
+ "singleAxis",
55
+ "timeline",
56
+ "visualMap",
57
+ "dataZoom",
58
+ "toolbox",
59
+ "brush",
60
+ "graphic",
61
+ "dataset"
62
+ ]) {
63
+ if (o[key] != null) types.add(key);
64
+ }
65
+ return [...types];
66
+ }
39
67
  function useECharts(options) {
40
68
  const {
41
69
  option,
@@ -73,7 +101,14 @@ function useECharts(options) {
73
101
  const chart = instanceRef.current;
74
102
  if (!chart || !option) return;
75
103
  const finalOption = autoDark ? { backgroundColor: "transparent", ...option } : option;
76
- chart.setOption(finalOption, { notMerge, lazyUpdate });
104
+ try {
105
+ chart.setOption(finalOption, { notMerge, lazyUpdate });
106
+ } catch (err) {
107
+ const types = collectOptionTypes(finalOption);
108
+ throw new Error(
109
+ `[fancy-echarts] Failed to render chart \u2014 a chart/component type is likely not registered. This option uses: ${types.length ? types.join(", ") : "(none detected)"}. Call registerAll() once at app startup, or registerCharts(...)/registerComponents(...) for the types you use. Registration is module-scoped per bundle entry \u2014 every entry that renders charts must register. Original error: ${err instanceof Error ? err.message : String(err)}`
110
+ );
111
+ }
77
112
  }, [option, notMerge, lazyUpdate, autoDark]);
78
113
  react.useEffect(() => {
79
114
  const chart = instanceRef.current;
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/use-resize-observer.ts","../src/hooks/use-echarts.ts","../src/components/EChart.tsx","../src/components/EChart3D.tsx","../src/components/EChartGraphic.tsx","../src/utils/register.ts","../src/utils/themes.ts"],"names":["useRef","useEffect","useSyncExternalStore","useState","getInstanceByDom","init","forwardRef","jsx","useMemo","DEFAULT_STYLE","Fragment","LineChart","BarChart","PieChart","ScatterChart","RadarChart","HeatmapChart","GaugeChart","FunnelChart","TreemapChart","SunburstChart","SankeyChart","GraphChart","CandlestickChart","BoxplotChart","ParallelChart","ThemeRiverChart","MapChart","CustomChart","EffectScatterChart","PictorialBarChart","GridComponent","TooltipComponent","TitleComponent","LegendComponent","DataZoomComponent","ToolboxComponent","VisualMapComponent","GeoComponent","ParallelComponent","CalendarComponent","GraphicComponent","PolarComponent","RadarComp","DatasetComponent","MarkLineComponent","MarkPointComponent","MarkAreaComponent","TimelineComponent","BrushComponent","SingleAxisComponent","CanvasRenderer","SVGRenderer","use","echartsRegisterTheme"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\n\nexport function useResizeObserver(\n ref: RefObject<HTMLElement | null>,\n callback: () => void\n): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n callbackRef.current();\n });\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [ref]);\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type RefObject } from \"react\";\nimport { init, getInstanceByDom, type EChartsType } from \"echarts/core\";\nimport type { EChartsOption } from \"echarts\";\n\ntype ECharts = EChartsType;\nimport { useResizeObserver } from \"./use-resize-observer\";\n\nexport interface UseEChartsOptions {\n option: EChartsOption;\n theme?: string | object;\n renderer?: \"canvas\" | \"svg\";\n notMerge?: boolean;\n lazyUpdate?: boolean;\n showLoading?: boolean;\n loadingOption?: object;\n onEvents?: Record<string, (params: any) => void>;\n autoResize?: boolean;\n}\n\nexport interface UseEChartsReturn {\n chartRef: RefObject<HTMLDivElement | null>;\n instance: ECharts | null;\n}\n\n/** Detect system dark mode preference reactively. */\nfunction useDarkMode(): boolean {\n return useSyncExternalStore(\n (callback) => {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n },\n () => window.matchMedia(\"(prefers-color-scheme: dark)\").matches,\n () => false,\n );\n}\n\nexport function useECharts(options: UseEChartsOptions): UseEChartsReturn {\n const {\n option,\n theme,\n renderer = \"canvas\",\n notMerge = false,\n lazyUpdate = false,\n showLoading = false,\n loadingOption,\n onEvents,\n autoResize = true,\n } = options;\n\n const isDark = useDarkMode();\n // Auto-detect theme: use explicit theme if provided, otherwise \"dark\" or undefined\n const autoDark = theme === undefined && isDark;\n const resolvedTheme = theme !== undefined ? theme : isDark ? \"dark\" : undefined;\n\n const chartRef = useRef<HTMLDivElement | null>(null);\n const instanceRef = useRef<ECharts | null>(null);\n const [instance, setInstance] = useState<ECharts | null>(null);\n\n // Init/dispose — re-init when theme changes (including dark mode toggle)\n useEffect(() => {\n if (!chartRef.current) return;\n\n // Dispose any existing instance (handles StrictMode double-mount)\n const existing = getInstanceByDom(chartRef.current);\n if (existing) {\n existing.dispose();\n }\n\n const chart = init(chartRef.current, resolvedTheme, { renderer });\n instanceRef.current = chart;\n setInstance(chart);\n\n return () => {\n chart.dispose();\n instanceRef.current = null;\n setInstance(null);\n };\n }, [resolvedTheme, renderer]);\n\n // Set option\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !option) return;\n // When using auto-detected dark theme, force transparent background\n // so charts blend with the page's own dark background\n const finalOption = autoDark\n ? { backgroundColor: \"transparent\", ...option }\n : option;\n chart.setOption(finalOption, { notMerge, lazyUpdate });\n }, [option, notMerge, lazyUpdate, autoDark]);\n\n // Loading state\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart) return;\n if (showLoading) {\n chart.showLoading(\"default\", loadingOption);\n } else {\n chart.hideLoading();\n }\n }, [showLoading, loadingOption]);\n\n // Event binding\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !onEvents) return;\n\n const entries = Object.entries(onEvents);\n for (const [event, handler] of entries) {\n chart.on(event, handler);\n }\n\n return () => {\n for (const [event, handler] of entries) {\n chart.off(event, handler);\n }\n };\n }, [onEvents]);\n\n // Auto-resize\n useResizeObserver(chartRef, () => {\n if (autoResize && instanceRef.current) {\n instanceRef.current.resize();\n }\n });\n\n return { chartRef, instance };\n}\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/** Base EChart component — accepts any ECharts option. */\nconst EChartBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartBase.displayName = \"EChart\";\n\n// --- Helper to create typed series sub-components ---\n\nfunction createSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n xAxis,\n yAxis,\n tooltip = true,\n legend = false,\n grid,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: EChartsOption = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = { trigger: \"axis\" };\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if (legend === true) {\n base.legend = {};\n } else if (legend && typeof legend === \"object\") {\n base.legend = legend;\n }\n\n if (grid) {\n base.grid = grid;\n }\n\n // Handle axis-based charts\n const axisCharts = [\n \"line\",\n \"bar\",\n \"scatter\",\n \"candlestick\",\n \"boxplot\",\n \"heatmap\",\n \"effectScatter\",\n \"pictorialBar\",\n ];\n if (axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? { type: \"category\" };\n base.yAxis = yAxis ?? { type: \"value\" };\n }\n\n // Handle data format\n if (Array.isArray(data)) {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n } else if (data && typeof data === \"object\" && \"series\" in data) {\n // Multi-series: { categories: [...], series: [{ name, data }, ...] }\n const multiData = data as {\n categories?: string[];\n series: Array<{ name?: string; data: any[]; [k: string]: any }>;\n };\n if (multiData.categories && axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? {\n type: \"category\",\n data: multiData.categories,\n };\n }\n base.series = multiData.series.map((s) => ({\n type: seriesType,\n ...seriesOptions,\n ...s,\n })) as any;\n } else {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n }\n\n return { ...base, ...extraOption };\n }, [\n data,\n title,\n xAxis,\n yAxis,\n tooltip,\n legend,\n grid,\n seriesOptions,\n extraOption,\n ]);\n\n return (\n <EChartBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\n// --- Compound component with all chart type sub-components ---\n\nexport const EChart = Object.assign(EChartBase, {\n Line: createSeriesComponent(\"line\", \"EChart.Line\"),\n Bar: createSeriesComponent(\"bar\", \"EChart.Bar\"),\n Pie: createSeriesComponent(\"pie\", \"EChart.Pie\"),\n Scatter: createSeriesComponent(\"scatter\", \"EChart.Scatter\"),\n Radar: createSeriesComponent(\"radar\", \"EChart.Radar\"),\n Heatmap: createSeriesComponent(\"heatmap\", \"EChart.Heatmap\"),\n Gauge: createSeriesComponent(\"gauge\", \"EChart.Gauge\"),\n Funnel: createSeriesComponent(\"funnel\", \"EChart.Funnel\"),\n Treemap: createSeriesComponent(\"treemap\", \"EChart.Treemap\"),\n Sunburst: createSeriesComponent(\"sunburst\", \"EChart.Sunburst\"),\n Sankey: createSeriesComponent(\"sankey\", \"EChart.Sankey\"),\n Graph: createSeriesComponent(\"graph\", \"EChart.Graph\"),\n Candlestick: createSeriesComponent(\"candlestick\", \"EChart.Candlestick\"),\n Boxplot: createSeriesComponent(\"boxplot\", \"EChart.Boxplot\"),\n Parallel: createSeriesComponent(\"parallel\", \"EChart.Parallel\"),\n ThemeRiver: createSeriesComponent(\"themeRiver\", \"EChart.ThemeRiver\"),\n Map: createSeriesComponent(\"map\", \"EChart.Map\"),\n Custom: createSeriesComponent(\"custom\", \"EChart.Custom\"),\n EffectScatter: createSeriesComponent(\n \"effectScatter\",\n \"EChart.EffectScatter\"\n ),\n PictorialBar: createSeriesComponent(\"pictorialBar\", \"EChart.PictorialBar\"),\n});\n","import React, { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 500 };\n\nlet glLoaded = false;\nlet glPromise: Promise<void> | null = null;\n\nfunction loadEChartsGL(): Promise<void> {\n if (glLoaded) return Promise.resolve();\n if (!glPromise) {\n glPromise = import(\"echarts-gl\")\n .then(() => {\n glLoaded = true;\n })\n .catch((err: unknown) => {\n console.warn(\"Failed to load echarts-gl for 3D charts:\", err);\n });\n }\n return glPromise;\n}\n\n/** Wrapper that delays mount until echarts-gl is loaded */\nfunction WithGL({ children, style, className }: { children: React.ReactNode; style?: React.CSSProperties; className?: string }) {\n const [ready, setReady] = useState(glLoaded);\n\n useEffect(() => {\n if (glLoaded) {\n setReady(true);\n return;\n }\n loadEChartsGL().then(() => setReady(true));\n }, []);\n\n if (!ready) {\n return (\n <div style={{ ...DEFAULT_STYLE, ...style, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }} className={className}>\n <span style={{ color: \"#9ca3af\", fontSize: 14 }}>Loading 3D engine...</span>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n\n/**\n * EChart3D — 3D chart component that lazy-loads the bundled echarts-gl\n * engine on first mount (split into its own chunk to keep the main bundle small).\n */\nconst EChart3DInner = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChart3DInner.displayName = \"EChart3DInner\";\n\nconst EChart3DBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (props, ref) => {\n const { style, className, ...rest } = props;\n return (\n <WithGL style={style} className={className}>\n <EChart3DInner ref={ref} style={style} className={className} {...rest} />\n </WithGL>\n );\n }\n);\n\nEChart3DBase.displayName = \"EChart3D\";\n\nfunction create3DSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n tooltip = true,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = {};\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if ([\"bar3D\", \"scatter3D\", \"line3D\", \"surface\"].includes(seriesType)) {\n base.xAxis3D = { type: \"value\" };\n base.yAxis3D = { type: \"value\" };\n base.zAxis3D = { type: \"value\" };\n base.grid3D = {};\n }\n\n base.series = [{ type: seriesType, data, ...seriesOptions }];\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [data, title, tooltip, seriesOptions, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\nfunction createGlobeComponent(): React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n> {\n const Component: React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n > = ({\n title,\n globe,\n series = [],\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n base.globe = globe ?? {\n baseTexture: \"\",\n shading: \"lambert\",\n atmosphere: { show: true },\n };\n\n if (series.length > 0) {\n base.series = series;\n }\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [title, globe, series, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = \"EChart3D.Globe\";\n return Component;\n}\n\nexport const EChart3D = Object.assign(EChart3DBase, {\n Bar: create3DSeriesComponent(\"bar3D\", \"EChart3D.Bar\"),\n Scatter: create3DSeriesComponent(\"scatter3D\", \"EChart3D.Scatter\"),\n Line: create3DSeriesComponent(\"line3D\", \"EChart3D.Line\"),\n Surface: create3DSeriesComponent(\"surface\", \"EChart3D.Surface\"),\n Globe: createGlobeComponent(),\n});\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type { EChartBaseProps, ChartDivProps } from \"../types\";\n\nexport interface GraphicElement {\n type:\n | \"rect\"\n | \"circle\"\n | \"ring\"\n | \"arc\"\n | \"polygon\"\n | \"polyline\"\n | \"path\"\n | \"image\"\n | \"text\"\n | \"group\";\n left?: number | string;\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n shape?: Record<string, any>;\n style?: Record<string, any>;\n children?: GraphicElement[];\n onclick?: (e: any) => void;\n onmouseover?: (e: any) => void;\n onmouseout?: (e: any) => void;\n [key: string]: any;\n}\n\nexport interface EChartGraphicProps\n extends Omit<EChartBaseProps, \"option\">,\n ChartDivProps,\n React.HTMLAttributes<HTMLDivElement> {\n elements: GraphicElement[];\n option?: Partial<EChartsOption>;\n}\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/**\n * EChartGraphic — for custom drawing via ECharts graphic layer.\n * Supports rect, circle, ring, arc, polygon, polyline, path, image, text, group elements.\n */\nexport const EChartGraphic = forwardRef<HTMLDivElement, EChartGraphicProps>(\n (\n {\n elements,\n option: extraOption = {},\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const option = useMemo((): EChartsOption => {\n return {\n graphic: {\n elements,\n },\n ...extraOption,\n } as EChartsOption;\n }, [elements, extraOption]);\n\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartGraphic.displayName = \"EChartGraphic\";\n","import { use } from \"echarts/core\";\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n} from \"echarts/charts\";\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComponent as RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n} from \"echarts/components\";\nimport { CanvasRenderer, SVGRenderer } from \"echarts/renderers\";\n\nconst allCharts = [\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n] as const;\n\nconst allComponents = [\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n] as const;\n\nconst allRenderers = [CanvasRenderer, SVGRenderer] as const;\n\nlet registered = false;\n\n/** Register all ECharts chart types, components, and renderers. Convenient for demos/quick starts. */\nexport function registerAll(): void {\n if (registered) return;\n use([...allCharts, ...allComponents, ...allRenderers] as any);\n registered = true;\n}\n\n/** Register specific chart types by name for tree-shaking optimization. */\nexport function registerCharts(\n ...chartTypes: Array<(typeof allCharts)[number]>\n): void {\n use(chartTypes as any);\n}\n\n/** Register specific components by reference. */\nexport function registerComponents(\n ...components: Array<(typeof allComponents)[number]>\n): void {\n use(components as any);\n}\n\n// Re-export individual charts and components for manual registration\nexport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n DatasetComponent,\n SingleAxisComponent,\n CanvasRenderer,\n SVGRenderer,\n};\n","import { registerTheme as echartsRegisterTheme } from \"echarts/core\";\n\n/** Dark theme preset */\nexport const darkTheme = {\n backgroundColor: \"#1a1a2e\",\n textStyle: { color: \"#e0e0e0\" },\n title: { textStyle: { color: \"#ffffff\" } },\n legend: { textStyle: { color: \"#cccccc\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n color: [\n \"#5470c6\",\n \"#91cc75\",\n \"#fac858\",\n \"#ee6666\",\n \"#73c0de\",\n \"#3ba272\",\n \"#fc8452\",\n \"#9a60b4\",\n \"#ea7ccc\",\n ],\n};\n\n/** Vintage theme preset */\nexport const vintageTheme = {\n color: [\n \"#d87c7c\",\n \"#919e8b\",\n \"#d7ab82\",\n \"#6e7074\",\n \"#61a0a8\",\n \"#efa18d\",\n \"#787464\",\n \"#cc7e63\",\n \"#724e58\",\n \"#4b565b\",\n ],\n backgroundColor: \"#fef8ef\",\n textStyle: {},\n title: { textStyle: { color: \"#333333\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n};\n\n/** Pastel theme preset */\nexport const pastelTheme = {\n color: [\n \"#c4b5fd\",\n \"#a5f3fc\",\n \"#fca5a5\",\n \"#fde68a\",\n \"#a7f3d0\",\n \"#fbcfe8\",\n \"#c7d2fe\",\n \"#fed7aa\",\n ],\n backgroundColor: \"#fafafa\",\n textStyle: { color: \"#555\" },\n title: { textStyle: { color: \"#333\" } },\n};\n\n/** Register a named theme with ECharts */\nexport function registerTheme(name: string, theme: object): void {\n echartsRegisterTheme(name, theme);\n}\n\n/** Register all built-in theme presets */\nexport function registerBuiltinThemes(): void {\n registerTheme(\"dark-preset\", darkTheme);\n registerTheme(\"vintage\", vintageTheme);\n registerTheme(\"pastel\", pastelTheme);\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/use-resize-observer.ts","../src/hooks/use-echarts.ts","../src/components/EChart.tsx","../src/components/EChart3D.tsx","../src/components/EChartGraphic.tsx","../src/utils/register.ts","../src/utils/themes.ts"],"names":["useRef","useEffect","useSyncExternalStore","useState","getInstanceByDom","init","forwardRef","jsx","useMemo","DEFAULT_STYLE","Fragment","LineChart","BarChart","PieChart","ScatterChart","RadarChart","HeatmapChart","GaugeChart","FunnelChart","TreemapChart","SunburstChart","SankeyChart","GraphChart","CandlestickChart","BoxplotChart","ParallelChart","ThemeRiverChart","MapChart","CustomChart","EffectScatterChart","PictorialBarChart","GridComponent","TooltipComponent","TitleComponent","LegendComponent","DataZoomComponent","ToolboxComponent","VisualMapComponent","GeoComponent","ParallelComponent","CalendarComponent","GraphicComponent","PolarComponent","RadarComp","DatasetComponent","MarkLineComponent","MarkPointComponent","MarkAreaComponent","TimelineComponent","BrushComponent","SingleAxisComponent","CanvasRenderer","SVGRenderer","use","echartsRegisterTheme"],"mappings":"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","file":"index.cjs","sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\n\nexport function useResizeObserver(\n ref: RefObject<HTMLElement | null>,\n callback: () => void\n): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n callbackRef.current();\n });\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [ref]);\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type RefObject } from \"react\";\nimport { init, getInstanceByDom, type EChartsType } from \"echarts/core\";\nimport type { EChartsOption } from \"echarts\";\n\ntype ECharts = EChartsType;\nimport { useResizeObserver } from \"./use-resize-observer\";\n\nexport interface UseEChartsOptions {\n option: EChartsOption;\n theme?: string | object;\n renderer?: \"canvas\" | \"svg\";\n notMerge?: boolean;\n lazyUpdate?: boolean;\n showLoading?: boolean;\n loadingOption?: object;\n onEvents?: Record<string, (params: any) => void>;\n autoResize?: boolean;\n}\n\nexport interface UseEChartsReturn {\n chartRef: RefObject<HTMLDivElement | null>;\n instance: ECharts | null;\n}\n\n/** Detect system dark mode preference reactively. */\nfunction useDarkMode(): boolean {\n return useSyncExternalStore(\n (callback) => {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n },\n () => window.matchMedia(\"(prefers-color-scheme: dark)\").matches,\n () => false,\n );\n}\n\n/** Collect the chart/component type names an option references, so a render\n * failure can name the likely-unregistered culprits. */\nfunction collectOptionTypes(option: EChartsOption): string[] {\n const types = new Set<string>();\n const o = option as Record<string, unknown>;\n const series = o.series;\n const arr = Array.isArray(series) ? series : series ? [series] : [];\n for (const s of arr) {\n const t = (s as { type?: unknown })?.type;\n if (typeof t === \"string\") types.add(`series:${t}`);\n }\n for (const key of [\n \"radar\", \"polar\", \"geo\", \"parallel\", \"calendar\", \"singleAxis\",\n \"timeline\", \"visualMap\", \"dataZoom\", \"toolbox\", \"brush\", \"graphic\", \"dataset\",\n ]) {\n if (o[key] != null) types.add(key);\n }\n return [...types];\n}\n\nexport function useECharts(options: UseEChartsOptions): UseEChartsReturn {\n const {\n option,\n theme,\n renderer = \"canvas\",\n notMerge = false,\n lazyUpdate = false,\n showLoading = false,\n loadingOption,\n onEvents,\n autoResize = true,\n } = options;\n\n const isDark = useDarkMode();\n // Auto-detect theme: use explicit theme if provided, otherwise \"dark\" or undefined\n const autoDark = theme === undefined && isDark;\n const resolvedTheme = theme !== undefined ? theme : isDark ? \"dark\" : undefined;\n\n const chartRef = useRef<HTMLDivElement | null>(null);\n const instanceRef = useRef<ECharts | null>(null);\n const [instance, setInstance] = useState<ECharts | null>(null);\n\n // Init/dispose — re-init when theme changes (including dark mode toggle)\n useEffect(() => {\n if (!chartRef.current) return;\n\n // Dispose any existing instance (handles StrictMode double-mount)\n const existing = getInstanceByDom(chartRef.current);\n if (existing) {\n existing.dispose();\n }\n\n const chart = init(chartRef.current, resolvedTheme, { renderer });\n instanceRef.current = chart;\n setInstance(chart);\n\n return () => {\n chart.dispose();\n instanceRef.current = null;\n setInstance(null);\n };\n }, [resolvedTheme, renderer]);\n\n // Set option\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !option) return;\n // When using auto-detected dark theme, force transparent background\n // so charts blend with the page's own dark background\n const finalOption = autoDark\n ? { backgroundColor: \"transparent\", ...option }\n : option;\n try {\n chart.setOption(finalOption, { notMerge, lazyUpdate });\n } catch (err) {\n // echarts throws a cryptic minified error (e.g. \"_u[o] is not a\n // constructor\") when an option uses a chart/component type that was\n // never registered. Re-throw something actionable that names the likely\n // culprits and points at registration — which is module-scoped per\n // bundle, so every entry that renders charts must call registerAll().\n const types = collectOptionTypes(finalOption);\n throw new Error(\n `[fancy-echarts] Failed to render chart — a chart/component type is likely not registered. ` +\n `This option uses: ${types.length ? types.join(\", \") : \"(none detected)\"}. ` +\n `Call registerAll() once at app startup, or registerCharts(...)/registerComponents(...) for the types you use. ` +\n `Registration is module-scoped per bundle entry — every entry that renders charts must register. ` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }, [option, notMerge, lazyUpdate, autoDark]);\n\n // Loading state\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart) return;\n if (showLoading) {\n chart.showLoading(\"default\", loadingOption);\n } else {\n chart.hideLoading();\n }\n }, [showLoading, loadingOption]);\n\n // Event binding\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !onEvents) return;\n\n const entries = Object.entries(onEvents);\n for (const [event, handler] of entries) {\n chart.on(event, handler);\n }\n\n return () => {\n for (const [event, handler] of entries) {\n chart.off(event, handler);\n }\n };\n }, [onEvents]);\n\n // Auto-resize\n useResizeObserver(chartRef, () => {\n if (autoResize && instanceRef.current) {\n instanceRef.current.resize();\n }\n });\n\n return { chartRef, instance };\n}\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/** Base EChart component — accepts any ECharts option. */\nconst EChartBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartBase.displayName = \"EChart\";\n\n// --- Helper to create typed series sub-components ---\n\nfunction createSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n xAxis,\n yAxis,\n tooltip = true,\n legend = false,\n grid,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: EChartsOption = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = { trigger: \"axis\" };\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if (legend === true) {\n base.legend = {};\n } else if (legend && typeof legend === \"object\") {\n base.legend = legend;\n }\n\n if (grid) {\n base.grid = grid;\n }\n\n // Handle axis-based charts\n const axisCharts = [\n \"line\",\n \"bar\",\n \"scatter\",\n \"candlestick\",\n \"boxplot\",\n \"heatmap\",\n \"effectScatter\",\n \"pictorialBar\",\n ];\n if (axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? { type: \"category\" };\n base.yAxis = yAxis ?? { type: \"value\" };\n }\n\n // Handle data format\n if (Array.isArray(data)) {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n } else if (data && typeof data === \"object\" && \"series\" in data) {\n // Multi-series: { categories: [...], series: [{ name, data }, ...] }\n const multiData = data as {\n categories?: string[];\n series: Array<{ name?: string; data: any[]; [k: string]: any }>;\n };\n if (multiData.categories && axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? {\n type: \"category\",\n data: multiData.categories,\n };\n }\n base.series = multiData.series.map((s) => ({\n type: seriesType,\n ...seriesOptions,\n ...s,\n })) as any;\n } else {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n }\n\n return { ...base, ...extraOption };\n }, [\n data,\n title,\n xAxis,\n yAxis,\n tooltip,\n legend,\n grid,\n seriesOptions,\n extraOption,\n ]);\n\n return (\n <EChartBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\n// --- Compound component with all chart type sub-components ---\n\nexport const EChart = Object.assign(EChartBase, {\n Line: createSeriesComponent(\"line\", \"EChart.Line\"),\n Bar: createSeriesComponent(\"bar\", \"EChart.Bar\"),\n Pie: createSeriesComponent(\"pie\", \"EChart.Pie\"),\n Scatter: createSeriesComponent(\"scatter\", \"EChart.Scatter\"),\n Radar: createSeriesComponent(\"radar\", \"EChart.Radar\"),\n Heatmap: createSeriesComponent(\"heatmap\", \"EChart.Heatmap\"),\n Gauge: createSeriesComponent(\"gauge\", \"EChart.Gauge\"),\n Funnel: createSeriesComponent(\"funnel\", \"EChart.Funnel\"),\n Treemap: createSeriesComponent(\"treemap\", \"EChart.Treemap\"),\n Sunburst: createSeriesComponent(\"sunburst\", \"EChart.Sunburst\"),\n Sankey: createSeriesComponent(\"sankey\", \"EChart.Sankey\"),\n Graph: createSeriesComponent(\"graph\", \"EChart.Graph\"),\n Candlestick: createSeriesComponent(\"candlestick\", \"EChart.Candlestick\"),\n Boxplot: createSeriesComponent(\"boxplot\", \"EChart.Boxplot\"),\n Parallel: createSeriesComponent(\"parallel\", \"EChart.Parallel\"),\n ThemeRiver: createSeriesComponent(\"themeRiver\", \"EChart.ThemeRiver\"),\n Map: createSeriesComponent(\"map\", \"EChart.Map\"),\n Custom: createSeriesComponent(\"custom\", \"EChart.Custom\"),\n EffectScatter: createSeriesComponent(\n \"effectScatter\",\n \"EChart.EffectScatter\"\n ),\n PictorialBar: createSeriesComponent(\"pictorialBar\", \"EChart.PictorialBar\"),\n});\n","import React, { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 500 };\n\nlet glLoaded = false;\nlet glPromise: Promise<void> | null = null;\n\nfunction loadEChartsGL(): Promise<void> {\n if (glLoaded) return Promise.resolve();\n if (!glPromise) {\n glPromise = import(\"echarts-gl\")\n .then(() => {\n glLoaded = true;\n })\n .catch((err: unknown) => {\n console.warn(\"Failed to load echarts-gl for 3D charts:\", err);\n });\n }\n return glPromise;\n}\n\n/** Wrapper that delays mount until echarts-gl is loaded */\nfunction WithGL({ children, style, className }: { children: React.ReactNode; style?: React.CSSProperties; className?: string }) {\n const [ready, setReady] = useState(glLoaded);\n\n useEffect(() => {\n if (glLoaded) {\n setReady(true);\n return;\n }\n loadEChartsGL().then(() => setReady(true));\n }, []);\n\n if (!ready) {\n return (\n <div style={{ ...DEFAULT_STYLE, ...style, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }} className={className}>\n <span style={{ color: \"#9ca3af\", fontSize: 14 }}>Loading 3D engine...</span>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n\n/**\n * EChart3D — 3D chart component that lazy-loads the bundled echarts-gl\n * engine on first mount (split into its own chunk to keep the main bundle small).\n */\nconst EChart3DInner = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChart3DInner.displayName = \"EChart3DInner\";\n\nconst EChart3DBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (props, ref) => {\n const { style, className, ...rest } = props;\n return (\n <WithGL style={style} className={className}>\n <EChart3DInner ref={ref} style={style} className={className} {...rest} />\n </WithGL>\n );\n }\n);\n\nEChart3DBase.displayName = \"EChart3D\";\n\nfunction create3DSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n tooltip = true,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = {};\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if ([\"bar3D\", \"scatter3D\", \"line3D\", \"surface\"].includes(seriesType)) {\n base.xAxis3D = { type: \"value\" };\n base.yAxis3D = { type: \"value\" };\n base.zAxis3D = { type: \"value\" };\n base.grid3D = {};\n }\n\n base.series = [{ type: seriesType, data, ...seriesOptions }];\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [data, title, tooltip, seriesOptions, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\nfunction createGlobeComponent(): React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n> {\n const Component: React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n > = ({\n title,\n globe,\n series = [],\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n base.globe = globe ?? {\n baseTexture: \"\",\n shading: \"lambert\",\n atmosphere: { show: true },\n };\n\n if (series.length > 0) {\n base.series = series;\n }\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [title, globe, series, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = \"EChart3D.Globe\";\n return Component;\n}\n\nexport const EChart3D = Object.assign(EChart3DBase, {\n Bar: create3DSeriesComponent(\"bar3D\", \"EChart3D.Bar\"),\n Scatter: create3DSeriesComponent(\"scatter3D\", \"EChart3D.Scatter\"),\n Line: create3DSeriesComponent(\"line3D\", \"EChart3D.Line\"),\n Surface: create3DSeriesComponent(\"surface\", \"EChart3D.Surface\"),\n Globe: createGlobeComponent(),\n});\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type { EChartBaseProps, ChartDivProps } from \"../types\";\n\nexport interface GraphicElement {\n type:\n | \"rect\"\n | \"circle\"\n | \"ring\"\n | \"arc\"\n | \"polygon\"\n | \"polyline\"\n | \"path\"\n | \"image\"\n | \"text\"\n | \"group\";\n left?: number | string;\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n shape?: Record<string, any>;\n style?: Record<string, any>;\n children?: GraphicElement[];\n onclick?: (e: any) => void;\n onmouseover?: (e: any) => void;\n onmouseout?: (e: any) => void;\n [key: string]: any;\n}\n\nexport interface EChartGraphicProps\n extends Omit<EChartBaseProps, \"option\">,\n ChartDivProps,\n React.HTMLAttributes<HTMLDivElement> {\n elements: GraphicElement[];\n option?: Partial<EChartsOption>;\n}\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/**\n * EChartGraphic — for custom drawing via ECharts graphic layer.\n * Supports rect, circle, ring, arc, polygon, polyline, path, image, text, group elements.\n */\nexport const EChartGraphic = forwardRef<HTMLDivElement, EChartGraphicProps>(\n (\n {\n elements,\n option: extraOption = {},\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const option = useMemo((): EChartsOption => {\n return {\n graphic: {\n elements,\n },\n ...extraOption,\n } as EChartsOption;\n }, [elements, extraOption]);\n\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartGraphic.displayName = \"EChartGraphic\";\n","import { use } from \"echarts/core\";\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n} from \"echarts/charts\";\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComponent as RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n} from \"echarts/components\";\nimport { CanvasRenderer, SVGRenderer } from \"echarts/renderers\";\n\nconst allCharts = [\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n] as const;\n\nconst allComponents = [\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n] as const;\n\nconst allRenderers = [CanvasRenderer, SVGRenderer] as const;\n\nlet registered = false;\n\n/** Register all ECharts chart types, components, and renderers. Convenient for demos/quick starts. */\nexport function registerAll(): void {\n if (registered) return;\n use([...allCharts, ...allComponents, ...allRenderers] as any);\n registered = true;\n}\n\n/** Register specific chart types by name for tree-shaking optimization. */\nexport function registerCharts(\n ...chartTypes: Array<(typeof allCharts)[number]>\n): void {\n use(chartTypes as any);\n}\n\n/** Register specific components by reference. */\nexport function registerComponents(\n ...components: Array<(typeof allComponents)[number]>\n): void {\n use(components as any);\n}\n\n// Re-export individual charts and components for manual registration\nexport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n DatasetComponent,\n SingleAxisComponent,\n CanvasRenderer,\n SVGRenderer,\n};\n","import { registerTheme as echartsRegisterTheme } from \"echarts/core\";\n\n/** Dark theme preset */\nexport const darkTheme = {\n backgroundColor: \"#1a1a2e\",\n textStyle: { color: \"#e0e0e0\" },\n title: { textStyle: { color: \"#ffffff\" } },\n legend: { textStyle: { color: \"#cccccc\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n color: [\n \"#5470c6\",\n \"#91cc75\",\n \"#fac858\",\n \"#ee6666\",\n \"#73c0de\",\n \"#3ba272\",\n \"#fc8452\",\n \"#9a60b4\",\n \"#ea7ccc\",\n ],\n};\n\n/** Vintage theme preset */\nexport const vintageTheme = {\n color: [\n \"#d87c7c\",\n \"#919e8b\",\n \"#d7ab82\",\n \"#6e7074\",\n \"#61a0a8\",\n \"#efa18d\",\n \"#787464\",\n \"#cc7e63\",\n \"#724e58\",\n \"#4b565b\",\n ],\n backgroundColor: \"#fef8ef\",\n textStyle: {},\n title: { textStyle: { color: \"#333333\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n};\n\n/** Pastel theme preset */\nexport const pastelTheme = {\n color: [\n \"#c4b5fd\",\n \"#a5f3fc\",\n \"#fca5a5\",\n \"#fde68a\",\n \"#a7f3d0\",\n \"#fbcfe8\",\n \"#c7d2fe\",\n \"#fed7aa\",\n ],\n backgroundColor: \"#fafafa\",\n textStyle: { color: \"#555\" },\n title: { textStyle: { color: \"#333\" } },\n};\n\n/** Register a named theme with ECharts */\nexport function registerTheme(name: string, theme: object): void {\n echartsRegisterTheme(name, theme);\n}\n\n/** Register all built-in theme presets */\nexport function registerBuiltinThemes(): void {\n registerTheme(\"dark-preset\", darkTheme);\n registerTheme(\"vintage\", vintageTheme);\n registerTheme(\"pastel\", pastelTheme);\n}\n"]}
package/dist/index.js CHANGED
@@ -37,6 +37,34 @@ function useDarkMode() {
37
37
  () => false
38
38
  );
39
39
  }
40
+ function collectOptionTypes(option) {
41
+ const types = /* @__PURE__ */ new Set();
42
+ const o = option;
43
+ const series = o.series;
44
+ const arr = Array.isArray(series) ? series : series ? [series] : [];
45
+ for (const s of arr) {
46
+ const t = s?.type;
47
+ if (typeof t === "string") types.add(`series:${t}`);
48
+ }
49
+ for (const key of [
50
+ "radar",
51
+ "polar",
52
+ "geo",
53
+ "parallel",
54
+ "calendar",
55
+ "singleAxis",
56
+ "timeline",
57
+ "visualMap",
58
+ "dataZoom",
59
+ "toolbox",
60
+ "brush",
61
+ "graphic",
62
+ "dataset"
63
+ ]) {
64
+ if (o[key] != null) types.add(key);
65
+ }
66
+ return [...types];
67
+ }
40
68
  function useECharts(options) {
41
69
  const {
42
70
  option,
@@ -74,7 +102,14 @@ function useECharts(options) {
74
102
  const chart = instanceRef.current;
75
103
  if (!chart || !option) return;
76
104
  const finalOption = autoDark ? { backgroundColor: "transparent", ...option } : option;
77
- chart.setOption(finalOption, { notMerge, lazyUpdate });
105
+ try {
106
+ chart.setOption(finalOption, { notMerge, lazyUpdate });
107
+ } catch (err) {
108
+ const types = collectOptionTypes(finalOption);
109
+ throw new Error(
110
+ `[fancy-echarts] Failed to render chart \u2014 a chart/component type is likely not registered. This option uses: ${types.length ? types.join(", ") : "(none detected)"}. Call registerAll() once at app startup, or registerCharts(...)/registerComponents(...) for the types you use. Registration is module-scoped per bundle entry \u2014 every entry that renders charts must register. Original error: ${err instanceof Error ? err.message : String(err)}`
111
+ );
112
+ }
78
113
  }, [option, notMerge, lazyUpdate, autoDark]);
79
114
  useEffect(() => {
80
115
  const chart = instanceRef.current;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/hooks/use-resize-observer.ts","../src/hooks/use-echarts.ts","../src/components/EChart.tsx","../src/components/EChart3D.tsx","../src/components/EChartGraphic.tsx","../src/utils/register.ts","../src/utils/themes.ts"],"names":["useRef","useEffect","DEFAULT_STYLE","useState","jsx","forwardRef","useMemo","RadarComp","echartsRegisterTheme"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\n\nexport function useResizeObserver(\n ref: RefObject<HTMLElement | null>,\n callback: () => void\n): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n callbackRef.current();\n });\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [ref]);\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type RefObject } from \"react\";\nimport { init, getInstanceByDom, type EChartsType } from \"echarts/core\";\nimport type { EChartsOption } from \"echarts\";\n\ntype ECharts = EChartsType;\nimport { useResizeObserver } from \"./use-resize-observer\";\n\nexport interface UseEChartsOptions {\n option: EChartsOption;\n theme?: string | object;\n renderer?: \"canvas\" | \"svg\";\n notMerge?: boolean;\n lazyUpdate?: boolean;\n showLoading?: boolean;\n loadingOption?: object;\n onEvents?: Record<string, (params: any) => void>;\n autoResize?: boolean;\n}\n\nexport interface UseEChartsReturn {\n chartRef: RefObject<HTMLDivElement | null>;\n instance: ECharts | null;\n}\n\n/** Detect system dark mode preference reactively. */\nfunction useDarkMode(): boolean {\n return useSyncExternalStore(\n (callback) => {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n },\n () => window.matchMedia(\"(prefers-color-scheme: dark)\").matches,\n () => false,\n );\n}\n\nexport function useECharts(options: UseEChartsOptions): UseEChartsReturn {\n const {\n option,\n theme,\n renderer = \"canvas\",\n notMerge = false,\n lazyUpdate = false,\n showLoading = false,\n loadingOption,\n onEvents,\n autoResize = true,\n } = options;\n\n const isDark = useDarkMode();\n // Auto-detect theme: use explicit theme if provided, otherwise \"dark\" or undefined\n const autoDark = theme === undefined && isDark;\n const resolvedTheme = theme !== undefined ? theme : isDark ? \"dark\" : undefined;\n\n const chartRef = useRef<HTMLDivElement | null>(null);\n const instanceRef = useRef<ECharts | null>(null);\n const [instance, setInstance] = useState<ECharts | null>(null);\n\n // Init/dispose — re-init when theme changes (including dark mode toggle)\n useEffect(() => {\n if (!chartRef.current) return;\n\n // Dispose any existing instance (handles StrictMode double-mount)\n const existing = getInstanceByDom(chartRef.current);\n if (existing) {\n existing.dispose();\n }\n\n const chart = init(chartRef.current, resolvedTheme, { renderer });\n instanceRef.current = chart;\n setInstance(chart);\n\n return () => {\n chart.dispose();\n instanceRef.current = null;\n setInstance(null);\n };\n }, [resolvedTheme, renderer]);\n\n // Set option\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !option) return;\n // When using auto-detected dark theme, force transparent background\n // so charts blend with the page's own dark background\n const finalOption = autoDark\n ? { backgroundColor: \"transparent\", ...option }\n : option;\n chart.setOption(finalOption, { notMerge, lazyUpdate });\n }, [option, notMerge, lazyUpdate, autoDark]);\n\n // Loading state\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart) return;\n if (showLoading) {\n chart.showLoading(\"default\", loadingOption);\n } else {\n chart.hideLoading();\n }\n }, [showLoading, loadingOption]);\n\n // Event binding\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !onEvents) return;\n\n const entries = Object.entries(onEvents);\n for (const [event, handler] of entries) {\n chart.on(event, handler);\n }\n\n return () => {\n for (const [event, handler] of entries) {\n chart.off(event, handler);\n }\n };\n }, [onEvents]);\n\n // Auto-resize\n useResizeObserver(chartRef, () => {\n if (autoResize && instanceRef.current) {\n instanceRef.current.resize();\n }\n });\n\n return { chartRef, instance };\n}\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/** Base EChart component — accepts any ECharts option. */\nconst EChartBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartBase.displayName = \"EChart\";\n\n// --- Helper to create typed series sub-components ---\n\nfunction createSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n xAxis,\n yAxis,\n tooltip = true,\n legend = false,\n grid,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: EChartsOption = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = { trigger: \"axis\" };\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if (legend === true) {\n base.legend = {};\n } else if (legend && typeof legend === \"object\") {\n base.legend = legend;\n }\n\n if (grid) {\n base.grid = grid;\n }\n\n // Handle axis-based charts\n const axisCharts = [\n \"line\",\n \"bar\",\n \"scatter\",\n \"candlestick\",\n \"boxplot\",\n \"heatmap\",\n \"effectScatter\",\n \"pictorialBar\",\n ];\n if (axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? { type: \"category\" };\n base.yAxis = yAxis ?? { type: \"value\" };\n }\n\n // Handle data format\n if (Array.isArray(data)) {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n } else if (data && typeof data === \"object\" && \"series\" in data) {\n // Multi-series: { categories: [...], series: [{ name, data }, ...] }\n const multiData = data as {\n categories?: string[];\n series: Array<{ name?: string; data: any[]; [k: string]: any }>;\n };\n if (multiData.categories && axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? {\n type: \"category\",\n data: multiData.categories,\n };\n }\n base.series = multiData.series.map((s) => ({\n type: seriesType,\n ...seriesOptions,\n ...s,\n })) as any;\n } else {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n }\n\n return { ...base, ...extraOption };\n }, [\n data,\n title,\n xAxis,\n yAxis,\n tooltip,\n legend,\n grid,\n seriesOptions,\n extraOption,\n ]);\n\n return (\n <EChartBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\n// --- Compound component with all chart type sub-components ---\n\nexport const EChart = Object.assign(EChartBase, {\n Line: createSeriesComponent(\"line\", \"EChart.Line\"),\n Bar: createSeriesComponent(\"bar\", \"EChart.Bar\"),\n Pie: createSeriesComponent(\"pie\", \"EChart.Pie\"),\n Scatter: createSeriesComponent(\"scatter\", \"EChart.Scatter\"),\n Radar: createSeriesComponent(\"radar\", \"EChart.Radar\"),\n Heatmap: createSeriesComponent(\"heatmap\", \"EChart.Heatmap\"),\n Gauge: createSeriesComponent(\"gauge\", \"EChart.Gauge\"),\n Funnel: createSeriesComponent(\"funnel\", \"EChart.Funnel\"),\n Treemap: createSeriesComponent(\"treemap\", \"EChart.Treemap\"),\n Sunburst: createSeriesComponent(\"sunburst\", \"EChart.Sunburst\"),\n Sankey: createSeriesComponent(\"sankey\", \"EChart.Sankey\"),\n Graph: createSeriesComponent(\"graph\", \"EChart.Graph\"),\n Candlestick: createSeriesComponent(\"candlestick\", \"EChart.Candlestick\"),\n Boxplot: createSeriesComponent(\"boxplot\", \"EChart.Boxplot\"),\n Parallel: createSeriesComponent(\"parallel\", \"EChart.Parallel\"),\n ThemeRiver: createSeriesComponent(\"themeRiver\", \"EChart.ThemeRiver\"),\n Map: createSeriesComponent(\"map\", \"EChart.Map\"),\n Custom: createSeriesComponent(\"custom\", \"EChart.Custom\"),\n EffectScatter: createSeriesComponent(\n \"effectScatter\",\n \"EChart.EffectScatter\"\n ),\n PictorialBar: createSeriesComponent(\"pictorialBar\", \"EChart.PictorialBar\"),\n});\n","import React, { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 500 };\n\nlet glLoaded = false;\nlet glPromise: Promise<void> | null = null;\n\nfunction loadEChartsGL(): Promise<void> {\n if (glLoaded) return Promise.resolve();\n if (!glPromise) {\n glPromise = import(\"echarts-gl\")\n .then(() => {\n glLoaded = true;\n })\n .catch((err: unknown) => {\n console.warn(\"Failed to load echarts-gl for 3D charts:\", err);\n });\n }\n return glPromise;\n}\n\n/** Wrapper that delays mount until echarts-gl is loaded */\nfunction WithGL({ children, style, className }: { children: React.ReactNode; style?: React.CSSProperties; className?: string }) {\n const [ready, setReady] = useState(glLoaded);\n\n useEffect(() => {\n if (glLoaded) {\n setReady(true);\n return;\n }\n loadEChartsGL().then(() => setReady(true));\n }, []);\n\n if (!ready) {\n return (\n <div style={{ ...DEFAULT_STYLE, ...style, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }} className={className}>\n <span style={{ color: \"#9ca3af\", fontSize: 14 }}>Loading 3D engine...</span>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n\n/**\n * EChart3D — 3D chart component that lazy-loads the bundled echarts-gl\n * engine on first mount (split into its own chunk to keep the main bundle small).\n */\nconst EChart3DInner = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChart3DInner.displayName = \"EChart3DInner\";\n\nconst EChart3DBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (props, ref) => {\n const { style, className, ...rest } = props;\n return (\n <WithGL style={style} className={className}>\n <EChart3DInner ref={ref} style={style} className={className} {...rest} />\n </WithGL>\n );\n }\n);\n\nEChart3DBase.displayName = \"EChart3D\";\n\nfunction create3DSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n tooltip = true,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = {};\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if ([\"bar3D\", \"scatter3D\", \"line3D\", \"surface\"].includes(seriesType)) {\n base.xAxis3D = { type: \"value\" };\n base.yAxis3D = { type: \"value\" };\n base.zAxis3D = { type: \"value\" };\n base.grid3D = {};\n }\n\n base.series = [{ type: seriesType, data, ...seriesOptions }];\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [data, title, tooltip, seriesOptions, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\nfunction createGlobeComponent(): React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n> {\n const Component: React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n > = ({\n title,\n globe,\n series = [],\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n base.globe = globe ?? {\n baseTexture: \"\",\n shading: \"lambert\",\n atmosphere: { show: true },\n };\n\n if (series.length > 0) {\n base.series = series;\n }\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [title, globe, series, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = \"EChart3D.Globe\";\n return Component;\n}\n\nexport const EChart3D = Object.assign(EChart3DBase, {\n Bar: create3DSeriesComponent(\"bar3D\", \"EChart3D.Bar\"),\n Scatter: create3DSeriesComponent(\"scatter3D\", \"EChart3D.Scatter\"),\n Line: create3DSeriesComponent(\"line3D\", \"EChart3D.Line\"),\n Surface: create3DSeriesComponent(\"surface\", \"EChart3D.Surface\"),\n Globe: createGlobeComponent(),\n});\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type { EChartBaseProps, ChartDivProps } from \"../types\";\n\nexport interface GraphicElement {\n type:\n | \"rect\"\n | \"circle\"\n | \"ring\"\n | \"arc\"\n | \"polygon\"\n | \"polyline\"\n | \"path\"\n | \"image\"\n | \"text\"\n | \"group\";\n left?: number | string;\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n shape?: Record<string, any>;\n style?: Record<string, any>;\n children?: GraphicElement[];\n onclick?: (e: any) => void;\n onmouseover?: (e: any) => void;\n onmouseout?: (e: any) => void;\n [key: string]: any;\n}\n\nexport interface EChartGraphicProps\n extends Omit<EChartBaseProps, \"option\">,\n ChartDivProps,\n React.HTMLAttributes<HTMLDivElement> {\n elements: GraphicElement[];\n option?: Partial<EChartsOption>;\n}\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/**\n * EChartGraphic — for custom drawing via ECharts graphic layer.\n * Supports rect, circle, ring, arc, polygon, polyline, path, image, text, group elements.\n */\nexport const EChartGraphic = forwardRef<HTMLDivElement, EChartGraphicProps>(\n (\n {\n elements,\n option: extraOption = {},\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const option = useMemo((): EChartsOption => {\n return {\n graphic: {\n elements,\n },\n ...extraOption,\n } as EChartsOption;\n }, [elements, extraOption]);\n\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartGraphic.displayName = \"EChartGraphic\";\n","import { use } from \"echarts/core\";\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n} from \"echarts/charts\";\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComponent as RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n} from \"echarts/components\";\nimport { CanvasRenderer, SVGRenderer } from \"echarts/renderers\";\n\nconst allCharts = [\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n] as const;\n\nconst allComponents = [\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n] as const;\n\nconst allRenderers = [CanvasRenderer, SVGRenderer] as const;\n\nlet registered = false;\n\n/** Register all ECharts chart types, components, and renderers. Convenient for demos/quick starts. */\nexport function registerAll(): void {\n if (registered) return;\n use([...allCharts, ...allComponents, ...allRenderers] as any);\n registered = true;\n}\n\n/** Register specific chart types by name for tree-shaking optimization. */\nexport function registerCharts(\n ...chartTypes: Array<(typeof allCharts)[number]>\n): void {\n use(chartTypes as any);\n}\n\n/** Register specific components by reference. */\nexport function registerComponents(\n ...components: Array<(typeof allComponents)[number]>\n): void {\n use(components as any);\n}\n\n// Re-export individual charts and components for manual registration\nexport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n DatasetComponent,\n SingleAxisComponent,\n CanvasRenderer,\n SVGRenderer,\n};\n","import { registerTheme as echartsRegisterTheme } from \"echarts/core\";\n\n/** Dark theme preset */\nexport const darkTheme = {\n backgroundColor: \"#1a1a2e\",\n textStyle: { color: \"#e0e0e0\" },\n title: { textStyle: { color: \"#ffffff\" } },\n legend: { textStyle: { color: \"#cccccc\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n color: [\n \"#5470c6\",\n \"#91cc75\",\n \"#fac858\",\n \"#ee6666\",\n \"#73c0de\",\n \"#3ba272\",\n \"#fc8452\",\n \"#9a60b4\",\n \"#ea7ccc\",\n ],\n};\n\n/** Vintage theme preset */\nexport const vintageTheme = {\n color: [\n \"#d87c7c\",\n \"#919e8b\",\n \"#d7ab82\",\n \"#6e7074\",\n \"#61a0a8\",\n \"#efa18d\",\n \"#787464\",\n \"#cc7e63\",\n \"#724e58\",\n \"#4b565b\",\n ],\n backgroundColor: \"#fef8ef\",\n textStyle: {},\n title: { textStyle: { color: \"#333333\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n};\n\n/** Pastel theme preset */\nexport const pastelTheme = {\n color: [\n \"#c4b5fd\",\n \"#a5f3fc\",\n \"#fca5a5\",\n \"#fde68a\",\n \"#a7f3d0\",\n \"#fbcfe8\",\n \"#c7d2fe\",\n \"#fed7aa\",\n ],\n backgroundColor: \"#fafafa\",\n textStyle: { color: \"#555\" },\n title: { textStyle: { color: \"#333\" } },\n};\n\n/** Register a named theme with ECharts */\nexport function registerTheme(name: string, theme: object): void {\n echartsRegisterTheme(name, theme);\n}\n\n/** Register all built-in theme presets */\nexport function registerBuiltinThemes(): void {\n registerTheme(\"dark-preset\", darkTheme);\n registerTheme(\"vintage\", vintageTheme);\n registerTheme(\"pastel\", pastelTheme);\n}\n"]}
1
+ {"version":3,"sources":["../src/hooks/use-resize-observer.ts","../src/hooks/use-echarts.ts","../src/components/EChart.tsx","../src/components/EChart3D.tsx","../src/components/EChartGraphic.tsx","../src/utils/register.ts","../src/utils/themes.ts"],"names":["useRef","useEffect","DEFAULT_STYLE","useState","jsx","forwardRef","useMemo","RadarComp","echartsRegisterTheme"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef, type RefObject } from \"react\";\n\nexport function useResizeObserver(\n ref: RefObject<HTMLElement | null>,\n callback: () => void\n): void {\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n useEffect(() => {\n const element = ref.current;\n if (!element) return;\n\n const observer = new ResizeObserver(() => {\n callbackRef.current();\n });\n\n observer.observe(element);\n\n return () => {\n observer.disconnect();\n };\n }, [ref]);\n}\n","import { useEffect, useRef, useState, useSyncExternalStore, type RefObject } from \"react\";\nimport { init, getInstanceByDom, type EChartsType } from \"echarts/core\";\nimport type { EChartsOption } from \"echarts\";\n\ntype ECharts = EChartsType;\nimport { useResizeObserver } from \"./use-resize-observer\";\n\nexport interface UseEChartsOptions {\n option: EChartsOption;\n theme?: string | object;\n renderer?: \"canvas\" | \"svg\";\n notMerge?: boolean;\n lazyUpdate?: boolean;\n showLoading?: boolean;\n loadingOption?: object;\n onEvents?: Record<string, (params: any) => void>;\n autoResize?: boolean;\n}\n\nexport interface UseEChartsReturn {\n chartRef: RefObject<HTMLDivElement | null>;\n instance: ECharts | null;\n}\n\n/** Detect system dark mode preference reactively. */\nfunction useDarkMode(): boolean {\n return useSyncExternalStore(\n (callback) => {\n const mq = window.matchMedia(\"(prefers-color-scheme: dark)\");\n mq.addEventListener(\"change\", callback);\n return () => mq.removeEventListener(\"change\", callback);\n },\n () => window.matchMedia(\"(prefers-color-scheme: dark)\").matches,\n () => false,\n );\n}\n\n/** Collect the chart/component type names an option references, so a render\n * failure can name the likely-unregistered culprits. */\nfunction collectOptionTypes(option: EChartsOption): string[] {\n const types = new Set<string>();\n const o = option as Record<string, unknown>;\n const series = o.series;\n const arr = Array.isArray(series) ? series : series ? [series] : [];\n for (const s of arr) {\n const t = (s as { type?: unknown })?.type;\n if (typeof t === \"string\") types.add(`series:${t}`);\n }\n for (const key of [\n \"radar\", \"polar\", \"geo\", \"parallel\", \"calendar\", \"singleAxis\",\n \"timeline\", \"visualMap\", \"dataZoom\", \"toolbox\", \"brush\", \"graphic\", \"dataset\",\n ]) {\n if (o[key] != null) types.add(key);\n }\n return [...types];\n}\n\nexport function useECharts(options: UseEChartsOptions): UseEChartsReturn {\n const {\n option,\n theme,\n renderer = \"canvas\",\n notMerge = false,\n lazyUpdate = false,\n showLoading = false,\n loadingOption,\n onEvents,\n autoResize = true,\n } = options;\n\n const isDark = useDarkMode();\n // Auto-detect theme: use explicit theme if provided, otherwise \"dark\" or undefined\n const autoDark = theme === undefined && isDark;\n const resolvedTheme = theme !== undefined ? theme : isDark ? \"dark\" : undefined;\n\n const chartRef = useRef<HTMLDivElement | null>(null);\n const instanceRef = useRef<ECharts | null>(null);\n const [instance, setInstance] = useState<ECharts | null>(null);\n\n // Init/dispose — re-init when theme changes (including dark mode toggle)\n useEffect(() => {\n if (!chartRef.current) return;\n\n // Dispose any existing instance (handles StrictMode double-mount)\n const existing = getInstanceByDom(chartRef.current);\n if (existing) {\n existing.dispose();\n }\n\n const chart = init(chartRef.current, resolvedTheme, { renderer });\n instanceRef.current = chart;\n setInstance(chart);\n\n return () => {\n chart.dispose();\n instanceRef.current = null;\n setInstance(null);\n };\n }, [resolvedTheme, renderer]);\n\n // Set option\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !option) return;\n // When using auto-detected dark theme, force transparent background\n // so charts blend with the page's own dark background\n const finalOption = autoDark\n ? { backgroundColor: \"transparent\", ...option }\n : option;\n try {\n chart.setOption(finalOption, { notMerge, lazyUpdate });\n } catch (err) {\n // echarts throws a cryptic minified error (e.g. \"_u[o] is not a\n // constructor\") when an option uses a chart/component type that was\n // never registered. Re-throw something actionable that names the likely\n // culprits and points at registration — which is module-scoped per\n // bundle, so every entry that renders charts must call registerAll().\n const types = collectOptionTypes(finalOption);\n throw new Error(\n `[fancy-echarts] Failed to render chart — a chart/component type is likely not registered. ` +\n `This option uses: ${types.length ? types.join(\", \") : \"(none detected)\"}. ` +\n `Call registerAll() once at app startup, or registerCharts(...)/registerComponents(...) for the types you use. ` +\n `Registration is module-scoped per bundle entry — every entry that renders charts must register. ` +\n `Original error: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n }, [option, notMerge, lazyUpdate, autoDark]);\n\n // Loading state\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart) return;\n if (showLoading) {\n chart.showLoading(\"default\", loadingOption);\n } else {\n chart.hideLoading();\n }\n }, [showLoading, loadingOption]);\n\n // Event binding\n useEffect(() => {\n const chart = instanceRef.current;\n if (!chart || !onEvents) return;\n\n const entries = Object.entries(onEvents);\n for (const [event, handler] of entries) {\n chart.on(event, handler);\n }\n\n return () => {\n for (const [event, handler] of entries) {\n chart.off(event, handler);\n }\n };\n }, [onEvents]);\n\n // Auto-resize\n useResizeObserver(chartRef, () => {\n if (autoResize && instanceRef.current) {\n instanceRef.current.resize();\n }\n });\n\n return { chartRef, instance };\n}\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/** Base EChart component — accepts any ECharts option. */\nconst EChartBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartBase.displayName = \"EChart\";\n\n// --- Helper to create typed series sub-components ---\n\nfunction createSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n xAxis,\n yAxis,\n tooltip = true,\n legend = false,\n grid,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: EChartsOption = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = { trigger: \"axis\" };\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if (legend === true) {\n base.legend = {};\n } else if (legend && typeof legend === \"object\") {\n base.legend = legend;\n }\n\n if (grid) {\n base.grid = grid;\n }\n\n // Handle axis-based charts\n const axisCharts = [\n \"line\",\n \"bar\",\n \"scatter\",\n \"candlestick\",\n \"boxplot\",\n \"heatmap\",\n \"effectScatter\",\n \"pictorialBar\",\n ];\n if (axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? { type: \"category\" };\n base.yAxis = yAxis ?? { type: \"value\" };\n }\n\n // Handle data format\n if (Array.isArray(data)) {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n } else if (data && typeof data === \"object\" && \"series\" in data) {\n // Multi-series: { categories: [...], series: [{ name, data }, ...] }\n const multiData = data as {\n categories?: string[];\n series: Array<{ name?: string; data: any[]; [k: string]: any }>;\n };\n if (multiData.categories && axisCharts.includes(seriesType)) {\n base.xAxis = xAxis ?? {\n type: \"category\",\n data: multiData.categories,\n };\n }\n base.series = multiData.series.map((s) => ({\n type: seriesType,\n ...seriesOptions,\n ...s,\n })) as any;\n } else {\n base.series = [{ type: seriesType, data, ...seriesOptions }] as any;\n }\n\n return { ...base, ...extraOption };\n }, [\n data,\n title,\n xAxis,\n yAxis,\n tooltip,\n legend,\n grid,\n seriesOptions,\n extraOption,\n ]);\n\n return (\n <EChartBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\n// --- Compound component with all chart type sub-components ---\n\nexport const EChart = Object.assign(EChartBase, {\n Line: createSeriesComponent(\"line\", \"EChart.Line\"),\n Bar: createSeriesComponent(\"bar\", \"EChart.Bar\"),\n Pie: createSeriesComponent(\"pie\", \"EChart.Pie\"),\n Scatter: createSeriesComponent(\"scatter\", \"EChart.Scatter\"),\n Radar: createSeriesComponent(\"radar\", \"EChart.Radar\"),\n Heatmap: createSeriesComponent(\"heatmap\", \"EChart.Heatmap\"),\n Gauge: createSeriesComponent(\"gauge\", \"EChart.Gauge\"),\n Funnel: createSeriesComponent(\"funnel\", \"EChart.Funnel\"),\n Treemap: createSeriesComponent(\"treemap\", \"EChart.Treemap\"),\n Sunburst: createSeriesComponent(\"sunburst\", \"EChart.Sunburst\"),\n Sankey: createSeriesComponent(\"sankey\", \"EChart.Sankey\"),\n Graph: createSeriesComponent(\"graph\", \"EChart.Graph\"),\n Candlestick: createSeriesComponent(\"candlestick\", \"EChart.Candlestick\"),\n Boxplot: createSeriesComponent(\"boxplot\", \"EChart.Boxplot\"),\n Parallel: createSeriesComponent(\"parallel\", \"EChart.Parallel\"),\n ThemeRiver: createSeriesComponent(\"themeRiver\", \"EChart.ThemeRiver\"),\n Map: createSeriesComponent(\"map\", \"EChart.Map\"),\n Custom: createSeriesComponent(\"custom\", \"EChart.Custom\"),\n EffectScatter: createSeriesComponent(\n \"effectScatter\",\n \"EChart.EffectScatter\"\n ),\n PictorialBar: createSeriesComponent(\"pictorialBar\", \"EChart.PictorialBar\"),\n});\n","import React, { forwardRef, useEffect, useMemo, useState } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type {\n EChartComponentProps,\n SeriesComponentProps,\n ChartDivProps,\n} from \"../types\";\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 500 };\n\nlet glLoaded = false;\nlet glPromise: Promise<void> | null = null;\n\nfunction loadEChartsGL(): Promise<void> {\n if (glLoaded) return Promise.resolve();\n if (!glPromise) {\n glPromise = import(\"echarts-gl\")\n .then(() => {\n glLoaded = true;\n })\n .catch((err: unknown) => {\n console.warn(\"Failed to load echarts-gl for 3D charts:\", err);\n });\n }\n return glPromise;\n}\n\n/** Wrapper that delays mount until echarts-gl is loaded */\nfunction WithGL({ children, style, className }: { children: React.ReactNode; style?: React.CSSProperties; className?: string }) {\n const [ready, setReady] = useState(glLoaded);\n\n useEffect(() => {\n if (glLoaded) {\n setReady(true);\n return;\n }\n loadEChartsGL().then(() => setReady(true));\n }, []);\n\n if (!ready) {\n return (\n <div style={{ ...DEFAULT_STYLE, ...style, display: \"flex\", alignItems: \"center\", justifyContent: \"center\" }} className={className}>\n <span style={{ color: \"#9ca3af\", fontSize: 14 }}>Loading 3D engine...</span>\n </div>\n );\n }\n\n return <>{children}</>;\n}\n\n/**\n * EChart3D — 3D chart component that lazy-loads the bundled echarts-gl\n * engine on first mount (split into its own chunk to keep the main bundle small).\n */\nconst EChart3DInner = forwardRef<HTMLDivElement, EChartComponentProps>(\n (\n {\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChart3DInner.displayName = \"EChart3DInner\";\n\nconst EChart3DBase = forwardRef<HTMLDivElement, EChartComponentProps>(\n (props, ref) => {\n const { style, className, ...rest } = props;\n return (\n <WithGL style={style} className={className}>\n <EChart3DInner ref={ref} style={style} className={className} {...rest} />\n </WithGL>\n );\n }\n);\n\nEChart3DBase.displayName = \"EChart3D\";\n\nfunction create3DSeriesComponent(\n seriesType: string,\n displayName: string\n): React.FC<SeriesComponentProps & ChartDivProps> {\n const Component: React.FC<SeriesComponentProps & ChartDivProps> = ({\n data,\n title,\n tooltip = true,\n seriesOptions = {},\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n if (tooltip === true) {\n base.tooltip = {};\n } else if (tooltip && typeof tooltip === \"object\") {\n base.tooltip = tooltip;\n }\n\n if ([\"bar3D\", \"scatter3D\", \"line3D\", \"surface\"].includes(seriesType)) {\n base.xAxis3D = { type: \"value\" };\n base.yAxis3D = { type: \"value\" };\n base.zAxis3D = { type: \"value\" };\n base.grid3D = {};\n }\n\n base.series = [{ type: seriesType, data, ...seriesOptions }];\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [data, title, tooltip, seriesOptions, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = displayName;\n return Component;\n}\n\nfunction createGlobeComponent(): React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n> {\n const Component: React.FC<\n Omit<SeriesComponentProps, \"data\"> &\n ChartDivProps & { globe?: any; series?: any[] }\n > = ({\n title,\n globe,\n series = [],\n option: extraOption = {},\n style,\n className,\n ...rest\n }) => {\n const option = useMemo((): EChartsOption => {\n const base: any = {};\n\n if (title) {\n base.title = { text: title };\n }\n\n base.globe = globe ?? {\n baseTexture: \"\",\n shading: \"lambert\",\n atmosphere: { show: true },\n };\n\n if (series.length > 0) {\n base.series = series;\n }\n\n return { ...base, ...extraOption } as EChartsOption;\n }, [title, globe, series, extraOption]);\n\n return (\n <EChart3DBase\n option={option}\n style={style}\n className={className}\n {...rest}\n />\n );\n };\n\n Component.displayName = \"EChart3D.Globe\";\n return Component;\n}\n\nexport const EChart3D = Object.assign(EChart3DBase, {\n Bar: create3DSeriesComponent(\"bar3D\", \"EChart3D.Bar\"),\n Scatter: create3DSeriesComponent(\"scatter3D\", \"EChart3D.Scatter\"),\n Line: create3DSeriesComponent(\"line3D\", \"EChart3D.Line\"),\n Surface: create3DSeriesComponent(\"surface\", \"EChart3D.Surface\"),\n Globe: createGlobeComponent(),\n});\n","import React, { forwardRef, useMemo } from \"react\";\nimport type { EChartsOption } from \"echarts\";\nimport { useECharts } from \"../hooks/use-echarts\";\nimport type { EChartBaseProps, ChartDivProps } from \"../types\";\n\nexport interface GraphicElement {\n type:\n | \"rect\"\n | \"circle\"\n | \"ring\"\n | \"arc\"\n | \"polygon\"\n | \"polyline\"\n | \"path\"\n | \"image\"\n | \"text\"\n | \"group\";\n left?: number | string;\n top?: number | string;\n right?: number | string;\n bottom?: number | string;\n shape?: Record<string, any>;\n style?: Record<string, any>;\n children?: GraphicElement[];\n onclick?: (e: any) => void;\n onmouseover?: (e: any) => void;\n onmouseout?: (e: any) => void;\n [key: string]: any;\n}\n\nexport interface EChartGraphicProps\n extends Omit<EChartBaseProps, \"option\">,\n ChartDivProps,\n React.HTMLAttributes<HTMLDivElement> {\n elements: GraphicElement[];\n option?: Partial<EChartsOption>;\n}\n\nconst DEFAULT_STYLE: React.CSSProperties = { width: \"100%\", height: 400 };\n\n/**\n * EChartGraphic — for custom drawing via ECharts graphic layer.\n * Supports rect, circle, ring, arc, polygon, polyline, path, image, text, group elements.\n */\nexport const EChartGraphic = forwardRef<HTMLDivElement, EChartGraphicProps>(\n (\n {\n elements,\n option: extraOption = {},\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize = true,\n style,\n className,\n ...rest\n },\n _ref\n ) => {\n const option = useMemo((): EChartsOption => {\n return {\n graphic: {\n elements,\n },\n ...extraOption,\n } as EChartsOption;\n }, [elements, extraOption]);\n\n const { chartRef } = useECharts({\n option,\n theme,\n renderer,\n notMerge,\n lazyUpdate,\n showLoading,\n loadingOption,\n onEvents,\n autoResize,\n });\n\n return (\n <div\n ref={chartRef}\n style={{ ...DEFAULT_STYLE, ...style }}\n className={className}\n {...rest}\n />\n );\n }\n);\n\nEChartGraphic.displayName = \"EChartGraphic\";\n","import { use } from \"echarts/core\";\nimport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n} from \"echarts/charts\";\nimport {\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComponent as RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n} from \"echarts/components\";\nimport { CanvasRenderer, SVGRenderer } from \"echarts/renderers\";\n\nconst allCharts = [\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n] as const;\n\nconst allComponents = [\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n ParallelComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n RadarComp,\n DatasetComponent,\n MarkLineComponent,\n MarkPointComponent,\n MarkAreaComponent,\n TimelineComponent,\n BrushComponent,\n SingleAxisComponent,\n] as const;\n\nconst allRenderers = [CanvasRenderer, SVGRenderer] as const;\n\nlet registered = false;\n\n/** Register all ECharts chart types, components, and renderers. Convenient for demos/quick starts. */\nexport function registerAll(): void {\n if (registered) return;\n use([...allCharts, ...allComponents, ...allRenderers] as any);\n registered = true;\n}\n\n/** Register specific chart types by name for tree-shaking optimization. */\nexport function registerCharts(\n ...chartTypes: Array<(typeof allCharts)[number]>\n): void {\n use(chartTypes as any);\n}\n\n/** Register specific components by reference. */\nexport function registerComponents(\n ...components: Array<(typeof allComponents)[number]>\n): void {\n use(components as any);\n}\n\n// Re-export individual charts and components for manual registration\nexport {\n LineChart,\n BarChart,\n PieChart,\n ScatterChart,\n RadarChart,\n HeatmapChart,\n GaugeChart,\n FunnelChart,\n TreemapChart,\n SunburstChart,\n SankeyChart,\n GraphChart,\n CandlestickChart,\n BoxplotChart,\n ParallelChart,\n ThemeRiverChart,\n MapChart,\n CustomChart,\n EffectScatterChart,\n PictorialBarChart,\n GridComponent,\n TooltipComponent,\n TitleComponent,\n LegendComponent,\n DataZoomComponent,\n ToolboxComponent,\n VisualMapComponent,\n GeoComponent,\n CalendarComponent,\n GraphicComponent,\n PolarComponent,\n DatasetComponent,\n SingleAxisComponent,\n CanvasRenderer,\n SVGRenderer,\n};\n","import { registerTheme as echartsRegisterTheme } from \"echarts/core\";\n\n/** Dark theme preset */\nexport const darkTheme = {\n backgroundColor: \"#1a1a2e\",\n textStyle: { color: \"#e0e0e0\" },\n title: { textStyle: { color: \"#ffffff\" } },\n legend: { textStyle: { color: \"#cccccc\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#444\" } },\n splitLine: { lineStyle: { color: \"#333\" } },\n axisLabel: { color: \"#aaa\" },\n },\n color: [\n \"#5470c6\",\n \"#91cc75\",\n \"#fac858\",\n \"#ee6666\",\n \"#73c0de\",\n \"#3ba272\",\n \"#fc8452\",\n \"#9a60b4\",\n \"#ea7ccc\",\n ],\n};\n\n/** Vintage theme preset */\nexport const vintageTheme = {\n color: [\n \"#d87c7c\",\n \"#919e8b\",\n \"#d7ab82\",\n \"#6e7074\",\n \"#61a0a8\",\n \"#efa18d\",\n \"#787464\",\n \"#cc7e63\",\n \"#724e58\",\n \"#4b565b\",\n ],\n backgroundColor: \"#fef8ef\",\n textStyle: {},\n title: { textStyle: { color: \"#333333\" } },\n categoryAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n valueAxis: {\n axisLine: { lineStyle: { color: \"#ccc\" } },\n splitLine: { lineStyle: { color: \"#eee\" } },\n },\n};\n\n/** Pastel theme preset */\nexport const pastelTheme = {\n color: [\n \"#c4b5fd\",\n \"#a5f3fc\",\n \"#fca5a5\",\n \"#fde68a\",\n \"#a7f3d0\",\n \"#fbcfe8\",\n \"#c7d2fe\",\n \"#fed7aa\",\n ],\n backgroundColor: \"#fafafa\",\n textStyle: { color: \"#555\" },\n title: { textStyle: { color: \"#333\" } },\n};\n\n/** Register a named theme with ECharts */\nexport function registerTheme(name: string, theme: object): void {\n echartsRegisterTheme(name, theme);\n}\n\n/** Register all built-in theme presets */\nexport function registerBuiltinThemes(): void {\n registerTheme(\"dark-preset\", darkTheme);\n registerTheme(\"vintage\", vintageTheme);\n registerTheme(\"pastel\", pastelTheme);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@particle-academy/fancy-echarts",
3
- "version": "4.0.0",
3
+ "version": "5.0.0",
4
4
  "description": "Typed React wrapper around Apache ECharts — every chart type from a single <EChart> component, lazy module registration, four built-in themes. Diagram subsystem removed in 4.0; node-edge graphs live in @particle-academy/fancy-flow now.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -44,10 +44,10 @@
44
44
  "components"
45
45
  ],
46
46
  "peerDependencies": {
47
+ "echarts": "^6.1.0",
48
+ "echarts-gl": "^2.1.0",
47
49
  "react": "^18.0.0 || ^19.0.0",
48
- "react-dom": "^18.0.0 || ^19.0.0",
49
- "echarts": "^5.5.0",
50
- "echarts-gl": "^2.0.0"
50
+ "react-dom": "^18.0.0 || ^19.0.0"
51
51
  },
52
52
  "peerDependenciesMeta": {
53
53
  "echarts-gl": {
@@ -57,8 +57,8 @@
57
57
  "devDependencies": {
58
58
  "@types/react": "^19.0.0",
59
59
  "@types/react-dom": "^19.0.0",
60
- "echarts": "^5.6.0",
61
- "echarts-gl": "^2.0.9",
60
+ "echarts": "^6.1.0",
61
+ "echarts-gl": "^2.1.0",
62
62
  "react": "^19.0.0",
63
63
  "react-dom": "^19.0.0",
64
64
  "tsup": "^8.5.0",
@@ -67,5 +67,12 @@
67
67
  "publishConfig": {
68
68
  "access": "public"
69
69
  },
70
- "license": "MIT"
70
+ "license": "MIT",
71
+ "overrides": {
72
+ "esbuild": "^0.28.1",
73
+ "picomatch": "^4.0.4",
74
+ "postcss": "^8.5.10",
75
+ "react-router": "^7.15.1",
76
+ "vite": "^6.4.2"
77
+ }
71
78
  }