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":"theme.js","names":["DEFAULT_PALETTE","createTheme","variables","input","buildTheme","name","staticColorResolver","palette","resolveStaticColor","value","fallback","fallbackGray","resolveColor","resolve","color","names","readVariable","background","text","textMuted","border","colors","c","custom","i","fontFamily","inheritedFont","mix"],"sources":["../../../../../../charts/src/engine/theme.ts"],"sourcesContent":["// Chart colors and fonts read from the Minerva CSS variables.\n\nimport {\n domColorResolver,\n mix,\n resolveStaticColor,\n type ColorResolver,\n type Rgba,\n} from \"./color\";\n\nexport interface ChartTheme {\n palette: Rgba[];\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n surface: Rgba;\n primary: Rgba;\n fontFamily: string;\n /** Tick label font size in CSS pixels */\n fontSize: number;\n /** Resolves the colors of the options (`var(--x)` included); static colors only when omitted */\n resolve?: ColorResolver;\n}\n\n/** Used when no CSS variable is defined (e.g. without the Minerva stylesheet) */\nconst DEFAULT_PALETTE = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\nconst readVar = (style: CSSStyleDeclaration | null, name: string) =>\n style?.getPropertyValue(name).trim() ?? \"\";\n\n
|
|
1
|
+
{"version":3,"file":"theme.js","names":["DEFAULT_PALETTE","createTheme","variables","input","buildTheme","name","staticColorResolver","palette","resolveStaticColor","value","fallback","fallbackGray","resolveColor","resolve","color","names","readVariable","background","text","textMuted","border","colors","c","custom","i","fontFamily","inheritedFont","mix"],"sources":["../../../../../../charts/src/engine/theme.ts"],"sourcesContent":["// Chart colors and fonts read from the Minerva CSS variables.\n\nimport {\n domColorResolver,\n memoizeColorResolver,\n mix,\n resolveStaticColor,\n sameColor,\n type ColorResolver,\n type MemoizedColorResolver,\n type Rgba,\n} from \"./color\";\n\nexport interface ChartTheme {\n palette: Rgba[];\n text: Rgba;\n textMuted: Rgba;\n grid: Rgba;\n axis: Rgba;\n background: Rgba;\n surface: Rgba;\n primary: Rgba;\n fontFamily: string;\n /** Tick label font size in CSS pixels */\n fontSize: number;\n /** Resolves the colors of the options (`var(--x)` included); static colors only when omitted */\n resolve?: ColorResolver;\n}\n\n/** Used when no CSS variable is defined (e.g. without the Minerva stylesheet) */\nconst DEFAULT_PALETTE = [\n \"#4f46e5\",\n \"#10b981\",\n \"#f59e0b\",\n \"#ef4444\",\n \"#0ea5e9\",\n \"#8b5cf6\",\n \"#14b8a6\",\n \"#f97316\",\n];\n\nconst readVar = (style: CSSStyleDeclaration | null, name: string) =>\n style?.getPropertyValue(name).trim() ?? \"\";\n\n/**\n * Reads the theme from the computed style of `element`. Its resolver caches\n * the colors (DOM probes are costly): read the theme again to see new values.\n */\nexport const readTheme = (\n element: Element | null,\n palette?: readonly string[],\n): ChartTheme => {\n const style =\n element && typeof getComputedStyle === \"function\"\n ? getComputedStyle(element)\n : null;\n return buildTheme(\n (name) => readVar(style, name),\n memoizeColorResolver(domColorResolver(element)),\n palette,\n style?.fontFamily ?? \"\",\n );\n};\n\nconst THEME_COLORS = [\n \"text\",\n \"textMuted\",\n \"grid\",\n \"axis\",\n \"background\",\n \"surface\",\n \"primary\",\n] as const;\n\n/**\n * Whether `next` (a re-read of `previous`) resolves any color differently:\n * the theme colors, the palette and every color `previous` has resolved so\n * far (series, points, annotations...). `true` when it cannot tell.\n */\nexport const themeColorsChanged = (\n previous: ChartTheme,\n next: ChartTheme,\n): boolean => {\n if (previous === next) return false;\n if (previous.palette.length !== next.palette.length) return true;\n if (previous.palette.some((c, i) => !sameColor(c, next.palette[i])))\n return true;\n if (THEME_COLORS.some((key) => !sameColor(previous[key], next[key])))\n return true;\n const cache = (previous.resolve as Partial<MemoizedColorResolver> | undefined)\n ?.cache;\n if (!cache || !next.resolve) return true;\n const probe: Rgba = [NaN, NaN, NaN, NaN];\n for (const [value, color] of cache) {\n const resolved = next.resolve(value, probe);\n if (!sameColor(color, resolved === probe ? null : resolved)) return true;\n }\n return false;\n};\n\n/** Theme of the charts drawn without a DOM (mini-programs, React Native) */\nexport interface ChartThemeInput {\n /**\n * Values of the Minerva CSS variables (`--primary-color`, `--text-color`,\n * `--chart-series-1`, ...) used for the theme colors and to resolve\n * `var(--name)` colors of the options\n */\n variables?: Readonly<Record<string, string>>;\n /** Series colors (hex / rgb) */\n palette?: readonly string[];\n /** Font family of the labels */\n fontFamily?: string;\n /**\n * Font size of the tick labels, in pixels\n * @default 11\n */\n fontSize?: number;\n}\n\n/** Builds a theme from plain values (no DOM) */\nexport const createTheme = (\n input: ChartThemeInput = {},\n palette?: readonly string[],\n): ChartTheme => {\n const variables = input.variables ?? {};\n const theme = buildTheme(\n (name) => variables[name]?.trim() ?? \"\",\n staticColorResolver(variables),\n palette?.length ? palette : input.palette,\n \"\",\n );\n return {\n ...theme,\n ...(input.fontFamily ? { fontFamily: input.fontFamily } : {}),\n ...(input.fontSize ? { fontSize: input.fontSize } : {}),\n };\n};\n\n/** Resolver of `var(--name, fallback)` colors against plain variables */\nexport const staticColorResolver =\n (variables: Readonly<Record<string, string>>): ColorResolver =>\n (value, fallback) =>\n resolveStaticColor(value, variables, fallback);\n\nconst buildTheme = (\n readVariable: (name: string) => string,\n resolve: ColorResolver,\n palette: readonly string[] | undefined,\n inheritedFont: string,\n): ChartTheme => {\n const fallbackGray: Rgba = [0.4, 0.4, 0.4, 1];\n const resolveColor = (value: string) => resolve(value, fallbackGray);\n const color = (names: string[], fallback: string): Rgba => {\n for (const name of names) {\n if (readVariable(name)) return resolveColor(`var(${name})`);\n }\n return resolveColor(fallback);\n };\n\n const background = color(\n [\"--surface-color\", \"--background-color\"],\n \"#ffffff\",\n );\n const text = color([\"--text-color\"], \"#1f2937\");\n const textMuted = color(\n [\"--text-secondary-color\", \"--text-muted-color\"],\n \"#6b7280\",\n );\n const border = color([\"--border-color\"], \"#e5e7eb\");\n\n let colors: Rgba[];\n if (palette && palette.length) {\n colors = palette.map((c) => resolveColor(c));\n } else {\n const custom: Rgba[] = [];\n for (let i = 1; i <= 8; i++) {\n const name = `--chart-series-${i}`;\n if (readVariable(name)) custom.push(resolveColor(`var(${name})`));\n }\n if (custom.length) {\n colors = custom;\n } else {\n const themed = [\n \"--primary-color\",\n \"--success-color\",\n \"--warning-color\",\n \"--danger-color\",\n \"--info-color\",\n ].map((name, i) =>\n readVariable(name)\n ? resolveColor(`var(${name})`)\n : resolveColor(DEFAULT_PALETTE[i]),\n );\n colors = [\n ...themed,\n ...DEFAULT_PALETTE.slice(5).map((c) => resolveColor(c)),\n ];\n }\n }\n\n const fontFamily =\n readVariable(\"--font-family-sans\") ||\n inheritedFont ||\n \"system-ui, -apple-system, 'Segoe UI', sans-serif\";\n\n return {\n palette: colors,\n text,\n textMuted,\n grid: mix(background, border, 0.75),\n axis: border,\n background,\n surface: background,\n primary: colors[0],\n fontFamily,\n fontSize: 11,\n resolve,\n };\n};\n\n/**\n * Calls `onChange` when the theme may have changed: attributes of `<html>` /\n * `<body>` (class, style, data-theme) and the color scheme.\n */\nexport const watchTheme = (onChange: () => void): (() => void) => {\n if (typeof document === \"undefined\") return () => {};\n const cleanups: (() => void)[] = [];\n if (typeof MutationObserver === \"function\") {\n const observer = new MutationObserver(onChange);\n for (const node of [document.documentElement, document.body]) {\n if (node) {\n observer.observe(node, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-theme\", \"data-mode\"],\n });\n }\n }\n cleanups.push(() => observer.disconnect());\n }\n if (typeof matchMedia === \"function\") {\n const query = matchMedia(\"(prefers-color-scheme: dark)\");\n query.addEventListener?.(\"change\", onChange);\n cleanups.push(() => query.removeEventListener?.(\"change\", onChange));\n }\n return () => cleanups.forEach((fn) => fn());\n};\n"],"mappings":";;AA8BA,IAAMA,IAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,GAiFaC,KACX,IAAyB,CAAC,GAC1B,MACe;CACf,IAAMC,IAAYC,EAAM,aAAa,CAAC;CAOtC,OAAO;EACL,GAPYC,GACX,MAASF,EAAUG,EAAK,EAAE,KAAK,KAAK,IACrCC,EAAoBJ,CAAS,GAC7BK,GAAS,SAASA,IAAUJ,EAAM,SAClC,EAGG;EACH,GAAIA,EAAM,aAAa,EAAE,YAAYA,EAAM,WAAW,IAAI,CAAC;EAC3D,GAAIA,EAAM,WAAW,EAAE,UAAUA,EAAM,SAAS,IAAI,CAAC;CACvD;AACF,GAGaG,KACV,OACA,GAAO,MACNE,EAAmBC,GAAOP,GAAWQ,CAAQ,GAE3CN,KACJ,GACA,GACA,GACA,MACe;CACf,IAAMO,IAAqB;EAAC;EAAK;EAAK;EAAK;CAAC,GACtCC,KAAgB,MAAkBC,EAAQJ,GAAOE,CAAY,GAC7DG,KAAS,GAAiB,MAA2B;EACzD,KAAK,IAAMT,KAAQU,GACjB,IAAIC,EAAaX,CAAI,GAAG,OAAOO,EAAa,OAAOP,EAAK,EAAE;EAE5D,OAAOO,EAAaF,CAAQ;CAC9B,GAEMO,IAAaH,EACjB,CAAC,mBAAmB,oBAAoB,GACxC,SACF,GACMI,IAAOJ,EAAM,CAAC,cAAc,GAAG,SAAS,GACxCK,IAAYL,EAChB,CAAC,0BAA0B,oBAAoB,GAC/C,SACF,GACMM,IAASN,EAAM,CAAC,gBAAgB,GAAG,SAAS,GAE9CO;CACJ,IAAId,KAAWA,EAAQ,QACrB,IAASA,EAAQ,KAAK,MAAMK,EAAaU,CAAC,CAAC;MACtC;EACL,IAAMC,IAAiB,CAAC;EACxB,KAAK,IAAIC,IAAI,GAAGA,KAAK,GAAG,KAAK;GAC3B,IAAMnB,IAAO,kBAAkBmB;GAC/B,AAAIR,EAAaX,CAAI,KAAGkB,EAAO,KAAKX,EAAa,OAAOP,EAAK,EAAE,CAAC;EAClE;EACA,AAcEgB,IAdEE,EAAO,SACAA,IAaA,CACP,GAZa;GACb;GACA;GACA;GACA;GACA;EACF,CAAC,CAAC,KAAK,GAAM,MACXP,EAAaX,CAAI,IACbO,EAAa,OAAOP,EAAK,EAAE,IAC3BO,EAAaZ,EAAgBwB,EAAE,CAGhC,GACH,GAAGxB,EAAgB,MAAM,CAAC,CAAC,CAAC,KAAK,MAAMY,EAAaU,CAAC,CAAC,CACxD;CAEJ;CAEA,IAAMG,IACJT,EAAa,oBAAoB,KACjCU,KACA;CAEF,OAAO;EACL,SAASL;EACT;EACA;EACA,MAAMM,EAAIV,GAAYG,GAAQ,GAAI;EAClC,MAAMA;EACN;EACA,SAASH;EACT,SAASI,EAAO;EAChB;EACA,UAAU;EACV;CACF;AACF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const e=require("../../internal/parts.cjs"),t=require("../../charts/src/engine/color.cjs"),n=require("../../charts/src/engine/controller.cjs");require("../../charts/src/canvas.cjs");const r=require("./measure.cjs");let i=require("react-native"),a=require("react/jsx-runtime");var o={linePoints:1200,dotsPerSeries:800,dots:2e3,barsPerSeries:600,bars:1500,areaColumns:200,dashes:200},s=`chart`,c=e=>Math.ceil(e*1.35),l=(e,t)=>Math.ceil(r.measureChartText(e,`${t.weight??400} ${t.size}px sans-serif`)*1.4+t.size*2);function u(e,t,n,r,o,s,u,d,f){let p=c(u.size),m=(p-u.size)/2,h=l(t,u),g=s===`top`?r-m:s===`bottom`?r-p+m:r-p/2,_=o===`left`?{left:n,width:h}:o===`right`?{right:d-n,width:h}:{left:n-h/2,width:h};return(0,a.jsx)(i.Text,{numberOfLines:1,style:[{position:`absolute`,top:g,..._,textAlign:o,fontSize:u.size,lineHeight:p,color:u.color,fontWeight:String(u.weight??400),includeFontPadding:!1,...u.family?{fontFamily:u.family}:null,...u.halo?{textShadowColor:u.halo,textShadowRadius:3,textShadowOffset:{width:0,height:0}}:null},f],children:t},e)}var d=(e,t,n,r,o,s,c)=>(0,a.jsx)(i.View,{style:[{position:`absolute`,left:t,top:n,width:r,height:o,backgroundColor:s},c]},e),f=(e,t,n,r,i,a)=>d(e,t-r/2,n-r/2,r,r,i,{borderRadius:r/2,...a}),p=(e,t,n,r,i,a,o)=>{let s=r-t,c=i-n,l=Math.hypot(s,c)+a;return d(e,(t+r)/2-l/2,(n+i)/2-a/2,l,a,o,{borderRadius:a/2,transform:[{rotate:`${Math.atan2(c,s)}rad`}]})};function m(e,t,n=o.dashes){let r=t.filter(e=>Number.isFinite(e)&&e>=0);r.length%2&&(r=[...r,...r]);let i=r.reduce((e,t)=>e+t,0);if(!r.length||i<=0)return[[0,e]];let a=e/i*(r.length/2),s=a>n?a/n:1,c=[],l=0;for(let t=0;l<e;t=(t+1)%r.length){let n=r[t]*s;t%2==0&&n>0&&c.push([l,Math.min(n,e-l)]),l+=Math.max(n,.5)}return c}var h=(e,t,n,r,i,a,o,s)=>m(i,s).map(([i,s],c)=>t===`y`?d(`${e}-${c}`,r+i,n,s,a,o):d(`${e}-${c}`,n,r+i,a,s,o)),g=(e,t=1)=>Math.round(e)+.5-t/2;function _(e,t){let n=e.length/2,r=n>t?Math.ceil(n/t):1,i=[];for(let t=0;t<n;t+=r){let n=e[t*2],r=e[t*2+1],a=i.length;a&&Math.hypot(n-i[a-2],r-i[a-1])<1.5||i.push(n,r)}let a=e[n*2-2],o=e[n*2-1],s=i.length;return n>1&&(i[s-2]!==a||i[s-1]!==o)&&i.push(a,o),i}function v(e,t,n,r,i,a){let s=t.length/2;if(s<2)return[];let c=t[0]<=t[s*2-2],l=e=>t[(c?e:s-1-e)*2],u=e=>t[(c?e:s-1-e)*2+1],f=Math.max(a.x,l(0)),p=Math.min(a.x+a.width,l(s-1));if(p<=f)return[];let m=Math.max(2,a.width/o.areaColumns),h=[],g=0;for(let t=Math.floor(f),o=0;t<p;o++){let c=Math.min(Math.ceil(p),Math.round(t+m)),f=(t+c)/2;for(;g<s-2&&l(g+1)<f;)g++;let _=l(g),v=l(g+1),y=v===_?0:Math.max(0,Math.min(1,(f-_)/(v-_))),b=u(g)+(u(g+1)-u(g))*y;if(Number.isFinite(b)){let s=Math.min(b,n);h.push(d(`${e}-${o}`,t-a.x,s-a.y,c-t,Math.abs(n-b),r,{opacity:i}))}t=c}return h}function y(e){let{plot:t}=e.layout,n=e.model.series.filter(e=>!e.hidden),r=n.filter(e=>e.type===`line`||e.type===`area`).length,i=n.filter(e=>e.type===`scatter`).length,a=Math.max(150,o.linePoints/Math.max(1,r)),s=Math.max(100,Math.min(o.dotsPerSeries,o.dots/Math.max(1,i)));return{perLine:a,options:{columnWidth:Math.max(3,t.width*4/a),maxDots:s,maxBars:o.barsPerSeries,dotCell:Math.max(4,Math.sqrt(t.width*t.height/s)*1.15+1)}}}function b(e){let{plot:t}=e.layout,{perLine:r,options:i}=y(e),a=n.scenePrimitives(e,i),s=t.x,c=t.y,l=[],u=o.dots,m=o.bars;return a.forEach((e,n)=>{let i=`${e.kind}${e.seriesIndex}-${n}`;if(e.kind===`area`){e.segments.forEach((n,r)=>l.push(...v(`${i}-${r}`,n,e.baseline,e.color,e.opacity,t)));return}if(e.kind===`line`){let t=0;for(let n of e.segments)t+=n.length/2;e.segments.forEach((n,a)=>{let o=_(n,Math.max(2,Math.round(r*n.length/2/Math.max(1,t))));if(o.length===2){l.push(f(`${i}-${a}`,o[0]-s,o[1]-c,e.width*1.5,e.color));return}for(let t=0;t+3<o.length;t+=2)l.push(p(`${i}-${a}-${t}`,o[t]-s,o[t+1]-c,o[t+2]-s,o[t+3]-c,e.width,e.color))});return}if(e.kind===`bars`){let t=e.rects.length/4,n=t>m?Math.ceil(t/Math.max(1,m)):1;for(let r=0;r<t;r+=n){let[t,n,a,o]=e.rects.slice(r*4,r*4+4);l.push(d(`${i}-${r}`,t-s,n-c,Math.max(a,.5),o,e.color))}m=Math.max(0,m-Math.ceil(t/n));return}let a=e.dots.length/3,o=a>u?Math.ceil(a/Math.max(1,u)):1;for(let t=0;t<a;t+=o)l.push(f(`${i}-${t}`,e.dots[t*3]-s,e.dots[t*3+1]-c,e.dots[t*3+2],e.colors[t],{opacity:e.opacity}));u=Math.max(0,u-Math.ceil(a/o))}),l}var x=(e,t)=>{let{plot:n}=t,r=e.x0===void 0?-1/0:t.xToPx(e.x0),i=e.x1===void 0?1/0:t.xToPx(e.x1),a=e.y0===void 0?1/0:t.yToPx(e.y0),o=e.y1===void 0?-1/0:t.yToPx(e.y1),s=Math.max(n.x,Math.min(r,i)),c=Math.min(n.x+n.width,Math.max(r,i)),l=Math.max(n.y,Math.min(a,o)),u=Math.min(n.y+n.height,Math.max(a,o));return{x:s,y:l,width:c-s,height:u-l}},S=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},C=(e,n)=>t.toCss(e,n);function w(t,n){let{width:o,theme:c,model:l,layout:p,annotations:m}=t,{plot:h,scales:_,xTicks:v,yTicks:y}=p,b=c.fontSize,S=[];m.forEach((e,t)=>{if(e.type!==`rect`)return;let n=x(e,_);n.width<=0||n.height<=0||S.push(d(`area-${t}`,n.x,n.y,n.width,n.height,C(e.color,e.opacity)))});let w=C(c.grid);l.y.grid&&y.values.forEach((e,t)=>{let n=_.yToPx(e);n<h.y-1||n>h.y+h.height+1||S.push(d(`ygrid-${t}`,h.x,g(n),h.width,1,w))}),l.x.grid&&v.values.forEach((e,t)=>{let n=_.xToPx(e);n<h.x-1||n>h.x+h.width+1||S.push(d(`xgrid-${t}`,g(n),h.y,1,h.height,w))});let T=Math.ceil(b*1.4),E={size:b,color:C(c.textMuted),family:n},D={size:b+1,weight:500,color:C(c.text,.8),family:n},O=h.y+h.height;if(l.x.visible){S.push(d(`xaxis`,h.x,g(O),h.width,1,C(c.axis)));let e=-1/0;v.values.map((e,t)=>({px:_.xToPx(e),text:v.labels[t]??``})).sort((e,t)=>e.px-t.px).forEach(({px:t,text:n},i)=>{if(!n||t<h.x-.5||t>h.x+h.width+.5)return;let a=r.measureChartText(n,`400 ${b}px sans-serif`),s=Math.max(0,Math.min(o-a,t-a/2));s<e+6||(e=s+a,S.push(u(`xtick-${i}`,n,s+a/2,O+7,`center`,`top`,E,o)))}),l.x.title&&S.push(u(`xtitle`,l.x.title,h.x+h.width/2,O+T+10,`center`,`top`,D,o))}if(l.y.visible&&(y.values.forEach((e,t)=>{let n=_.yToPx(e),r=y.labels[t];!r||n<h.y-.5||n>h.y+h.height+.5||S.push(u(`ytick-${t}`,r,h.x-8,n,`right`,`middle`,E,o))}),l.y.title&&S.push(u(`ytitle`,l.y.title,T/2+4,h.y+h.height/2,`center`,`middle`,D,o,{transform:[{rotate:`-90deg`}]}))),t.legend)for(let r of t.legend.entries){let t=r.box.height/2,o=r.shape===`dot`?f(`swatch`,5,t,8,r.color):r.shape===`line`?d(`swatch`,0,t-1,10,2,r.color):d(`swatch`,1,t-4,8,8,r.color);S.push((0,a.jsxs)(i.View,{style:{position:`absolute`,left:r.box.x,top:r.box.y,width:r.box.width,height:r.box.height,opacity:r.hidden?.45:1},...e.part(s,`legend-item`,{hidden:r.hidden}),children:[o,u(`name`,r.name,14,t,`left`,`middle`,{size:12,color:C(c.textMuted),family:n},r.box.width,r.hidden?{textDecorationLine:`line-through`}:void 0)]},`legend-${r.id}`))}return S}function T(e,t){let{theme:n,annotations:i,layout:a}=e,{plot:o,scales:s}=a,c=n.fontSize,l=o.x,d=o.y,f=o.width,p=C(n.background,.9),m=c+4,_=[];i.forEach((e,n)=>{if(e.type!==`line`)return;let r=C(e.color);if(e.axis===`y`){let i=s.yToPx(e.value);_.push(...h(`line-${n}`,`y`,g(i,e.width)-d,0,o.width,e.width,r,e.dash)),e.label&&_.push(u(`line-label-${n}`,e.label,o.width-6,i-3-d,`right`,`bottom`,{size:c,weight:500,color:r,halo:p,family:t},f))}else{let i=s.xToPx(e.value);_.push(...h(`line-${n}`,`x`,g(i,e.width)-l,0,o.height,e.width,r,e.dash)),e.label&&_.push(u(`line-label-${n}`,e.label,i+5-l,5,`left`,`top`,{size:c,weight:500,color:r,halo:p,family:t},f))}}),i.forEach((e,n)=>{if(e.type!==`rect`||!e.label)return;let r=x(e,s);if(r.width<=0||r.height<=0)return;let i=e.labelPosition,a=i.endsWith(`left`)?`left`:i.endsWith(`right`)?`right`:`center`,o=a===`left`?r.x+10:a===`right`?r.x+r.width-10:r.x+r.width/2,p=i.startsWith(`top`)?r.y+10:i.startsWith(`bottom`)?r.y+r.height-10-m:r.y+(r.height-m)/2;_.push(u(`area-label-${n}`,e.label,o-l,p-d,a,`top`,{size:c+1,weight:600,color:C(e.labelColor),family:t},f))}),i.forEach((e,n)=>{if(e.type!==`text`||!e.text)return;let i=r.measureChartText(e.text,`${e.weight} ${c}px sans-serif`),a=S(e,s,i,m);_.push(u(`text-${n}`,e.text,a.x-l,a.y+a.height/2-d,`left`,`middle`,{size:c,weight:e.weight,color:C(e.color),halo:p,family:t},f))});let v=C(n.text,.85);return e.pointLabels.forEach(({label:e,box:n},r)=>{_.push(u(`point-label-${r}`,e.text,n.x-l,n.y+n.height/2-d,`left`,`middle`,{size:c,color:v,halo:p,family:t},f))}),_}var E=e=>({position:`absolute`,left:e.x,top:e.y,width:e.width,height:e.height,overflow:`hidden`});function D(t,n){let{plot:r}=t.layout;return(0,a.jsxs)(a.Fragment,{children:[w(t,n),(0,a.jsx)(i.View,{style:E(r),...e.part(s,`data`),children:b(t)},`data`),(0,a.jsx)(i.View,{style:E(r),...e.part(s,`labels`),children:T(t,n)},`labels`)]})}function O(t,n,r){let{theme:o,layout:c,hover:l,dragging:u}=t,{plot:p}=c,m=C(o.background),g=[];l&&l.crosshairX!==null&&g.push((0,a.jsx)(i.View,{style:i.StyleSheet.absoluteFill,...e.part(s,`crosshair`),children:h(`dash`,`x`,Math.round(l.crosshairX),p.y,p.height,1,C(o.textMuted,.55),[3,3])},`crosshair`)),l?.marks.forEach((e,t)=>{g.push(e.kind===`bar`?d(`mark-${t}`,e.x-2,e.y-2,e.width+4,e.height+2,C(o.text,.08)):f(`mark-${t}`,e.x,e.y,e.size+2,e.color,{borderWidth:2,borderColor:m}))}),u&&g.push((0,a.jsx)(i.View,{...e.part(s,`drag`),style:i.StyleSheet.absoluteFill,children:f(`ghost`,u.x,u.y,u.size+2,u.color,{opacity:.85,borderWidth:2,borderColor:m})},`drag`));let _=l?.tooltip;if(_&&!r){let{box:r,lineHeight:c,padding:l,content:u}=_,d=C(o.text),f=C(o.textMuted),p=(e,t)=>({fontSize:12,lineHeight:c,color:t,fontWeight:String(e),includeFontPadding:!1,...n?{fontFamily:n}:null}),m=e=>(0,a.jsx)(i.View,{style:{width:8,height:8,borderRadius:4,marginRight:6,backgroundColor:e}}),h={height:c,flexDirection:`row`,alignItems:`center`};g.push((0,a.jsx)(i.View,{...e.part(s,`tooltip`),style:[k(t),{left:r.x,top:r.y,width:r.width,height:r.height,paddingHorizontal:l+1,paddingVertical:l-1}],children:_.text?_.text.map((e,t)=>(0,a.jsx)(i.Text,{numberOfLines:1,style:p(400,d),children:e},t)):[(0,a.jsxs)(i.View,{style:h,children:[u.titleColor?m(u.titleColor):null,(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(600,d),{flexShrink:1}],children:u.title})]},`title`),...u.rows.map((e,t)=>(0,a.jsxs)(i.View,{style:h,children:[e.color?m(e.color):null,(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(400,f),{flexShrink:1}],children:e.name}),(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(600,d),{flexGrow:1,marginLeft:16,textAlign:`right`}],children:e.value})]},t))]},`tooltip`))}return g}var k=e=>({position:`absolute`,backgroundColor:C(e.theme.background),borderColor:C(e.theme.axis),borderWidth:1,borderRadius:8,shadowColor:`#0f172a`,shadowOpacity:.18,shadowRadius:8,shadowOffset:{width:0,height:6},elevation:6});exports.SHAPE_BUDGET=o,exports.dashRuns=m,exports.drawHover=O,exports.drawStatic=D,exports.primitiveLimits=y,exports.tooltipCard=k;
|
|
1
|
+
const e=require("../../internal/parts.cjs"),t=require("../../charts/src/engine/color.cjs"),n=require("../../charts/src/engine/controller.cjs");require("../../charts/src/canvas.cjs");const r=require("./measure.cjs");let i=require("react-native"),a=require("react/jsx-runtime");var o={linePoints:1200,dotsPerSeries:800,dots:2e3,barsPerSeries:600,bars:1500,areaColumns:200,dashes:200},s=`chart`,c=e=>Math.ceil(e*1.35),l=(e,t)=>Math.ceil(r.measureChartText(e,`${t.weight??400} ${t.size}px sans-serif`)*1.4+t.size*2);function u(e,t,n,r,o,s,u,d,f){let p=c(u.size),m=(p-u.size)/2,h=l(t,u),g=s===`top`?r-m:s===`bottom`?r-p+m:r-p/2,_=o===`left`?{left:n,width:h}:o===`right`?{right:d-n,width:h}:{left:n-h/2,width:h};return(0,a.jsx)(i.Text,{numberOfLines:1,style:[{position:`absolute`,top:g,..._,textAlign:o,fontSize:u.size,lineHeight:p,color:u.color,fontWeight:String(u.weight??400),includeFontPadding:!1,...u.family?{fontFamily:u.family}:null,...u.halo?{textShadowColor:u.halo,textShadowRadius:3,textShadowOffset:{width:0,height:0}}:null},f],children:t},e)}var d=(e,t,n,r,o,s,c)=>(0,a.jsx)(i.View,{style:[{position:`absolute`,left:t,top:n,width:r,height:o,backgroundColor:s},c]},e),f=(e,t,n,r,i,a)=>d(e,t-r/2,n-r/2,r,r,i,{borderRadius:r/2,...a}),p=(e,t,n,r,i,a,o)=>{let s=r-t,c=i-n,l=Math.hypot(s,c)+a;return d(e,(t+r)/2-l/2,(n+i)/2-a/2,l,a,o,{borderRadius:a/2,transform:[{rotate:`${Math.atan2(c,s)}rad`}]})};function m(e,t,n=o.dashes){let r=t.filter(e=>Number.isFinite(e)&&e>=0);r.length%2&&(r=[...r,...r]);let i=r.reduce((e,t)=>e+t,0);if(!r.length||i<=0)return[[0,e]];let a=e/i*(r.length/2),s=a>n?a/n:1,c=[],l=0;for(let t=0;l<e;t=(t+1)%r.length){let n=r[t]*s;t%2==0&&n>0&&c.push([l,Math.min(n,e-l)]),l+=Math.max(n,.5)}return c}var h=(e,t,n,r,i,a,o,s)=>m(i,s).map(([i,s],c)=>t===`y`?d(`${e}-${c}`,r+i,n,s,a,o):d(`${e}-${c}`,n,r+i,a,s,o)),g=(e,t=1)=>Math.round(e)+.5-t/2;function _(e,t){let n=e.length/2,r=n>t?Math.ceil(n/t):1,i=[];for(let t=0;t<n;t+=r){let n=e[t*2],r=e[t*2+1],a=i.length;a&&Math.hypot(n-i[a-2],r-i[a-1])<1.5||i.push(n,r)}let a=e[n*2-2],o=e[n*2-1],s=i.length;return n>1&&(i[s-2]!==a||i[s-1]!==o)&&i.push(a,o),i}function v(e,t,n,r,i,a,s){let c=t.length/2;if(c<2)return[];let l=t[0]<=t[c*2-2],u=e=>l?e:c-1-e,f=e=>t[u(e)*2],p=e=>t[u(e)*2+1],m=e=>s?s[u(e)]:n,h=Math.max(a.x,f(0)),g=Math.min(a.x+a.width,f(c-1));if(g<=h)return[];let _=Math.max(2,a.width/o.areaColumns),v=[],y=0;for(let t=Math.floor(h),n=0;t<g;n++){let o=Math.min(Math.ceil(g),Math.round(t+_)),s=(t+o)/2;for(;y<c-2&&f(y+1)<s;)y++;let l=f(y),u=f(y+1),h=u===l?0:Math.max(0,Math.min(1,(s-l)/(u-l))),b=p(y)+(p(y+1)-p(y))*h,x=m(y)+(m(y+1)-m(y))*h;if(Number.isFinite(b)&&Number.isFinite(x)){let s=Math.min(b,x);v.push(d(`${e}-${n}`,t-a.x,s-a.y,o-t,Math.abs(x-b),r,{opacity:i}))}t=o}return v}function y(e){let{plot:t}=e.layout,n=e.model.series.filter(e=>!e.hidden),r=n.filter(e=>e.type===`line`||e.type===`area`).length,i=n.filter(e=>e.type===`scatter`).length,a=Math.max(150,o.linePoints/Math.max(1,r)),s=Math.max(100,Math.min(o.dotsPerSeries,o.dots/Math.max(1,i)));return{perLine:a,options:{columnWidth:Math.max(3,t.width*4/a),maxDots:s,maxBars:o.barsPerSeries,dotCell:Math.max(4,Math.sqrt(t.width*t.height/s)*1.15+1)}}}function b(e){let{plot:t}=e.layout,{perLine:r,options:i}=y(e),a=n.scenePrimitives(e,i),s=t.x,c=t.y,l=[],u=o.dots,m=o.bars;return a.forEach((e,n)=>{let i=`${e.kind}${e.seriesIndex}-${n}`;if(e.kind===`area`){e.segments.forEach((n,r)=>l.push(...v(`${i}-${r}`,n,e.baseline,e.color,e.opacity,t,e.bottoms?.[r])));return}if(e.kind===`line`){let t=0;for(let n of e.segments)t+=n.length/2;e.segments.forEach((n,a)=>{let o=_(n,Math.max(2,Math.round(r*n.length/2/Math.max(1,t))));if(o.length===2){l.push(f(`${i}-${a}`,o[0]-s,o[1]-c,e.width*1.5,e.color));return}for(let t=0;t+3<o.length;t+=2)l.push(p(`${i}-${a}-${t}`,o[t]-s,o[t+1]-c,o[t+2]-s,o[t+3]-c,e.width,e.color))});return}if(e.kind===`bars`){let t=e.rects.length/4,n=t>m?Math.ceil(t/Math.max(1,m)):1;for(let r=0;r<t;r+=n){let[t,n,a,o]=e.rects.slice(r*4,r*4+4),u=Math.min(e.radius??0,a/2,o/2);l.push(d(`${i}-${r}`,t-s,n-c,Math.max(a,.5),o,e.colors?.[r]??e.color,u>.5?{borderRadius:u}:void 0))}m=Math.max(0,m-Math.ceil(t/n));return}let a=e.dots.length/3,o=a>u?Math.ceil(a/Math.max(1,u)):1;for(let t=0;t<a;t+=o)l.push(f(`${i}-${t}`,e.dots[t*3]-s,e.dots[t*3+1]-c,e.dots[t*3+2],e.colors[t],{opacity:e.opacity}));u=Math.max(0,u-Math.ceil(a/o))}),l}var x=(e,t)=>{let{plot:n}=t,r=e.x0===void 0?-1/0:t.xToPx(e.x0),i=e.x1===void 0?1/0:t.xToPx(e.x1),a=e.y0===void 0?1/0:t.yToPx(e.y0),o=e.y1===void 0?-1/0:t.yToPx(e.y1),s=Math.max(n.x,Math.min(r,i)),c=Math.min(n.x+n.width,Math.max(r,i)),l=Math.max(n.y,Math.min(a,o)),u=Math.min(n.y+n.height,Math.max(a,o));return{x:s,y:l,width:c-s,height:u-l}},S=(e,t,n,r)=>{let{plot:i}=t,a=e.x===void 0?i.x+i.width/2:t.xToPx(e.x),o=e.y===void 0?i.y+i.height/2:t.yToPx(e.y),s=a-n/2,c=o-r/2;return e.anchor===`top`?c=o+6:e.anchor===`bottom`?c=o-6-r:e.anchor===`left`?s=a+6:e.anchor===`right`&&(s=a-6-n),s=Math.max(i.x+6,Math.min(s,i.x+i.width-6-n)),c=Math.max(i.y+2,Math.min(c,i.y+i.height-2-r)),{x:s,y:c,width:n,height:r}},C=(e,n)=>t.toCss(e,n);function w(t,n){let{width:o,theme:c,model:l,layout:p,annotations:m}=t,{plot:h,scales:_,xTicks:v,yTicks:y}=p,b=c.fontSize,S=[];m.forEach((e,t)=>{if(e.type!==`rect`)return;let n=x(e,_);n.width<=0||n.height<=0||S.push(d(`area-${t}`,n.x,n.y,n.width,n.height,C(e.color,e.opacity)))});let w=C(c.grid);l.y.grid&&y.values.forEach((e,t)=>{let n=_.yToPx(e);n<h.y-1||n>h.y+h.height+1||S.push(d(`ygrid-${t}`,h.x,g(n),h.width,1,w))}),l.x.grid&&v.values.forEach((e,t)=>{let n=_.xToPx(e);n<h.x-1||n>h.x+h.width+1||S.push(d(`xgrid-${t}`,g(n),h.y,1,h.height,w))});let T=Math.ceil(b*1.4),E={size:b,color:C(c.textMuted),family:n},D={size:b+1,weight:500,color:C(c.text,.8),family:n},O=h.y+h.height;if(l.x.visible){S.push(d(`xaxis`,h.x,g(O),h.width,1,C(c.axis)));let e=-1/0;v.values.map((e,t)=>({px:_.xToPx(e),text:v.labels[t]??``})).sort((e,t)=>e.px-t.px).forEach(({px:t,text:n},i)=>{if(!n||t<h.x-.5||t>h.x+h.width+.5)return;let a=r.measureChartText(n,`400 ${b}px sans-serif`),s=Math.max(0,Math.min(o-a,t-a/2));s<e+6||(e=s+a,S.push(u(`xtick-${i}`,n,s+a/2,O+7,`center`,`top`,E,o)))}),l.x.title&&S.push(u(`xtitle`,l.x.title,h.x+h.width/2,O+T+10,`center`,`top`,D,o))}if(l.y.visible&&(y.values.forEach((e,t)=>{let n=_.yToPx(e),r=y.labels[t];!r||n<h.y-.5||n>h.y+h.height+.5||S.push(u(`ytick-${t}`,r,h.x-8,n,`right`,`middle`,E,o))}),l.y.title&&S.push(u(`ytitle`,l.y.title,T/2+4,h.y+h.height/2,`center`,`middle`,D,o,{transform:[{rotate:`-90deg`}]}))),t.legend)for(let r of t.legend.entries){let t=r.box.height/2,o=r.shape===`dot`?f(`swatch`,5,t,8,r.color):r.shape===`line`?d(`swatch`,0,t-1,10,2,r.color):d(`swatch`,1,t-4,8,8,r.color);S.push((0,a.jsxs)(i.View,{style:{position:`absolute`,left:r.box.x,top:r.box.y,width:r.box.width,height:r.box.height,opacity:r.hidden?.45:1},...e.part(s,`legend-item`,{hidden:r.hidden}),children:[o,u(`name`,r.name,14,t,`left`,`middle`,{size:12,color:C(c.textMuted),family:n},r.box.width,r.hidden?{textDecorationLine:`line-through`}:void 0)]},`legend-${r.id}`))}return S}function T(e,t){let{theme:n,annotations:i,layout:a}=e,{plot:o,scales:s}=a,c=n.fontSize,l=o.x,d=o.y,f=o.width,p=C(n.background,.9),m=c+4,_=[];i.forEach((e,n)=>{if(e.type!==`line`)return;let r=C(e.color);if(e.axis===`y`){let i=s.yToPx(e.value);_.push(...h(`line-${n}`,`y`,g(i,e.width)-d,0,o.width,e.width,r,e.dash)),e.label&&_.push(u(`line-label-${n}`,e.label,o.width-6,i-3-d,`right`,`bottom`,{size:c,weight:500,color:r,halo:p,family:t},f))}else{let i=s.xToPx(e.value);_.push(...h(`line-${n}`,`x`,g(i,e.width)-l,0,o.height,e.width,r,e.dash)),e.label&&_.push(u(`line-label-${n}`,e.label,i+5-l,5,`left`,`top`,{size:c,weight:500,color:r,halo:p,family:t},f))}}),i.forEach((e,n)=>{if(e.type!==`rect`||!e.label)return;let r=x(e,s);if(r.width<=0||r.height<=0)return;let i=e.labelPosition,a=i.endsWith(`left`)?`left`:i.endsWith(`right`)?`right`:`center`,o=a===`left`?r.x+10:a===`right`?r.x+r.width-10:r.x+r.width/2,p=i.startsWith(`top`)?r.y+10:i.startsWith(`bottom`)?r.y+r.height-10-m:r.y+(r.height-m)/2;_.push(u(`area-label-${n}`,e.label,o-l,p-d,a,`top`,{size:c+1,weight:600,color:C(e.labelColor),family:t},f))}),i.forEach((e,n)=>{if(e.type!==`text`||!e.text)return;let i=r.measureChartText(e.text,`${e.weight} ${c}px sans-serif`),a=S(e,s,i,m);_.push(u(`text-${n}`,e.text,a.x-l,a.y+a.height/2-d,`left`,`middle`,{size:c,weight:e.weight,color:C(e.color),halo:p,family:t},f))});let v=C(n.text,.85);return e.pointLabels.forEach(({label:e,box:n},r)=>{_.push(u(`point-label-${r}`,e.text,n.x-l,n.y+n.height/2-d,`left`,`middle`,{size:c,color:v,halo:p,family:t},f))}),_}var E=e=>({position:`absolute`,left:e.x,top:e.y,width:e.width,height:e.height,overflow:`hidden`});function D(t,n){let{plot:r}=t.layout;return(0,a.jsxs)(a.Fragment,{children:[w(t,n),(0,a.jsx)(i.View,{style:E(r),...e.part(s,`data`),children:b(t)},`data`),(0,a.jsx)(i.View,{style:E(r),...e.part(s,`labels`),children:T(t,n)},`labels`)]})}function O(t,n,r){let{theme:o,layout:c,hover:l,dragging:u}=t,{plot:p}=c,m=C(o.background),g=[];l&&l.crosshairX!==null&&g.push((0,a.jsx)(i.View,{style:i.StyleSheet.absoluteFill,...e.part(s,`crosshair`),children:h(`dash`,`x`,Math.round(l.crosshairX),p.y,p.height,1,C(o.textMuted,.55),[3,3])},`crosshair`)),l?.marks.forEach((e,t)=>{if(e.kind===`band`){g.push(d(`mark-${t}`,e.x,e.y,e.width,e.height,C(o.text,.05),{borderRadius:6}));return}if(e.kind===`cell`){g.push(d(`mark-${t}`,e.x-1.5,e.y-1.5,e.width+3,e.height+3,`transparent`,{borderRadius:4,borderWidth:1.5,borderColor:C(o.text,.55)}));return}g.push(f(`halo-${t}`,e.x,e.y,e.size+8,e.halo),f(`mark-${t}`,e.x,e.y,e.size,e.color,{borderWidth:2,borderColor:m}))}),u&&g.push((0,a.jsx)(i.View,{...e.part(s,`drag`),style:i.StyleSheet.absoluteFill,children:f(`ghost`,u.x,u.y,u.size+2,u.color,{opacity:.85,borderWidth:2,borderColor:m})},`drag`));let _=l?.tooltip;if(_&&!r){let{box:r,lineHeight:c,padding:l,content:u}=_,d=C(o.text),f=C(o.textMuted),p=(e,t)=>({fontSize:12,lineHeight:c,color:t,fontWeight:String(e),includeFontPadding:!1,...n?{fontFamily:n}:null}),m=e=>(0,a.jsx)(i.View,{style:{width:8,height:8,borderRadius:4,marginRight:6,backgroundColor:e}}),h={height:c,flexDirection:`row`,alignItems:`center`};g.push((0,a.jsx)(i.View,{...e.part(s,`tooltip`),style:[k(t),{left:r.x,top:r.y,width:r.width,height:r.height,paddingHorizontal:l+1,paddingVertical:l-1}],children:_.text?_.text.map((e,t)=>(0,a.jsx)(i.Text,{numberOfLines:1,style:p(400,d),children:e},t)):[(0,a.jsxs)(i.View,{style:h,children:[u.titleColor?m(u.titleColor):null,(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(600,d),{flexShrink:1}],children:u.title})]},`title`),...u.rows.map((e,t)=>(0,a.jsxs)(i.View,{style:h,children:[e.color?m(e.color):null,(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(400,f),{flexShrink:1}],children:e.name}),(0,a.jsx)(i.Text,{numberOfLines:1,style:[p(600,d),{flexGrow:1,marginLeft:16,textAlign:`right`}],children:e.value})]},t))]},`tooltip`))}return g}var k=e=>({position:`absolute`,backgroundColor:C(e.theme.background),borderColor:C(e.theme.axis),borderWidth:1,borderRadius:8,shadowColor:`#0f172a`,shadowOpacity:.18,shadowRadius:8,shadowOffset:{width:0,height:6},elevation:6});exports.SHAPE_BUDGET=o,exports.dashRuns=m,exports.drawHover=O,exports.drawStatic=D,exports.primitiveLimits=y,exports.tooltipCard=k;
|
|
2
2
|
//# sourceMappingURL=scene.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scene.cjs","names":["measureChartText","Text","View","scenePrimitives","toCss","part","_Fragment","StyleSheet","require_parts","require_color","require_controller","require_measure","react_native","react_jsx_runtime","SHAPE_BUDGET","C","lineHeightOf","size","slack","text","o","label","lh","pad","w","top","valign","y","horizontal","align","x","frameWidth","extra","key","box","color","dot","cx","d","cy","segment","dx","x2","x1","dy","y2","y1","length","width","dashRuns","pattern","dash","v","period","a","b","runs","scale","max","out","at","i","step","dashedLine","start","run","axis","from","crisp","thin","stride","k","lx","ly","areaStrips","n","forward","xs","ys","plot","to","column","j","left","c","right","mid","x0","t","baseline","primitiveLimits","scene","visible","s","lines","scatters","perLine","maxDots","drawData","primitives","options","ox","oy","dotsLeft","barsLeft","p","total","pts","r","count","h","rectOf","xa","xb","ya","yb","bottom","textBox","px","py","height","css","alpha","drawBackground","layout","fs","theme","annotations","scales","grid","model","yTicks","xTicks","line","tick","title","lastRight","e","swatch","drawForeground","fw","halo","labelHeight","pos","tx","ty","pointColor","l","clip","drawStatic","family","drawHover","background","hover","m","dragging","tip","customTooltip","muted","font","weight","row","lineHeight","tooltipCard","padding","content"],"sources":["../../../../../native/src/components/Chart/scene.tsx"],"sourcesContent":["// Draws a chart scene (`ChartController.getScene()`) with plain views: no\n// canvas, SVG or native drawing module. The engine already resolves every\n// position in pixels; this file only turns them into absolutely positioned\n// <View> / <Text> elements, keeping the number of views bounded by the size\n// of the chart (lines decimated per column, dots merged per cell, bars\n// merged per pixel column), whatever the size of the data.\n\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n StyleSheet,\n Text,\n View,\n type TextStyle,\n type ViewStyle,\n} from \"react-native\";\nimport {\n scenePrimitives,\n toCss,\n type ChartPrimitive,\n type ChartRect,\n type ChartScene,\n} from \"@minerva/charts/canvas\";\nimport { part } from \"../../internal/parts\";\nimport { measureChartText } from \"./measure\";\n\ntype Rgba = ChartScene[\"theme\"][\"text\"];\ntype Annotation = ChartScene[\"annotations\"][number];\ntype RectAnnotation = Extract<Annotation, { type: \"rect\" }>;\ntype TextAnnotation = Extract<Annotation, { type: \"text\" }>;\ntype Scales = ChartScene[\"layout\"][\"scales\"];\n\n/** Upper bounds of the views drawn for the data of a chart */\nexport const SHAPE_BUDGET = {\n /** Points of all the lines (one view per segment) */\n linePoints: 1200,\n /** Dots of one scatter series before they are merged per cell */\n dotsPerSeries: 800,\n /** Dots of all the series */\n dots: 2000,\n /** Bars of one series before neighbors are merged per pixel column */\n barsPerSeries: 600,\n /** Bars of all the series */\n bars: 1500,\n /** Vertical strips filling one area */\n areaColumns: 200,\n /** Dashes of one dashed line */\n dashes: 200,\n} as const;\n\nconst C = \"chart\";\n\n// ------------------------------------------------------------------ text\n\ninterface TextOptions {\n size: number;\n color: string;\n weight?: number;\n family?: string;\n /** Halo color: keeps the text readable over the data */\n halo?: string;\n}\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype VAlign = \"top\" | \"middle\" | \"bottom\";\n\nconst lineHeightOf = (size: number) => Math.ceil(size * 1.35);\n\n/** Box wide enough for the estimated width (the real one may differ) */\nconst slack = (text: string, o: TextOptions) =>\n Math.ceil(\n measureChartText(text, `${o.weight ?? 400} ${o.size}px sans-serif`) * 1.4 +\n o.size * 2,\n );\n\n/**\n * A one-line text anchored at (x, y) of a container `frameWidth` wide:\n * `left` starts there, `right` ends there, `center` is centered on it;\n * `top` / `bottom` place the em box like the canvas text baselines\n */\nfunction label(\n key: string,\n text: string,\n x: number,\n y: number,\n align: Align,\n valign: VAlign,\n o: TextOptions,\n frameWidth: number,\n extra?: TextStyle,\n): ReactElement {\n const lh = lineHeightOf(o.size);\n const pad = (lh - o.size) / 2;\n const w = slack(text, o);\n const top =\n valign === \"top\"\n ? y - pad\n : valign === \"bottom\"\n ? y - lh + pad\n : y - lh / 2;\n const horizontal: TextStyle =\n align === \"left\"\n ? { left: x, width: w }\n : align === \"right\"\n ? { right: frameWidth - x, width: w }\n : { left: x - w / 2, width: w };\n return (\n <Text\n key={key}\n numberOfLines={1}\n style={[\n {\n position: \"absolute\",\n top,\n ...horizontal,\n textAlign: align,\n fontSize: o.size,\n lineHeight: lh,\n color: o.color,\n fontWeight: String(o.weight ?? 400) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(o.family ? { fontFamily: o.family } : null),\n ...(o.halo\n ? {\n textShadowColor: o.halo,\n textShadowRadius: 3,\n textShadowOffset: { width: 0, height: 0 },\n }\n : null),\n },\n extra,\n ]}\n >\n {text}\n </Text>\n );\n}\n\n// ---------------------------------------------------------------- shapes\n\nconst box = (\n key: string,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n extra?: ViewStyle,\n): ReactElement => (\n <View\n key={key}\n style={[\n {\n position: \"absolute\",\n left: x,\n top: y,\n width,\n height,\n backgroundColor: color,\n },\n extra,\n ]}\n />\n);\n\nconst dot = (\n key: string,\n cx: number,\n cy: number,\n d: number,\n color: string,\n extra?: ViewStyle,\n) =>\n box(key, cx - d / 2, cy - d / 2, d, d, color, {\n borderRadius: d / 2,\n ...extra,\n });\n\n/** A straight stroke: one view, rotated around its center */\nconst segment = (\n key: string,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n width: number,\n color: string,\n) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const length = Math.hypot(dx, dy) + width;\n return box(\n key,\n (x1 + x2) / 2 - length / 2,\n (y1 + y2) / 2 - width / 2,\n length,\n width,\n color,\n {\n borderRadius: width / 2,\n transform: [{ rotate: `${Math.atan2(dy, dx)}rad` }],\n },\n );\n};\n\n/** Dash runs `[start, length]` along a line (canvas `setLineDash` pattern) */\nexport function dashRuns(\n length: number,\n dash: readonly number[],\n max: number = SHAPE_BUDGET.dashes,\n): [number, number][] {\n let pattern = dash.filter((v) => Number.isFinite(v) && v >= 0);\n // odd patterns repeat twice, like the canvas\n if (pattern.length % 2) pattern = [...pattern, ...pattern];\n const period = pattern.reduce((a, b) => a + b, 0);\n if (!pattern.length || period <= 0) return [[0, length]];\n const runs = (length / period) * (pattern.length / 2);\n const scale = runs > max ? runs / max : 1;\n const out: [number, number][] = [];\n let at = 0;\n for (let i = 0; at < length; i = (i + 1) % pattern.length) {\n const step = pattern[i] * scale;\n if (i % 2 === 0 && step > 0) out.push([at, Math.min(step, length - at)]);\n at += Math.max(step, 0.5);\n }\n return out;\n}\n\nconst dashedLine = (\n key: string,\n axis: \"x\" | \"y\",\n at: number,\n from: number,\n length: number,\n width: number,\n color: string,\n dash: readonly number[],\n) =>\n dashRuns(length, dash).map(([start, run], i) =>\n axis === \"y\"\n ? box(`${key}-${i}`, from + start, at, run, width, color)\n : box(`${key}-${i}`, at, from + start, width, run, color),\n );\n\nconst crisp = (v: number, width = 1) => Math.round(v) + 0.5 - width / 2;\n\n// ------------------------------------------------------------------ data\n\n/** Thins a run of interleaved points to `max` points and drops sub-pixel steps */\nfunction thin(run: readonly number[], max: number): number[] {\n const n = run.length / 2;\n const stride = n > max ? Math.ceil(n / max) : 1;\n const out: number[] = [];\n for (let i = 0; i < n; i += stride) {\n const x = run[i * 2];\n const y = run[i * 2 + 1];\n const k = out.length;\n if (k && Math.hypot(x - out[k - 2], y - out[k - 1]) < 1.5) continue;\n out.push(x, y);\n }\n const lx = run[n * 2 - 2];\n const ly = run[n * 2 - 1];\n const k = out.length;\n if (n > 1 && (out[k - 2] !== lx || out[k - 1] !== ly)) out.push(lx, ly);\n return out;\n}\n\n/** Vertical strips between the line and the baseline, one per column */\nfunction areaStrips(\n key: string,\n run: readonly number[],\n baseline: number,\n color: string,\n opacity: number,\n plot: ChartRect,\n): ReactElement[] {\n const n = run.length / 2;\n if (n < 2) return [];\n // left to right (reversed axes list their points right to left)\n const forward = run[0] <= run[n * 2 - 2];\n const xs = (i: number) => run[(forward ? i : n - 1 - i) * 2];\n const ys = (i: number) => run[(forward ? i : n - 1 - i) * 2 + 1];\n const from = Math.max(plot.x, xs(0));\n const to = Math.min(plot.x + plot.width, xs(n - 1));\n if (to <= from) return [];\n const column = Math.max(2, plot.width / SHAPE_BUDGET.areaColumns);\n const out: ReactElement[] = [];\n let j = 0;\n for (let left = Math.floor(from), c = 0; left < to; c++) {\n const right = Math.min(Math.ceil(to), Math.round(left + column));\n const mid = (left + right) / 2;\n while (j < n - 2 && xs(j + 1) < mid) j++;\n const x0 = xs(j);\n const x1 = xs(j + 1);\n const t = x1 === x0 ? 0 : Math.max(0, Math.min(1, (mid - x0) / (x1 - x0)));\n const y = ys(j) + (ys(j + 1) - ys(j)) * t;\n if (Number.isFinite(y)) {\n const top = Math.min(y, baseline);\n out.push(\n box(\n `${key}-${c}`,\n left - plot.x,\n top - plot.y,\n right - left,\n Math.abs(baseline - y),\n color,\n {\n opacity,\n },\n ),\n );\n }\n left = right;\n }\n return out;\n}\n\n/** Limits of `scenePrimitives` for the views budget */\nexport function primitiveLimits(scene: ChartScene) {\n const { plot } = scene.layout;\n const visible = scene.model.series.filter((s) => !s.hidden);\n const lines = visible.filter(\n (s) => s.type === \"line\" || s.type === \"area\",\n ).length;\n const scatters = visible.filter((s) => s.type === \"scatter\").length;\n const perLine = Math.max(150, SHAPE_BUDGET.linePoints / Math.max(1, lines));\n const maxDots = Math.max(\n 100,\n Math.min(\n SHAPE_BUDGET.dotsPerSeries,\n SHAPE_BUDGET.dots / Math.max(1, scatters),\n ),\n );\n return {\n perLine,\n options: {\n // decimation keeps up to 4 points per column\n columnWidth: Math.max(3, (plot.width * 4) / perLine),\n maxDots,\n maxBars: SHAPE_BUDGET.barsPerSeries,\n dotCell: Math.max(\n 4,\n Math.sqrt((plot.width * plot.height) / maxDots) * 1.15 + 1,\n ),\n },\n };\n}\n\nfunction drawData(scene: ChartScene): ReactElement[] {\n const { plot } = scene.layout;\n const { perLine, options } = primitiveLimits(scene);\n const primitives: ChartPrimitive[] = scenePrimitives(scene, options);\n const ox = plot.x;\n const oy = plot.y;\n const out: ReactElement[] = [];\n let dotsLeft: number = SHAPE_BUDGET.dots;\n let barsLeft: number = SHAPE_BUDGET.bars;\n primitives.forEach((p, k) => {\n const key = `${p.kind}${p.seriesIndex}-${k}`;\n if (p.kind === \"area\") {\n p.segments.forEach((run, r) =>\n out.push(\n ...areaStrips(\n `${key}-${r}`,\n run,\n p.baseline,\n p.color,\n p.opacity,\n plot,\n ),\n ),\n );\n return;\n }\n if (p.kind === \"line\") {\n let total = 0;\n for (const run of p.segments) total += run.length / 2;\n p.segments.forEach((run, r) => {\n const pts = thin(\n run,\n Math.max(\n 2,\n Math.round((perLine * run.length) / 2 / Math.max(1, total)),\n ),\n );\n if (pts.length === 2) {\n out.push(\n dot(\n `${key}-${r}`,\n pts[0] - ox,\n pts[1] - oy,\n p.width * 1.5,\n p.color,\n ),\n );\n return;\n }\n for (let i = 0; i + 3 < pts.length; i += 2) {\n out.push(\n segment(\n `${key}-${r}-${i}`,\n pts[i] - ox,\n pts[i + 1] - oy,\n pts[i + 2] - ox,\n pts[i + 3] - oy,\n p.width,\n p.color,\n ),\n );\n }\n });\n return;\n }\n if (p.kind === \"bars\") {\n const count = p.rects.length / 4;\n const stride =\n count > barsLeft ? Math.ceil(count / Math.max(1, barsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n const [x, y, w, h] = p.rects.slice(i * 4, i * 4 + 4);\n out.push(\n box(`${key}-${i}`, x - ox, y - oy, Math.max(w, 0.5), h, p.color),\n );\n }\n barsLeft = Math.max(0, barsLeft - Math.ceil(count / stride));\n return;\n }\n const count = p.dots.length / 3;\n const stride =\n count > dotsLeft ? Math.ceil(count / Math.max(1, dotsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n out.push(\n dot(\n `${key}-${i}`,\n p.dots[i * 3] - ox,\n p.dots[i * 3 + 1] - oy,\n p.dots[i * 3 + 2],\n p.colors[i],\n {\n opacity: p.opacity,\n },\n ),\n );\n }\n dotsLeft = Math.max(0, dotsLeft - Math.ceil(count / stride));\n });\n return out;\n}\n\n// ------------------------------------------------------------ background\n\nconst rectOf = (a: RectAnnotation, s: Scales): ChartRect => {\n const { plot } = s;\n const xa = a.x0 === undefined ? -Infinity : s.xToPx(a.x0);\n const xb = a.x1 === undefined ? Infinity : s.xToPx(a.x1);\n const ya = a.y0 === undefined ? Infinity : s.yToPx(a.y0);\n const yb = a.y1 === undefined ? -Infinity : s.yToPx(a.y1);\n const left = Math.max(plot.x, Math.min(xa, xb));\n const right = Math.min(plot.x + plot.width, Math.max(xa, xb));\n const top = Math.max(plot.y, Math.min(ya, yb));\n const bottom = Math.min(plot.y + plot.height, Math.max(ya, yb));\n return { x: left, y: top, width: right - left, height: bottom - top };\n};\n\n/** Box of a text annotation, kept inside the plot (engine `textBox`) */\nconst textBox = (\n a: TextAnnotation,\n s: Scales,\n width: number,\n height: number,\n): ChartRect => {\n const { plot } = s;\n const px = a.x === undefined ? plot.x + plot.width / 2 : s.xToPx(a.x);\n const py = a.y === undefined ? plot.y + plot.height / 2 : s.yToPx(a.y);\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\nconst css = (c: Rgba, alpha?: number) => toCss(c, alpha);\n\nfunction drawBackground(scene: ChartScene, family?: string): ReactElement[] {\n const { width, theme, model, layout, annotations } = scene;\n const { plot, scales, xTicks, yTicks } = layout;\n const fs = theme.fontSize;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n out.push(\n box(`area-${i}`, r.x, r.y, r.width, r.height, css(a.color, a.opacity)),\n );\n });\n\n const grid = css(theme.grid);\n if (model.y.grid) {\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) return;\n out.push(box(`ygrid-${i}`, plot.x, crisp(py), plot.width, 1, grid));\n });\n }\n if (model.x.grid) {\n xTicks.values.forEach((v, i) => {\n const px = scales.xToPx(v);\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) return;\n out.push(box(`xgrid-${i}`, crisp(px), plot.y, 1, plot.height, grid));\n });\n }\n\n const line = Math.ceil(fs * 1.4);\n const tick: TextOptions = { size: fs, color: css(theme.textMuted), family };\n const title: TextOptions = {\n size: fs + 1,\n weight: 500,\n color: css(theme.text, 0.8),\n family,\n };\n const bottom = plot.y + plot.height;\n\n if (model.x.visible) {\n out.push(\n box(\"xaxis\", plot.x, crisp(bottom), plot.width, 1, css(theme.axis)),\n );\n let lastRight = -Infinity;\n xTicks.values\n .map((v, i) => ({ px: scales.xToPx(v), text: xTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.px - b.px)\n .forEach(({ px, text }, i) => {\n if (!text || px < plot.x - 0.5 || px > plot.x + plot.width + 0.5)\n return;\n const w = measureChartText(text, `400 ${fs}px sans-serif`);\n const left = Math.max(0, Math.min(width - w, px - w / 2));\n if (left < lastRight + 6) return;\n lastRight = left + w;\n out.push(\n label(\n `xtick-${i}`,\n text,\n left + w / 2,\n bottom + 7,\n \"center\",\n \"top\",\n tick,\n width,\n ),\n );\n });\n if (model.x.title)\n out.push(\n label(\n \"xtitle\",\n model.x.title,\n plot.x + plot.width / 2,\n bottom + line + 10,\n \"center\",\n \"top\",\n title,\n width,\n ),\n );\n }\n\n if (model.y.visible) {\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n const text = yTicks.labels[i];\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n out.push(\n label(\n `ytick-${i}`,\n text,\n plot.x - 8,\n py,\n \"right\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (model.y.title)\n out.push(\n label(\n \"ytitle\",\n model.y.title,\n line / 2 + 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"-90deg\" }],\n },\n ),\n );\n }\n\n if (scene.legend) {\n for (const e of scene.legend.entries) {\n // coordinates relative to the entry box\n const cy = e.box.height / 2;\n const swatch =\n e.shape === \"dot\"\n ? dot(\"swatch\", 5, cy, 8, e.color)\n : e.shape === \"line\"\n ? box(\"swatch\", 0, cy - 1, 10, 2, e.color)\n : box(\"swatch\", 1, cy - 4, 8, 8, e.color);\n out.push(\n <View\n key={`legend-${e.id}`}\n style={{\n position: \"absolute\",\n left: e.box.x,\n top: e.box.y,\n width: e.box.width,\n height: e.box.height,\n opacity: e.hidden ? 0.45 : 1,\n }}\n {...part(C, \"legend-item\", { hidden: e.hidden })}\n >\n {swatch}\n {label(\n \"name\",\n e.name,\n 14,\n cy,\n \"left\",\n \"middle\",\n { size: 12, color: css(theme.textMuted), family },\n e.box.width,\n e.hidden ? { textDecorationLine: \"line-through\" } : undefined,\n )}\n </View>,\n );\n }\n }\n return out;\n}\n\n// ------------------------------------------------------------ foreground\n\nfunction drawForeground(scene: ChartScene, family?: string): ReactElement[] {\n const { theme, annotations, layout } = scene;\n const { plot, scales } = layout;\n const fs = theme.fontSize;\n const ox = plot.x;\n const oy = plot.y;\n const fw = plot.width;\n const halo = css(theme.background, 0.9);\n const labelHeight = fs + 4;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"line\") return;\n const color = css(a.color);\n if (a.axis === \"y\") {\n const py = scales.yToPx(a.value);\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"y\",\n crisp(py, a.width) - oy,\n 0,\n plot.width,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n plot.width - 6,\n py - 3 - oy,\n \"right\",\n \"bottom\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n } else {\n const px = scales.xToPx(a.value);\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"x\",\n crisp(px, a.width) - ox,\n 0,\n plot.height,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n px + 5 - ox,\n 5,\n \"left\",\n \"top\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n }\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\" || !a.label) return;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n const pad = 10;\n const pos = a.labelPosition;\n const align: Align = pos.endsWith(\"left\")\n ? \"left\"\n : pos.endsWith(\"right\")\n ? \"right\"\n : \"center\";\n const tx =\n align === \"left\"\n ? r.x + pad\n : align === \"right\"\n ? r.x + r.width - pad\n : r.x + r.width / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n out.push(\n label(\n `area-label-${i}`,\n a.label,\n tx - ox,\n ty - oy,\n align,\n \"top\",\n { size: fs + 1, weight: 600, color: css(a.labelColor), family },\n fw,\n ),\n );\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"text\" || !a.text) return;\n const w = measureChartText(a.text, `${a.weight} ${fs}px sans-serif`);\n const b = textBox(a, scales, w, labelHeight);\n out.push(\n label(\n `text-${i}`,\n a.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, weight: a.weight, color: css(a.color), halo, family },\n fw,\n ),\n );\n });\n\n const pointColor = css(theme.text, 0.85);\n scene.pointLabels.forEach(({ label: l, box: b }, i) => {\n out.push(\n label(\n `point-label-${i}`,\n l.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, color: pointColor, halo, family },\n fw,\n ),\n );\n });\n return out;\n}\n\nconst clip = (plot: ChartRect): ViewStyle => ({\n position: \"absolute\",\n left: plot.x,\n top: plot.y,\n width: plot.width,\n height: plot.height,\n overflow: \"hidden\",\n});\n\n/**\n * Everything but the hover state: axes, grid, legend, annotations, data and\n * labels (cached by the caller while the model, view and size are the same)\n */\nexport function drawStatic(scene: ChartScene, family?: string): ReactNode {\n const { plot } = scene.layout;\n return (\n <>\n {drawBackground(scene, family)}\n <View key=\"data\" style={clip(plot)} {...part(C, \"data\")}>\n {drawData(scene)}\n </View>\n <View key=\"labels\" style={clip(plot)} {...part(C, \"labels\")}>\n {drawForeground(scene, family)}\n </View>\n </>\n );\n}\n\n/** Crosshair, highlighted points, dragged point and the default tooltip */\nexport function drawHover(\n scene: ChartScene,\n family: string | undefined,\n customTooltip: boolean,\n): ReactNode {\n const { theme, layout, hover, dragging } = scene;\n const { plot } = layout;\n const background = css(theme.background);\n const out: ReactElement[] = [];\n if (hover && hover.crosshairX !== null) {\n out.push(\n <View\n key=\"crosshair\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"x\",\n Math.round(hover.crosshairX),\n plot.y,\n plot.height,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n hover?.marks.forEach((m, i) => {\n out.push(\n m.kind === \"bar\"\n ? box(\n `mark-${i}`,\n m.x - 2,\n m.y - 2,\n m.width + 4,\n m.height + 2,\n css(theme.text, 0.08),\n )\n : dot(`mark-${i}`, m.x, m.y, m.size + 2, m.color, {\n borderWidth: 2,\n borderColor: background,\n }),\n );\n });\n if (dragging) {\n out.push(\n <View key=\"drag\" {...part(C, \"drag\")} style={StyleSheet.absoluteFill}>\n {dot(\n \"ghost\",\n dragging.x,\n dragging.y,\n dragging.size + 2,\n dragging.color,\n {\n opacity: 0.85,\n borderWidth: 2,\n borderColor: background,\n },\n )}\n </View>,\n );\n }\n const tip = hover?.tooltip;\n if (tip && !customTooltip) {\n const { box: b, lineHeight, padding, content } = tip;\n const text = css(theme.text);\n const muted = css(theme.textMuted);\n const font = (weight: number, color: string): TextStyle => ({\n fontSize: 12,\n lineHeight,\n color,\n fontWeight: String(weight) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(family ? { fontFamily: family } : null),\n });\n const swatch = (color: string) => (\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginRight: 6,\n backgroundColor: color,\n }}\n />\n );\n const row: ViewStyle = {\n height: lineHeight,\n flexDirection: \"row\",\n alignItems: \"center\",\n };\n out.push(\n <View\n key=\"tooltip\"\n {...part(C, \"tooltip\")}\n style={[\n tooltipCard(scene),\n {\n left: b.x,\n top: b.y,\n width: b.width,\n height: b.height,\n paddingHorizontal: padding + 1,\n paddingVertical: padding - 1,\n },\n ]}\n >\n {tip.text\n ? tip.text.map((t, i) => (\n <Text key={i} numberOfLines={1} style={font(400, text)}>\n {t}\n </Text>\n ))\n : [\n <View key=\"title\" style={row}>\n {content.titleColor ? swatch(content.titleColor) : null}\n <Text\n numberOfLines={1}\n style={[font(600, text), { flexShrink: 1 }]}\n >\n {content.title}\n </Text>\n </View>,\n ...content.rows.map((r, i) => (\n <View key={i} style={row}>\n {r.color ? swatch(r.color) : null}\n <Text\n numberOfLines={1}\n style={[font(400, muted), { flexShrink: 1 }]}\n >\n {r.name}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n font(600, text),\n { flexGrow: 1, marginLeft: 16, textAlign: \"right\" },\n ]}\n >\n {r.value}\n </Text>\n </View>\n )),\n ]}\n </View>,\n );\n }\n return out;\n}\n\n/** Look of the tooltips (default and `renderTooltip` content) */\nexport const tooltipCard = (scene: ChartScene): ViewStyle => ({\n position: \"absolute\",\n backgroundColor: css(scene.theme.background),\n borderColor: css(scene.theme.axis),\n borderWidth: 1,\n borderRadius: 8,\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 6 },\n elevation: 6,\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scene.cjs","names":["measureChartText","Text","View","scenePrimitives","toCss","part","_Fragment","StyleSheet","require_parts","require_color","require_controller","require_measure","react_native","react_jsx_runtime","SHAPE_BUDGET","C","lineHeightOf","size","slack","text","o","label","lh","pad","w","top","valign","y","horizontal","align","x","frameWidth","extra","key","box","color","dot","cx","d","cy","segment","dx","x2","x1","dy","y2","y1","length","width","dashRuns","pattern","dash","v","period","a","b","runs","scale","max","out","at","i","step","dashedLine","start","run","axis","from","crisp","thin","stride","k","lx","ly","areaStrips","n","forward","xs","ys","bs","bottom","baseline","plot","to","column","j","left","c","right","mid","x0","t","primitiveLimits","scene","visible","s","lines","scatters","perLine","maxDots","drawData","primitives","options","ox","oy","dotsLeft","barsLeft","p","total","pts","r","count","h","radius","rectOf","xa","xb","ya","yb","textBox","px","py","height","css","alpha","drawBackground","layout","fs","theme","annotations","scales","grid","model","yTicks","xTicks","line","tick","title","lastRight","e","swatch","drawForeground","fw","halo","labelHeight","pos","tx","ty","pointColor","l","clip","drawStatic","family","drawHover","background","hover","m","dragging","tip","customTooltip","muted","font","weight","row","lineHeight","tooltipCard","padding","content"],"sources":["../../../../../native/src/components/Chart/scene.tsx"],"sourcesContent":["// Draws a chart scene (`ChartController.getScene()`) with plain views: no\n// canvas, SVG or native drawing module. The engine already resolves every\n// position in pixels; this file only turns them into absolutely positioned\n// <View> / <Text> elements, keeping the number of views bounded by the size\n// of the chart (lines decimated per column, dots merged per cell, bars\n// merged per pixel column), whatever the size of the data.\n\nimport type { ReactElement, ReactNode } from \"react\";\nimport {\n StyleSheet,\n Text,\n View,\n type TextStyle,\n type ViewStyle,\n} from \"react-native\";\nimport {\n scenePrimitives,\n toCss,\n type ChartPrimitive,\n type ChartRect,\n type ChartScene,\n} from \"@minerva/charts/canvas\";\nimport { part } from \"../../internal/parts\";\nimport { measureChartText } from \"./measure\";\n\ntype Rgba = ChartScene[\"theme\"][\"text\"];\ntype Annotation = ChartScene[\"annotations\"][number];\ntype RectAnnotation = Extract<Annotation, { type: \"rect\" }>;\ntype TextAnnotation = Extract<Annotation, { type: \"text\" }>;\ntype Scales = ChartScene[\"layout\"][\"scales\"];\n\n/** Upper bounds of the views drawn for the data of a chart */\nexport const SHAPE_BUDGET = {\n /** Points of all the lines (one view per segment) */\n linePoints: 1200,\n /** Dots of one scatter series before they are merged per cell */\n dotsPerSeries: 800,\n /** Dots of all the series */\n dots: 2000,\n /** Bars of one series before neighbors are merged per pixel column */\n barsPerSeries: 600,\n /** Bars of all the series */\n bars: 1500,\n /** Vertical strips filling one area */\n areaColumns: 200,\n /** Dashes of one dashed line */\n dashes: 200,\n} as const;\n\nconst C = \"chart\";\n\n// ------------------------------------------------------------------ text\n\ninterface TextOptions {\n size: number;\n color: string;\n weight?: number;\n family?: string;\n /** Halo color: keeps the text readable over the data */\n halo?: string;\n}\n\ntype Align = \"left\" | \"center\" | \"right\";\ntype VAlign = \"top\" | \"middle\" | \"bottom\";\n\nconst lineHeightOf = (size: number) => Math.ceil(size * 1.35);\n\n/** Box wide enough for the estimated width (the real one may differ) */\nconst slack = (text: string, o: TextOptions) =>\n Math.ceil(\n measureChartText(text, `${o.weight ?? 400} ${o.size}px sans-serif`) * 1.4 +\n o.size * 2,\n );\n\n/**\n * A one-line text anchored at (x, y) of a container `frameWidth` wide:\n * `left` starts there, `right` ends there, `center` is centered on it;\n * `top` / `bottom` place the em box like the canvas text baselines\n */\nfunction label(\n key: string,\n text: string,\n x: number,\n y: number,\n align: Align,\n valign: VAlign,\n o: TextOptions,\n frameWidth: number,\n extra?: TextStyle,\n): ReactElement {\n const lh = lineHeightOf(o.size);\n const pad = (lh - o.size) / 2;\n const w = slack(text, o);\n const top =\n valign === \"top\"\n ? y - pad\n : valign === \"bottom\"\n ? y - lh + pad\n : y - lh / 2;\n const horizontal: TextStyle =\n align === \"left\"\n ? { left: x, width: w }\n : align === \"right\"\n ? { right: frameWidth - x, width: w }\n : { left: x - w / 2, width: w };\n return (\n <Text\n key={key}\n numberOfLines={1}\n style={[\n {\n position: \"absolute\",\n top,\n ...horizontal,\n textAlign: align,\n fontSize: o.size,\n lineHeight: lh,\n color: o.color,\n fontWeight: String(o.weight ?? 400) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(o.family ? { fontFamily: o.family } : null),\n ...(o.halo\n ? {\n textShadowColor: o.halo,\n textShadowRadius: 3,\n textShadowOffset: { width: 0, height: 0 },\n }\n : null),\n },\n extra,\n ]}\n >\n {text}\n </Text>\n );\n}\n\n// ---------------------------------------------------------------- shapes\n\nconst box = (\n key: string,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n extra?: ViewStyle,\n): ReactElement => (\n <View\n key={key}\n style={[\n {\n position: \"absolute\",\n left: x,\n top: y,\n width,\n height,\n backgroundColor: color,\n },\n extra,\n ]}\n />\n);\n\nconst dot = (\n key: string,\n cx: number,\n cy: number,\n d: number,\n color: string,\n extra?: ViewStyle,\n) =>\n box(key, cx - d / 2, cy - d / 2, d, d, color, {\n borderRadius: d / 2,\n ...extra,\n });\n\n/** A straight stroke: one view, rotated around its center */\nconst segment = (\n key: string,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n width: number,\n color: string,\n) => {\n const dx = x2 - x1;\n const dy = y2 - y1;\n const length = Math.hypot(dx, dy) + width;\n return box(\n key,\n (x1 + x2) / 2 - length / 2,\n (y1 + y2) / 2 - width / 2,\n length,\n width,\n color,\n {\n borderRadius: width / 2,\n transform: [{ rotate: `${Math.atan2(dy, dx)}rad` }],\n },\n );\n};\n\n/** Dash runs `[start, length]` along a line (canvas `setLineDash` pattern) */\nexport function dashRuns(\n length: number,\n dash: readonly number[],\n max: number = SHAPE_BUDGET.dashes,\n): [number, number][] {\n let pattern = dash.filter((v) => Number.isFinite(v) && v >= 0);\n // odd patterns repeat twice, like the canvas\n if (pattern.length % 2) pattern = [...pattern, ...pattern];\n const period = pattern.reduce((a, b) => a + b, 0);\n if (!pattern.length || period <= 0) return [[0, length]];\n const runs = (length / period) * (pattern.length / 2);\n const scale = runs > max ? runs / max : 1;\n const out: [number, number][] = [];\n let at = 0;\n for (let i = 0; at < length; i = (i + 1) % pattern.length) {\n const step = pattern[i] * scale;\n if (i % 2 === 0 && step > 0) out.push([at, Math.min(step, length - at)]);\n at += Math.max(step, 0.5);\n }\n return out;\n}\n\nconst dashedLine = (\n key: string,\n axis: \"x\" | \"y\",\n at: number,\n from: number,\n length: number,\n width: number,\n color: string,\n dash: readonly number[],\n) =>\n dashRuns(length, dash).map(([start, run], i) =>\n axis === \"y\"\n ? box(`${key}-${i}`, from + start, at, run, width, color)\n : box(`${key}-${i}`, at, from + start, width, run, color),\n );\n\nconst crisp = (v: number, width = 1) => Math.round(v) + 0.5 - width / 2;\n\n// ------------------------------------------------------------------ data\n\n/** Thins a run of interleaved points to `max` points and drops sub-pixel steps */\nfunction thin(run: readonly number[], max: number): number[] {\n const n = run.length / 2;\n const stride = n > max ? Math.ceil(n / max) : 1;\n const out: number[] = [];\n for (let i = 0; i < n; i += stride) {\n const x = run[i * 2];\n const y = run[i * 2 + 1];\n const k = out.length;\n if (k && Math.hypot(x - out[k - 2], y - out[k - 1]) < 1.5) continue;\n out.push(x, y);\n }\n const lx = run[n * 2 - 2];\n const ly = run[n * 2 - 1];\n const k = out.length;\n if (n > 1 && (out[k - 2] !== lx || out[k - 1] !== ly)) out.push(lx, ly);\n return out;\n}\n\n/** Vertical strips between the line and the baseline (or the stack below), one per column */\nfunction areaStrips(\n key: string,\n run: readonly number[],\n baseline: number,\n color: string,\n opacity: number,\n plot: ChartRect,\n /** Y pixel of the bottom edge under every point (stacked areas) */\n bottom?: readonly number[],\n): ReactElement[] {\n const n = run.length / 2;\n if (n < 2) return [];\n // left to right (reversed axes list their points right to left)\n const forward = run[0] <= run[n * 2 - 2];\n const at = (i: number) => (forward ? i : n - 1 - i);\n const xs = (i: number) => run[at(i) * 2];\n const ys = (i: number) => run[at(i) * 2 + 1];\n const bs = (i: number) => (bottom ? bottom[at(i)] : baseline);\n const from = Math.max(plot.x, xs(0));\n const to = Math.min(plot.x + plot.width, xs(n - 1));\n if (to <= from) return [];\n const column = Math.max(2, plot.width / SHAPE_BUDGET.areaColumns);\n const out: ReactElement[] = [];\n let j = 0;\n for (let left = Math.floor(from), c = 0; left < to; c++) {\n const right = Math.min(Math.ceil(to), Math.round(left + column));\n const mid = (left + right) / 2;\n while (j < n - 2 && xs(j + 1) < mid) j++;\n const x0 = xs(j);\n const x1 = xs(j + 1);\n const t = x1 === x0 ? 0 : Math.max(0, Math.min(1, (mid - x0) / (x1 - x0)));\n const y = ys(j) + (ys(j + 1) - ys(j)) * t;\n const b = bs(j) + (bs(j + 1) - bs(j)) * t;\n if (Number.isFinite(y) && Number.isFinite(b)) {\n const top = Math.min(y, b);\n out.push(\n box(\n `${key}-${c}`,\n left - plot.x,\n top - plot.y,\n right - left,\n Math.abs(b - y),\n color,\n {\n opacity,\n },\n ),\n );\n }\n left = right;\n }\n return out;\n}\n\n/** Limits of `scenePrimitives` for the views budget */\nexport function primitiveLimits(scene: ChartScene) {\n const { plot } = scene.layout;\n const visible = scene.model.series.filter((s) => !s.hidden);\n const lines = visible.filter(\n (s) => s.type === \"line\" || s.type === \"area\",\n ).length;\n const scatters = visible.filter((s) => s.type === \"scatter\").length;\n const perLine = Math.max(150, SHAPE_BUDGET.linePoints / Math.max(1, lines));\n const maxDots = Math.max(\n 100,\n Math.min(\n SHAPE_BUDGET.dotsPerSeries,\n SHAPE_BUDGET.dots / Math.max(1, scatters),\n ),\n );\n return {\n perLine,\n options: {\n // decimation keeps up to 4 points per column\n columnWidth: Math.max(3, (plot.width * 4) / perLine),\n maxDots,\n maxBars: SHAPE_BUDGET.barsPerSeries,\n dotCell: Math.max(\n 4,\n Math.sqrt((plot.width * plot.height) / maxDots) * 1.15 + 1,\n ),\n },\n };\n}\n\nfunction drawData(scene: ChartScene): ReactElement[] {\n const { plot } = scene.layout;\n const { perLine, options } = primitiveLimits(scene);\n const primitives: ChartPrimitive[] = scenePrimitives(scene, options);\n const ox = plot.x;\n const oy = plot.y;\n const out: ReactElement[] = [];\n let dotsLeft: number = SHAPE_BUDGET.dots;\n let barsLeft: number = SHAPE_BUDGET.bars;\n primitives.forEach((p, k) => {\n const key = `${p.kind}${p.seriesIndex}-${k}`;\n if (p.kind === \"area\") {\n p.segments.forEach((run, r) =>\n out.push(\n ...areaStrips(\n `${key}-${r}`,\n run,\n p.baseline,\n p.color,\n p.opacity,\n plot,\n p.bottoms?.[r],\n ),\n ),\n );\n return;\n }\n if (p.kind === \"line\") {\n let total = 0;\n for (const run of p.segments) total += run.length / 2;\n p.segments.forEach((run, r) => {\n const pts = thin(\n run,\n Math.max(\n 2,\n Math.round((perLine * run.length) / 2 / Math.max(1, total)),\n ),\n );\n if (pts.length === 2) {\n out.push(\n dot(\n `${key}-${r}`,\n pts[0] - ox,\n pts[1] - oy,\n p.width * 1.5,\n p.color,\n ),\n );\n return;\n }\n for (let i = 0; i + 3 < pts.length; i += 2) {\n out.push(\n segment(\n `${key}-${r}-${i}`,\n pts[i] - ox,\n pts[i + 1] - oy,\n pts[i + 2] - ox,\n pts[i + 3] - oy,\n p.width,\n p.color,\n ),\n );\n }\n });\n return;\n }\n if (p.kind === \"bars\") {\n const count = p.rects.length / 4;\n const stride =\n count > barsLeft ? Math.ceil(count / Math.max(1, barsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n const [x, y, w, h] = p.rects.slice(i * 4, i * 4 + 4);\n const radius = Math.min(p.radius ?? 0, w / 2, h / 2);\n out.push(\n box(\n `${key}-${i}`,\n x - ox,\n y - oy,\n Math.max(w, 0.5),\n h,\n p.colors?.[i] ?? p.color,\n radius > 0.5 ? { borderRadius: radius } : undefined,\n ),\n );\n }\n barsLeft = Math.max(0, barsLeft - Math.ceil(count / stride));\n return;\n }\n const count = p.dots.length / 3;\n const stride =\n count > dotsLeft ? Math.ceil(count / Math.max(1, dotsLeft)) : 1;\n for (let i = 0; i < count; i += stride) {\n out.push(\n dot(\n `${key}-${i}`,\n p.dots[i * 3] - ox,\n p.dots[i * 3 + 1] - oy,\n p.dots[i * 3 + 2],\n p.colors[i],\n {\n opacity: p.opacity,\n },\n ),\n );\n }\n dotsLeft = Math.max(0, dotsLeft - Math.ceil(count / stride));\n });\n return out;\n}\n\n// ------------------------------------------------------------ background\n\nconst rectOf = (a: RectAnnotation, s: Scales): ChartRect => {\n const { plot } = s;\n const xa = a.x0 === undefined ? -Infinity : s.xToPx(a.x0);\n const xb = a.x1 === undefined ? Infinity : s.xToPx(a.x1);\n const ya = a.y0 === undefined ? Infinity : s.yToPx(a.y0);\n const yb = a.y1 === undefined ? -Infinity : s.yToPx(a.y1);\n const left = Math.max(plot.x, Math.min(xa, xb));\n const right = Math.min(plot.x + plot.width, Math.max(xa, xb));\n const top = Math.max(plot.y, Math.min(ya, yb));\n const bottom = Math.min(plot.y + plot.height, Math.max(ya, yb));\n return { x: left, y: top, width: right - left, height: bottom - top };\n};\n\n/** Box of a text annotation, kept inside the plot (engine `textBox`) */\nconst textBox = (\n a: TextAnnotation,\n s: Scales,\n width: number,\n height: number,\n): ChartRect => {\n const { plot } = s;\n const px = a.x === undefined ? plot.x + plot.width / 2 : s.xToPx(a.x);\n const py = a.y === undefined ? plot.y + plot.height / 2 : s.yToPx(a.y);\n const gap = 6;\n let x = px - width / 2;\n let y = py - height / 2;\n if (a.anchor === \"top\") y = py + gap;\n else if (a.anchor === \"bottom\") y = py - gap - height;\n else if (a.anchor === \"left\") x = px + gap;\n else if (a.anchor === \"right\") x = px - gap - width;\n x = Math.max(plot.x + gap, Math.min(x, plot.x + plot.width - gap - width));\n y = Math.max(plot.y + 2, Math.min(y, plot.y + plot.height - 2 - height));\n return { x, y, width, height };\n};\n\nconst css = (c: Rgba, alpha?: number) => toCss(c, alpha);\n\nfunction drawBackground(scene: ChartScene, family?: string): ReactElement[] {\n const { width, theme, model, layout, annotations } = scene;\n const { plot, scales, xTicks, yTicks } = layout;\n const fs = theme.fontSize;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\") return;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n out.push(\n box(`area-${i}`, r.x, r.y, r.width, r.height, css(a.color, a.opacity)),\n );\n });\n\n const grid = css(theme.grid);\n if (model.y.grid) {\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n if (py < plot.y - 1 || py > plot.y + plot.height + 1) return;\n out.push(box(`ygrid-${i}`, plot.x, crisp(py), plot.width, 1, grid));\n });\n }\n if (model.x.grid) {\n xTicks.values.forEach((v, i) => {\n const px = scales.xToPx(v);\n if (px < plot.x - 1 || px > plot.x + plot.width + 1) return;\n out.push(box(`xgrid-${i}`, crisp(px), plot.y, 1, plot.height, grid));\n });\n }\n\n const line = Math.ceil(fs * 1.4);\n const tick: TextOptions = { size: fs, color: css(theme.textMuted), family };\n const title: TextOptions = {\n size: fs + 1,\n weight: 500,\n color: css(theme.text, 0.8),\n family,\n };\n const bottom = plot.y + plot.height;\n\n if (model.x.visible) {\n out.push(\n box(\"xaxis\", plot.x, crisp(bottom), plot.width, 1, css(theme.axis)),\n );\n let lastRight = -Infinity;\n xTicks.values\n .map((v, i) => ({ px: scales.xToPx(v), text: xTicks.labels[i] ?? \"\" }))\n .sort((a, b) => a.px - b.px)\n .forEach(({ px, text }, i) => {\n if (!text || px < plot.x - 0.5 || px > plot.x + plot.width + 0.5)\n return;\n const w = measureChartText(text, `400 ${fs}px sans-serif`);\n const left = Math.max(0, Math.min(width - w, px - w / 2));\n if (left < lastRight + 6) return;\n lastRight = left + w;\n out.push(\n label(\n `xtick-${i}`,\n text,\n left + w / 2,\n bottom + 7,\n \"center\",\n \"top\",\n tick,\n width,\n ),\n );\n });\n if (model.x.title)\n out.push(\n label(\n \"xtitle\",\n model.x.title,\n plot.x + plot.width / 2,\n bottom + line + 10,\n \"center\",\n \"top\",\n title,\n width,\n ),\n );\n }\n\n if (model.y.visible) {\n yTicks.values.forEach((v, i) => {\n const py = scales.yToPx(v);\n const text = yTicks.labels[i];\n if (!text || py < plot.y - 0.5 || py > plot.y + plot.height + 0.5) return;\n out.push(\n label(\n `ytick-${i}`,\n text,\n plot.x - 8,\n py,\n \"right\",\n \"middle\",\n tick,\n width,\n ),\n );\n });\n if (model.y.title)\n out.push(\n label(\n \"ytitle\",\n model.y.title,\n line / 2 + 4,\n plot.y + plot.height / 2,\n \"center\",\n \"middle\",\n title,\n width,\n {\n transform: [{ rotate: \"-90deg\" }],\n },\n ),\n );\n }\n\n if (scene.legend) {\n for (const e of scene.legend.entries) {\n // coordinates relative to the entry box\n const cy = e.box.height / 2;\n const swatch =\n e.shape === \"dot\"\n ? dot(\"swatch\", 5, cy, 8, e.color)\n : e.shape === \"line\"\n ? box(\"swatch\", 0, cy - 1, 10, 2, e.color)\n : box(\"swatch\", 1, cy - 4, 8, 8, e.color);\n out.push(\n <View\n key={`legend-${e.id}`}\n style={{\n position: \"absolute\",\n left: e.box.x,\n top: e.box.y,\n width: e.box.width,\n height: e.box.height,\n opacity: e.hidden ? 0.45 : 1,\n }}\n {...part(C, \"legend-item\", { hidden: e.hidden })}\n >\n {swatch}\n {label(\n \"name\",\n e.name,\n 14,\n cy,\n \"left\",\n \"middle\",\n { size: 12, color: css(theme.textMuted), family },\n e.box.width,\n e.hidden ? { textDecorationLine: \"line-through\" } : undefined,\n )}\n </View>,\n );\n }\n }\n return out;\n}\n\n// ------------------------------------------------------------ foreground\n\nfunction drawForeground(scene: ChartScene, family?: string): ReactElement[] {\n const { theme, annotations, layout } = scene;\n const { plot, scales } = layout;\n const fs = theme.fontSize;\n const ox = plot.x;\n const oy = plot.y;\n const fw = plot.width;\n const halo = css(theme.background, 0.9);\n const labelHeight = fs + 4;\n const out: ReactElement[] = [];\n\n annotations.forEach((a, i) => {\n if (a.type !== \"line\") return;\n const color = css(a.color);\n if (a.axis === \"y\") {\n const py = scales.yToPx(a.value);\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"y\",\n crisp(py, a.width) - oy,\n 0,\n plot.width,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n plot.width - 6,\n py - 3 - oy,\n \"right\",\n \"bottom\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n } else {\n const px = scales.xToPx(a.value);\n out.push(\n ...dashedLine(\n `line-${i}`,\n \"x\",\n crisp(px, a.width) - ox,\n 0,\n plot.height,\n a.width,\n color,\n a.dash,\n ),\n );\n if (a.label)\n out.push(\n label(\n `line-label-${i}`,\n a.label,\n px + 5 - ox,\n 5,\n \"left\",\n \"top\",\n { size: fs, weight: 500, color, halo, family },\n fw,\n ),\n );\n }\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"rect\" || !a.label) return;\n const r = rectOf(a, scales);\n if (r.width <= 0 || r.height <= 0) return;\n const pad = 10;\n const pos = a.labelPosition;\n const align: Align = pos.endsWith(\"left\")\n ? \"left\"\n : pos.endsWith(\"right\")\n ? \"right\"\n : \"center\";\n const tx =\n align === \"left\"\n ? r.x + pad\n : align === \"right\"\n ? r.x + r.width - pad\n : r.x + r.width / 2;\n const ty = pos.startsWith(\"top\")\n ? r.y + pad\n : pos.startsWith(\"bottom\")\n ? r.y + r.height - pad - labelHeight\n : r.y + (r.height - labelHeight) / 2;\n out.push(\n label(\n `area-label-${i}`,\n a.label,\n tx - ox,\n ty - oy,\n align,\n \"top\",\n { size: fs + 1, weight: 600, color: css(a.labelColor), family },\n fw,\n ),\n );\n });\n\n annotations.forEach((a, i) => {\n if (a.type !== \"text\" || !a.text) return;\n const w = measureChartText(a.text, `${a.weight} ${fs}px sans-serif`);\n const b = textBox(a, scales, w, labelHeight);\n out.push(\n label(\n `text-${i}`,\n a.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, weight: a.weight, color: css(a.color), halo, family },\n fw,\n ),\n );\n });\n\n const pointColor = css(theme.text, 0.85);\n scene.pointLabels.forEach(({ label: l, box: b }, i) => {\n out.push(\n label(\n `point-label-${i}`,\n l.text,\n b.x - ox,\n b.y + b.height / 2 - oy,\n \"left\",\n \"middle\",\n { size: fs, color: pointColor, halo, family },\n fw,\n ),\n );\n });\n return out;\n}\n\nconst clip = (plot: ChartRect): ViewStyle => ({\n position: \"absolute\",\n left: plot.x,\n top: plot.y,\n width: plot.width,\n height: plot.height,\n overflow: \"hidden\",\n});\n\n/**\n * Everything but the hover state: axes, grid, legend, annotations, data and\n * labels (cached by the caller while the model, view and size are the same)\n */\nexport function drawStatic(scene: ChartScene, family?: string): ReactNode {\n const { plot } = scene.layout;\n return (\n <>\n {drawBackground(scene, family)}\n <View key=\"data\" style={clip(plot)} {...part(C, \"data\")}>\n {drawData(scene)}\n </View>\n <View key=\"labels\" style={clip(plot)} {...part(C, \"labels\")}>\n {drawForeground(scene, family)}\n </View>\n </>\n );\n}\n\n/** Crosshair, highlighted points, dragged point and the default tooltip */\nexport function drawHover(\n scene: ChartScene,\n family: string | undefined,\n customTooltip: boolean,\n): ReactNode {\n const { theme, layout, hover, dragging } = scene;\n const { plot } = layout;\n const background = css(theme.background);\n const out: ReactElement[] = [];\n if (hover && hover.crosshairX !== null) {\n out.push(\n <View\n key=\"crosshair\"\n style={StyleSheet.absoluteFill}\n {...part(C, \"crosshair\")}\n >\n {dashedLine(\n \"dash\",\n \"x\",\n Math.round(hover.crosshairX),\n plot.y,\n plot.height,\n 1,\n css(theme.textMuted, 0.55),\n [3, 3],\n )}\n </View>,\n );\n }\n hover?.marks.forEach((m, i) => {\n if (m.kind === \"band\") {\n out.push(\n box(`mark-${i}`, m.x, m.y, m.width, m.height, css(theme.text, 0.05), {\n borderRadius: 6,\n }),\n );\n return;\n }\n if (m.kind === \"cell\") {\n out.push(\n box(\n `mark-${i}`,\n m.x - 1.5,\n m.y - 1.5,\n m.width + 3,\n m.height + 3,\n \"transparent\",\n {\n borderRadius: 4,\n borderWidth: 1.5,\n borderColor: css(theme.text, 0.55),\n },\n ),\n );\n return;\n }\n // soft halo, then the dot with a thin ring in the background color\n out.push(\n dot(`halo-${i}`, m.x, m.y, m.size + 8, m.halo),\n dot(`mark-${i}`, m.x, m.y, m.size, m.color, {\n borderWidth: 2,\n borderColor: background,\n }),\n );\n });\n if (dragging) {\n out.push(\n <View key=\"drag\" {...part(C, \"drag\")} style={StyleSheet.absoluteFill}>\n {dot(\n \"ghost\",\n dragging.x,\n dragging.y,\n dragging.size + 2,\n dragging.color,\n {\n opacity: 0.85,\n borderWidth: 2,\n borderColor: background,\n },\n )}\n </View>,\n );\n }\n const tip = hover?.tooltip;\n if (tip && !customTooltip) {\n const { box: b, lineHeight, padding, content } = tip;\n const text = css(theme.text);\n const muted = css(theme.textMuted);\n const font = (weight: number, color: string): TextStyle => ({\n fontSize: 12,\n lineHeight,\n color,\n fontWeight: String(weight) as TextStyle[\"fontWeight\"],\n includeFontPadding: false,\n ...(family ? { fontFamily: family } : null),\n });\n const swatch = (color: string) => (\n <View\n style={{\n width: 8,\n height: 8,\n borderRadius: 4,\n marginRight: 6,\n backgroundColor: color,\n }}\n />\n );\n const row: ViewStyle = {\n height: lineHeight,\n flexDirection: \"row\",\n alignItems: \"center\",\n };\n out.push(\n <View\n key=\"tooltip\"\n {...part(C, \"tooltip\")}\n style={[\n tooltipCard(scene),\n {\n left: b.x,\n top: b.y,\n width: b.width,\n height: b.height,\n paddingHorizontal: padding + 1,\n paddingVertical: padding - 1,\n },\n ]}\n >\n {tip.text\n ? tip.text.map((t, i) => (\n <Text key={i} numberOfLines={1} style={font(400, text)}>\n {t}\n </Text>\n ))\n : [\n <View key=\"title\" style={row}>\n {content.titleColor ? swatch(content.titleColor) : null}\n <Text\n numberOfLines={1}\n style={[font(600, text), { flexShrink: 1 }]}\n >\n {content.title}\n </Text>\n </View>,\n ...content.rows.map((r, i) => (\n <View key={i} style={row}>\n {r.color ? swatch(r.color) : null}\n <Text\n numberOfLines={1}\n style={[font(400, muted), { flexShrink: 1 }]}\n >\n {r.name}\n </Text>\n <Text\n numberOfLines={1}\n style={[\n font(600, text),\n { flexGrow: 1, marginLeft: 16, textAlign: \"right\" },\n ]}\n >\n {r.value}\n </Text>\n </View>\n )),\n ]}\n </View>,\n );\n }\n return out;\n}\n\n/** Look of the tooltips (default and `renderTooltip` content) */\nexport const tooltipCard = (scene: ChartScene): ViewStyle => ({\n position: \"absolute\",\n backgroundColor: css(scene.theme.background),\n borderColor: css(scene.theme.axis),\n borderWidth: 1,\n borderRadius: 8,\n shadowColor: \"#0f172a\",\n shadowOpacity: 0.18,\n shadowRadius: 8,\n shadowOffset: { width: 0, height: 6 },\n elevation: 6,\n});\n"],"mappings":"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"}
|
|
@@ -90,23 +90,23 @@ function x(e, t) {
|
|
|
90
90
|
let a = e[n * 2 - 2], o = e[n * 2 - 1], s = i.length;
|
|
91
91
|
return n > 1 && (i[s - 2] !== a || i[s - 1] !== o) && i.push(a, o), i;
|
|
92
92
|
}
|
|
93
|
-
function S(e, t, n, r, i, a) {
|
|
94
|
-
let
|
|
95
|
-
if (
|
|
96
|
-
let
|
|
97
|
-
if (
|
|
98
|
-
let
|
|
99
|
-
for (let t = Math.floor(
|
|
100
|
-
let
|
|
101
|
-
for (;
|
|
102
|
-
let
|
|
103
|
-
if (Number.isFinite(b)) {
|
|
104
|
-
let
|
|
105
|
-
|
|
93
|
+
function S(e, t, n, r, i, a, o) {
|
|
94
|
+
let s = t.length / 2;
|
|
95
|
+
if (s < 2) return [];
|
|
96
|
+
let c = t[0] <= t[s * 2 - 2], l = (e) => c ? e : s - 1 - e, d = (e) => t[l(e) * 2], f = (e) => t[l(e) * 2 + 1], p = (e) => o ? o[l(e)] : n, m = Math.max(a.x, d(0)), g = Math.min(a.x + a.width, d(s - 1));
|
|
97
|
+
if (g <= m) return [];
|
|
98
|
+
let _ = Math.max(2, a.width / u.areaColumns), v = [], y = 0;
|
|
99
|
+
for (let t = Math.floor(m), n = 0; t < g; n++) {
|
|
100
|
+
let o = Math.min(Math.ceil(g), Math.round(t + _)), c = (t + o) / 2;
|
|
101
|
+
for (; y < s - 2 && d(y + 1) < c;) y++;
|
|
102
|
+
let l = d(y), u = d(y + 1), m = u === l ? 0 : Math.max(0, Math.min(1, (c - l) / (u - l))), b = f(y) + (f(y + 1) - f(y)) * m, x = p(y) + (p(y + 1) - p(y)) * m;
|
|
103
|
+
if (Number.isFinite(b) && Number.isFinite(x)) {
|
|
104
|
+
let s = Math.min(b, x);
|
|
105
|
+
v.push(h(`${e}-${n}`, t - a.x, s - a.y, o - t, Math.abs(x - b), r, { opacity: i }));
|
|
106
106
|
}
|
|
107
|
-
t =
|
|
107
|
+
t = o;
|
|
108
108
|
}
|
|
109
|
-
return
|
|
109
|
+
return v;
|
|
110
110
|
}
|
|
111
111
|
function C(e) {
|
|
112
112
|
let { plot: t } = e.layout, n = e.model.series.filter((e) => !e.hidden), r = n.filter((e) => e.type === "line" || e.type === "area").length, i = n.filter((e) => e.type === "scatter").length, a = Math.max(150, u.linePoints / Math.max(1, r)), o = Math.max(100, Math.min(u.dotsPerSeries, u.dots / Math.max(1, i)));
|
|
@@ -125,7 +125,7 @@ function w(e) {
|
|
|
125
125
|
return a.forEach((e, n) => {
|
|
126
126
|
let i = `${e.kind}${e.seriesIndex}-${n}`;
|
|
127
127
|
if (e.kind === "area") {
|
|
128
|
-
e.segments.forEach((n, r) => c.push(...S(`${i}-${r}`, n, e.baseline, e.color, e.opacity, t)));
|
|
128
|
+
e.segments.forEach((n, r) => c.push(...S(`${i}-${r}`, n, e.baseline, e.color, e.opacity, t, e.bottoms?.[r])));
|
|
129
129
|
return;
|
|
130
130
|
}
|
|
131
131
|
if (e.kind === "line") {
|
|
@@ -144,8 +144,8 @@ function w(e) {
|
|
|
144
144
|
if (e.kind === "bars") {
|
|
145
145
|
let t = e.rects.length / 4, n = t > d ? Math.ceil(t / Math.max(1, d)) : 1;
|
|
146
146
|
for (let r = 0; r < t; r += n) {
|
|
147
|
-
let [t, n, a, l] = e.rects.slice(r * 4, r * 4 + 4);
|
|
148
|
-
c.push(h(`${i}-${r}`, t - o, n - s, Math.max(a, .5), l, e.color));
|
|
147
|
+
let [t, n, a, l] = e.rects.slice(r * 4, r * 4 + 4), u = Math.min(e.radius ?? 0, a / 2, l / 2);
|
|
148
|
+
c.push(h(`${i}-${r}`, t - o, n - s, Math.max(a, .5), l, e.colors?.[r] ?? e.color, u > .5 ? { borderRadius: u } : void 0));
|
|
149
149
|
}
|
|
150
150
|
d = Math.max(0, d - Math.ceil(t / n));
|
|
151
151
|
return;
|
|
@@ -320,7 +320,19 @@ function M(t, n, r) {
|
|
|
320
320
|
...e(d, "crosshair"),
|
|
321
321
|
children: y("dash", "x", Math.round(f.crosshairX), m.y, m.height, 1, D(s.textMuted, .55), [3, 3])
|
|
322
322
|
}, "crosshair")), f?.marks.forEach((e, t) => {
|
|
323
|
-
|
|
323
|
+
if (e.kind === "band") {
|
|
324
|
+
v.push(h(`mark-${t}`, e.x, e.y, e.width, e.height, D(s.text, .05), { borderRadius: 6 }));
|
|
325
|
+
return;
|
|
326
|
+
}
|
|
327
|
+
if (e.kind === "cell") {
|
|
328
|
+
v.push(h(`mark-${t}`, e.x - 1.5, e.y - 1.5, e.width + 3, e.height + 3, "transparent", {
|
|
329
|
+
borderRadius: 4,
|
|
330
|
+
borderWidth: 1.5,
|
|
331
|
+
borderColor: D(s.text, .55)
|
|
332
|
+
}));
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
v.push(g(`halo-${t}`, e.x, e.y, e.size + 8, e.halo), g(`mark-${t}`, e.x, e.y, e.size, e.color, {
|
|
324
336
|
borderWidth: 2,
|
|
325
337
|
borderColor: _
|
|
326
338
|
}));
|