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":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","parseVar","fallback","resolveStaticColor","direct","ref","depth","defined","variables","NAMED","toCss","c","mix","a","b","t"],"sources":["../../../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? resolveStaticColor(value, {}, fallback);\n};\n\n/** Resolves a color to RGBA, falling back to `fallback` */\nexport type ColorResolver = (value: string, fallback: Rgba) => Rgba;\n\n/** Splits the arguments of `var(--name, fallback)` (the fallback may contain commas) */\nconst parseVar = (\n value: string,\n): { name: string; fallback?: string } | null => {\n const match = /^var\\(\\s*(--[\\w-]+)\\s*(?:,([\\s\\S]*))?\\)$/.exec(value.trim());\n if (!match) return null;\n const fallback = match[2]?.trim();\n return { name: match[1], ...(fallback ? { fallback } : {}) };\n};\n\n/**\n * Resolves a color without a DOM (mini-programs, React Native, workers):\n * hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in\n * `variables` (nested fallbacks included).\n */\nexport const resolveStaticColor = (\n value: string,\n variables: Readonly<Record<string, string>> = {},\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n depth = 0,\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n const ref = depth < 8 ? parseVar(value) : null;\n if (ref) {\n const defined = variables[ref.name];\n if (defined)\n return resolveStaticColor(defined, variables, fallback, depth + 1);\n if (ref.fallback)\n return resolveStaticColor(ref.fallback, variables, fallback, depth + 1);\n }\n return NAMED[value.trim().toLowerCase()] ?? fallback;\n};\n\nconst NAMED: Record<string, Rgba> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n};\n\n/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */\nexport const domColorResolver =\n (element: Element | null): ColorResolver =>\n (value, fallback) =>\n resolveColor(value, element, fallback);\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":";AAIA,IAAMA,KAAW,MAAeC,IAAI,IAAI,IAAIA,IAAI,IAAI,IAAIA,GAElDC,KAAY,MAA6B;CAC7C,IAAMC,IAAIC,EAAI,MAAM,CAAC;CACrB,IAAI,CAAC,eAAe,KAAKD,CAAC,GAAG,OAAO;CACpC,IAAME,IAASF,EAAE,WAAW,KAAKA,EAAE,WAAW;CAC9C,IAAI,CAACE,KAAUF,EAAE,WAAW,KAAKA,EAAE,WAAW,GAAG,OAAO;CACxD,IAAMG,KAAW,MACfD,IACI,SAASF,EAAEI,KAAKJ,EAAEI,IAAI,EAAE,IAAI,MAC5B,SAASJ,EAAE,MAAMI,IAAI,GAAGA,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,KAC1CC,IAAWL,EAAE,WAAW,KAAKA,EAAE,WAAW;CAChD,OAAO;EAACG,EAAQ,CAAC;EAAGA,EAAQ,CAAC;EAAGA,EAAQ,CAAC;EAAGE,IAAWF,EAAQ,CAAC,IAAI;CAAC;AACvE,GAEMG,KAAkB,GAAc,MAA0B;CAC9D,IAAMR,IAAI,WAAWS,CAAI;CAEzB,OADI,OAAO,MAAMT,CAAC,IAAU,IACrBS,EAAK,KAAK,CAAC,CAAC,SAAS,GAAG,IAAIT,IAAI,MAAMA,IAAIU;AACnD,GAGMC,KAAa,MAA2B;CAC5C,IAAM,CAACC,GAAMC,KAASC,EAAK,MAAM,GAAG,GAC9BC,IAAQH,EAAK,MAAM,QAAQ,CAAC,CAAC,OAAO,OAAO;CAEjD,OADIC,MAAU,KAAA,KAAWE,EAAM,KAAKF,EAAM,KAAK,CAAC,GACzCE;AACT,GAOaC,KAAc,MAA+B;CACxD,IAAMC,IAAQC,EAAM,KAAK,CAAC,CAAC,YAAY;CACvC,IAAID,EAAM,WAAW,GAAG,GAAG,OAAOhB,EAASgB,CAAK;CAChD,IAAIA,MAAU,eAAe,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;CAC/C,IAAIE,IAAQ,kBAAkB,KAAKF,CAAK;CACxC,IAAIE,GAAO;EACT,IAAMJ,IAAQJ,EAAUQ,EAAM,EAAE;EAEhC,OADIJ,EAAM,SAAS,IAAU,OACtB;GACLhB,EAAQS,EAAeO,EAAM,IAAI,GAAG,CAAC;GACrChB,EAAQS,EAAeO,EAAM,IAAI,GAAG,CAAC;GACrChB,EAAQS,EAAeO,EAAM,IAAI,GAAG,CAAC;GACrCA,EAAM,OAAO,KAAA,IAAY,IAAIhB,EAAQS,EAAeO,EAAM,IAAI,CAAC,CAAC;EAClE;CACF;CAEA,IADA,IAAQ,yBAAyB,KAAKE,CAAK,GACvCE,GAAO;EACT,IAAMJ,IAAQJ,EAAUQ,EAAM,EAAE;EAEhC,OADIJ,EAAM,SAAS,IAAU,OACtB;GACLhB,EAAQS,EAAeO,EAAM,IAAI,CAAC,CAAC;GACnChB,EAAQS,EAAeO,EAAM,IAAI,CAAC,CAAC;GACnChB,EAAQS,EAAeO,EAAM,IAAI,CAAC,CAAC;GACnCA,EAAM,OAAO,KAAA,IAAY,IAAIhB,EAAQS,EAAeO,EAAM,IAAI,CAAC,CAAC;EAClE;CACF;CACA,OAAO;AACT,GAuDMK,KACJ,MAC+C;CAC/C,IAAMD,IAAQ,2CAA2C,KAAKF,EAAM,KAAK,CAAC;CAC1E,IAAI,CAACE,GAAO,OAAO;CACnB,IAAME,IAAWF,EAAM,EAAE,EAAE,KAAK;CAChC,OAAO;EAAE,MAAMA,EAAM;EAAI,GAAIE,IAAW,EAAE,YAAS,IAAI,CAAC;CAAG;AAC7D,GAOaC,KACX,GACA,IAA8C,CAAC,GAC/C,IAAiB;CAAC;CAAK;CAAK;CAAK;AAAC,GAClC,IAAQ,MACC;CACT,IAAMC,IAASP,EAAWC,CAAK;CAC/B,IAAIM,GAAQ,OAAOA;CACnB,IAAMC,IAAMC,IAAQ,IAAIL,EAASH,CAAK,IAAI;CAC1C,IAAIO,GAAK;EACP,IAAME,IAAUC,EAAUH,EAAI;EAC9B,IAAIE,GACF,OAAOJ,EAAmBI,GAASC,GAAWN,GAAUI,IAAQ,CAAC;EACnE,IAAID,EAAI,UACN,OAAOF,EAAmBE,EAAI,UAAUG,GAAWN,GAAUI,IAAQ,CAAC;CAC1E;CACA,OAAOG,EAAMX,EAAM,KAAK,CAAC,CAAC,YAAY,MAAMI;AAC9C,GAEMO,IAA8B;CAClC,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;CAClB,OAAO;EAAC;EAAG;EAAG;EAAG;CAAC;CAClB,KAAK;EAAC;EAAG;EAAG;EAAG;CAAC;CAChB,OAAO;EAAC;EAAG,MAAM;EAAK;EAAG;CAAC;CAC1B,MAAM;EAAC;EAAG;EAAG;EAAG;CAAC;CACjB,MAAM;EAAC,MAAM;EAAK,MAAM;EAAK,MAAM;EAAK;CAAC;CACzC,MAAM;EAAC,MAAM;EAAK,MAAM;EAAK,MAAM;EAAK;CAAC;CACzC,QAAQ;EAAC;EAAG,MAAM;EAAK;EAAG;CAAC;AAC7B,GAcaC,KAAS,GAAS,IAAQ,MACrC,QAAQ,KAAK,MAAMC,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,MAAMA,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,MAAMA,EAAE,KAAK,GAAG,EAAE,IAAI,EAAEA,EAAE,KAAKjB,EAAA,CAAO,QAAQ,CAAC,EAAE,IAezGkB,KAAO,GAAS,GAAS,MAAoB;CACxDC,EAAE,MAAMC,EAAE,KAAKD,EAAE,MAAME;CACvBF,EAAE,MAAMC,EAAE,KAAKD,EAAE,MAAME;CACvBF,EAAE,MAAMC,EAAE,KAAKD,EAAE,MAAME;CACvBF,EAAE,MAAMC,EAAE,KAAKD,EAAE,MAAME;AACzB"}
|
|
1
|
+
{"version":3,"file":"color.js","names":["clamp01","v","parseHex","h","hex","expand","channel","i","hasAlpha","parseComponent","part","scale","splitArgs","main","alpha","args","parts","parseColor","value","input","match","parseVar","fallback","resolveStaticColor","direct","ref","depth","defined","variables","NAMED","toCss","c","packColor","mix","a","b","t","unpackColor","packed","rampColor","stops","p"],"sources":["../../../../../../charts/src/engine/color.ts"],"sourcesContent":["// Color parsing to straight (non-premultiplied) RGBA in 0-1.\n\nexport type Rgba = readonly [number, number, number, number];\n\nconst clamp01 = (v: number) => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst parseHex = (hex: string): Rgba | null => {\n const h = hex.slice(1);\n if (!/^[0-9a-f]+$/i.test(h)) return null;\n const expand = h.length === 3 || h.length === 4;\n if (!expand && h.length !== 6 && h.length !== 8) return null;\n const channel = (i: number) =>\n expand\n ? parseInt(h[i] + h[i], 16) / 255\n : parseInt(h.slice(i * 2, i * 2 + 2), 16) / 255;\n const hasAlpha = h.length === 4 || h.length === 8;\n return [channel(0), channel(1), channel(2), hasAlpha ? channel(3) : 1];\n};\n\nconst parseComponent = (part: string, scale: number): number => {\n const v = parseFloat(part);\n if (Number.isNaN(v)) return 0;\n return part.trim().endsWith(\"%\") ? v / 100 : v / scale;\n};\n\n/** Splits `a b c / d` or `a, b, c, d` */\nconst splitArgs = (args: string): string[] => {\n const [main, alpha] = args.split(\"/\");\n const parts = main.split(/[\\s,]+/).filter(Boolean);\n if (alpha !== undefined) parts.push(alpha.trim());\n return parts;\n};\n\n/**\n * Parses the color syntaxes returned by `getComputedStyle` (`rgb()`,\n * `rgba()`, `color(srgb ...)`) and hex colors; `null` for anything else\n * (named colors, `oklch()`, ... are resolved by `resolveColor`).\n */\nexport const parseColor = (input: string): Rgba | null => {\n const value = input.trim().toLowerCase();\n if (value.startsWith(\"#\")) return parseHex(value);\n if (value === \"transparent\") return [0, 0, 0, 0];\n let match = /^rgba?\\((.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 255)),\n clamp01(parseComponent(parts[1], 255)),\n clamp01(parseComponent(parts[2], 255)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n match = /^color\\(srgb\\s+(.*)\\)$/.exec(value);\n if (match) {\n const parts = splitArgs(match[1]);\n if (parts.length < 3) return null;\n return [\n clamp01(parseComponent(parts[0], 1)),\n clamp01(parseComponent(parts[1], 1)),\n clamp01(parseComponent(parts[2], 1)),\n parts[3] === undefined ? 1 : clamp01(parseComponent(parts[3], 1)),\n ];\n }\n return null;\n};\n\nlet probeContext: CanvasRenderingContext2D | null | undefined;\n\n/** Lets the browser convert any CSS color (named, hsl, oklch, color-mix, ...) */\nconst parseWithCanvas = (value: string): Rgba | null => {\n if (typeof document === \"undefined\") return null;\n if (probeContext === undefined) {\n const canvas = document.createElement(\"canvas\");\n canvas.width = 1;\n canvas.height = 1;\n probeContext = canvas.getContext(\"2d\", { willReadFrequently: true });\n }\n const ctx = probeContext;\n if (!ctx) return null;\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = \"#000\";\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === 0) return [0, 0, 0, 0];\n // getImageData returns premultiplied-then-unpremultiplied values\n return [r / 255, g / 255, b / 255, a / 255];\n};\n\n/**\n * Resolves a CSS color in the context of `element`: `var(--x)`,\n * `color-mix()`, named colors, ... Falls back to `fallback` when the color\n * cannot be resolved (e.g. outside a browser).\n */\nexport const resolveColor = (\n value: string,\n element: Element | null,\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n let computed = value;\n if (element && typeof getComputedStyle === \"function\") {\n const probe = element.ownerDocument.createElement(\"span\");\n probe.style.display = \"none\";\n probe.style.color = value;\n element.appendChild(probe);\n computed = getComputedStyle(probe).color || value;\n probe.remove();\n const parsed = parseColor(computed);\n if (parsed) return parsed;\n }\n return parseWithCanvas(computed) ?? resolveStaticColor(value, {}, fallback);\n};\n\n/** Resolves a color to RGBA, falling back to `fallback` */\nexport type ColorResolver = (value: string, fallback: Rgba) => Rgba;\n\n/** Splits the arguments of `var(--name, fallback)` (the fallback may contain commas) */\nconst parseVar = (\n value: string,\n): { name: string; fallback?: string } | null => {\n const match = /^var\\(\\s*(--[\\w-]+)\\s*(?:,([\\s\\S]*))?\\)$/.exec(value.trim());\n if (!match) return null;\n const fallback = match[2]?.trim();\n return { name: match[1], ...(fallback ? { fallback } : {}) };\n};\n\n/**\n * Resolves a color without a DOM (mini-programs, React Native, workers):\n * hex, `rgb()`, `transparent` and `var(--name, fallback)` looked up in\n * `variables` (nested fallbacks included).\n */\nexport const resolveStaticColor = (\n value: string,\n variables: Readonly<Record<string, string>> = {},\n fallback: Rgba = [0.4, 0.4, 0.4, 1],\n depth = 0,\n): Rgba => {\n const direct = parseColor(value);\n if (direct) return direct;\n const ref = depth < 8 ? parseVar(value) : null;\n if (ref) {\n const defined = variables[ref.name];\n if (defined)\n return resolveStaticColor(defined, variables, fallback, depth + 1);\n if (ref.fallback)\n return resolveStaticColor(ref.fallback, variables, fallback, depth + 1);\n }\n return NAMED[value.trim().toLowerCase()] ?? fallback;\n};\n\nconst NAMED: Record<string, Rgba> = {\n black: [0, 0, 0, 1],\n white: [1, 1, 1, 1],\n red: [1, 0, 0, 1],\n green: [0, 128 / 255, 0, 1],\n blue: [0, 0, 1, 1],\n gray: [128 / 255, 128 / 255, 128 / 255, 1],\n grey: [128 / 255, 128 / 255, 128 / 255, 1],\n orange: [1, 165 / 255, 0, 1],\n};\n\n/** Resolver of the DOM: CSS variables and any CSS color syntax of `element` */\nexport const domColorResolver =\n (element: Element | null): ColorResolver =>\n (value, fallback) =>\n resolveColor(value, element, fallback);\n\n/** A resolver remembering its results; `null` marks unresolvable colors */\nexport interface MemoizedColorResolver extends ColorResolver {\n readonly cache: ReadonlyMap<string, Rgba | null>;\n}\n\nconst UNRESOLVED: Rgba = [NaN, NaN, NaN, NaN];\n\n/**\n * Caches the colors of `resolve` by input string (DOM probes force a style\n * recalculation). `resolve` must return `fallback` itself when it cannot\n * resolve a color, as the resolvers of this module do. Create a new one to\n * invalidate it (e.g. when the theme changes).\n */\nexport const memoizeColorResolver = (\n resolve: ColorResolver,\n): MemoizedColorResolver => {\n const cache = new Map<string, Rgba | null>();\n const memoized = (value: string, fallback: Rgba): Rgba => {\n let hit = cache.get(value);\n if (hit === undefined) {\n const resolved = resolve(value, UNRESOLVED);\n hit = resolved === UNRESOLVED ? null : resolved;\n cache.set(value, hit);\n }\n return hit ?? fallback;\n };\n return Object.assign(memoized, { cache });\n};\n\n/** Same channels (both `null` included) */\nexport const sameColor = (a: Rgba | null, b: Rgba | null): boolean =>\n a === b ||\n (!!a &&\n !!b &&\n a[0] === b[0] &&\n a[1] === b[1] &&\n a[2] === b[2] &&\n a[3] === b[3]);\n\nconst hex2 = (v: number) =>\n Math.round(clamp01(v) * 255)\n .toString(16)\n .padStart(2, \"0\");\n\n/** `rgba()` string usable by Canvas2D and the DOM */\nexport const toCss = (c: Rgba, alpha = 1): string =>\n `rgba(${Math.round(c[0] * 255)}, ${Math.round(c[1] * 255)}, ${Math.round(c[2] * 255)}, ${+(c[3] * alpha).toFixed(3)})`;\n\n/** `#rrggbb` (alpha dropped) */\nexport const toHex = (c: Rgba): string =>\n `#${hex2(c[0])}${hex2(c[1])}${hex2(c[2])}`;\n\n/** Packs a color as little-endian `unorm8x4` (r in the lowest byte) */\nexport const packColor = (c: Rgba): number =>\n ((Math.round(clamp01(c[3]) * 255) << 24) |\n (Math.round(clamp01(c[2]) * 255) << 16) |\n (Math.round(clamp01(c[1]) * 255) << 8) |\n Math.round(clamp01(c[0]) * 255)) >>>\n 0;\n\n/** Mixes two colors (t = 0 -> a, 1 -> b) */\nexport const mix = (a: Rgba, b: Rgba, t: number): Rgba => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t,\n a[3] + (b[3] - a[3]) * t,\n];\n\n/** Inverse of `packColor` */\nexport const unpackColor = (packed: number): Rgba => [\n (packed & 0xff) / 255,\n ((packed >>> 8) & 0xff) / 255,\n ((packed >>> 16) & 0xff) / 255,\n ((packed >>> 24) & 0xff) / 255,\n];\n\n/** Color at `t` (0-1) of a ramp through `stops` */\nexport const rampColor = (stops: readonly Rgba[], t: number): Rgba => {\n if (stops.length === 1) return stops[0];\n const p = clamp01(t) * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(p));\n return mix(stops[i], stops[i + 1], p - i);\n};\n\n/** Relative luminance (sRGB approximation) */\nexport const luminance = (c: Rgba): number =>\n 0.2126 * c[0] + 0.7152 * c[1] + 0.0722 * c[2];\n"],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
const e=require("./color.cjs"),t=require("./
|
|
2
|
-
`))}let c=o.tooltipContent(v,e,w?.layout.yTicks??null),l=0,u;if(s){for(let e of s)l=Math.max(l,F(e,12));u=s.length}else{l=F(c.title,12,600)+(c.titleColor?14:0);for(let e of c.rows)l=Math.max(l,(e.color?14:0)+F(e.name,12)+16+F(e.value,12,600));u=1+c.rows.length}let d=Math.ceil(Math.max(l,96)+16+4),f=u*18+16,p=n+14;p+d>x-4&&(p=n-14-d),p=Math.max(4,Math.min(p,x-d-4));let m=Math.max(4,Math.min(r-f/2,S-f-4));return{content:c,text:s,box:{x:p,y:m,width:d,height:f},lineHeight:18,padding:8}},z=()=>{if(x<=0||S<=0)return null;let e=L(),n=e?.position===`top`?e.height:0,r=o.layoutChart({model:v,view:y,theme:m,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>F(e)}),i=o.collectPointLabels(v,y,r.scales),s=[],c=m.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){s.push(a.textBox(e,r.scales,F(e.text,m.fontSize,e.weight),c));continue}if(e.type!==`rect`||!e.label)continue;let t=r.scales,n=e.x0===void 0?r.plot.x:t.xToPx(e.x0),i=e.x1===void 0?r.plot.x+r.plot.width:t.xToPx(e.x1),o=e.y0===void 0?r.plot.y+r.plot.height:t.yToPx(e.y0),l=e.y1===void 0?r.plot.y:t.yToPx(e.y1),u=F(e.label,m.fontSize+1,600),d=Math.min(n,i),f=Math.max(n,i),p=Math.min(o,l),h=Math.max(o,l),g=e.labelPosition;s.push({x:g.endsWith(`left`)?d+10:g.endsWith(`right`)?f-10-u:(d+f-u)/2,y:g.startsWith(`top`)?p+10:g.startsWith(`bottom`)?h-10-c:(p+h-c)/2,width:u,height:c})}let u=a.placeLabels(i,r.plot,e=>F(e),c-2,s),d={width:x,height:S,theme:m,model:v,view:l(y),layout:r,annotations:C,pointLabels:u,legend:e,hover:null,dragging:null};if(w=d,O){let e=o.showsCrosshair(v,O.event,t.crosshair),n=r.scales.xToPx(O.event.items[0].x);d.hover={event:O.event,marks:o.hoverMarks(v,r.scales,O.event),crosshairX:e&&n>=r.plot.x&&n<=r.plot.x+r.plot.width?n:null,tooltip:A?.kind===`pan`||A?.kind===`point`?null:R(O.event,O.x,O.y)}}if(A?.kind===`point`){let e=v.series[A.item.seriesIndex];d.dragging={x:A.x,y:A.y,color:A.item.color,size:(e?o.dotSize(e,A.item.index):8)+6}}let f=r.plot,p=`${f.x},${f.y},${f.width},${f.height}`;return p!==E&&(E=p,M(`layout`,{...f})),d},B=()=>((T||!w)&&(T=!1,w=z()),w),V=()=>B()?.layout.scales??null,H=e=>{let t=!o.sameHover(O?.event??null,e?.event??null);O=e,N(),t&&M(`hover`,e?e.event:null)},U=(e,t,n)=>{let r=V();return r?o.hitTest(v,r,w?.layout.xTicks??null,e,t,n?8:0):null},W=(e,t)=>{let n=V()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},G=(e,t)=>{let n=V();if(!n)return null;let{plot:r}=n,i=Math.max(r.x,Math.min(r.x+r.width,e)),a=Math.max(r.y,Math.min(r.y+r.height,t));return{x:n.pxToX(i),y:n.pxToY(a)}},K=(e,t)=>{let{base:n,minSpan:r}=v;y={x:c.clampRange(e.x,n.x,r.x),y:c.clampRange(e.y,n.y,r.y)},b=!c.sameRange(y.x,n.x)||!c.sameRange(y.y,n.y),t&&M(`zoom`,l(y)),N()},q=(e,t,n)=>{let r=V();if(!r||!v.zoom.x&&!v.zoom.y)return;let i=l(y);v.zoom.x&&(i.x=c.zoomRange(y.x,r.pxToX(e),n)),v.zoom.y&&(i.y=c.zoomRange(y.y,r.pxToY(t),n)),K(i,!0)},J=()=>{b&&K(l(v.base),!0)},Y=(e,t)=>B()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,X=e=>{g.has(e)?g.delete(e):g.add(e),I()},Z=()=>{let[e,t]=[...k.values()];A={kind:`pinch`,view:l(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},H(null)};return v=i.buildModel(t,m,g,h),I(),{setOptions(e){if(D)return;let r=(e.palette??[]).join()!==(t.palette??[]).join();t=e,r&&(m=s.createTheme(n,t.palette)),I()},setTheme(e){D||(n=e,m=s.createTheme(n,t.palette),I())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),N())},getScene:B,pointerDown:(e,t,n={})=>{if(D)return;let r=n.id??0,i=!!n.touch;k.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=P();if(k.size===2){a&&(v.zoom.x||v.zoom.y)&&A?.kind!==`point`&&Z();return}if(k.size>2||!a){if(!a&&i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=U(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){A={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&W(e,t)){A={kind:`pan`,view:l(y),x:e,y:t};return}if(A=null,i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(D)return;let i=n.id??0,a=k.get(i);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?d:u)&&(a.moved=!0)),A?.kind===`pinch`&&k.size>=2){let[e,t]=[...k.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),i=(e.x+t.x)/2,a=(e.y+t.y)/2,o=V();if(!o)return;let s=r.createScales(o.plot,A.view,v.x.reverse,v.y.reverse),u=A.distance/n,d=l(A.view);if(v.zoom.x){d.x=c.zoomRange(A.view.x,s.pxToX(A.midX),u);let e=(i-A.midX)*s.xPerPx*u;d.x=c.panRange(d.x,v.x.reverse?e:-e)}if(v.zoom.y){d.y=c.zoomRange(A.view.y,s.pxToY(A.midY),u);let e=(a-A.midY)*s.yPerPx*u;d.y=c.panRange(d.y,v.y.reverse?-e:e)}K(d,!0);return}if(A?.kind===`point`&&a){if(!a.moved)return;A.x=e,A.y=t;let n=G(e,t);N(),n&&M(`drag`,{item:A.item,x:n.x,y:n.y});return}if(A?.kind===`pan`&&a){if(!a.moved)return;let n=V();if(!n)return;let r=e-A.x,i=t-A.y,o=l(A.view);v.zoom.x&&(o.x=c.panRange(A.view.x,-r*n.xPerPx*(v.x.reverse?-1:1))),v.zoom.y&&(o.y=c.panRange(A.view.y,i*n.yPerPx*(v.y.reverse?-1:1))),K(o,!0);return}if(!(k.size>1)&&(!a||a.touch||!n.touch)){let r=U(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&H(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(D)return;let r=n.id??0,i=k.get(r);k.delete(r);let a=A;if(a?.kind===`pinch`){k.size<2&&(A=null);return}if(A=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=G(e,t);N(),n&&M(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){N();return}if(i.moved){i.touch&&N();return}let o=Date.now();if(i.touch&&o-j.time<f&&Math.hypot(e-j.x,t-j.y)<24&&b){j={time:0,x:e,y:t},J();return}j={time:o,x:e,y:t};let s=Y(e,t);if(s){B()?.legend?.toggle&&X(s.id);return}let c=U(e,t,i.touch);if(c){i.touch&&H({event:c,x:e,y:t}),M(`click`,c);return}if(i.touch&&H(null),W(e,t)){let n=G(e,t);n&&M(`plotClick`,n)}},pointerCancel:(e={})=>{k.delete(e.id??0),(A?.kind===`point`||k.size<2)&&(A=null),N()},pointerLeave(){!A&&O&&H(null)},zoomAt:q,resetZoom:J,getView:()=>l(y),setView(e){D||K({x:e.x??y.x,y:e.y??y.y},!1)},toggleSeries:X,clearHover(){O&&H(null)},getPlotRect(){let e=B()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=V();return n?{x:n.xToPx(e),y:n.yToPx(t)}:null},fromPixel(e,t){let n=V();return n?{x:n.pxToX(e),y:n.pxToY(t)}:null},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){D=!0,k.clear();for(let e of Object.keys(_))delete _[e]}}},h=(e,n,r,i)=>{if(!r)return[0,n];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,t.lowerBound(e,n,a)-1),Math.min(n,t.lowerBound(e,n,o)+1)]},g=(t,r={})=>{let{model:i,view:a,layout:s}=t,c=s.scales,{plot:l}=s,u=r.maxDots??4e3,d=r.maxBars??2e3,f=Math.max(1,r.columnWidth??1),p={area:0,bar:1,line:2,scatter:3},m=[],g=i.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>p[e.type]-p[t.type]||e.index-t.index);for(let t of g){let{x:s,y:p,count:g,sorted:_}=t.cols;if(t.type===`line`||t.type===`area`){let[e,r]=h(s,g,_,a.x),o=new Float64Array((r-e)*2);for(let t=e;t<r;t++)o[(t-e)*2]=s[t],o[(t-e)*2+1]=p[t];let u=r-e,d=_&&u>l.width*2/f?n.decimateMinMax(o,0,u,e=>c.xToPx(e)/f):{points:o,length:u},v=[],y=[];for(let e=0;e<d.length;e++){let t=d.points[e*2],n=d.points[e*2+1];if(!Number.isFinite(t)||!Number.isFinite(n)){y.length&&v.push(y),y=[];continue}y.push(c.xToPx(t),c.yToPx(n))}y.length&&v.push(y),t.type===`area`&&m.push({kind:`area`,seriesIndex:t.index,color:t.colorCss,opacity:t.opacity,baseline:c.yToPx(i.baseline),segments:v}),m.push({kind:`line`,seriesIndex:t.index,color:t.colorCss,width:t.type===`area`?Math.min(t.lineWidth,2):t.lineWidth,segments:v});continue}if(t.type===`bar`&&t.barBase&&t.barTop){let[e,n]=h(s,g,_,a.x),r=Math.max(t.barHalfWidth/c.xPerPx,.5),i=[],o=n-e>d,u=NaN;for(let a=e;a<n;a++){let e=t.barBase[a],n=t.barTop[a];if(!Number.isFinite(e)||!Number.isFinite(n))continue;let d=c.xToPx(s[a]+t.barOffset);if(d+r<l.x||d-r>l.x+l.width)continue;let f=c.yToPx(e),p=c.yToPx(n),m=Math.min(f,p),h=Math.max(1,Math.abs(f-p)),g=Math.floor(d);if(o&&g===u&&i.length){let e=i.length-4,t=Math.max(i[e+1]+i[e+3],m+h);i[e+1]=Math.min(i[e+1],m),i[e+3]=t-i[e+1];continue}u=g,i.push(d-r,m,r*2,h)}m.push({kind:`bars`,seriesIndex:t.index,color:t.colorCss,rects:i});continue}let v=[],y=[],b=n=>{let r=t.pointColors?.[n];return r?e.toCss(r):t.colorCss},x=[];for(let e=0;e<g;e++){let t=s[e],n=p[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=c.xToPx(t),i=c.yToPx(n);r<l.x||r>l.x+l.width||i<l.y||i>l.y+l.height||x.push(e)}if(x.length>u){let e=Math.max(2,r.dotCell??t.pointSize*.8),n=Math.ceil(l.width/e)+1,i=new Map;for(let t of x){let r=Math.floor((c.xToPx(s[t])-l.x)/e),a=Math.floor((c.yToPx(p[t])-l.y)/e);i.set(a*n+r,t)}for(let[t,r]of i)v.push(l.x+(t%n+.5)*e,l.y+(Math.floor(t/n)+.5)*e,e),y.push(b(r))}else for(let e of x)v.push(c.xToPx(s[e]),c.yToPx(p[e]),o.dotSize(t,e)),y.push(b(e));m.push({kind:`dots`,seriesIndex:t.index,opacity:t.opacity,dots:v,colors:y})}return m};exports.createChartController=m,exports.scenePrimitives=g;
|
|
1
|
+
const e=require("./color.cjs"),t=require("./curve.cjs"),n=require("./data.cjs"),r=require("./decimate.cjs"),i=require("./layout.cjs"),a=require("./model.cjs"),o=require("./overlay.cjs"),s=require("./scene.cjs"),c=require("./theme.cjs"),l=require("./viewport.cjs");var u=e=>({x:[e.x[0],e.x[1]],y:[e.y[0],e.y[1]]}),d=6,f=10,p=320,m=20,h=e=>{let t=e.options,n=e.theme,r=c.createTheme(n,t.palette),h=new Map,g=new Set,_={},v,y={x:[0,1],y:[0,1]},b=!1,x=0,S=0,C=[],w=null,T=!0,E=``,D=!1,O=null,k=new Map,A=null,j={time:0,x:0,y:0},M=(e,t)=>{_[e]?.forEach(e=>e(t))},N=()=>{T=!0,D||e.onInvalidate?.()},P=()=>{let e=t.interaction;if(e===!1)return null;let n=typeof e==`object`?e:{};return{pan:n.pan??!0,dragPoints:n.dragPoints??!1}},F=(t,n=r.fontSize,i=400)=>e.measureText(t,o.font(r,n,i)),I=()=>{v=a.buildModel(t,r,g,h);let{base:e,minSpan:n}=v;b?(y={x:v.zoom.x?l.clampRange(y.x,e.x,n.x):[...e.x],y:v.zoom.y?l.clampRange(y.y,e.y,n.y):[...e.y]},b=!l.sameRange(y.x,e.x)||!l.sameRange(y.y,e.y)):y=u(e),C=s.resolveAnnotations(t.annotations,r),O&&(O.event.items.every(e=>v.series[e.seriesIndex]&&!v.series[e.seriesIndex].hidden&&e.index<v.series[e.seriesIndex].cols.count)||H(null)),N()},L=()=>{let e=t.legend,n=t.series.filter(e=>e.name).length;if(!(e===void 0?n>1:e))return null;let r=typeof e==`object`?e:{},i=r.position===`bottom`?`bottom`:`top`,a=[],o=4,c=0;for(let e of v.series){let t=14+F(e.name,12)+8;o+t>x-4&&o>4&&(o=4,c++),a.push({id:e.id,name:e.name,color:e.colorCss,shape:s.legendShape(e.type),hidden:e.hidden,box:{x:o,y:c*m,width:t,height:m}}),o+=t+10}let l=(c+1)*m+6;if(i===`bottom`)for(let e of a)e.box.y+=S-l+6;return{entries:a,position:i,toggle:r.toggle??!0,height:l}},R=(e,n,r)=>{let i=t.tooltip;if(i===!1)return null;let a=typeof i==`object`?i.render:void 0,o=null;if(a){let t=a(e);if(t===null||t===``)return null;typeof t==`string`&&(o=t.split(`
|
|
2
|
+
`))}let c=s.tooltipContent(v,e,w?.layout.yTicks??null),l=0,u;if(o){for(let e of o)l=Math.max(l,F(e,12));u=o.length}else{l=F(c.title,12,600)+(c.titleColor?14:0);for(let e of c.rows)l=Math.max(l,(e.color?14:0)+F(e.name,12)+16+F(e.value,12,600));u=1+c.rows.length}let d=Math.ceil(Math.max(l,96)+16+4),f=u*18+16,p=n+14;p+d>x-4&&(p=n-14-d),p=Math.max(4,Math.min(p,x-d-4));let m=Math.max(4,Math.min(r-f/2,S-f-4));return{content:c,text:o,box:{x:p,y:m,width:d,height:f},lineHeight:18,padding:8}},z=()=>{if(x<=0||S<=0)return null;let e=L(),n=e?.position===`top`?e.height:0,i=s.layoutChart({model:v,view:y,theme:r,width:x,height:S-(e?.height??0),padding:t.padding,top:n,measure:e=>F(e)}),a=s.collectPointLabels(v,y,i.scales,i.yTicks),c=[],l=r.fontSize+4;for(let e of C){if(e.type===`text`&&e.text){c.push(o.textBox(e,i.scales,F(e.text,r.fontSize,e.weight),l));continue}if(e.type!==`rect`||!e.label)continue;let t=i.scales,n=e.x0===void 0?i.plot.x:t.xToPx(e.x0),a=e.x1===void 0?i.plot.x+i.plot.width:t.xToPx(e.x1),s=e.y0===void 0?i.plot.y+i.plot.height:t.yToPx(e.y0),u=e.y1===void 0?i.plot.y:t.yToPx(e.y1),d=F(e.label,r.fontSize+1,600),f=Math.min(n,a),p=Math.max(n,a),m=Math.min(s,u),h=Math.max(s,u),g=e.labelPosition;c.push({x:g.endsWith(`left`)?f+10:g.endsWith(`right`)?p-10-d:(f+p-d)/2,y:g.startsWith(`top`)?m+10:g.startsWith(`bottom`)?h-10-l:(m+h-l)/2,width:d,height:l})}let d=o.placeLabels(a,i.plot,e=>F(e),l-2,c),f={width:x,height:S,theme:r,model:v,view:u(y),layout:i,annotations:C,pointLabels:d,legend:e,hover:null,dragging:null};if(w=f,O){let e=s.showsCrosshair(v,O.event,t.crosshair),n=i.scales.xToPx(O.event.items[0].x);f.hover={event:O.event,marks:s.hoverMarks(v,i.scales,O.event),crosshairX:e&&n>=i.plot.x&&n<=i.plot.x+i.plot.width?n:null,tooltip:A?.kind===`pan`||A?.kind===`point`?null:R(O.event,O.x,O.y)}}if(A?.kind===`point`){let e=v.series[A.item.seriesIndex];f.dragging={x:A.x,y:A.y,color:A.item.color,size:(e?s.dotSize(e,A.item.index):8)+6}}let p=i.plot,m=`${p.x},${p.y},${p.width},${p.height}`;return m!==E&&(E=m,M(`layout`,{...p})),f},B=()=>((T||!w)&&(T=!1,w=z()),w),V=()=>B()?.layout.scales??null,H=e=>{let t=!s.sameHover(O?.event??null,e?.event??null);O=e,N(),t&&M(`hover`,e?e.event:null)},U=(e,t,n)=>{let r=V();return r?s.hitTest(v,r,w?.layout.xTicks??null,e,t,n?8:0):null},W=(e,t)=>{let n=V()?.plot;return!!n&&e>=n.x&&e<=n.x+n.width&&t>=n.y&&t<=n.y+n.height},G=(e,t)=>{let n=V();if(!n)return null;let{plot:r}=n,i=Math.max(r.x,Math.min(r.x+r.width,e)),a=Math.max(r.y,Math.min(r.y+r.height,t));return{x:n.pxToX(i),y:n.pxToY(a)}},K=(e,t)=>{let{base:n,minSpan:r}=v;y={x:l.clampRange(e.x,n.x,r.x),y:l.clampRange(e.y,n.y,r.y)},b=!l.sameRange(y.x,n.x)||!l.sameRange(y.y,n.y),t&&M(`zoom`,u(y)),N()},q=(e,t,n)=>{let r=V();if(!r||!v.zoom.x&&!v.zoom.y)return;let i=u(y);v.zoom.x&&(i.x=l.zoomRange(y.x,r.pxToX(e),n)),v.zoom.y&&(i.y=l.zoomRange(y.y,r.pxToY(t),n)),K(i,!0)},J=()=>{b&&K(u(v.base),!0)},Y=(e,t)=>B()?.legend?.entries.find(n=>e>=n.box.x&&e<=n.box.x+n.box.width&&t>=n.box.y&&t<=n.box.y+n.box.height)??null,X=e=>{g.has(e)?g.delete(e):g.add(e),I()},Z=()=>{let[e,t]=[...k.values()];A={kind:`pinch`,view:u(y),distance:Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),midX:(e.x+t.x)/2,midY:(e.y+t.y)/2},H(null)};return v=a.buildModel(t,r,g,h),I(),{setOptions(e){if(D)return;let i=(e.palette??[]).join()!==(t.palette??[]).join();t=e,i&&(r=c.createTheme(n,t.palette)),I()},setTheme(e){D||(n=e,r=c.createTheme(n,t.palette),I())},setSize(e,t){(e!==x||t!==S)&&(x=Math.max(0,e),S=Math.max(0,t),N())},getScene:B,pointerDown:(e,t,n={})=>{if(D)return;let r=n.id??0,i=!!n.touch;k.set(r,{x:e,y:t,startX:e,startY:t,touch:i,moved:!1});let a=P();if(k.size===2){a&&(v.zoom.x||v.zoom.y)&&A?.kind!==`point`&&Z();return}if(k.size>2||!a){if(!a&&i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}return}if(a.dragPoints){let n=U(e,t,i)?.items.find(e=>v.series[e.seriesIndex].type===`scatter`);if(n){A={kind:`point`,item:n,x:e,y:t};return}}if(b&&a.pan&&W(e,t)){A={kind:`pan`,view:u(y),x:e,y:t};return}if(A=null,i){let n=U(e,t,!0);H(n?{event:n,x:e,y:t}:null)}},pointerMove:(e,t,n={})=>{if(D)return;let r=n.id??0,a=k.get(r);if(a&&(a.x=e,a.y=t,!a.moved&&Math.hypot(e-a.startX,t-a.startY)>(a.touch?f:d)&&(a.moved=!0)),A?.kind===`pinch`&&k.size>=2){let[e,t]=[...k.values()],n=Math.max(1,Math.hypot(e.x-t.x,e.y-t.y)),r=(e.x+t.x)/2,a=(e.y+t.y)/2,o=V();if(!o)return;let s=i.createScales(o.plot,A.view,v.x.reverse,v.y.reverse),c=A.distance/n,d=u(A.view);if(v.zoom.x){d.x=l.zoomRange(A.view.x,s.pxToX(A.midX),c);let e=(r-A.midX)*s.xPerPx*c;d.x=l.panRange(d.x,v.x.reverse?e:-e)}if(v.zoom.y){d.y=l.zoomRange(A.view.y,s.pxToY(A.midY),c);let e=(a-A.midY)*s.yPerPx*c;d.y=l.panRange(d.y,v.y.reverse?-e:e)}K(d,!0);return}if(A?.kind===`point`&&a){if(!a.moved)return;A.x=e,A.y=t;let n=G(e,t);N(),n&&M(`drag`,{item:A.item,x:n.x,y:n.y});return}if(A?.kind===`pan`&&a){if(!a.moved)return;let n=V();if(!n)return;let r=e-A.x,i=t-A.y,o=u(A.view);v.zoom.x&&(o.x=l.panRange(A.view.x,-r*n.xPerPx*(v.x.reverse?-1:1))),v.zoom.y&&(o.y=l.panRange(A.view.y,i*n.yPerPx*(v.y.reverse?-1:1))),K(o,!0);return}if(!(k.size>1)&&(!a||a.touch||!n.touch)){let r=U(e,t,!!a?.touch||!!n.touch);(r||!a?.touch)&&H(r?{event:r,x:e,y:t}:null)}},pointerUp:(e,t,n={})=>{if(D)return;let r=n.id??0,i=k.get(r);k.delete(r);let a=A;if(a?.kind===`pinch`){k.size<2&&(A=null);return}if(A=null,!i)return;if(a?.kind===`point`){if(i.moved){let n=G(e,t);N(),n&&M(`drop`,{item:a.item,x:n.x,y:n.y});return}}else if(a?.kind===`pan`&&i.moved){N();return}if(i.moved){i.touch&&N();return}let o=Date.now();if(i.touch&&o-j.time<p&&Math.hypot(e-j.x,t-j.y)<24&&b){j={time:0,x:e,y:t},J();return}j={time:o,x:e,y:t};let s=Y(e,t);if(s){B()?.legend?.toggle&&X(s.id);return}let c=U(e,t,i.touch);if(c){i.touch&&H({event:c,x:e,y:t}),M(`click`,c);return}if(i.touch&&H(null),W(e,t)){let n=G(e,t);n&&M(`plotClick`,n)}},pointerCancel:(e={})=>{k.delete(e.id??0),(A?.kind===`point`||k.size<2)&&(A=null),N()},pointerLeave(){!A&&O&&H(null)},zoomAt:q,resetZoom:J,getView:()=>u(y),setView(e){D||K({x:e.x??y.x,y:e.y??y.y},!1)},toggleSeries:X,clearHover(){O&&H(null)},getPlotRect(){let e=B()?.layout.plot;return e?{...e}:null},toPixel(e,t){let n=V();return n?{x:n.xToPx(e),y:n.yToPx(t)}:null},fromPixel(e,t){let n=V();return n?{x:n.pxToX(e),y:n.pxToY(t)}:null},on(e,t){let n=_[e];return n||(n=new Set,_[e]=n),n.add(t),()=>{n.delete(t)}},destroy(){D=!0,k.clear();for(let e of Object.keys(_))delete _[e]}}},g=(e,t,r,i)=>{if(!r)return[0,t];let[a,o]=i[0]<=i[1]?i:[i[1],i[0]];return[Math.max(0,n.lowerBound(e,t,a)-1),Math.min(t,n.lowerBound(e,t,o)+1)]},_={heatmap:0,area:1,bar:2,candlestick:3,line:4,scatter:5},v=(n,i={})=>{let{model:a,view:o,layout:c}=n,l=c.scales,{plot:u}=c,d=i.maxDots??4e3,f=i.maxBars??2e3,p=Math.max(1,i.columnWidth??1),m=[],h=a.series.filter(e=>!e.hidden&&e.cols.count>0).sort((e,t)=>_[e.type]-_[t.type]||e.index-t.index);for(let n of h){let{x:c,y:h,count:_,sorted:v}=n.cols;if(n.type===`line`||n.type===`area`){let[e,i]=g(c,_,v,o.x),s=n.stackTop??h,d=t.curvePoints(c,s,e,i,n.curve),f=n.stackBase?t.curvePoints(c,n.stackBase,e,i,n.curve).points:null,y=d.length,b=d.points,x=f;if(v&&y>u.width*2/p){if(f){let e=r.decimateMinMax(b,0,y,e=>l.xToPx(e)/p),t=new Float64Array(e.length*2),n=new Float64Array(e.length*2),i=0,a=0;for(let r=0;r<e.length;r++){let o=e.points[r*2];for(;a<y-1&&b[a*2]<o;)a++;t[i*2]=o,t[i*2+1]=e.points[r*2+1],n[i*2]=o,n[i*2+1]=f[a*2+1],i++}b=t,x=n,y=i}else{let e=r.decimateMinMax(b,0,y,e=>l.xToPx(e)/p);b=e.points,y=e.length}}let S=[],C=[],w=[],T=[];for(let e=0;e<y;e++){let t=b[e*2],n=b[e*2+1],r=x?x[e*2+1]:0;if(!Number.isFinite(t)||!Number.isFinite(n)||!Number.isFinite(r)){w.length&&(S.push(w),C.push(T)),w=[],T=[];continue}w.push(l.xToPx(t),l.yToPx(n)),x&&T.push(l.yToPx(r))}w.length&&(S.push(w),C.push(T)),n.type===`area`&&m.push({kind:`area`,seriesIndex:n.index,color:n.colorCss,opacity:n.opacity,baseline:l.yToPx(a.baseline),segments:S,...x?{bottoms:C}:{}}),m.push({kind:`line`,seriesIndex:n.index,color:n.colorCss,width:n.type===`area`?Math.min(n.lineWidth,2):n.lineWidth,segments:S});continue}if(n.type===`bar`&&n.barBase&&n.barTop){let[t,r]=g(c,_,v,o.x),i=Math.max(n.barHalfWidth/l.xPerPx,.5),a=[],s=[],d=r-t>f,p=NaN;for(let o=t;o<r;o++){let t=n.barBase[o],r=n.barTop[o];if(!Number.isFinite(t)||!Number.isFinite(r))continue;let f=l.xToPx(c[o]+n.barOffset);if(f+i<u.x||f-i>u.x+u.width)continue;let m=l.yToPx(t),h=l.yToPx(r),g=Math.min(m,h),_=Math.max(1,Math.abs(m-h)),v=Math.floor(f);if(d&&v===p&&a.length){let e=a.length-4,t=Math.max(a[e+1]+a[e+3],g+_);a[e+1]=Math.min(a[e+1],g),a[e+3]=t-a[e+1];continue}p=v,a.push(f-i,g,i*2,_);let y=n.pointColors?.[o];s.push(y?e.toCss(y):n.colorCss)}m.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:a,...n.pointColors?{colors:s}:{},radius:n.radius});continue}if(n.type===`candlestick`){let[t,r]=g(c,_,v,o.x),{open:i,high:a,low:s}=n.cols,d=Math.max(n.barHalfWidth/l.xPerPx,1),p=e.toCss(n.upColor),y=e.toCss(n.downColor),b=[],x=[],S=[],C=[],w=Math.max(1,Math.ceil((r-t)/f));for(let e=t;e<r;e+=w){let t=h[e],n=i?i[e]:t;if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=l.xToPx(c[e]);if(r+d<u.x||r-d>u.x+u.width)continue;let o=t<n?y:p,f=l.yToPx(a?a[e]:Math.max(n,t)),m=l.yToPx(s?s[e]:Math.min(n,t));b.push(r-.5,Math.min(f,m),1,Math.abs(m-f)),S.push(o);let g=l.yToPx(n),_=l.yToPx(t);x.push(r-d,Math.min(g,_),d*2,Math.max(1,Math.abs(g-_))),C.push(o)}m.push({kind:`bars`,seriesIndex:n.index,color:p,rects:b,colors:S},{kind:`bars`,seriesIndex:n.index,color:p,rects:x,colors:C,radius:1});continue}if(n.type===`heatmap`){let t=Math.abs(n.cellHalf.x/l.xPerPx),r=Math.abs(n.cellHalf.y/l.yPerPx),i=[],a=[],o=+(t>3&&r>3);for(let s=0;s<_&&i.length/4<f*4;s++){let d=n.cellColors?.[s];if(!d)continue;let f=l.xToPx(c[s]),p=l.yToPx(h[s]);f+t<u.x||f-t>u.x+u.width||p+r<u.y||p-r>u.y+u.height||(i.push(f-t+o,p-r+o,t*2-o*2,r*2-o*2),a.push(e.toCss(e.unpackColor(d))))}m.push({kind:`bars`,seriesIndex:n.index,color:n.colorCss,rects:i,colors:a,radius:n.radius});continue}let y=[],b=[],x=t=>{let r=n.pointColors?.[t];return r?e.toCss(r):n.colorCss},S=[];for(let e=0;e<_;e++){let t=c[e],n=h[e];if(!Number.isFinite(t)||!Number.isFinite(n))continue;let r=l.xToPx(t),i=l.yToPx(n);r<u.x||r>u.x+u.width||i<u.y||i>u.y+u.height||S.push(e)}if(S.length>d){let e=Math.max(2,i.dotCell??n.pointSize*.8),t=Math.ceil(u.width/e)+1,r=new Map;for(let n of S){let i=Math.floor((l.xToPx(c[n])-u.x)/e),a=Math.floor((l.yToPx(h[n])-u.y)/e);r.set(a*t+i,n)}for(let[n,i]of r)y.push(u.x+(n%t+.5)*e,u.y+(Math.floor(n/t)+.5)*e,e),b.push(x(i))}else for(let e of S)y.push(l.xToPx(c[e]),l.yToPx(h[e]),s.dotSize(n,e)),b.push(x(e));m.push({kind:`dots`,seriesIndex:n.index,opacity:n.opacity,dots:y,colors:b})}return m};exports.createChartController=h,exports.scenePrimitives=v;
|
|
3
3
|
//# sourceMappingURL=controller.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","tooltipContent","layoutChart","collectPointLabels","textBox","placeLabels","showsCrosshair","hoverMarks","dotSize","sameHover","hitTest","zoomRange","createScales","panRange","lowerBound","decimateMinMax","toCss","require_color","require_data","require_decimate","require_layout","require_model","require_overlay","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","x0","x1","y0","y1","right","bottom","pos","pointLabels","t","next","crosshair","cx","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","shift","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","scenePrimitives","maxDots","limits","maxBars","column","order","out","series","end","interleaved","n","segments","run","xv","yv","half","rects","merge","lastCol","ya","yb","col","k","dots","colors","colorOf","c","visible","px","py","cell","cols","owner"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss } from \"./color\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport { createScales, type Rect } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n font,\n placeLabels,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n type ChartLayout,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\nexport interface ChartLegendLayout {\n entries: ChartLegendEntry[];\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the guide line (`null` when hidden) */\n crosshairX: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(options.annotations, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = option === undefined ? named > 1 : !!option;\n if (!show) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape:\n s.type === \"scatter\" ? \"dot\" : s.type === \"line\" ? \"line\" : \"square\",\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(model, event, scene?.layout.yTicks ?? null);\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n for (const row of content.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, 12) +\n 16 +\n measure(row.value, 12, 600),\n );\n }\n lines = 1 + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(model, view, layout.scales);\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const s = layout.scales;\n const x0 = a.x0 === undefined ? layout.plot.x : s.xToPx(a.x0);\n const x1 =\n a.x1 === undefined ? layout.plot.x + layout.plot.width : s.xToPx(a.x1);\n const y0 =\n a.y0 === undefined ? layout.plot.y + layout.plot.height : s.yToPx(a.y0);\n const y1 = a.y1 === undefined ? layout.plot.y : s.yToPx(a.y1);\n const w = measure(a.label, theme.fontSize + 1, 600);\n const left = Math.min(x0, x1);\n const right = Math.max(x0, x1);\n const top = Math.min(y0, y1);\n const bottom = Math.max(y0, y1);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? left + 10\n : pos.endsWith(\"right\")\n ? right - 10 - w\n : (left + right - w) / 2,\n y: pos.startsWith(\"top\")\n ? top + 10\n : pos.startsWith(\"bottom\")\n ? bottom - 10 - labelHeight\n : (top + bottom - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n };\n scene = next;\n if (hover) {\n const crosshair = showsCrosshair(model, hover.event, options.crosshair);\n const cx = layout.scales.xToPx(hover.event.items[0].x);\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX:\n crosshair &&\n cx >= layout.plot.x &&\n cx <= layout.plot.x + layout.plot.width\n ? cx\n : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(x), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(y), factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, start.pxToX(gesture.midX), factor);\n const shift = (midX - gesture.midX) * start.xPerPx * factor;\n next.x = panRange(next.x, model.x.reverse ? shift : -shift);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, start.pxToY(gesture.midY), factor);\n const shift = (midY - gesture.midY) * start.yPerPx * factor;\n next.y = panRange(next.y, model.y.reverse ? -shift : shift);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const dx = x - gesture.x;\n const dy = y - gesture.y;\n const next = copyView(gesture.view);\n if (model.zoom.x)\n next.x = panRange(\n gesture.view.x,\n -dx * sc.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n gesture.view.y,\n dy * sc.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.xToPx(x), y: sc.yToPx(y) } : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.pxToX(x), y: sc.pxToY(y) } : null;\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline */\n baseline: number;\n segments: number[][];\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n const order = { area: 0, bar: 1, line: 2, scatter: 3 } as const;\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => order[a.type] - order[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const interleaved = new Float64Array((end - start) * 2);\n for (let i = start; i < end; i++) {\n interleaved[(i - start) * 2] = x[i];\n interleaved[(i - start) * 2 + 1] = y[i];\n }\n const n = end - start;\n const line =\n sorted && n > (plot.width * 2) / column\n ? decimateMinMax(interleaved, 0, n, (v) => sc.xToPx(v) / column)\n : { points: interleaved, length: n };\n const segments: number[][] = [];\n let run: number[] = [];\n for (let i = 0; i < line.length; i++) {\n const xv = line.points[i * 2];\n const yv = line.points[i * 2 + 1];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) {\n if (run.length) segments.push(run);\n run = [];\n continue;\n }\n run.push(sc.xToPx(xv), sc.yToPx(yv));\n }\n if (run.length) segments.push(run);\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n });\n }\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width: s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth,\n segments,\n });\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 0.5);\n const rects: number[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column vertically\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const px = sc.xToPx(xv);\n const py = sc.yToPx(yv);\n if (\n px < plot.x ||\n px > plot.x + plot.width ||\n py < plot.y ||\n py > plot.y + plot.height\n )\n continue;\n visible.push(i);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n for (const i of visible) {\n const cx = Math.floor((sc.xToPx(x[i]) - plot.x) / cell);\n const cy = Math.floor((sc.yToPx(y[i]) - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n }\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n for (const i of visible) {\n dots.push(sc.xToPx(x[i]), sc.yToPx(y[i]), dotSize(s, i));\n colors.push(colorOf(i));\n }\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"controller.cjs","names":["createTheme","font","buildModel","clampRange","sameRange","resolveAnnotations","legendShape","tooltipContent","layoutChart","collectPointLabels","textBox","placeLabels","showsCrosshair","hoverMarks","dotSize","sameHover","hitTest","zoomRange","createScales","panRange","lowerBound","curvePoints","decimateMinMax","toCss","unpackColor","require_color","require_curve","require_data","require_decimate","require_layout","require_model","require_overlay","require_scene","require_theme","require_viewport","copyView","v","TAP_SLOP","TOUCH_SLOP","DOUBLE_TAP_MS","LEGEND_ROW","createChartController","options","config","themeInput","theme","cache","hidden","listeners","model","view","zoomed","width","height","annotations","scene","sceneDirty","lastPlot","destroyed","hover","pointers","gesture","lastTap","emit","type","listener","event","invalidate","interaction","value","o","measure","text","size","weight","rebuild","base","minSpan","it","setHover","legendLayout","option","named","s","cfg","position","entries","x","row","w","legendHeight","tooltipLayout","tooltip","custom","result","content","lines","line","boxW","boxH","left","anchorX","top","anchorY","computeScene","legend","legendTop","layout","labels","occupied","labelHeight","a","x0","x1","y0","y1","right","bottom","pos","pointLabels","t","next","crosshair","cx","rect","key","getScene","scales","changed","hitAt","sc","y","touch","inPlot","p","dataAt","plot","cy","setViewInternal","notify","zoomAt","factor","resetZoom","legendAt","e","toggleSeries","id","startPinch","b","paletteChanged","h","item","i","distance","midX","midY","start","shift","at","dx","dy","current","now","hit","set","visibleRange","sorted","count","range","ORDER","scenePrimitives","maxDots","limits","maxBars","column","out","series","end","curved","n","points","bottoms","d","nextBottom","k","j","xv","segments","bottomSegments","run","runBottom","yv","bv","half","rects","colors","merge","lastCol","ya","yb","col","pc","up","down","wicks","bodies","wickColors","bodyColors","step","c","open","color","hi","high","lo","low","hw","hh","inset","dots","colorOf","visible","px","py","cell","cols","owner"],"sources":["../../../../../../charts/src/engine/controller.ts"],"sourcesContent":["// createChartController: the platform-free chart. It owns the options, the\n// theme, the model, the visible range and the interactions (pointer / touch\n// gestures fed by the host) and describes what to draw (`getScene`). Hosts\n// only draw: createCanvasChart on any 2D context, the React Native charts\n// with views.\n\nimport { toCss, unpackColor } from \"./color\";\nimport { curvePoints } from \"./curve\";\nimport { lowerBound } from \"./data\";\nimport { decimateMinMax } from \"./decimate\";\nimport { createScales, type Rect } from \"./layout\";\nimport { buildModel, type ChartModel, type DataCache } from \"./model\";\nimport {\n font,\n placeLabels,\n textBox,\n type PointLabel,\n type ResolvedAnnotation,\n} from \"./overlay\";\nimport {\n collectPointLabels,\n dotSize,\n hitTest,\n hoverMarks,\n layoutChart,\n legendShape,\n resolveAnnotations,\n sameHover,\n showsCrosshair,\n tooltipContent,\n type ChartLayout,\n type HoverMark,\n type TooltipContent,\n} from \"./scene\";\nimport { createTheme, type ChartTheme, type ChartThemeInput } from \"./theme\";\nimport type {\n ChartEventMap,\n ChartHoverEvent,\n ChartHoverItem,\n ChartOptions,\n ChartPlotClickEvent,\n ChartRect,\n ChartView,\n} from \"./types\";\nimport {\n clampRange,\n panRange,\n sameRange,\n zoomRange,\n type Range,\n} from \"./viewport\";\n\n/** Events of a controller (no renderer events: hosts draw themselves) */\nexport type ChartControllerEventMap = Omit<ChartEventMap, \"renderer\">;\n\nexport interface ChartControllerConfig {\n options: ChartOptions;\n /** Colors and fonts (Minerva variables); light defaults when omitted */\n theme?: ChartThemeInput;\n /** Width in pixels of `text` drawn with the CSS `font` */\n measureText: (text: string, font: string) => number;\n /** Called when the scene changed and must be drawn again */\n onInvalidate?: () => void;\n}\n\nexport interface ChartLegendEntry {\n id: string;\n name: string;\n /** CSS color */\n color: string;\n shape: \"dot\" | \"line\" | \"square\";\n hidden: boolean;\n /** Hit / draw box of the entry, pixels of the chart */\n box: Rect;\n}\n\nexport interface ChartLegendLayout {\n entries: ChartLegendEntry[];\n position: \"top\" | \"bottom\";\n /** Whether a tap toggles the series */\n toggle: boolean;\n /** Height taken by the legend */\n height: number;\n}\n\nexport interface ChartTooltipLayout {\n /** Default content (`text` is set instead when `tooltip.render` returns a string) */\n content: TooltipContent;\n /** Lines of a custom string tooltip */\n text: string[] | null;\n /** Box of the tooltip, pixels of the chart */\n box: Rect;\n /** Line height used to lay the box out */\n lineHeight: number;\n padding: number;\n}\n\nexport interface ChartHoverLayout {\n event: ChartHoverEvent;\n marks: HoverMark[];\n /** X pixel of the guide line (`null` when hidden) */\n crosshairX: number | null;\n tooltip: ChartTooltipLayout | null;\n}\n\n/** Everything a host draws, in CSS pixels of the chart */\nexport interface ChartScene {\n width: number;\n height: number;\n theme: ChartTheme;\n model: ChartModel;\n view: ChartView;\n layout: ChartLayout;\n annotations: ResolvedAnnotation[];\n /** Labels of the dots that found a free slot */\n pointLabels: { label: PointLabel; box: Rect }[];\n legend: ChartLegendLayout | null;\n hover: ChartHoverLayout | null;\n /** Point being dragged (`interaction.dragPoints`) */\n dragging: { x: number; y: number; color: string; size: number } | null;\n}\n\nexport interface ChartPointerOptions {\n /** Pointer id (touch identifier); 0 by default */\n id?: number;\n /** Touch input: the tooltip follows the finger and stays after a tap */\n touch?: boolean;\n}\n\nexport interface ChartController {\n setOptions(options: ChartOptions): void;\n setTheme(theme: ChartThemeInput | undefined): void;\n /** Size of the chart in CSS pixels */\n setSize(width: number, height: number): void;\n /** What to draw (`null` until the size is known) */\n getScene(): ChartScene | null;\n pointerDown(x: number, y: number, options?: ChartPointerOptions): void;\n pointerMove(x: number, y: number, options?: ChartPointerOptions): void;\n pointerUp(x: number, y: number, options?: ChartPointerOptions): void;\n pointerCancel(options?: ChartPointerOptions): void;\n /** The mouse left the chart */\n pointerLeave(): void;\n /** Zooms around a pixel (factor < 1 zooms in) */\n zoomAt(x: number, y: number, factor: number): void;\n resetZoom(): void;\n getView(): ChartView;\n setView(view: Partial<ChartView>): void;\n /** Shows / hides a series (like a legend click) */\n toggleSeries(id: string): void;\n /** Hides the tooltip */\n clearHover(): void;\n getPlotRect(): ChartRect | null;\n toPixel(x: number, y: number): { x: number; y: number } | null;\n fromPixel(x: number, y: number): { x: number; y: number } | null;\n on<K extends keyof ChartControllerEventMap>(\n type: K,\n listener: (event: ChartControllerEventMap[K]) => void,\n ): () => void;\n destroy(): void;\n}\n\nconst copyView = (v: ChartView): ChartView => ({\n x: [v.x[0], v.x[1]],\n y: [v.y[0], v.y[1]],\n});\n\nconst TAP_SLOP = 6;\nconst TOUCH_SLOP = 10;\nconst DOUBLE_TAP_MS = 320;\nconst LEGEND_ROW = 20;\n\ninterface PointerState {\n x: number;\n y: number;\n startX: number;\n startY: number;\n touch: boolean;\n moved: boolean;\n}\n\nexport const createChartController = (\n config: ChartControllerConfig,\n): ChartController => {\n let options = config.options;\n let themeInput = config.theme;\n let theme = createTheme(themeInput, options.palette);\n const cache: DataCache = new Map();\n const hidden = new Set<string>();\n const listeners: {\n [K in keyof ChartControllerEventMap]?: Set<\n (event: ChartControllerEventMap[K]) => void\n >;\n } = {};\n let model: ChartModel;\n let view: ChartView = { x: [0, 1], y: [0, 1] };\n let zoomed = false;\n let width = 0;\n let height = 0;\n let annotations: ResolvedAnnotation[] = [];\n let scene: ChartScene | null = null;\n let sceneDirty = true;\n let lastPlot = \"\";\n let destroyed = false;\n\n let hover: { event: ChartHoverEvent; x: number; y: number } | null = null;\n const pointers = new Map<number, PointerState>();\n let gesture:\n | { kind: \"pan\"; view: ChartView; x: number; y: number }\n | {\n kind: \"pinch\";\n view: ChartView;\n distance: number;\n midX: number;\n midY: number;\n }\n | { kind: \"point\"; item: ChartHoverItem; x: number; y: number }\n | null = null;\n let lastTap = { time: 0, x: 0, y: 0 };\n\n const emit = <K extends keyof ChartControllerEventMap>(\n type: K,\n event: ChartControllerEventMap[K],\n ) => {\n listeners[type]?.forEach((listener) => listener(event));\n };\n\n const invalidate = () => {\n sceneDirty = true;\n if (!destroyed) config.onInvalidate?.();\n };\n\n const interaction = () => {\n const value = options.interaction;\n if (value === false) return null;\n const o = typeof value === \"object\" ? value : {};\n return {\n pan: o.pan ?? true,\n dragPoints: o.dragPoints ?? false,\n };\n };\n\n const measure = (text: string, size = theme.fontSize, weight = 400) =>\n config.measureText(text, font(theme, size, weight));\n\n const rebuild = () => {\n model = buildModel(options, theme, hidden, cache);\n const { base, minSpan } = model;\n if (!zoomed) {\n view = copyView(base);\n } else {\n view = {\n x: model.zoom.x ? clampRange(view.x, base.x, minSpan.x) : [...base.x],\n y: model.zoom.y ? clampRange(view.y, base.y, minSpan.y) : [...base.y],\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n }\n annotations = resolveAnnotations(options.annotations, theme);\n if (hover) {\n const stillThere = hover.event.items.every(\n (it) =>\n model.series[it.seriesIndex] &&\n !model.series[it.seriesIndex].hidden &&\n it.index < model.series[it.seriesIndex].cols.count,\n );\n if (!stillThere) setHover(null);\n }\n invalidate();\n };\n\n // --------------------------------------------------------------- legend\n\n const legendLayout = (): ChartLegendLayout | null => {\n const option = options.legend;\n const named = options.series.filter((s) => s.name).length;\n const show = option === undefined ? named > 1 : !!option;\n if (!show) return null;\n const cfg = typeof option === \"object\" ? option : {};\n const position = cfg.position === \"bottom\" ? \"bottom\" : \"top\";\n const entries: ChartLegendEntry[] = [];\n let x = 4;\n let row = 0;\n for (const s of model.series) {\n const w = 14 + measure(s.name, 12) + 8;\n if (x + w > width - 4 && x > 4) {\n x = 4;\n row++;\n }\n entries.push({\n id: s.id,\n name: s.name,\n color: s.colorCss,\n shape: legendShape(s.type),\n hidden: s.hidden,\n box: { x, y: row * LEGEND_ROW, width: w, height: LEGEND_ROW },\n });\n x += w + 10;\n }\n const legendHeight = (row + 1) * LEGEND_ROW + 6;\n if (position === \"bottom\") {\n for (const e of entries) e.box.y += height - legendHeight + 6;\n }\n return {\n entries,\n position,\n toggle: cfg.toggle ?? true,\n height: legendHeight,\n };\n };\n\n // ---------------------------------------------------------------- scene\n\n const tooltipLayout = (\n event: ChartHoverEvent,\n anchorX: number,\n anchorY: number,\n ): ChartTooltipLayout | null => {\n const tooltip = options.tooltip;\n if (tooltip === false) return null;\n const custom = typeof tooltip === \"object\" ? tooltip.render : undefined;\n let text: string[] | null = null;\n if (custom) {\n const result = custom(event);\n if (result === null || result === \"\") return null;\n if (typeof result === \"string\") text = result.split(\"\\n\");\n }\n const content = tooltipContent(model, event, scene?.layout.yTicks ?? null);\n const lineHeight = 18;\n const padding = 8;\n let w = 0;\n let lines: number;\n if (text) {\n for (const line of text) w = Math.max(w, measure(line, 12));\n lines = text.length;\n } else {\n w = measure(content.title, 12, 600) + (content.titleColor ? 14 : 0);\n for (const row of content.rows) {\n w = Math.max(\n w,\n (row.color ? 14 : 0) +\n measure(row.name, 12) +\n 16 +\n measure(row.value, 12, 600),\n );\n }\n lines = 1 + content.rows.length;\n }\n const boxW = Math.ceil(Math.max(w, 96) + padding * 2 + 4);\n const boxH = lines * lineHeight + padding * 2;\n let left = anchorX + 14;\n if (left + boxW > width - 4) left = anchorX - 14 - boxW;\n left = Math.max(4, Math.min(left, width - boxW - 4));\n const top = Math.max(4, Math.min(anchorY - boxH / 2, height - boxH - 4));\n return {\n content,\n text,\n box: { x: left, y: top, width: boxW, height: boxH },\n lineHeight,\n padding,\n };\n };\n\n const computeScene = (): ChartScene | null => {\n if (width <= 0 || height <= 0) return null;\n const legend = legendLayout();\n const legendTop = legend?.position === \"top\" ? legend.height : 0;\n const layout = layoutChart({\n model,\n view,\n theme,\n width,\n height: height - (legend?.height ?? 0),\n padding: options.padding,\n top: legendTop,\n measure: (text) => measure(text),\n });\n const labels = collectPointLabels(\n model,\n view,\n layout.scales,\n layout.yTicks,\n );\n const occupied: Rect[] = [];\n const labelHeight = theme.fontSize + 4;\n for (const a of annotations) {\n if (a.type === \"text\" && a.text) {\n occupied.push(\n textBox(\n a,\n layout.scales,\n measure(a.text, theme.fontSize, a.weight),\n labelHeight,\n ),\n );\n continue;\n }\n if (a.type !== \"rect\" || !a.label) continue;\n // keep the dot labels off the area titles (drawForeground does the same)\n const s = layout.scales;\n const x0 = a.x0 === undefined ? layout.plot.x : s.xToPx(a.x0);\n const x1 =\n a.x1 === undefined ? layout.plot.x + layout.plot.width : s.xToPx(a.x1);\n const y0 =\n a.y0 === undefined ? layout.plot.y + layout.plot.height : s.yToPx(a.y0);\n const y1 = a.y1 === undefined ? layout.plot.y : s.yToPx(a.y1);\n const w = measure(a.label, theme.fontSize + 1, 600);\n const left = Math.min(x0, x1);\n const right = Math.max(x0, x1);\n const top = Math.min(y0, y1);\n const bottom = Math.max(y0, y1);\n const pos = a.labelPosition;\n occupied.push({\n x: pos.endsWith(\"left\")\n ? left + 10\n : pos.endsWith(\"right\")\n ? right - 10 - w\n : (left + right - w) / 2,\n y: pos.startsWith(\"top\")\n ? top + 10\n : pos.startsWith(\"bottom\")\n ? bottom - 10 - labelHeight\n : (top + bottom - labelHeight) / 2,\n width: w,\n height: labelHeight,\n });\n }\n const pointLabels = placeLabels(\n labels,\n layout.plot,\n (t) => measure(t),\n labelHeight - 2,\n occupied,\n );\n const next: ChartScene = {\n width,\n height,\n theme,\n model,\n view: copyView(view),\n layout,\n annotations,\n pointLabels,\n legend,\n hover: null,\n dragging: null,\n };\n scene = next;\n if (hover) {\n const crosshair = showsCrosshair(model, hover.event, options.crosshair);\n const cx = layout.scales.xToPx(hover.event.items[0].x);\n next.hover = {\n event: hover.event,\n marks: hoverMarks(model, layout.scales, hover.event),\n crosshairX:\n crosshair &&\n cx >= layout.plot.x &&\n cx <= layout.plot.x + layout.plot.width\n ? cx\n : null,\n tooltip:\n gesture?.kind === \"pan\" || gesture?.kind === \"point\"\n ? null\n : tooltipLayout(hover.event, hover.x, hover.y),\n };\n }\n if (gesture?.kind === \"point\") {\n const s = model.series[gesture.item.seriesIndex];\n next.dragging = {\n x: gesture.x,\n y: gesture.y,\n color: gesture.item.color,\n size: (s ? dotSize(s, gesture.item.index) : 8) + 6,\n };\n }\n const rect = layout.plot;\n const key = `${rect.x},${rect.y},${rect.width},${rect.height}`;\n if (key !== lastPlot) {\n lastPlot = key;\n emit(\"layout\", { ...rect });\n }\n return next;\n };\n\n const getScene = () => {\n if (sceneDirty || !scene) {\n sceneDirty = false;\n scene = computeScene();\n }\n return scene;\n };\n\n // ---------------------------------------------------------- interaction\n\n const scales = () => getScene()?.layout.scales ?? null;\n\n const setHover = (\n next: { event: ChartHoverEvent; x: number; y: number } | null,\n ) => {\n const changed = !sameHover(hover?.event ?? null, next?.event ?? null);\n hover = next;\n invalidate();\n if (changed) emit(\"hover\", next ? next.event : null);\n };\n\n const hitAt = (x: number, y: number, touch: boolean) => {\n const sc = scales();\n return sc\n ? hitTest(model, sc, scene?.layout.xTicks ?? null, x, y, touch ? 8 : 0)\n : null;\n };\n\n const inPlot = (x: number, y: number) => {\n const p = scales()?.plot;\n return (\n !!p && x >= p.x && x <= p.x + p.width && y >= p.y && y <= p.y + p.height\n );\n };\n\n const dataAt = (x: number, y: number) => {\n const sc = scales();\n if (!sc) return null;\n const { plot } = sc;\n const cx = Math.max(plot.x, Math.min(plot.x + plot.width, x));\n const cy = Math.max(plot.y, Math.min(plot.y + plot.height, y));\n return { x: sc.pxToX(cx), y: sc.pxToY(cy) };\n };\n\n const setViewInternal = (next: ChartView, notify: boolean) => {\n const { base, minSpan } = model;\n view = {\n x: clampRange(next.x, base.x, minSpan.x),\n y: clampRange(next.y, base.y, minSpan.y),\n };\n zoomed = !sameRange(view.x, base.x) || !sameRange(view.y, base.y);\n if (notify) emit(\"zoom\", copyView(view));\n invalidate();\n };\n\n const zoomAt = (x: number, y: number, factor: number) => {\n const sc = scales();\n if (!sc || (!model.zoom.x && !model.zoom.y)) return;\n const next = copyView(view);\n if (model.zoom.x) next.x = zoomRange(view.x, sc.pxToX(x), factor);\n if (model.zoom.y) next.y = zoomRange(view.y, sc.pxToY(y), factor);\n setViewInternal(next, true);\n };\n\n const resetZoom = () => {\n if (!zoomed) return;\n setViewInternal(copyView(model.base), true);\n };\n\n const legendAt = (x: number, y: number) =>\n getScene()?.legend?.entries.find(\n (e) =>\n x >= e.box.x &&\n x <= e.box.x + e.box.width &&\n y >= e.box.y &&\n y <= e.box.y + e.box.height,\n ) ?? null;\n\n const toggleSeries = (id: string) => {\n if (hidden.has(id)) hidden.delete(id);\n else hidden.add(id);\n rebuild();\n };\n\n const startPinch = () => {\n const [a, b] = [...pointers.values()];\n gesture = {\n kind: \"pinch\",\n view: copyView(view),\n distance: Math.max(1, Math.hypot(a.x - b.x, a.y - b.y)),\n midX: (a.x + b.x) / 2,\n midY: (a.y + b.y) / 2,\n };\n setHover(null);\n };\n\n const pointerDown = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const touch = !!o.touch;\n pointers.set(id, { x, y, startX: x, startY: y, touch, moved: false });\n const it = interaction();\n if (pointers.size === 2) {\n if (it && (model.zoom.x || model.zoom.y) && gesture?.kind !== \"point\")\n startPinch();\n return;\n }\n if (pointers.size > 2 || !it) {\n if (!it && touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n return;\n }\n if (it.dragPoints) {\n const item = hitAt(x, y, touch)?.items.find(\n (i) => model.series[i.seriesIndex].type === \"scatter\",\n );\n if (item) {\n gesture = { kind: \"point\", item, x, y };\n return;\n }\n }\n if (zoomed && it.pan && inPlot(x, y)) {\n gesture = { kind: \"pan\", view: copyView(view), x, y };\n return;\n }\n gesture = null;\n if (touch) {\n const event = hitAt(x, y, true);\n setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerMove = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n if (p) {\n p.x = x;\n p.y = y;\n if (\n !p.moved &&\n Math.hypot(x - p.startX, y - p.startY) >\n (p.touch ? TOUCH_SLOP : TAP_SLOP)\n )\n p.moved = true;\n }\n if (gesture?.kind === \"pinch\" && pointers.size >= 2) {\n const [a, b] = [...pointers.values()];\n const distance = Math.max(1, Math.hypot(a.x - b.x, a.y - b.y));\n const midX = (a.x + b.x) / 2;\n const midY = (a.y + b.y) / 2;\n const sc = scales();\n if (!sc) return;\n const start = createScales(\n sc.plot,\n gesture.view,\n model.x.reverse,\n model.y.reverse,\n );\n const factor = gesture.distance / distance;\n const next = copyView(gesture.view);\n if (model.zoom.x) {\n next.x = zoomRange(gesture.view.x, start.pxToX(gesture.midX), factor);\n const shift = (midX - gesture.midX) * start.xPerPx * factor;\n next.x = panRange(next.x, model.x.reverse ? shift : -shift);\n }\n if (model.zoom.y) {\n next.y = zoomRange(gesture.view.y, start.pxToY(gesture.midY), factor);\n const shift = (midY - gesture.midY) * start.yPerPx * factor;\n next.y = panRange(next.y, model.y.reverse ? -shift : shift);\n }\n setViewInternal(next, true);\n return;\n }\n if (gesture?.kind === \"point\" && p) {\n if (!p.moved) return;\n gesture.x = x;\n gesture.y = y;\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drag\", { item: gesture.item, x: at.x, y: at.y });\n return;\n }\n if (gesture?.kind === \"pan\" && p) {\n if (!p.moved) return;\n const sc = scales();\n if (!sc) return;\n const dx = x - gesture.x;\n const dy = y - gesture.y;\n const next = copyView(gesture.view);\n if (model.zoom.x)\n next.x = panRange(\n gesture.view.x,\n -dx * sc.xPerPx * (model.x.reverse ? -1 : 1),\n );\n if (model.zoom.y)\n next.y = panRange(\n gesture.view.y,\n dy * sc.yPerPx * (model.y.reverse ? -1 : 1),\n );\n setViewInternal(next, true);\n return;\n }\n if (pointers.size > 1) return;\n // mouse hover, or a finger scrubbing along the data\n if (!p || p.touch || !o.touch) {\n const event = hitAt(x, y, !!p?.touch || !!o.touch);\n if (event || !p?.touch) setHover(event ? { event, x, y } : null);\n }\n };\n\n const pointerUp = (x: number, y: number, o: ChartPointerOptions = {}) => {\n if (destroyed) return;\n const id = o.id ?? 0;\n const p = pointers.get(id);\n pointers.delete(id);\n const current = gesture;\n if (current?.kind === \"pinch\") {\n if (pointers.size < 2) gesture = null;\n return;\n }\n gesture = null;\n if (!p) return;\n if (current?.kind === \"point\") {\n if (p.moved) {\n const at = dataAt(x, y);\n invalidate();\n if (at) emit(\"drop\", { item: current.item, x: at.x, y: at.y });\n return;\n }\n } else if (current?.kind === \"pan\" && p.moved) {\n invalidate();\n return;\n }\n if (p.moved) {\n if (p.touch) invalidate();\n return;\n }\n // tap / click\n const now = Date.now();\n if (\n p.touch &&\n now - lastTap.time < DOUBLE_TAP_MS &&\n Math.hypot(x - lastTap.x, y - lastTap.y) < 24 &&\n zoomed\n ) {\n lastTap = { time: 0, x, y };\n resetZoom();\n return;\n }\n lastTap = { time: now, x, y };\n const legend = legendAt(x, y);\n if (legend) {\n if (getScene()?.legend?.toggle) toggleSeries(legend.id);\n return;\n }\n const hit = hitAt(x, y, p.touch);\n if (hit) {\n if (p.touch) setHover({ event: hit, x, y });\n emit(\"click\", hit);\n return;\n }\n if (p.touch) setHover(null);\n if (inPlot(x, y)) {\n const at = dataAt(x, y);\n if (at) emit(\"plotClick\", at as ChartPlotClickEvent);\n }\n };\n\n const pointerCancel = (o: ChartPointerOptions = {}) => {\n pointers.delete(o.id ?? 0);\n if (gesture?.kind === \"point\" || pointers.size < 2) gesture = null;\n invalidate();\n };\n\n model = buildModel(options, theme, hidden, cache);\n rebuild();\n\n return {\n setOptions(next) {\n if (destroyed) return;\n const paletteChanged =\n (next.palette ?? []).join() !== (options.palette ?? []).join();\n options = next;\n if (paletteChanged) theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setTheme(next) {\n if (destroyed) return;\n themeInput = next;\n theme = createTheme(themeInput, options.palette);\n rebuild();\n },\n setSize(w, h) {\n if (w === width && h === height) return;\n width = Math.max(0, w);\n height = Math.max(0, h);\n invalidate();\n },\n getScene,\n pointerDown,\n pointerMove,\n pointerUp,\n pointerCancel,\n pointerLeave() {\n if (!gesture && hover) setHover(null);\n },\n zoomAt,\n resetZoom,\n getView: () => copyView(view),\n setView(next) {\n if (destroyed) return;\n setViewInternal({ x: next.x ?? view.x, y: next.y ?? view.y }, false);\n },\n toggleSeries,\n clearHover() {\n if (hover) setHover(null);\n },\n getPlotRect() {\n const p = getScene()?.layout.plot;\n return p ? { ...p } : null;\n },\n toPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.xToPx(x), y: sc.yToPx(y) } : null;\n },\n fromPixel(x, y) {\n const sc = scales();\n return sc ? { x: sc.pxToX(x), y: sc.pxToY(y) } : null;\n },\n on(type, listener) {\n let set = listeners[type] as Set<typeof listener> | undefined;\n if (!set) {\n set = new Set();\n (listeners as Record<string, unknown>)[type] = set;\n }\n set.add(listener);\n return () => {\n set.delete(listener);\n };\n },\n destroy() {\n destroyed = true;\n pointers.clear();\n for (const key of Object.keys(listeners))\n delete (listeners as Record<string, unknown>)[key];\n },\n };\n};\n\n// ------------------------------------------------------------- primitives\n\n/** A polyline (pixels of the chart): interleaved x, y */\nexport interface ChartLinePrimitive {\n kind: \"line\";\n seriesIndex: number;\n color: string;\n width: number;\n /** Runs of points without gaps */\n segments: number[][];\n}\n\nexport interface ChartAreaPrimitive {\n kind: \"area\";\n seriesIndex: number;\n color: string;\n opacity: number;\n /** Y pixel of the baseline */\n baseline: number;\n segments: number[][];\n /** Stacked areas: y pixel of the bottom edge under every point of `segments` */\n bottoms?: number[][];\n}\n\nexport interface ChartBarPrimitive {\n kind: \"bars\";\n seriesIndex: number;\n color: string;\n /** Interleaved x, y, width, height */\n rects: number[];\n /** CSS color of every rect (candlesticks, heatmap cells, colored bars); `color` otherwise */\n colors?: string[];\n /** Corner radius in pixels */\n radius?: number;\n}\n\nexport interface ChartDotPrimitive {\n kind: \"dots\";\n seriesIndex: number;\n opacity: number;\n /** Interleaved x, y, diameter */\n dots: number[];\n /** CSS color of every dot */\n colors: string[];\n}\n\nexport type ChartPrimitive =\n | ChartLinePrimitive\n | ChartAreaPrimitive\n | ChartBarPrimitive\n | ChartDotPrimitive;\n\nexport interface ChartPrimitiveOptions {\n /**\n * Upper bound of the dots drawn per series: above it the dots are merged\n * into one per occupied cell of their size\n * @default 4000\n */\n maxDots?: number;\n /**\n * Upper bound of the bars drawn per series: above it neighboring bars\n * sharing a pixel column are merged\n * @default 2000\n */\n maxBars?: number;\n /**\n * Width in pixels of the columns lines are decimated to (at most four\n * points per column); larger values mean fewer shapes\n * @default 1\n */\n columnWidth?: number;\n /** Size of the cells dots are merged into (the dot size by default) */\n dotCell?: number;\n}\n\nconst visibleRange = (\n x: Float64Array,\n count: number,\n sorted: boolean,\n range: Range,\n): [number, number] => {\n if (!sorted) return [0, count];\n const [a, b] = range[0] <= range[1] ? range : [range[1], range[0]];\n return [\n Math.max(0, lowerBound(x, count, a) - 1),\n Math.min(count, lowerBound(x, count, b) + 1),\n ];\n};\n\nconst ORDER = {\n heatmap: 0,\n area: 1,\n bar: 2,\n candlestick: 3,\n line: 4,\n scatter: 5,\n} as const;\n\n/**\n * Data of a scene as simple shapes in pixels of the chart, for hosts\n * without a canvas (React Native views, SVG): lines are decimated to a few\n * points per pixel column and large point sets are merged per cell, so the\n * number of shapes stays bounded by the size of the chart.\n */\nexport const scenePrimitives = (\n scene: ChartScene,\n limits: ChartPrimitiveOptions = {},\n): ChartPrimitive[] => {\n const { model, view, layout } = scene;\n const sc = layout.scales;\n const { plot } = layout;\n const maxDots = limits.maxDots ?? 4000;\n const maxBars = limits.maxBars ?? 2000;\n const column = Math.max(1, limits.columnWidth ?? 1);\n const out: ChartPrimitive[] = [];\n const series = model.series\n .filter((s) => !s.hidden && s.cols.count > 0)\n .sort((a, b) => ORDER[a.type] - ORDER[b.type] || a.index - b.index);\n for (const s of series) {\n const { x, y, count, sorted } = s.cols;\n if (s.type === \"line\" || s.type === \"area\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const top = s.stackTop ?? y;\n // curve first (in data space), then decimation; the stacked bottom\n // edge follows the same sampling\n const curved = curvePoints(x, top, start, end, s.curve);\n const bottom = s.stackBase\n ? curvePoints(x, s.stackBase, start, end, s.curve).points\n : null;\n let n = curved.length;\n let points = curved.points;\n let bottoms = bottom;\n if (sorted && n > (plot.width * 2) / column) {\n if (bottom) {\n // keep the bottoms aligned with the kept tops (same x)\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n const next = new Float64Array(d.length * 2);\n const nextBottom = new Float64Array(d.length * 2);\n let k = 0;\n let j = 0;\n for (let i = 0; i < d.length; i++) {\n const xv = d.points[i * 2];\n while (j < n - 1 && points[j * 2] < xv) j++;\n next[k * 2] = xv;\n next[k * 2 + 1] = d.points[i * 2 + 1];\n nextBottom[k * 2] = xv;\n nextBottom[k * 2 + 1] = bottom[j * 2 + 1];\n k++;\n }\n points = next;\n bottoms = nextBottom;\n n = k;\n } else {\n const d = decimateMinMax(points, 0, n, (v) => sc.xToPx(v) / column);\n points = d.points;\n n = d.length;\n }\n }\n const segments: number[][] = [];\n const bottomSegments: number[][] = [];\n let run: number[] = [];\n let runBottom: number[] = [];\n for (let i = 0; i < n; i++) {\n const xv = points[i * 2];\n const yv = points[i * 2 + 1];\n const bv = bottoms ? bottoms[i * 2 + 1] : 0;\n if (\n !Number.isFinite(xv) ||\n !Number.isFinite(yv) ||\n !Number.isFinite(bv)\n ) {\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n run = [];\n runBottom = [];\n continue;\n }\n run.push(sc.xToPx(xv), sc.yToPx(yv));\n if (bottoms) runBottom.push(sc.yToPx(bv));\n }\n if (run.length) {\n segments.push(run);\n bottomSegments.push(runBottom);\n }\n if (s.type === \"area\") {\n out.push({\n kind: \"area\",\n seriesIndex: s.index,\n color: s.colorCss,\n opacity: s.opacity,\n baseline: sc.yToPx(model.baseline),\n segments,\n ...(bottoms ? { bottoms: bottomSegments } : {}),\n });\n }\n out.push({\n kind: \"line\",\n seriesIndex: s.index,\n color: s.colorCss,\n width: s.type === \"area\" ? Math.min(s.lineWidth, 2) : s.lineWidth,\n segments,\n });\n continue;\n }\n if (s.type === \"bar\" && s.barBase && s.barTop) {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 0.5);\n const rects: number[] = [];\n const colors: string[] = [];\n const merge = end - start > maxBars;\n let lastCol = NaN;\n for (let i = start; i < end; i++) {\n const a = s.barBase[i];\n const b = s.barTop[i];\n if (!Number.isFinite(a) || !Number.isFinite(b)) continue;\n const cx = sc.xToPx(x[i] + s.barOffset);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const ya = sc.yToPx(a);\n const yb = sc.yToPx(b);\n const top = Math.min(ya, yb);\n const h = Math.max(1, Math.abs(ya - yb));\n const col = Math.floor(cx);\n if (merge && col === lastCol && rects.length) {\n // widen the previous bar of the same pixel column vertically\n const k = rects.length - 4;\n const bottom = Math.max(rects[k + 1] + rects[k + 3], top + h);\n rects[k + 1] = Math.min(rects[k + 1], top);\n rects[k + 3] = bottom - rects[k + 1];\n continue;\n }\n lastCol = col;\n rects.push(cx - half, top, half * 2, h);\n const pc = s.pointColors?.[i];\n colors.push(pc ? toCss(pc) : s.colorCss);\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n ...(s.pointColors ? { colors } : {}),\n radius: s.radius,\n });\n continue;\n }\n if (s.type === \"candlestick\") {\n const [start, end] = visibleRange(x, count, sorted, view.x);\n const { open, high, low } = s.cols;\n const half = Math.max(s.barHalfWidth / sc.xPerPx, 1);\n const up = toCss(s.upColor);\n const down = toCss(s.downColor);\n const wicks: number[] = [];\n const bodies: number[] = [];\n const wickColors: string[] = [];\n const bodyColors: string[] = [];\n const step = Math.max(1, Math.ceil((end - start) / maxBars));\n for (let i = start; i < end; i += step) {\n const c = y[i];\n const o = open ? open[i] : c;\n if (!Number.isFinite(c) || !Number.isFinite(o)) continue;\n const cx = sc.xToPx(x[i]);\n if (cx + half < plot.x || cx - half > plot.x + plot.width) continue;\n const color = c < o ? down : up;\n const hi = sc.yToPx(high ? high[i] : Math.max(o, c));\n const lo = sc.yToPx(low ? low[i] : Math.min(o, c));\n wicks.push(cx - 0.5, Math.min(hi, lo), 1, Math.abs(lo - hi));\n wickColors.push(color);\n const ya = sc.yToPx(o);\n const yb = sc.yToPx(c);\n bodies.push(\n cx - half,\n Math.min(ya, yb),\n half * 2,\n Math.max(1, Math.abs(ya - yb)),\n );\n bodyColors.push(color);\n }\n out.push(\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: wicks,\n colors: wickColors,\n },\n {\n kind: \"bars\",\n seriesIndex: s.index,\n color: up,\n rects: bodies,\n colors: bodyColors,\n radius: 1,\n },\n );\n continue;\n }\n if (s.type === \"heatmap\") {\n const hw = Math.abs(s.cellHalf.x / sc.xPerPx);\n const hh = Math.abs(s.cellHalf.y / sc.yPerPx);\n const rects: number[] = [];\n const colors: string[] = [];\n const inset = hw > 3 && hh > 3 ? 1 : 0;\n for (let i = 0; i < count && rects.length / 4 < maxBars * 4; i++) {\n const c = s.cellColors?.[i];\n if (!c) continue;\n const cx = sc.xToPx(x[i]);\n const cy = sc.yToPx(y[i]);\n if (\n cx + hw < plot.x ||\n cx - hw > plot.x + plot.width ||\n cy + hh < plot.y ||\n cy - hh > plot.y + plot.height\n )\n continue;\n rects.push(\n cx - hw + inset,\n cy - hh + inset,\n hw * 2 - inset * 2,\n hh * 2 - inset * 2,\n );\n colors.push(toCss(unpackColor(c)));\n }\n out.push({\n kind: \"bars\",\n seriesIndex: s.index,\n color: s.colorCss,\n rects,\n colors,\n radius: s.radius,\n });\n continue;\n }\n // scatter\n const dots: number[] = [];\n const colors: string[] = [];\n const colorOf = (i: number) => {\n const c = s.pointColors?.[i];\n return c ? toCss(c) : s.colorCss;\n };\n const visible: number[] = [];\n for (let i = 0; i < count; i++) {\n const xv = x[i];\n const yv = y[i];\n if (!Number.isFinite(xv) || !Number.isFinite(yv)) continue;\n const px = sc.xToPx(xv);\n const py = sc.yToPx(yv);\n if (\n px < plot.x ||\n px > plot.x + plot.width ||\n py < plot.y ||\n py > plot.y + plot.height\n )\n continue;\n visible.push(i);\n }\n if (visible.length > maxDots) {\n const cell = Math.max(2, limits.dotCell ?? s.pointSize * 0.8);\n const cols = Math.ceil(plot.width / cell) + 1;\n const owner = new Map<number, number>();\n for (const i of visible) {\n const cx = Math.floor((sc.xToPx(x[i]) - plot.x) / cell);\n const cy = Math.floor((sc.yToPx(y[i]) - plot.y) / cell);\n owner.set(cy * cols + cx, i);\n }\n for (const [key, i] of owner) {\n dots.push(\n plot.x + ((key % cols) + 0.5) * cell,\n plot.y + (Math.floor(key / cols) + 0.5) * cell,\n cell,\n );\n colors.push(colorOf(i));\n }\n } else {\n for (const i of visible) {\n dots.push(sc.xToPx(x[i]), sc.yToPx(y[i]), dotSize(s, i));\n colors.push(colorOf(i));\n }\n }\n out.push({\n kind: \"dots\",\n seriesIndex: s.index,\n opacity: s.opacity,\n dots,\n colors,\n });\n }\n return out;\n};\n"],"mappings":"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"}
|