minerva-design 1.2.0 → 1.3.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/CHANGELOG.md +7 -0
- package/dist/charts/canvas.d.cts +4 -1
- package/dist/charts/canvas.d.ts +4 -1
- package/dist/charts/core.cjs +1 -1
- package/dist/charts/core.d.cts +5 -2
- package/dist/charts/core.d.ts +5 -2
- package/dist/charts/core.js +6 -4
- package/dist/charts/engine/canvas.cjs +1 -1
- package/dist/charts/engine/canvas.cjs.map +1 -1
- package/dist/charts/engine/canvas.js +65 -53
- package/dist/charts/engine/canvas.js.map +1 -1
- package/dist/charts/engine/chart.cjs +1 -2
- package/dist/charts/engine/chart.cjs.map +1 -1
- package/dist/charts/engine/chart.js +342 -323
- package/dist/charts/engine/chart.js.map +1 -1
- package/dist/charts/engine/color.cjs +1 -1
- package/dist/charts/engine/color.cjs.map +1 -1
- package/dist/charts/engine/color.d.cts +17 -0
- package/dist/charts/engine/color.d.ts +17 -0
- package/dist/charts/engine/color.js +27 -3
- package/dist/charts/engine/color.js.map +1 -1
- package/dist/charts/engine/controller.cjs +2 -2
- package/dist/charts/engine/controller.cjs.map +1 -1
- package/dist/charts/engine/controller.d.cts +6 -0
- package/dist/charts/engine/controller.d.ts +6 -0
- package/dist/charts/engine/controller.js +317 -253
- package/dist/charts/engine/controller.js.map +1 -1
- package/dist/charts/engine/curve.cjs +2 -0
- package/dist/charts/engine/curve.cjs.map +1 -0
- package/dist/charts/engine/curve.d.cts +15 -0
- package/dist/charts/engine/curve.d.ts +15 -0
- package/dist/charts/engine/curve.js +56 -0
- package/dist/charts/engine/curve.js.map +1 -0
- package/dist/charts/engine/data.cjs +1 -1
- package/dist/charts/engine/data.cjs.map +1 -1
- package/dist/charts/engine/data.d.cts +15 -2
- package/dist/charts/engine/data.d.ts +15 -2
- package/dist/charts/engine/data.js +98 -38
- package/dist/charts/engine/data.js.map +1 -1
- package/dist/charts/engine/dom.cjs +1 -1
- package/dist/charts/engine/dom.cjs.map +1 -1
- package/dist/charts/engine/dom.d.cts +5 -3
- package/dist/charts/engine/dom.d.ts +5 -3
- package/dist/charts/engine/dom.js +27 -22
- package/dist/charts/engine/dom.js.map +1 -1
- package/dist/charts/engine/items.cjs +1 -1
- package/dist/charts/engine/items.cjs.map +1 -1
- package/dist/charts/engine/items.js +132 -61
- package/dist/charts/engine/items.js.map +1 -1
- package/dist/charts/engine/model.cjs +1 -1
- package/dist/charts/engine/model.cjs.map +1 -1
- package/dist/charts/engine/model.d.cts +30 -3
- package/dist/charts/engine/model.d.ts +30 -3
- package/dist/charts/engine/model.js +225 -108
- package/dist/charts/engine/model.js.map +1 -1
- package/dist/charts/engine/overlay.cjs +1 -1
- package/dist/charts/engine/overlay.cjs.map +1 -1
- package/dist/charts/engine/overlay.d.cts +2 -0
- package/dist/charts/engine/overlay.d.ts +2 -0
- package/dist/charts/engine/overlay.js +16 -16
- package/dist/charts/engine/overlay.js.map +1 -1
- package/dist/charts/engine/presets.cjs +2 -2
- package/dist/charts/engine/presets.cjs.map +1 -1
- package/dist/charts/engine/presets.d.cts +71 -5
- package/dist/charts/engine/presets.d.ts +71 -5
- package/dist/charts/engine/presets.js +120 -33
- package/dist/charts/engine/presets.js.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs +1 -1
- package/dist/charts/engine/renderers/canvas2d.cjs.map +1 -1
- package/dist/charts/engine/renderers/canvas2d.js +149 -111
- package/dist/charts/engine/renderers/canvas2d.js.map +1 -1
- package/dist/charts/engine/renderers/range.cjs +1 -1
- package/dist/charts/engine/renderers/range.cjs.map +1 -1
- package/dist/charts/engine/renderers/range.js +4 -4
- package/dist/charts/engine/renderers/range.js.map +1 -1
- package/dist/charts/engine/renderers/shaders.cjs +37 -19
- package/dist/charts/engine/renderers/shaders.cjs.map +1 -1
- package/dist/charts/engine/renderers/shaders.d.cts +2 -2
- package/dist/charts/engine/renderers/shaders.d.ts +2 -2
- package/dist/charts/engine/renderers/shaders.js +37 -19
- package/dist/charts/engine/renderers/shaders.js.map +1 -1
- package/dist/charts/engine/renderers/types.cjs.map +1 -1
- package/dist/charts/engine/renderers/types.d.cts +11 -4
- package/dist/charts/engine/renderers/types.d.ts +11 -4
- package/dist/charts/engine/renderers/types.js.map +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs +1 -1
- package/dist/charts/engine/renderers/webgl2.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgl2.js +33 -12
- package/dist/charts/engine/renderers/webgl2.js.map +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs +1 -1
- package/dist/charts/engine/renderers/webgpu.cjs.map +1 -1
- package/dist/charts/engine/renderers/webgpu.js +18 -15
- package/dist/charts/engine/renderers/webgpu.js.map +1 -1
- package/dist/charts/engine/scene.cjs +1 -1
- package/dist/charts/engine/scene.cjs.map +1 -1
- package/dist/charts/engine/scene.d.cts +19 -6
- package/dist/charts/engine/scene.d.ts +19 -6
- package/dist/charts/engine/scene.js +201 -89
- package/dist/charts/engine/scene.js.map +1 -1
- package/dist/charts/engine/shapes/canvas.cjs +2 -0
- package/dist/charts/engine/shapes/canvas.cjs.map +1 -0
- package/dist/charts/engine/shapes/canvas.d.cts +58 -0
- package/dist/charts/engine/shapes/canvas.d.ts +58 -0
- package/dist/charts/engine/shapes/canvas.js +159 -0
- package/dist/charts/engine/shapes/canvas.js.map +1 -0
- package/dist/charts/engine/shapes/chart.cjs +2 -0
- package/dist/charts/engine/shapes/chart.cjs.map +1 -0
- package/dist/charts/engine/shapes/chart.d.cts +6 -0
- package/dist/charts/engine/shapes/chart.d.ts +6 -0
- package/dist/charts/engine/shapes/chart.js +273 -0
- package/dist/charts/engine/shapes/chart.js.map +1 -0
- package/dist/charts/engine/shapes/draw.cjs +2 -0
- package/dist/charts/engine/shapes/draw.cjs.map +1 -0
- package/dist/charts/engine/shapes/draw.d.cts +20 -0
- package/dist/charts/engine/shapes/draw.d.ts +20 -0
- package/dist/charts/engine/shapes/draw.js +152 -0
- package/dist/charts/engine/shapes/draw.js.map +1 -0
- package/dist/charts/engine/shapes/funnel.cjs +2 -0
- package/dist/charts/engine/shapes/funnel.cjs.map +1 -0
- package/dist/charts/engine/shapes/funnel.d.cts +6 -0
- package/dist/charts/engine/shapes/funnel.d.ts +6 -0
- package/dist/charts/engine/shapes/funnel.js +149 -0
- package/dist/charts/engine/shapes/funnel.js.map +1 -0
- package/dist/charts/engine/shapes/gauge.cjs +2 -0
- package/dist/charts/engine/shapes/gauge.cjs.map +1 -0
- package/dist/charts/engine/shapes/gauge.d.cts +7 -0
- package/dist/charts/engine/shapes/gauge.d.ts +7 -0
- package/dist/charts/engine/shapes/gauge.js +173 -0
- package/dist/charts/engine/shapes/gauge.js.map +1 -0
- package/dist/charts/engine/shapes/hit.cjs +2 -0
- package/dist/charts/engine/shapes/hit.cjs.map +1 -0
- package/dist/charts/engine/shapes/hit.d.cts +28 -0
- package/dist/charts/engine/shapes/hit.d.ts +28 -0
- package/dist/charts/engine/shapes/hit.js +124 -0
- package/dist/charts/engine/shapes/hit.js.map +1 -0
- package/dist/charts/engine/shapes/index.d.cts +9 -0
- package/dist/charts/engine/shapes/index.d.ts +9 -0
- package/dist/charts/engine/shapes/layout.cjs +3 -0
- package/dist/charts/engine/shapes/layout.cjs.map +1 -0
- package/dist/charts/engine/shapes/layout.d.cts +88 -0
- package/dist/charts/engine/shapes/layout.d.ts +88 -0
- package/dist/charts/engine/shapes/layout.js +266 -0
- package/dist/charts/engine/shapes/layout.js.map +1 -0
- package/dist/charts/engine/shapes/pie.cjs +2 -0
- package/dist/charts/engine/shapes/pie.cjs.map +1 -0
- package/dist/charts/engine/shapes/pie.d.cts +20 -0
- package/dist/charts/engine/shapes/pie.d.ts +20 -0
- package/dist/charts/engine/shapes/pie.js +302 -0
- package/dist/charts/engine/shapes/pie.js.map +1 -0
- package/dist/charts/engine/shapes/radar.cjs +2 -0
- package/dist/charts/engine/shapes/radar.cjs.map +1 -0
- package/dist/charts/engine/shapes/radar.d.cts +8 -0
- package/dist/charts/engine/shapes/radar.d.ts +8 -0
- package/dist/charts/engine/shapes/radar.js +197 -0
- package/dist/charts/engine/shapes/radar.js.map +1 -0
- package/dist/charts/engine/shapes/runtime.cjs +2 -0
- package/dist/charts/engine/shapes/runtime.cjs.map +1 -0
- package/dist/charts/engine/shapes/runtime.d.cts +29 -0
- package/dist/charts/engine/shapes/runtime.d.ts +29 -0
- package/dist/charts/engine/shapes/runtime.js +97 -0
- package/dist/charts/engine/shapes/runtime.js.map +1 -0
- package/dist/charts/engine/shapes/scene.cjs +2 -0
- package/dist/charts/engine/shapes/scene.cjs.map +1 -0
- package/dist/charts/engine/shapes/scene.d.cts +257 -0
- package/dist/charts/engine/shapes/scene.d.ts +257 -0
- package/dist/charts/engine/shapes/scene.js +123 -0
- package/dist/charts/engine/shapes/scene.js.map +1 -0
- package/dist/charts/engine/shapes/treemap.cjs +2 -0
- package/dist/charts/engine/shapes/treemap.cjs.map +1 -0
- package/dist/charts/engine/shapes/treemap.d.cts +14 -0
- package/dist/charts/engine/shapes/treemap.d.ts +14 -0
- package/dist/charts/engine/shapes/treemap.js +213 -0
- package/dist/charts/engine/shapes/treemap.js.map +1 -0
- package/dist/charts/engine/shapes/types.d.cts +292 -0
- package/dist/charts/engine/shapes/types.d.ts +292 -0
- package/dist/charts/engine/signature.cjs +2 -0
- package/dist/charts/engine/signature.cjs.map +1 -0
- package/dist/charts/engine/signature.d.cts +9 -0
- package/dist/charts/engine/signature.d.ts +9 -0
- package/dist/charts/engine/signature.js +13 -0
- package/dist/charts/engine/signature.js.map +1 -0
- package/dist/charts/engine/theme.cjs +1 -1
- package/dist/charts/engine/theme.cjs.map +1 -1
- package/dist/charts/engine/theme.d.cts +10 -1
- package/dist/charts/engine/theme.d.ts +10 -1
- package/dist/charts/engine/theme.js +40 -16
- package/dist/charts/engine/theme.js.map +1 -1
- package/dist/charts/engine/types.d.cts +70 -9
- package/dist/charts/engine/types.d.ts +70 -9
- package/dist/charts/index.cjs +1 -1
- package/dist/charts/index.d.cts +4 -2
- package/dist/charts/index.d.ts +4 -2
- package/dist/charts/index.js +8 -5
- package/dist/charts/react/Chart.cjs +1 -1
- package/dist/charts/react/Chart.cjs.map +1 -1
- package/dist/charts/react/Chart.d.cts +8 -1
- package/dist/charts/react/Chart.d.ts +8 -1
- package/dist/charts/react/Chart.js +66 -47
- package/dist/charts/react/Chart.js.map +1 -1
- package/dist/charts/react/charts.cjs +1 -1
- package/dist/charts/react/charts.cjs.map +1 -1
- package/dist/charts/react/charts.d.cts +10 -2
- package/dist/charts/react/charts.d.ts +10 -2
- package/dist/charts/react/charts.js +174 -51
- package/dist/charts/react/charts.js.map +1 -1
- package/dist/charts/react/shapes.cjs +2 -0
- package/dist/charts/react/shapes.cjs.map +1 -0
- package/dist/charts/react/shapes.d.cts +255 -0
- package/dist/charts/react/shapes.d.ts +255 -0
- package/dist/charts/react/shapes.js +242 -0
- package/dist/charts/react/shapes.js.map +1 -0
- package/dist/charts/react/types.d.cts +73 -4
- package/dist/charts/react/types.d.ts +73 -4
- package/dist/native/charts/src/engine/color.cjs +1 -1
- package/dist/native/charts/src/engine/color.cjs.map +1 -1
- package/dist/native/charts/src/engine/color.js +12 -3
- package/dist/native/charts/src/engine/color.js.map +1 -1
- package/dist/native/charts/src/engine/controller.cjs +2 -2
- package/dist/native/charts/src/engine/controller.cjs.map +1 -1
- package/dist/native/charts/src/engine/controller.js +334 -270
- package/dist/native/charts/src/engine/controller.js.map +1 -1
- package/dist/native/charts/src/engine/curve.cjs +2 -0
- package/dist/native/charts/src/engine/curve.cjs.map +1 -0
- package/dist/native/charts/src/engine/curve.js +56 -0
- package/dist/native/charts/src/engine/curve.js.map +1 -0
- package/dist/native/charts/src/engine/data.cjs +1 -1
- package/dist/native/charts/src/engine/data.cjs.map +1 -1
- package/dist/native/charts/src/engine/data.js +98 -38
- package/dist/native/charts/src/engine/data.js.map +1 -1
- package/dist/native/charts/src/engine/model.cjs +1 -1
- package/dist/native/charts/src/engine/model.cjs.map +1 -1
- package/dist/native/charts/src/engine/model.js +229 -112
- package/dist/native/charts/src/engine/model.js.map +1 -1
- package/dist/native/charts/src/engine/overlay.cjs +1 -1
- package/dist/native/charts/src/engine/overlay.cjs.map +1 -1
- package/dist/native/charts/src/engine/overlay.js +16 -16
- package/dist/native/charts/src/engine/overlay.js.map +1 -1
- package/dist/native/charts/src/engine/presets.cjs +1 -1
- package/dist/native/charts/src/engine/presets.cjs.map +1 -1
- package/dist/native/charts/src/engine/presets.js +11 -4
- package/dist/native/charts/src/engine/presets.js.map +1 -1
- package/dist/native/charts/src/engine/scene.cjs +1 -1
- package/dist/native/charts/src/engine/scene.cjs.map +1 -1
- package/dist/native/charts/src/engine/scene.js +209 -97
- package/dist/native/charts/src/engine/scene.js.map +1 -1
- package/dist/native/charts/src/engine/theme.cjs.map +1 -1
- package/dist/native/charts/src/engine/theme.js.map +1 -1
- package/dist/native/components/Chart/scene.cjs +1 -1
- package/dist/native/components/Chart/scene.cjs.map +1 -1
- package/dist/native/components/Chart/scene.js +31 -19
- package/dist/native/components/Chart/scene.js.map +1 -1
- package/dist/native/source/components/Chart/scene.tsx +54 -20
- package/dist/taro/index.js +1059 -579
- package/dist/uni/charts-canvas.js +3 -1
- package/dist/weapp/controls.js +966 -225
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","nearestIndex","toCss","require_data","require_color","require_layout","require_model","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","layoutChart","input","yCount","model","height","yTicks","view","yLabelWidth","label","measure","categoryWidth","step","i","padding","plot","xCount","xTicks","collectPointLabels","labels","series","texts","count","text","xi","x","yi","y","d","size","s","pointOf","xv","yv","sc","candidateOf","p","inside","half","base","px","py","dotSize","nearestScatter","radius","slop","rx","ry","best","bestDist","nearestX","sorted","bestD","hoverItemOf","pc","index","eventOf","candidates","b","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","tooltipContent","yFormat","rows","hoverMarks","marks","cx","showsCrosshair","crosshair"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { computePlot, createScales, type Rect, type Scales } from \"./layout\";\nimport { gridOf, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts\n const yCount =\n model.y.tickCount ??\n (height >= 220 ? 5 : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(2, Math.floor(plot.width / 96)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks };\n};\n\n/** Labels of the visible scatter points (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n for (const series of model.series) {\n if (series.hidden || series.type !== \"scatter\" || !series.showLabels)\n continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n labels.push({ x: s.xToPx(xi), y: s.yToPx(yi), r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Pixel position of a point (the top of a bar) */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const xv = s.cols.x[i] + (s.type === \"bar\" ? s.barOffset : 0);\n const yv = s.type === \"bar\" && s.barTop ? s.barTop[i] : s.cols.y[i];\n return { px: sc.xToPx(xv), py: sc.yToPx(yv) };\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n let inside = false;\n if (s.type === \"bar\" && s.barBase) {\n const half = s.barHalfWidth / sc.xPerPx;\n const base = sc.yToPx(s.barBase[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(base, p.py) - 2 &&\n py <= Math.max(base, p.py) + 2;\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - px),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(s.pointSize / 2 + 6, 10) + slop;\n const xv = sc.pxToX(px);\n const yv = sc.pxToY(py);\n const rx = radius * sc.xPerPx;\n const ry = radius * sc.yPerPx;\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(xv - rx, xv + rx, yv - ry, yv + ry, (i) => {\n const d = Math.hypot(sc.xToPx(x[i]) - px, sc.yToPx(y[i]) - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const label = s.cols.labels?.[index];\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.cols.x[index],\n y: s.cols.y[index],\n color: pc ? toCss(pc) : s.colorCss,\n ...(label !== undefined ? { label } : {}),\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const xv = sc.pxToX(px);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else {\n const i = nearestX(s, xv);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / sc.xPerPx : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/** Default tooltip content of a hover payload */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? \"x\", value: event.xLabel },\n { color: null, name: model.y.title ?? \"y\", value: yFormat(it.y) },\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n return {\n title: event.xLabel,\n titleColor: null,\n rows: event.items.map((it) => ({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: yFormat(it.y),\n })),\n };\n};\n\n/** Shape of the hover marker of an item: a ring on a point, or a bar highlight */\nexport type HoverMark =\n | { kind: \"dot\"; x: number; y: number; size: number; color: string }\n | { kind: \"bar\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage) */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const cx = sc.xToPx(it.x + s.barOffset);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const a = sc.yToPx(s.barBase[it.index]);\n const b = sc.yToPx(s.barTop[it.index]);\n marks.push({\n kind: \"bar\",\n x: cx - half,\n y: Math.min(a, b),\n width: half * 2,\n height: Math.max(1, Math.abs(a - b)),\n });\n continue;\n }\n const px = sc.xToPx(it.x);\n const py = sc.yToPx(it.y);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 6\n : Math.max(10, s.lineWidth * 2 + 6);\n marks.push({ kind: \"dot\", x: px, y: py, size, color: it.color });\n }\n return marks;\n};\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => model.series[it.seriesIndex].type !== \"scatter\"));\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.cjs","names":["mix","axisTicks","computePlot","createScales","formatValue","plottedY","nearestIndex","toCss","unpackColor","require_data","require_color","require_layout","require_model","require_format","require_axis","DEFAULT_PADDING","fallbackResolve","fallback","resolveAnnotations","resolve","theme","annotations","a","color","layoutChart","input","yCount","model","height","yTicks","view","yLabelWidth","label","measure","categoryWidth","step","i","padding","plot","xCount","xTicks","collectPointLabels","labels","axisFormat","series","format","top","x0","x1","count","xv","x","y","negative","s","texts","text","xi","yi","d","size","pointOf","sc","candidateOf","p","inside","half","base","px","py","high","b","low","dotSize","nearestScatter","radius","slop","yv","rx","ry","best","bestDist","cellAt","hx","hy","found","nearestX","sorted","bestD","hoverItemOf","pc","index","extra","o","open","v","value","packed","eventOf","candidates","items","c","hitTest","margin","scatter","others","all","bestDx","bandPx","aligned","first","event","sameHover","it","tooltipContent","yFormat","firstSeries","yName","rows","rowOf","change","ohlc","name","totals","stack","stackIdOf","total","row","k","seriesIndex","hoverMarks","marks","bandLo","bandHi","cx","cy","hw","hh","rgba","pad","legendShape","type","showsCrosshair","crosshair"],"sources":["../../../../charts/src/engine/scene.ts"],"sourcesContent":["// The DOM-free half of a chart: annotations, layout, point labels, hit\n// testing and tooltip content. Shared by createChart (DOM + GPU),\n// createCanvasChart (any 2D context) and the React Native views.\n\nimport { axisTicks, type AxisTicks } from \"./axis\";\nimport { mix, toCss, unpackColor, type Rgba } from \"./color\";\nimport { nearestIndex } from \"./data\";\nimport { formatValue } from \"./format\";\nimport { computePlot, createScales, type Rect, type Scales } from \"./layout\";\nimport { gridOf, plottedY, type ChartModel, type SeriesModel } from \"./model\";\nimport type { PointLabel, ResolvedAnnotation } from \"./overlay\";\nimport type { ChartTheme } from \"./theme\";\nimport type {\n ChartAnnotation,\n ChartHoverEvent,\n ChartHoverItem,\n ChartPadding,\n ChartView,\n} from \"./types\";\n\nexport const MAX_POINT_LABELS = 300;\nexport const DEFAULT_PADDING = { top: 12, right: 16, bottom: 4, left: 4 };\n\nexport const fallbackResolve = (_value: string, fallback: Rgba) => fallback;\n\n/** Annotation colors resolved against the theme */\nexport const resolveAnnotations = (\n annotations: readonly ChartAnnotation[] | undefined,\n theme: ChartTheme,\n): ResolvedAnnotation[] => {\n const resolve = theme.resolve ?? fallbackResolve;\n return (annotations ?? []).map((a) => {\n if (a.type === \"rect\") {\n const color = a.color ? resolve(a.color, theme.primary) : theme.primary;\n return {\n type: \"rect\",\n x0: a.x0,\n x1: a.x1,\n y0: a.y0,\n y1: a.y1,\n color,\n opacity: a.opacity ?? 0.08,\n label: a.label,\n labelPosition: a.labelPosition ?? \"top-left\",\n labelColor: a.labelColor\n ? resolve(a.labelColor, color)\n : mix(color, theme.text, 0.2),\n };\n }\n if (a.type === \"text\") {\n return {\n type: \"text\",\n x: a.x,\n y: a.y,\n text: a.text,\n anchor: a.anchor ?? \"center\",\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n weight: a.weight ?? 500,\n };\n }\n return {\n type: \"line\",\n axis: a.axis,\n value: a.value,\n color: a.color ? resolve(a.color, theme.textMuted) : theme.textMuted,\n width: a.width ?? 1,\n dash: [...(a.dash ?? [4, 4])],\n label: a.label,\n };\n });\n};\n\nexport interface ChartLayout {\n plot: Rect;\n scales: Scales;\n xTicks: AxisTicks;\n yTicks: AxisTicks;\n}\n\nexport interface LayoutInput {\n model: ChartModel;\n view: ChartView;\n theme: ChartTheme;\n /** Size of the drawing area (legend excluded), CSS pixels */\n width: number;\n height: number;\n padding?: ChartPadding;\n /** Offset of the drawing area (e.g. below a legend) */\n top?: number;\n /** Width of a tick label in the theme font */\n measure: (text: string) => number;\n}\n\n/** Ticks, room for the axes and the plot rectangle */\nexport const layoutChart = (input: LayoutInput): ChartLayout => {\n const { model, view, theme, width, height, measure } = input;\n // same count as the nice range of the model (its ends are then ticks),\n // fewer on short charts; category rows get a label each when they fit\n const yCount =\n model.y.tickCount ??\n (model.y.type === \"category\"\n ? Math.max(1, Math.floor((height - 40) / (theme.fontSize + 5)))\n : height >= 220\n ? 5\n : Math.max(2, Math.round((height - 48) / 52)));\n const yTicks = axisTicks(model.y, view.y, yCount);\n let yLabelWidth = 0;\n if (model.y.visible) {\n for (const label of yTicks.labels)\n yLabelWidth = Math.max(yLabelWidth, measure(label));\n }\n let categoryWidth = 48;\n if (model.x.type === \"category\") {\n categoryWidth = 0;\n const step = Math.max(1, Math.floor(model.x.categories.length / 200));\n for (let i = 0; i < model.x.categories.length; i += step) {\n categoryWidth = Math.max(categoryWidth, measure(model.x.categories[i]));\n }\n }\n const padding = { ...DEFAULT_PADDING, ...input.padding };\n const plot = computePlot({\n width,\n height,\n padding,\n yLabelWidth: model.y.visible ? Math.ceil(yLabelWidth) : 0,\n xAxisVisible: model.x.visible,\n xTitle: !!model.x.title && model.x.visible,\n yTitle: !!model.y.title && model.y.visible,\n fontSize: theme.fontSize,\n });\n if (input.top) plot.y += input.top;\n const xCount =\n model.x.type === \"category\"\n ? Math.max(1, Math.floor(plot.width / (categoryWidth + 14)))\n : (model.x.tickCount ?? Math.max(3, Math.floor(plot.width / 88)));\n const xTicks = axisTicks(model.x, view.x, xCount);\n const scales = createScales(plot, view, model.x.reverse, model.y.reverse);\n return { plot, scales, xTicks, yTicks };\n};\n\n/** Labels of the visible scatter points and bar values (`showLabels`) */\nexport const collectPointLabels = (\n model: ChartModel,\n view: ChartView,\n s: Scales,\n yTicks?: AxisTicks | null,\n): PointLabel[] => {\n const labels: PointLabel[] = [];\n // 100% stacks: the axis shows percents, the labels the actual values\n const axisFormat = model.percent\n ? formatValue\n : (yTicks?.formatValue ?? formatValue);\n for (const series of model.series) {\n if (series.hidden || !series.showLabels) continue;\n if (series.type === \"bar\" && series.barTop) {\n const format = series.format ?? axisFormat;\n const { x, y, count } = series.cols;\n const top = series.barTop;\n const [x0, x1] = view.x[0] <= view.x[1] ? view.x : [view.x[1], view.x[0]];\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const xv = x[i] + series.barOffset;\n if (!Number.isFinite(y[i]) || xv < x0 || xv > x1) continue;\n const negative = top[i] < (series.barBase?.[i] ?? 0);\n labels.push({\n x: s.xToPx(xv),\n y: s.yToPx(top[i]),\n r: 0,\n text: format(y[i]),\n placement: negative ? \"below\" : \"above\",\n });\n }\n continue;\n }\n if (series.type !== \"scatter\") continue;\n const { x, y, count, labels: texts, size } = series.cols;\n if (!texts) continue;\n for (let i = 0; i < count && labels.length < MAX_POINT_LABELS; i++) {\n const text = texts[i];\n if (!text) continue;\n const xi = x[i];\n const yi = y[i];\n if (xi < view.x[0] || xi > view.x[1] || yi < view.y[0] || yi > view.y[1])\n continue;\n const d = size && size[i] > 0 ? size[i] : series.pointSize;\n labels.push({ x: s.xToPx(xi), y: s.yToPx(yi), r: d / 2, text });\n }\n }\n return labels;\n};\n\n// ---------------------------------------------------------------- hit tests\n\ninterface Candidate {\n series: SeriesModel;\n index: number;\n /** Pixel position of the point */\n px: number;\n py: number;\n dx: number;\n dist: number;\n inside: boolean;\n}\n\n/** Pixel position of a point (the top of a bar or stack, the close of a candle) */\nexport const pointOf = (s: SeriesModel, i: number, sc: Scales) => {\n const xv = s.cols.x[i] + (s.type === \"bar\" ? s.barOffset : 0);\n return { px: sc.xToPx(xv), py: sc.yToPx(plottedY(s, i)) };\n};\n\nconst candidateOf = (\n s: SeriesModel,\n i: number,\n px: number,\n py: number,\n sc: Scales,\n): Candidate => {\n const p = pointOf(s, i, sc);\n let inside = false;\n if (s.type === \"bar\" && s.barBase) {\n const half = s.barHalfWidth / sc.xPerPx;\n const base = sc.yToPx(s.barBase[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(base, p.py) - 2 &&\n py <= Math.max(base, p.py) + 2;\n } else if (s.type === \"candlestick\") {\n const { high, low, y } = s.cols;\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 3);\n const a = sc.yToPx(high ? high[i] : y[i]);\n const b = sc.yToPx(low ? low[i] : y[i]);\n inside =\n Math.abs(px - p.px) <= half &&\n py >= Math.min(a, b) - 2 &&\n py <= Math.max(a, b) + 2;\n }\n return {\n series: s,\n index: i,\n px: p.px,\n py: p.py,\n dx: Math.abs(sc.xToPx(s.cols.x[i]) - px),\n dist: inside ? 0 : Math.hypot(p.px - px, p.py - py),\n inside,\n };\n};\n\n/** Diameter of a scatter dot */\nexport const dotSize = (s: SeriesModel, i: number) =>\n s.cols.size && s.cols.size[i] > 0 ? s.cols.size[i] : s.pointSize;\n\nconst nearestScatter = (\n s: SeriesModel,\n px: number,\n py: number,\n sc: Scales,\n slop: number,\n) => {\n const radius = Math.max(s.pointSize / 2 + 6, 10) + slop;\n const xv = sc.pxToX(px);\n const yv = sc.pxToY(py);\n const rx = radius * sc.xPerPx;\n const ry = radius * sc.yPerPx;\n let best = -1;\n let bestDist = Infinity;\n const { x, y } = s.cols;\n gridOf(s).query(xv - rx, xv + rx, yv - ry, yv + ry, (i) => {\n const d = Math.hypot(sc.xToPx(x[i]) - px, sc.yToPx(y[i]) - py);\n const reach = Math.max(dotSize(s, i) / 2 + 4, 8) + slop;\n if (d <= reach && d <= bestDist) {\n bestDist = d;\n best = i;\n }\n });\n return best;\n};\n\n/** Heatmap cell containing a data position, -1 if none */\nconst cellAt = (s: SeriesModel, xv: number, yv: number) => {\n const { x: hx, y: hy } = s.cellHalf;\n const { x, y } = s.cols;\n let found = -1;\n gridOf(s).query(xv - hx, xv + hx, yv - hy, yv + hy, (i) => {\n if (\n s.cellColors?.[i] &&\n Math.abs(x[i] - xv) <= hx &&\n Math.abs(y[i] - yv) <= hy\n ) {\n found = i;\n }\n });\n return found;\n};\n\nconst nearestX = (s: SeriesModel, xv: number) => {\n const { x, y, count, sorted } = s.cols;\n if (sorted) return nearestIndex(x, y, count, xv);\n let best = -1;\n let bestD = Infinity;\n for (let i = 0; i < count; i++) {\n if (!Number.isFinite(y[i])) continue;\n const d = Math.abs(x[i] - xv);\n if (d < bestD) {\n bestD = d;\n best = i;\n }\n }\n return best;\n};\n\n/** Hover payload item of a point */\nexport const hoverItemOf = (s: SeriesModel, index: number): ChartHoverItem => {\n const pc = s.pointColors?.[index];\n const label = s.cols.labels?.[index];\n const { open, high, low, value } = s.cols;\n let color = pc ? toCss(pc) : s.colorCss;\n const extra: Partial<ChartHoverItem> = {};\n if (s.type === \"candlestick\") {\n const o = open ? open[index] : NaN;\n if (Number.isFinite(o)) extra.open = o;\n if (high && Number.isFinite(high[index])) extra.high = high[index];\n if (low && Number.isFinite(low[index])) extra.low = low[index];\n color = toCss(s.cols.y[index] < o ? s.downColor : s.upColor);\n } else if (s.type === \"heatmap\") {\n const v = value ? value[index] : s.cols.y[index];\n if (Number.isFinite(v)) extra.value = v;\n const packed = s.cellColors?.[index];\n if (packed) color = toCss(unpackColor(packed));\n }\n return {\n seriesIndex: s.index,\n seriesId: s.id,\n seriesName: s.name,\n index,\n x: s.cols.x[index],\n y: s.cols.y[index],\n color,\n ...(label !== undefined ? { label } : {}),\n ...extra,\n };\n};\n\nconst eventOf = (\n candidates: Candidate[],\n xTicks: AxisTicks | null,\n): ChartHoverEvent | null => {\n if (!candidates.length) return null;\n candidates.sort((a, b) => a.series.index - b.series.index);\n const items = candidates.map((c) => hoverItemOf(c.series, c.index));\n const x = items[0].x;\n return { items, x, xLabel: xTicks?.formatValue(x) ?? String(x) };\n};\n\n/**\n * Points under a pixel of the stage: the nearest point (scatter / `nearest`\n * tooltips) or every series at the nearest x (`axis` tooltips).\n * `slop` widens the reach of the dots (touch screens).\n */\nexport const hitTest = (\n model: ChartModel,\n sc: Scales,\n xTicks: AxisTicks | null,\n px: number,\n py: number,\n slop = 0,\n): ChartHoverEvent | null => {\n const { plot } = sc;\n const margin = 6 + slop;\n if (\n px < plot.x - margin ||\n px > plot.x + plot.width + margin ||\n py < plot.y - margin ||\n py > plot.y + plot.height + margin\n ) {\n return null;\n }\n const xv = sc.pxToX(px);\n const scatter: Candidate[] = [];\n const others: Candidate[] = [];\n for (const s of model.series) {\n if (s.hidden || s.cols.count === 0) continue;\n if (s.type === \"scatter\") {\n const i = nearestScatter(s, px, py, sc, slop);\n if (i >= 0) scatter.push(candidateOf(s, i, px, py, sc));\n } else if (s.type === \"heatmap\") {\n const i = cellAt(s, sc.pxToX(px), sc.pxToY(py));\n if (i >= 0) {\n const c = candidateOf(s, i, px, py, sc);\n c.inside = true;\n c.dist = 0;\n scatter.push(c);\n }\n } else {\n const i = nearestX(s, xv);\n if (i >= 0) others.push(candidateOf(s, i, px, py, sc));\n }\n }\n if (model.tooltipMode === \"nearest\") {\n const all = [...scatter, ...others].filter(\n (c) => c.inside || c.series.type === \"scatter\" || c.dist <= 32 + slop,\n );\n if (!all.length) return null;\n const best = all.reduce((a, b) => (b.dist <= a.dist ? b : a));\n return eventOf([best], xTicks);\n }\n if (!others.length) {\n if (!scatter.length) return null;\n return eventOf(\n [scatter.reduce((a, b) => (b.dist <= a.dist ? b : a))],\n xTicks,\n );\n }\n const bestDx = Math.min(...others.map((c) => c.dx));\n const bandPx = model.x.type === \"category\" ? 0.5 / sc.xPerPx : 0;\n const aligned = others.filter((c) => c.dx <= bestDx + Math.max(1, bandPx));\n const first = aligned.reduce((a, b) => (b.dx < a.dx ? b : a));\n const ordered = [first, ...aligned.filter((c) => c !== first), ...scatter];\n const event = eventOf(ordered, xTicks);\n if (event) {\n event.x = hoverItemOf(first.series, first.index).x;\n event.xLabel = xTicks?.formatValue(event.x) ?? String(event.x);\n }\n return event;\n};\n\n/** Whether two hover payloads point at the same points */\nexport const sameHover = (\n a: ChartHoverEvent | null,\n b: ChartHoverEvent | null,\n): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a.items.length === b.items.length &&\n a.items.every(\n (it, i) =>\n it.index === b.items[i].index &&\n it.seriesIndex === b.items[i].seriesIndex,\n ));\n\n// ------------------------------------------------------------------ tooltip\n\nexport interface TooltipRow {\n /** Swatch color (CSS) */\n color: string | null;\n name: string;\n value: string;\n}\n\nexport interface TooltipContent {\n title: string;\n /** Swatch of the title (single scatter point) */\n titleColor: string | null;\n rows: TooltipRow[];\n}\n\n/** Default tooltip content of a hover payload */\nexport const tooltipContent = (\n model: ChartModel,\n event: ChartHoverEvent,\n yTicks: AxisTicks | null,\n): TooltipContent => {\n const yFormat = yTicks?.formatValue ?? String;\n const first = event.items[0];\n const firstSeries = first ? model.series[first.seriesIndex] : null;\n if (event.items.length === 1 && firstSeries?.type === \"heatmap\") {\n const yName =\n model.y.type === \"category\"\n ? (model.y.categories[Math.round(first.y)] ?? yFormat(first.y))\n : yFormat(first.y);\n return {\n title: `${event.xLabel} · ${yName}`,\n titleColor: null,\n rows: [\n {\n color: first.color,\n name: first.label ?? firstSeries.name,\n value:\n first.value === undefined\n ? \"–\"\n : (firstSeries.format ?? formatValue)(first.value),\n },\n ],\n };\n }\n const scatterOnly = event.items.every(\n (it) => model.series[it.seriesIndex].type === \"scatter\",\n );\n if (scatterOnly && event.items.length === 1) {\n const it = event.items[0];\n const rows: TooltipRow[] = [\n { color: null, name: model.x.title ?? \"x\", value: event.xLabel },\n { color: null, name: model.y.title ?? \"y\", value: yFormat(it.y) },\n ];\n if (it.label !== undefined && model.series.length > 1)\n rows.push({ color: null, name: \"\", value: it.seriesName });\n return { title: it.label ?? it.seriesName, titleColor: it.color, rows };\n }\n const rows: TooltipRow[] = [];\n /** Row of every item */\n const rowOf: number[] = [];\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n rowOf.push(rows.length);\n if (s.type === \"candlestick\") {\n const change =\n it.open !== undefined && it.open !== 0\n ? ((it.y - it.open) / Math.abs(it.open)) * 100\n : NaN;\n rows.push({\n color: it.color,\n name: s.name,\n value: Number.isFinite(change)\n ? `${change >= 0 ? \"+\" : \"\"}${change.toFixed(2)}%`\n : \"\",\n });\n const ohlc: [string, number | undefined][] = [\n [\"Open\", it.open],\n [\"High\", it.high],\n [\"Low\", it.low],\n [\"Close\", it.y],\n ];\n for (const [name, v] of ohlc) {\n if (v !== undefined && Number.isFinite(v))\n rows.push({ color: null, name, value: (s.format ?? yFormat)(v) });\n }\n continue;\n }\n rows.push({\n color: it.color,\n name: it.label ? `${it.seriesName} · ${it.label}` : it.seriesName,\n value: (s.format ?? yFormat)(it.y),\n });\n }\n if (model.percent) {\n // 100% stacks: the share of every value next to it\n const totals = new Map<string, number>();\n for (const it of event.items) {\n const stack = stackIdOf(model, it.seriesIndex);\n if (stack !== null && Number.isFinite(it.y))\n totals.set(stack, (totals.get(stack) ?? 0) + Math.abs(it.y));\n }\n event.items.forEach((it, k) => {\n const stack = stackIdOf(model, it.seriesIndex);\n const total = stack !== null ? totals.get(stack) : undefined;\n const row = rows[rowOf[k]];\n if (total && row && Number.isFinite(it.y)) {\n const format = model.series[it.seriesIndex].format ?? formatValue;\n row.value = `${format(it.y)} · ${((Math.abs(it.y) / total) * 100).toFixed(1)}%`;\n }\n });\n }\n return { title: event.xLabel, titleColor: null, rows };\n};\n\n/** Stack of a series in a 100% chart (`null` when it is not stacked) */\nconst stackIdOf = (model: ChartModel, seriesIndex: number): string | null =>\n model.series[seriesIndex].hidden ? null : model.stacks[seriesIndex];\n\n/**\n * Shape of the hover marker of an item: a dot with a soft halo on a point,\n * a band behind the hovered bar group / candle, or the outline of a cell\n */\nexport type HoverMark =\n | {\n kind: \"dot\";\n x: number;\n y: number;\n size: number;\n color: string;\n /** Translucent series color of the halo around the dot */\n halo: string;\n }\n | { kind: \"band\"; x: number; y: number; width: number; height: number }\n | { kind: \"cell\"; x: number; y: number; width: number; height: number };\n\n/** Markers of the hovered points (pixels of the stage); bands come first */\nexport const hoverMarks = (\n model: ChartModel,\n sc: Scales,\n event: ChartHoverEvent,\n): HoverMark[] => {\n const marks: HoverMark[] = [];\n const { plot } = sc;\n let bandLo = Infinity;\n let bandHi = -Infinity;\n for (const it of event.items) {\n const s = model.series[it.seriesIndex];\n if (s.type === \"bar\" || s.type === \"candlestick\") {\n const cx = sc.xToPx(it.x + s.barOffset);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n bandLo = Math.min(bandLo, cx - half);\n bandHi = Math.max(bandHi, cx + half);\n continue;\n }\n if (s.type === \"heatmap\") {\n const cx = sc.xToPx(it.x);\n const cy = sc.yToPx(it.y);\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n marks.push({\n kind: \"cell\",\n x: cx - hw,\n y: cy - hh,\n width: hw * 2,\n height: hh * 2,\n });\n continue;\n }\n const { px, py } = pointOf(s, it.index, sc);\n if (\n px < plot.x - 1 ||\n px > plot.x + plot.width + 1 ||\n py < plot.y - 1 ||\n py > plot.y + plot.height + 1\n ) {\n continue;\n }\n const size =\n s.type === \"scatter\"\n ? dotSize(s, it.index) + 4\n : Math.max(9, s.lineWidth * 2 + 5);\n const rgba = s.pointColors?.[it.index] ?? s.color;\n marks.push({\n kind: \"dot\",\n x: px,\n y: py,\n size,\n color: it.color,\n halo: toCss(rgba, 0.2),\n });\n }\n if (bandHi > bandLo) {\n // the group of bars plus a margin, clipped to the plot\n const pad = Math.max(4, (bandHi - bandLo) * 0.14);\n const x0 = Math.max(plot.x, bandLo - pad);\n const x1 = Math.min(plot.x + plot.width, bandHi + pad);\n if (x1 > x0) {\n marks.unshift({\n kind: \"band\",\n x: x0,\n y: plot.y,\n width: x1 - x0,\n height: plot.height,\n });\n }\n }\n return marks;\n};\n\n/** Swatch of a series in the legend */\nexport const legendShape = (\n type: SeriesModel[\"type\"],\n): \"dot\" | \"line\" | \"square\" =>\n type === \"scatter\" ? \"dot\" : type === \"line\" ? \"line\" : \"square\";\n\n/** Whether the guide line follows the pointer */\nexport const showsCrosshair = (\n model: ChartModel,\n event: ChartHoverEvent,\n crosshair: boolean | undefined,\n) =>\n crosshair ??\n (model.tooltipMode === \"axis\" &&\n event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"line\" || type === \"area\";\n }) &&\n // bars get a band instead\n !event.items.some((it) => {\n const type = model.series[it.seriesIndex].type;\n return type === \"bar\" || type === \"candlestick\";\n }));\n"],"mappings":"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"}
|
|
@@ -36,9 +36,9 @@ export interface LayoutInput {
|
|
|
36
36
|
}
|
|
37
37
|
/** Ticks, room for the axes and the plot rectangle */
|
|
38
38
|
export declare const layoutChart: (input: LayoutInput) => ChartLayout;
|
|
39
|
-
/** Labels of the visible scatter points (`showLabels`) */
|
|
40
|
-
export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales) => PointLabel[];
|
|
41
|
-
/** Pixel position of a point (the top of a bar) */
|
|
39
|
+
/** Labels of the visible scatter points and bar values (`showLabels`) */
|
|
40
|
+
export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales, yTicks?: AxisTicks | null) => PointLabel[];
|
|
41
|
+
/** Pixel position of a point (the top of a bar or stack, the close of a candle) */
|
|
42
42
|
export declare const pointOf: (s: SeriesModel, i: number, sc: Scales) => {
|
|
43
43
|
px: number;
|
|
44
44
|
py: number;
|
|
@@ -69,21 +69,34 @@ export interface TooltipContent {
|
|
|
69
69
|
}
|
|
70
70
|
/** Default tooltip content of a hover payload */
|
|
71
71
|
export declare const tooltipContent: (model: ChartModel, event: ChartHoverEvent, yTicks: AxisTicks | null) => TooltipContent;
|
|
72
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* Shape of the hover marker of an item: a dot with a soft halo on a point,
|
|
74
|
+
* a band behind the hovered bar group / candle, or the outline of a cell
|
|
75
|
+
*/
|
|
73
76
|
export type HoverMark = {
|
|
74
77
|
kind: "dot";
|
|
75
78
|
x: number;
|
|
76
79
|
y: number;
|
|
77
80
|
size: number;
|
|
78
81
|
color: string;
|
|
82
|
+
/** Translucent series color of the halo around the dot */
|
|
83
|
+
halo: string;
|
|
84
|
+
} | {
|
|
85
|
+
kind: "band";
|
|
86
|
+
x: number;
|
|
87
|
+
y: number;
|
|
88
|
+
width: number;
|
|
89
|
+
height: number;
|
|
79
90
|
} | {
|
|
80
|
-
kind: "
|
|
91
|
+
kind: "cell";
|
|
81
92
|
x: number;
|
|
82
93
|
y: number;
|
|
83
94
|
width: number;
|
|
84
95
|
height: number;
|
|
85
96
|
};
|
|
86
|
-
/** Markers of the hovered points (pixels of the stage) */
|
|
97
|
+
/** Markers of the hovered points (pixels of the stage); bands come first */
|
|
87
98
|
export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
|
|
99
|
+
/** Swatch of a series in the legend */
|
|
100
|
+
export declare const legendShape: (type: SeriesModel["type"]) => "dot" | "line" | "square";
|
|
88
101
|
/** Whether the guide line follows the pointer */
|
|
89
102
|
export declare const showsCrosshair: (model: ChartModel, event: ChartHoverEvent, crosshair: boolean | undefined) => boolean;
|
|
@@ -36,9 +36,9 @@ export interface LayoutInput {
|
|
|
36
36
|
}
|
|
37
37
|
/** Ticks, room for the axes and the plot rectangle */
|
|
38
38
|
export declare const layoutChart: (input: LayoutInput) => ChartLayout;
|
|
39
|
-
/** Labels of the visible scatter points (`showLabels`) */
|
|
40
|
-
export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales) => PointLabel[];
|
|
41
|
-
/** Pixel position of a point (the top of a bar) */
|
|
39
|
+
/** Labels of the visible scatter points and bar values (`showLabels`) */
|
|
40
|
+
export declare const collectPointLabels: (model: ChartModel, view: ChartView, s: Scales, yTicks?: AxisTicks | null) => PointLabel[];
|
|
41
|
+
/** Pixel position of a point (the top of a bar or stack, the close of a candle) */
|
|
42
42
|
export declare const pointOf: (s: SeriesModel, i: number, sc: Scales) => {
|
|
43
43
|
px: number;
|
|
44
44
|
py: number;
|
|
@@ -69,21 +69,34 @@ export interface TooltipContent {
|
|
|
69
69
|
}
|
|
70
70
|
/** Default tooltip content of a hover payload */
|
|
71
71
|
export declare const tooltipContent: (model: ChartModel, event: ChartHoverEvent, yTicks: AxisTicks | null) => TooltipContent;
|
|
72
|
-
/**
|
|
72
|
+
/**
|
|
73
|
+
* Shape of the hover marker of an item: a dot with a soft halo on a point,
|
|
74
|
+
* a band behind the hovered bar group / candle, or the outline of a cell
|
|
75
|
+
*/
|
|
73
76
|
export type HoverMark = {
|
|
74
77
|
kind: "dot";
|
|
75
78
|
x: number;
|
|
76
79
|
y: number;
|
|
77
80
|
size: number;
|
|
78
81
|
color: string;
|
|
82
|
+
/** Translucent series color of the halo around the dot */
|
|
83
|
+
halo: string;
|
|
84
|
+
} | {
|
|
85
|
+
kind: "band";
|
|
86
|
+
x: number;
|
|
87
|
+
y: number;
|
|
88
|
+
width: number;
|
|
89
|
+
height: number;
|
|
79
90
|
} | {
|
|
80
|
-
kind: "
|
|
91
|
+
kind: "cell";
|
|
81
92
|
x: number;
|
|
82
93
|
y: number;
|
|
83
94
|
width: number;
|
|
84
95
|
height: number;
|
|
85
96
|
};
|
|
86
|
-
/** Markers of the hovered points (pixels of the stage) */
|
|
97
|
+
/** Markers of the hovered points (pixels of the stage); bands come first */
|
|
87
98
|
export declare const hoverMarks: (model: ChartModel, sc: Scales, event: ChartHoverEvent) => HoverMark[];
|
|
99
|
+
/** Swatch of a series in the legend */
|
|
100
|
+
export declare const legendShape: (type: SeriesModel["type"]) => "dot" | "line" | "square";
|
|
88
101
|
/** Whether the guide line follows the pointer */
|
|
89
102
|
export declare const showsCrosshair: (model: ChartModel, event: ChartHoverEvent, crosshair: boolean | undefined) => boolean;
|