@dou-ui/chart 0.0.0-stage → 0.1.0-alpha.1
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/LICENSE +21 -0
- package/README.md +10 -2
- package/dist/chart.js +6 -0
- package/dist/chart.js.map +1 -0
- package/dist/chart.vue_vue_type_script_setup_true_lang.js +4245 -0
- package/dist/chart.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/area.js +6 -0
- package/dist/components/area.js.map +1 -0
- package/dist/components/area.vue_vue_type_script_setup_true_lang.js +55 -0
- package/dist/components/area.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/axis.js +6 -0
- package/dist/components/axis.js.map +1 -0
- package/dist/components/axis.vue_vue_type_script_setup_true_lang.js +46 -0
- package/dist/components/axis.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/bar.js +6 -0
- package/dist/components/bar.js.map +1 -0
- package/dist/components/bar.vue_vue_type_script_setup_true_lang.js +46 -0
- package/dist/components/bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/boxplot.js +6 -0
- package/dist/components/boxplot.js.map +1 -0
- package/dist/components/boxplot.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/boxplot.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/brush.js +6 -0
- package/dist/components/brush.js.map +1 -0
- package/dist/components/brush.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/brush.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/funnel.js +6 -0
- package/dist/components/funnel.js.map +1 -0
- package/dist/components/funnel.vue_vue_type_script_setup_true_lang.js +41 -0
- package/dist/components/funnel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/gauge.js +6 -0
- package/dist/components/gauge.js.map +1 -0
- package/dist/components/gauge.vue_vue_type_script_setup_true_lang.js +91 -0
- package/dist/components/gauge.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/heatmap.js +6 -0
- package/dist/components/heatmap.js.map +1 -0
- package/dist/components/heatmap.vue_vue_type_script_setup_true_lang.js +45 -0
- package/dist/components/heatmap.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/histogram.js +6 -0
- package/dist/components/histogram.js.map +1 -0
- package/dist/components/histogram.vue_vue_type_script_setup_true_lang.js +61 -0
- package/dist/components/histogram.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/line.js +6 -0
- package/dist/components/line.js.map +1 -0
- package/dist/components/line.vue_vue_type_script_setup_true_lang.js +52 -0
- package/dist/components/line.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/marker.js +6 -0
- package/dist/components/marker.js.map +1 -0
- package/dist/components/marker.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/components/marker.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/pie.js +6 -0
- package/dist/components/pie.js.map +1 -0
- package/dist/components/pie.vue_vue_type_script_setup_true_lang.js +42 -0
- package/dist/components/pie.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/radar.js +6 -0
- package/dist/components/radar.js.map +1 -0
- package/dist/components/radar.vue_vue_type_script_setup_true_lang.js +45 -0
- package/dist/components/radar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/range.js +6 -0
- package/dist/components/range.js.map +1 -0
- package/dist/components/range.vue_vue_type_script_setup_true_lang.js +27 -0
- package/dist/components/range.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/scatter.js +6 -0
- package/dist/components/scatter.js.map +1 -0
- package/dist/components/scatter.vue_vue_type_script_setup_true_lang.js +45 -0
- package/dist/components/scatter.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sunburst.js +6 -0
- package/dist/components/sunburst.js.map +1 -0
- package/dist/components/sunburst.vue_vue_type_script_setup_true_lang.js +36 -0
- package/dist/components/sunburst.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/tooltip.js +6 -0
- package/dist/components/tooltip.js.map +1 -0
- package/dist/components/tooltip.vue_vue_type_script_setup_true_lang.js +31 -0
- package/dist/components/tooltip.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/treemap.js +6 -0
- package/dist/components/treemap.js.map +1 -0
- package/dist/components/treemap.vue_vue_type_script_setup_true_lang.js +33 -0
- package/dist/components/treemap.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/waterfall.js +6 -0
- package/dist/components/waterfall.js.map +1 -0
- package/dist/components/waterfall.vue_vue_type_script_setup_true_lang.js +49 -0
- package/dist/components/waterfall.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/zoom.js +6 -0
- package/dist/components/zoom.js.map +1 -0
- package/dist/components/zoom.vue_vue_type_script_setup_true_lang.js +37 -0
- package/dist/components/zoom.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/context.js +30 -0
- package/dist/context.js.map +1 -0
- package/dist/core/bar.js +223 -0
- package/dist/core/bar.js.map +1 -0
- package/dist/core/box.js +150 -0
- package/dist/core/box.js.map +1 -0
- package/dist/core/colors.js +58 -0
- package/dist/core/colors.js.map +1 -0
- package/dist/core/data.js +257 -0
- package/dist/core/data.js.map +1 -0
- package/dist/core/decimate.js +211 -0
- package/dist/core/decimate.js.map +1 -0
- package/dist/core/format.js +151 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/funnel.js +68 -0
- package/dist/core/funnel.js.map +1 -0
- package/dist/core/grid.js +87 -0
- package/dist/core/grid.js.map +1 -0
- package/dist/core/heatmap.js +187 -0
- package/dist/core/heatmap.js.map +1 -0
- package/dist/core/histogram.js +81 -0
- package/dist/core/histogram.js.map +1 -0
- package/dist/core/hit.js +115 -0
- package/dist/core/hit.js.map +1 -0
- package/dist/core/labels.js +141 -0
- package/dist/core/labels.js.map +1 -0
- package/dist/core/layout.js +1002 -0
- package/dist/core/layout.js.map +1 -0
- package/dist/core/line.js +230 -0
- package/dist/core/line.js.map +1 -0
- package/dist/core/marker.js +205 -0
- package/dist/core/marker.js.map +1 -0
- package/dist/core/model.js +391 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/painter.js +79 -0
- package/dist/core/painter.js.map +1 -0
- package/dist/core/pattern.js +102 -0
- package/dist/core/pattern.js.map +1 -0
- package/dist/core/pie.js +119 -0
- package/dist/core/pie.js.map +1 -0
- package/dist/core/radar.js +83 -0
- package/dist/core/radar.js.map +1 -0
- package/dist/core/scale.js +149 -0
- package/dist/core/scale.js.map +1 -0
- package/dist/core/scatter.js +263 -0
- package/dist/core/scatter.js.map +1 -0
- package/dist/core/svg.js +209 -0
- package/dist/core/svg.js.map +1 -0
- package/dist/core/sync.js +21 -0
- package/dist/core/sync.js.map +1 -0
- package/dist/core/time.js +217 -0
- package/dist/core/time.js.map +1 -0
- package/dist/core/tree.js +348 -0
- package/dist/core/tree.js.map +1 -0
- package/dist/core/warn.js +11 -0
- package/dist/core/warn.js.map +1 -0
- package/dist/core/waterfall.js +134 -0
- package/dist/core/waterfall.js.map +1 -0
- package/dist/core/window.js +94 -0
- package/dist/core/window.js.map +1 -0
- package/dist/define.js +62 -0
- package/dist/define.js.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/locale.js +170 -0
- package/dist/locale.js.map +1 -0
- package/dist/overlay.js +6 -0
- package/dist/overlay.js.map +1 -0
- package/dist/overlay.vue_vue_type_script_setup_true_lang.js +207 -0
- package/dist/overlay.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/pointer.js +6 -0
- package/dist/pointer.js.map +1 -0
- package/dist/pointer.vue_vue_type_script_setup_true_lang.js +136 -0
- package/dist/pointer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/static.js +6 -0
- package/dist/static.js.map +1 -0
- package/dist/static.vue_vue_type_script_setup_true_lang.js +34 -0
- package/dist/static.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/style.d.ts +1 -0
- package/dist/style.js +3 -0
- package/dist/table.js +6 -0
- package/dist/table.js.map +1 -0
- package/dist/table.vue_vue_type_script_setup_true_lang.js +52 -0
- package/dist/table.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/types/chart.vue.d.ts +24 -0
- package/dist/types/components/area.vue.d.ts +16 -0
- package/dist/types/components/axis.vue.d.ts +8 -0
- package/dist/types/components/bar.vue.d.ts +14 -0
- package/dist/types/components/boxplot.vue.d.ts +14 -0
- package/dist/types/components/brush.vue.d.ts +22 -0
- package/dist/types/components/funnel.vue.d.ts +14 -0
- package/dist/types/components/gauge.vue.d.ts +17 -0
- package/dist/types/components/heatmap.vue.d.ts +14 -0
- package/dist/types/components/histogram.vue.d.ts +14 -0
- package/dist/types/components/line.vue.d.ts +16 -0
- package/dist/types/components/marker.vue.d.ts +6 -0
- package/dist/types/components/pie.vue.d.ts +23 -0
- package/dist/types/components/radar.vue.d.ts +16 -0
- package/dist/types/components/range.vue.d.ts +12 -0
- package/dist/types/components/scatter.vue.d.ts +14 -0
- package/dist/types/components/sunburst.vue.d.ts +17 -0
- package/dist/types/components/tooltip.vue.d.ts +13 -0
- package/dist/types/components/treemap.vue.d.ts +8 -0
- package/dist/types/components/waterfall.vue.d.ts +16 -0
- package/dist/types/components/zoom.vue.d.ts +18 -0
- package/dist/types/context.d.ts +87 -0
- package/dist/types/core/bar.d.ts +38 -0
- package/dist/types/core/box.d.ts +25 -0
- package/dist/types/core/colors.d.ts +16 -0
- package/dist/types/core/data.d.ts +72 -0
- package/dist/types/core/decimate.d.ts +39 -0
- package/dist/types/core/format.d.ts +33 -0
- package/dist/types/core/funnel.d.ts +15 -0
- package/dist/types/core/grid.d.ts +18 -0
- package/dist/types/core/heatmap.d.ts +17 -0
- package/dist/types/core/histogram.d.ts +23 -0
- package/dist/types/core/hit.d.ts +31 -0
- package/dist/types/core/labels.d.ts +45 -0
- package/dist/types/core/layout.d.ts +259 -0
- package/dist/types/core/line.d.ts +36 -0
- package/dist/types/core/marker.d.ts +67 -0
- package/dist/types/core/model.d.ts +86 -0
- package/dist/types/core/painter.d.ts +34 -0
- package/dist/types/core/pattern.d.ts +14 -0
- package/dist/types/core/pie.d.ts +66 -0
- package/dist/types/core/radar.d.ts +12 -0
- package/dist/types/core/scale.d.ts +60 -0
- package/dist/types/core/scatter.d.ts +16 -0
- package/dist/types/core/series.d.ts +228 -0
- package/dist/types/core/svg.d.ts +63 -0
- package/dist/types/core/sync.d.ts +8 -0
- package/dist/types/core/time.d.ts +20 -0
- package/dist/types/core/tree.d.ts +84 -0
- package/dist/types/core/warn.d.ts +4 -0
- package/dist/types/core/waterfall.d.ts +24 -0
- package/dist/types/core/window.d.ts +36 -0
- package/dist/types/define.d.ts +115 -0
- package/dist/types/index.d.ts +363 -0
- package/dist/types/locale.d.ts +100 -0
- package/dist/types/overlay.vue.d.ts +95 -0
- package/dist/types/pointer.vue.d.ts +53 -0
- package/dist/types/static.vue.d.ts +24 -0
- package/dist/types/table.vue.d.ts +19 -0
- package/dist/types/types.d.ts +555 -0
- package/dist/types/zoom-layer.vue.d.ts +41 -0
- package/dist/zoom-layer.js +6 -0
- package/dist/zoom-layer.js.map +1 -0
- package/dist/zoom-layer.vue_vue_type_script_setup_true_lang.js +210 -0
- package/dist/zoom-layer.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/package.json +53 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart.vue_vue_type_script_setup_true_lang.js","names":["_useSlots","_openBlock","_createElementBlock","_normalizeClass","_unref","_normalizeStyle","_createElementVNode","_renderSlot","_createVNode","ChartStatic","ChartOverlay","ChartZoomLayer","ChartPointer","ChartTable"],"sources":["../src/chart.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n holdPointer,\n svgToPNG,\n useElementSize,\n useLocale,\n useNamespace,\n useReducedMotion,\n type PointerHold,\n} from 'dou-ui'\nimport {\n computed,\n getCurrentInstance,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n shallowRef,\n toRaw,\n useId,\n useTemplateRef,\n watch,\n watchEffect,\n type VNodeChild,\n} from 'vue'\nimport { createColorResolver, observeTheme } from './core/colors'\nimport { extent, read, rowOf, type ChartAccessor, type ChartRow } from './core/data'\nimport { allX, angleAt, nearestPoint, nearestX, neighborGap, rowAt, sortedOrder } from './core/hit'\nimport { joinGroup, tellGroup, type SharedX } from './core/sync'\nimport { numberFormatFull, numberTickFormat, timeFormatFull, timePrecision } from './core/format'\nimport {\n arcBox,\n HEAT_SWATCH,\n layoutChart,\n layoutFunnel,\n layoutPie,\n layoutRadar,\n PIE_LABEL_ROOM,\n type AxisConfig,\n type AxisLayout,\n type ChartAxes,\n type ChartLayout,\n type ChartAxisPosition,\n type ChartAxisRole,\n type ChartLegendPlacement,\n type ChartTickValue,\n type FunnelLayout,\n type LegendBox,\n type LegendItem,\n type LegendName,\n type RadarLayout,\n type TickLabel,\n} from './core/layout'\nimport {\n buildModel,\n seriesName,\n smallestGap,\n type ChartModel,\n type ModelSeries,\n type SeriesInput,\n} from './core/model'\nimport { drawMarkers, placeMarkers, type MarkerColors, type MarkerInput } from './core/marker'\nimport { barPlacement } from './core/bar'\nimport {\n contrast,\n DATA_LABEL,\n luminance,\n placeDataLabels,\n spread,\n type DataLabelInput,\n type PlacedDataLabel,\n} from './core/labels'\nimport { crisp, type Painter, type Rect } from './core/painter'\nimport { heatColor, heatRange, heatShare } from './core/heatmap'\nimport { drawPie, FADED, pieSlices, sliceOuter, type PieSlice } from './core/pie'\nimport { nearestSpoke, spokeAngle } from './core/radar'\nimport { FUNNEL_BAR } from './core/funnel'\nimport { isTotal } from './core/waterfall'\nimport { boxes } from './core/box'\nimport { warnOnce } from './core/warn'\nimport { CHART_PATTERNS, patternCss, type ChartPattern } from './core/pattern'\nimport {\n buildTree,\n drawSunburst,\n SUNBURST_FADE,\n sunburstBranch,\n drawTreemap,\n hasHeader,\n ringTreemap,\n layoutSunburst,\n layoutTreemap,\n sunburstAt,\n treemapAt,\n treePath,\n TREE_HEADER,\n type TreeNode,\n} from './core/tree'\nimport { baseline, categoryScale, linearScale, logScale, type Scale } from './core/scale'\nimport { escapeXml, isSvg, num, paintAttribute, SvgPainter } from './core/svg'\nimport type { ChartColors, ChartHit, ChartSeries, ChartValueAxis, ChartView } from './core/series'\nimport {\n clampWindow,\n intervalToWindow,\n panWindow,\n snapCategories,\n unitsOf,\n valueToNumber,\n windowToInterval,\n within,\n zoomWindow,\n type Window,\n} from './core/window'\nimport {\n chartKey,\n type AxisPart,\n type BrushPart,\n type ChartPart,\n type MarkerPart,\n type PiePart,\n type SeriesPart,\n type RangePart,\n type TooltipPart,\n type TreePart,\n type ZoomPart,\n} from './context'\nimport { format, useChartMessages } from './locale'\nimport ChartOverlay, { type OverlayState } from './overlay.vue'\nimport ChartPointer, { type PointerState, type Tip } from './pointer.vue'\nimport ChartTable, { type TableState } from './table.vue'\nimport ChartStatic, { type StaticState } from './static.vue'\nimport ChartZoomLayer, { type ZoomLayerState } from './zoom-layer.vue'\nimport type { Tone } from 'dou-ui'\nimport type {\n ChartBrushEvent,\n ChartExportOptions,\n ChartExpose,\n ChartImageOptions,\n ChartInterval,\n ChartMarkerProps,\n ChartProps,\n ChartEmits,\n ChartPointEvent,\n ChartSlots,\n ChartLabelFormat,\n ChartTooltipItem,\n} from './types'\n\ndefineOptions({ name: 'DouChart' })\n\nconst props = withDefaults(defineProps<ChartProps>(), {\n data: () => [],\n height: 320,\n ssrWidth: 640,\n // left out: shown when there is more than one series\n legend: undefined,\n})\nconst slots = defineSlots<ChartSlots>()\nconst emit = defineEmits<ChartEmits>()\n\nconst ns = useNamespace('chart')\nconst { locale } = useLocale()\nconst messages = useChartMessages(() => props.messages)\n\nconst rootRef = useTemplateRef<HTMLElement>('root')\nconst canvasRef = useTemplateRef<HTMLCanvasElement>('canvas')\nconst instance = getCurrentInstance()\n/**\n * Drawn on the server, or taking over a page drawn there: until the canvas\n * has drawn, the chart is an SVG at `ssrWidth` (the server can't know the width).\n */\nconst fromServer = ref(typeof window === 'undefined' || !!instance?.vnode.el)\nconst size = useElementSize(\n rootRef,\n fromServer.value\n ? {\n initial: {\n width: props.ssrWidth,\n height: typeof props.height === 'number' ? props.height : 320,\n },\n }\n : {},\n)\n\n/* the parts written inside the chart, in the order they are written */\n\nconst seriesParts = shallowRef<SeriesPart[]>([])\nconst axisParts = shallowRef<AxisPart[]>([])\nconst pieParts = shallowRef<PiePart[]>([])\nconst tooltipParts = shallowRef<TooltipPart[]>([])\nconst zoomParts = shallowRef<ZoomPart[]>([])\nconst brushParts = shallowRef<BrushPart[]>([])\nconst rangeParts = shallowRef<RangePart[]>([])\nconst markerParts = shallowRef<MarkerPart[]>([])\nconst treeParts = shallowRef<TreePart[]>([])\n\nfunction inPageOrder<T extends ChartPart<unknown>>(parts: T[]): T[] {\n // oxlint-disable-next-line unicorn/no-array-sort -- sorts a copy\n return [...parts].sort((a, b) => {\n const [x, y] = [a.el(), b.el()]\n if (!x || !y) return 0\n return x.compareDocumentPosition(y) & Node.DOCUMENT_POSITION_FOLLOWING ? -1 : 1\n })\n}\n\nfunction adder<T extends ChartPart<unknown>>(parts: { value: T[] }) {\n return (part: T) => {\n parts.value = inPageOrder([...parts.value, part])\n return () => (parts.value = parts.value.filter((p) => p !== part))\n }\n}\n\nprovide(chartKey, {\n addSeries: adder(seriesParts),\n addAxis: adder(axisParts),\n addPie: adder(pieParts),\n addTooltip: adder(tooltipParts),\n addZoom: adder(zoomParts),\n addBrush: adder(brushParts),\n addRange: adder(rangeParts),\n addMarker: adder(markerParts),\n addTree: adder(treeParts),\n data: () => props.data,\n locale: () => locale.value.name,\n messages: () => messages.value,\n})\n\n/* theme: colors are read from CSS and read again when the theme changes */\n\nconst themeVersion = ref(0)\nconst resolveColor = createColorResolver(() => rootRef.value)\n\nfunction readTheme() {\n resolveColor.clear()\n measured.clear()\n themeVersion.value++\n}\n\nlet stopTheme: (() => void) | undefined\n\n/** A touch screen: the legend's rows go further apart, for a finger. */\nconst coarse = ref(false)\nconst coarseQuery =\n typeof window === 'undefined' || !window.matchMedia\n ? undefined\n : window.matchMedia('(pointer: coarse)')\nconst readCoarse = () => (coarse.value = !!coarseQuery?.matches)\nonMounted(() => {\n readCoarse()\n coarseQuery?.addEventListener?.('change', readCoarse)\n})\nonBeforeUnmount(() => coarseQuery?.removeEventListener?.('change', readCoarse))\n// a font that loads after the labels were measured makes them wider: measured again\nconst fonts = typeof document === 'undefined' ? undefined : document.fonts\nonMounted(() => {\n readTheme()\n stopTheme = observeTheme(readTheme)\n fonts?.addEventListener?.('loadingdone', readTheme)\n})\nonBeforeUnmount(() => {\n stopTheme?.()\n fonts?.removeEventListener?.('loadingdone', readTheme)\n})\n\nconst colors = computed<ChartColors>(() => {\n void themeVersion.value\n return {\n surface: resolveColor('var(--dou-chart-surface)'),\n grid: resolveColor('var(--dou-chart-grid)'),\n baseline: resolveColor('var(--dou-chart-baseline)'),\n }\n})\n\n/* text width, for laying out tick labels */\n\n// measured in the page, with the labels' own styles: a canvas can pick other fallback fonts\nconst measured = new Map<string, number>()\nlet measurer: HTMLElement | null = null\nfunction measure(text: string): number {\n let width = measured.get(text)\n if (width !== undefined) return width\n const root = rootRef.value\n if (root && typeof document !== 'undefined') {\n if (!measurer || measurer.parentNode !== root) {\n measurer = document.createElement('span')\n measurer.className = `${ns.e('tick')} ${ns.e('measure')}`\n measurer.setAttribute('aria-hidden', 'true')\n measurer.appendChild(document.createElement('span')).className = ns.e('text')\n root.appendChild(measurer)\n }\n measurer.firstChild!.textContent = text\n width = measurer.getBoundingClientRect().width\n }\n if (!width) {\n // not in a page (tests, the server): a fair guess, wide for CJK\n width = 0\n for (const char of text) width += char.charCodeAt(0) > 0x2e80 ? 12 : 7\n }\n measured.set(text, width)\n return width\n}\n\n/* data → model → layout */\n\nconst declaredAxes = computed(() => {\n const declared: Partial<Record<ChartAxisRole, AxisPart['props']>> = {}\n for (const part of axisParts.value) declared[part.props.for] = part.props\n return declared\n})\n\n// with only a y2 axis written, series that don't say otherwise are measured on it\nconst defaultAxis = computed<ChartValueAxis>(() =>\n declaredAxes.value.y2 && !declaredAxes.value.y ? 'y2' : 'y',\n)\n\nconst uses = (axis: ChartValueAxis) =>\n seriesParts.value.some((part) => (part.props.axis ?? defaultAxis.value) === axis)\n/** Whether a value axis lists categories (a heatmap's rows): no grid lines across it by default. */\nconst listsCategories = (axis: ChartValueAxis) =>\n seriesParts.value.some(\n (part) => part.kind.categoryY && (part.props.axis ?? defaultAxis.value) === axis,\n )\n\n/**\n * The axes by what they measure, and where each is drawn: x at the bottom,\n * y on the left and y2 on the right; with `horizontal`, x on the left,\n * y at the bottom and y2 at the top.\n */\nconst axes = computed<ChartAxes>(() => {\n const declared = declaredAxes.value\n const places: Record<ChartAxisRole, ChartAxisPosition> = props.horizontal\n ? { x: 'left', y: 'bottom', y2: 'top' }\n : { x: 'bottom', y: 'left', y2: 'right' }\n const config = (role: ChartAxisRole, grid: boolean): AxisConfig => {\n const {\n for: _,\n percent: share,\n ...given\n } = declared[role] ?? ({} as Partial<AxisPart['props']>)\n const position = places[role]\n const out: AxisConfig = {\n ...given,\n position,\n grid: given.grid ?? grid,\n hidden: given.hidden ?? false,\n }\n // shares of a whole: up to 100%, written as percentages\n if (share && role !== 'x') {\n out.format ??= percentTicks.value.format\n out.max ??= 1\n }\n return out\n }\n const y = declared.y || uses('y') || !uses('y2')\n return {\n x: config('x', false),\n y: y ? config('y', !listsCategories('y')) : null,\n // grid lines go with y, or with y2 when it is alone\n y2: declared.y2 || uses('y2') ? config('y2', !y && !listsCategories('y2')) : null,\n }\n})\n\nconst model = computed(() => {\n const inputs: SeriesInput[] = seriesParts.value.map((part, index) => ({\n index,\n kind: part.kind,\n props: part.props,\n hidden: part.hidden.value,\n }))\n const type = axes.value.x.type\n const built = buildModel(inputs, {\n data: toRaw(props.data),\n x: props.x,\n xKind: type === 'log' ? 'linear' : type,\n axis: defaultAxis.value,\n percent: { y: !!declaredAxes.value.y?.percent, y2: !!declaredAxes.value.y2?.percent },\n sort: declaredAxes.value.x?.sort,\n })\n return labelRoom(reachMarkers(built))\n})\n\nif (process.env.NODE_ENV !== 'production')\n watchEffect(() => {\n for (const axis of ['y', 'y2'] as const)\n if (declaredAxes.value[axis]?.sort !== undefined)\n warnOnce(\n `sort-${axis}`,\n `<DouChartAxis for=\"${axis}\">: \\`sort\\` orders a category x axis only, so it is left out here.`,\n )\n })\n\n/** Percentages on the ticks of a `percent` axis: whole ones. */\nconst percentTicks = computed(\n () => new Intl.NumberFormat(locale.value.name, { style: 'percent', maximumFractionDigits: 0 }),\n)\n\n/** Room past the data on each value axis for labels outside bars and above points: a part of its span. */\nconst LABEL_ROOM = 0.12\n\n/**\n * The model with room on each value axis for data labels past the bars'\n * ends and above the points, so the highest one isn't left out.\n */\nfunction labelRoom(m: ChartModel): ChartModel {\n const wanted = new Set<ChartValueAxis>()\n for (const s of m.series) {\n const p = s.input.props as { labels?: unknown; labelPosition?: string }\n if (!p.labels || !s.input.kind.labels || p.labelPosition === 'end') continue\n // in cells: nothing past them\n if (s.input.kind.categoryY) continue\n // in the bars (stacked ones by default): no room needed past them\n if (p.labelPosition === 'inside' || (s.stackEnds && s.input.kind.band && !p.labelPosition))\n continue\n wanted.add(s.axis)\n }\n if (!wanted.size) return m\n const y = { ...m.y }\n for (const axis of wanted) {\n const known = y[axis]\n if (!known) continue\n // the span as the axis shows it: from 0, when it grows from there\n const zero = declaredAxes.value[axis]?.zero ?? m.zero[axis]\n const lo = zero ? Math.min(known[0], 0) : known[0]\n const hi = zero ? Math.max(known[1], 0) : known[1]\n const span = hi - lo || Math.abs(hi) || 1\n y[axis] = [\n lo < 0 ? known[0] - span * LABEL_ROOM : known[0],\n hi > 0 ? known[1] + span * LABEL_ROOM : known[1],\n ]\n }\n return { ...m, y }\n}\n\n/** The model with each value axis reaching the markers' values on it, so a target shows. */\nfunction reachMarkers(m: ChartModel): ChartModel {\n let y: ChartModel['y'] | null = null\n for (const part of markerParts.value) {\n const value = part.props.y\n if (value === undefined) continue\n const axis = part.props.axis ?? defaultAxis.value\n const known = (y ?? m.y)[axis]\n // an axis with no data stays empty: a marker alone isn't a chart\n if (!known) continue\n let [lo, hi] = known\n for (const v of Array.isArray(value) ? value : [value]) {\n if (!Number.isFinite(v)) continue\n lo = Math.min(lo, v)\n hi = Math.max(hi, v)\n }\n // a line above all the data, with a label: room over it for the label\n // (a line or a point above all the data, with a label: room over it for the label)\n if (part.props.label && !Array.isArray(value) && !Array.isArray(part.props.x) && value >= hi)\n hi = value + (value - lo) * 0.1\n if (lo !== known[0] || hi !== known[1]) {\n y ??= { ...m.y }\n y[axis] = [lo, hi]\n }\n }\n return y ? { ...m, y } : m\n}\n\n/* a pie: drawn alone, without axes */\n\nconst pie = computed(() => pieParts.value[0] ?? null)\n\nconst slices = computed(() => {\n const part = pie.value\n if (!part) return []\n const label = part.props.label ?? props.x\n return pieSlices(\n toRaw(part.props.data ?? props.data),\n part.props.value,\n label,\n part.props.color,\n part.hidden.value,\n { start: pieArc.value[0], end: pieArc.value[1], rose: !!part.props.rose },\n )\n})\n\n/** The part of the turn the pie takes, in radians clockwise from 12 o'clock. */\nconst pieArc = computed<[number, number]>(() => {\n const p = pie.value?.props\n const start = ((p?.startAngle ?? 0) * Math.PI) / 180\n const end = p?.endAngle === undefined ? start + Math.PI * 2 : (p.endAngle * Math.PI) / 180\n if (!(end > start))\n warnOnce(\n 'pie-angles',\n `<${pie.value?.gauge ? 'DouChartGauge' : 'DouChartPie'}>: \\`end-angle\\` must be past \\`start-angle\\` (clockwise); nothing is drawn.`,\n )\n return [start, Math.min(end, start + Math.PI * 2)]\n})\n\n/** The slices that take room: not turned off. */\nconst shownSlices = computed(() => slices.value.filter((slice) => !slice.hidden))\n\nif (process.env.NODE_ENV !== 'production')\n watch([pieParts, seriesParts, treeParts], ([pies, series, trees]) => {\n const pieName = pies[0]?.gauge ? 'DouChartGauge' : 'DouChartPie'\n if (pies.length > 1 || (pies.length && (series.length || trees.length)))\n console.warn(\n `[@dou-ui/chart] a <${pieName}> is drawn alone: other series, pies and trees are left out.`,\n )\n else if (trees.length > 1 || (trees.length && series.length)) {\n const name = trees[0]!.shape === 'treemap' ? 'DouChartTreemap' : 'DouChartSunburst'\n console.warn(\n `[@dou-ui/chart] a <${name}> is drawn alone: other series and trees are left out.`,\n )\n }\n })\n\n/* a treemap or a sunburst: a tree, drawn alone */\n\nconst tree = computed(() => (!pie.value && treeParts.value[0]) || null)\n\n/** The tree read from the part's rows, its nodes parents first. */\nconst treeData = computed(() => {\n const part = tree.value\n if (!part) return null\n const p = part.props\n const data = toRaw(p.data ?? props.data)\n if (data && !Array.isArray(data))\n warnOnce(\n 'tree-data',\n 'a treemap or sunburst reads nested rows (an array); data by column is left out.',\n )\n return buildTree(Array.isArray(data) ? (data as ChartRow[]) : [], {\n label: p.label ?? 'name',\n value: p.value ?? 'value',\n children: p.children ?? 'children',\n })\n})\n\n/** Room at the edges of a tree, in px. */\nconst TREE_EDGE = 4\n\nconst treeLayout = computed(() => {\n const width = size.width.value\n const height = size.height.value\n const part = tree.value\n const data = treeData.value\n if (!width || !height || !part || !data) return null\n void themeVersion.value\n const plot = {\n x: TREE_EDGE,\n y: TREE_EDGE,\n width: Math.max(0, width - TREE_EDGE * 2),\n height: Math.max(0, height - TREE_EDGE * 2),\n }\n const cx = width / 2\n const cy = height / 2\n const radius = Math.max(0, Math.min(plot.width, plot.height) / 2)\n const inner = radius * Math.min(0.9, Math.max(0, part.props.innerRadius ?? 0.3))\n if (part.shape === 'treemap') layoutTreemap(data.root, plot)\n else layoutSunburst(data.root, inner, radius)\n return {\n width,\n height,\n plot,\n cx,\n cy,\n radius,\n inner,\n // laid out again: a new object, so what is drawn from it follows\n nodes: [...data.nodes],\n legend: [] as LegendItem[],\n legendBox: undefined as LegendBox | undefined,\n }\n})\n\n/**\n * Each node's color: its own, else its parent's, the top level taking the\n * palette's. A sunburst's rings pale outwards, towards the surface.\n */\nconst treeColors = computed(() => {\n void themeVersion.value\n const part = tree.value\n const data = treeData.value\n if (!part || !data) return []\n const palette = ownPalette.value\n const own = part.props.color\n const css: string[] = []\n for (const node of data.nodes) {\n if (node.depth === 0) {\n css.push('')\n continue\n }\n const raw =\n !own || !node.row\n ? undefined\n : typeof own === 'function'\n ? own(node.row, node.depth)\n : read(node.row, own, node.place)\n const given = typeof raw === 'string' && raw ? raw : undefined\n const base = given\n ? toneOrColor(given)\n : node.depth > 1\n ? css[node.parent!.index]!\n : palette\n ? toneOrColor(palette[node.group % palette.length]!)\n : `var(--dou-color-chart-${(node.group % SLICE_COLORS) + 2})`\n css.push(base)\n }\n return data.nodes.map((node, k) => {\n if (node.depth === 0) return ''\n const shade = part.shape === 'sunburst' && node.depth > 1\n const pale = Math.max(40, 100 - (node.depth - 1) * 24)\n return resolveColor(\n shade ? `color-mix(in oklab, ${css[k]} ${pale}%, var(--dou-chart-surface))` : css[k]!,\n )\n })\n})\n\n/** The value as text, and its share of the whole. */\nfunction treeValue(node: TreeNode) {\n const root = treeData.value?.root\n return format(messages.value.share, {\n value: numberFormatFull(locale.value.name)(node.value),\n share: percent.value.format(root && root.value > 0 ? node.value / root.value : 0),\n })\n}\n\n/** The tree's names in it, where they fit: a leaf's in its middle, a group's in its header. */\nconst treeLabels = computed(() => {\n const l = treeLayout.value\n const part = tree.value\n const out: Array<PlacedDataLabel & { ink?: string; width?: number }> = []\n if (!l || !part || !part.props.labels || empty.value) return out\n const colorsOf = treeColors.value\n const given = part.props.labels\n const whole = treeData.value?.root.value ?? 0\n for (const node of l.nodes) {\n if (node.depth === 0) continue\n const text =\n typeof given === 'function'\n ? given({\n value: node.value,\n share: whole > 0 ? node.value / whole : 0,\n name: node.name,\n row: node.row ?? {},\n index: node.place,\n depth: node.depth,\n })\n : node.name\n if (text == null || text === '') continue\n const name = String(text)\n const width = measure(name)\n if (part.shape === 'treemap') {\n const w = node.x1 - node.x0\n const h = node.y1 - node.y0\n if (node.children.length) {\n if (!hasHeader(node) || width > w - 12) continue\n out.push({\n key: `node:${node.index}`,\n series: -1,\n text: name,\n left: node.x0 + 6,\n top: node.y0 + (TREE_HEADER - DATA_LABEL) / 2,\n align: 'start',\n ink: 'var(--dou-color-text-secondary)',\n })\n } else if (width <= w - 12 && h >= DATA_LABEL + 8) {\n out.push({\n key: `node:${node.index}`,\n series: -1,\n text: name,\n left: node.x0 + 6,\n top: node.y0 + 6,\n align: 'start',\n on: colorsOf[node.index],\n ink: inkOn(colorsOf[node.index]!),\n })\n }\n continue\n }\n // a sunburst: across the middle of its arc, where the arc is long enough\n const r = (node.y0 + node.y1) / 2\n const arc = (node.x1 - node.x0) * r\n if (arc < width + 8 || node.y1 - node.y0 < DATA_LABEL + 4) continue\n const middle = (node.x0 + node.x1) / 2\n out.push({\n key: `node:${node.index}`,\n series: -1,\n text: name,\n left: l.cx + Math.sin(middle) * r,\n top: l.cy - Math.cos(middle) * r - DATA_LABEL / 2,\n align: 'middle',\n on: colorsOf[node.index],\n ink: inkOn(colorsOf[node.index]!),\n })\n }\n return out\n})\n\n/** The node the tooltip shows, its path as the title. */\nfunction treeTip(index: number, pointer: [number, number] | null): Tip | null {\n const l = treeLayout.value\n const node = treeData.value?.nodes[index]\n if (!l || !node || node.depth === 0) return null\n const anchor: [number, number] =\n tree.value?.shape === 'sunburst'\n ? [\n l.cx + Math.sin((node.x0 + node.x1) / 2) * ((node.y0 + node.y1) / 2),\n l.cy - Math.cos((node.x0 + node.x1) / 2) * ((node.y0 + node.y1) / 2),\n ]\n : [(node.x0 + node.x1) / 2, (node.y0 + node.y1) / 2]\n return {\n x: node.name,\n title: treePath(node).join(' / '),\n items: [\n {\n name: tree.value?.props.name ?? messages.value.tableValue,\n text: treeValue(node),\n value: node.value,\n color: treeColors.value[node.index],\n row: node.row ?? undefined,\n },\n ],\n anchor: pointer ?? anchor,\n marks: [],\n }\n}\n\n/**\n * The tree as drawn with nothing pointed at, kept while its layout and\n * colors stay: pointing at a node then draws only that node's part over\n * it (a treemap's ring, a sunburst's branch), however many nodes.\n */\nlet treeImage: { key: unknown[]; canvas: HTMLCanvasElement } | null = null\n\n/** The kept image of the tree, drawn again when `key` changes; null without a canvas. */\nfunction treeImageOf(key: unknown[], dpr: number, render: (ctx: CanvasRenderingContext2D) => void) {\n const l = treeLayout.value!\n if (treeImage && key.every((k, i) => k === treeImage!.key[i])) return treeImage.canvas\n const canvas = treeImage?.canvas ?? document.createElement('canvas')\n canvas.width = Math.round(l.width * dpr)\n canvas.height = Math.round(l.height * dpr)\n const ctx = canvas.getContext('2d')\n if (!ctx) return null\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, l.width, l.height)\n render(ctx)\n treeImage = { key, canvas }\n return canvas\n}\n\n/** Draws the tree, as it comes in: a treemap fades in, a sunburst sweeps round. */\nfunction paintTree(painter: Painter, t: number, still = false, dpr = 1) {\n const l = treeLayout.value!\n const a = still ? null : active.value\n const focus = a?.type === 'slice' ? a.slice : -1\n const shape = tree.value?.shape\n const surface = colors.value.surface\n const ring = resolveColor('var(--dou-color-text)')\n const sunburst = { cx: l.cx, cy: l.cy, surface }\n const direct = () =>\n shape === 'treemap'\n ? drawTreemap(painter, l.nodes, treeColors.value, { surface, ring, t, focus })\n : drawSunburst(painter, l.nodes, treeColors.value, { ...sunburst, focus, sweep: t })\n // an export, or coming in: drawn as it is\n if (still || t < 1 || isSvg(painter) || typeof document === 'undefined') return direct()\n const image = treeImageOf([shape, l, treeColors.value, surface, dpr], dpr, (ctx) =>\n shape === 'treemap'\n ? drawTreemap(ctx, l.nodes, treeColors.value, { surface, ring, t })\n : drawSunburst(ctx, l.nodes, treeColors.value, sunburst),\n )\n if (!image) return direct()\n const node = l.nodes[focus]\n if (shape === 'treemap') {\n painter.drawImage(image, 0, 0, l.width, l.height)\n ringTreemap(painter, node, ring)\n return\n }\n if (!node) {\n painter.drawImage(image, 0, 0, l.width, l.height)\n return\n }\n // a sunburst: all of it faded, then the node's branch over it as it is\n painter.save()\n painter.globalAlpha *= SUNBURST_FADE\n painter.drawImage(image, 0, 0, l.width, l.height)\n painter.restore()\n drawSunburst(painter, sunburstBranch(node), treeColors.value, sunburst)\n}\n\n/* a radar: series round a center, without axes */\n\n/** The chart is a funnel: its first funnel's stages, one under another. */\nconst funnel = computed(() => !pie.value && seriesParts.value.some((part) => part.kind.funnel))\n\n/** The chart is a radar: its series are drawn round a center. */\nconst radar = computed(\n () => !pie.value && !funnel.value && seriesParts.value.some((part) => part.kind.polar),\n)\n\nif (process.env.NODE_ENV !== 'production')\n watch(seriesParts, (list) => {\n const polar = list.filter((part) => part.kind.polar).length\n if (polar && polar < list.length)\n console.warn(\n '[@dou-ui/chart] a <DouChartRadar> is drawn round a center: series on axes are left out of it.',\n )\n if (list.some((part) => part.kind.funnel) && list.length > 1)\n console.warn('[@dou-ui/chart] a <DouChartFunnel> is drawn alone: other series are left out.')\n })\n\n/** No series has a value to show. */\nconst empty = computed(() =>\n pie.value\n ? !shownSlices.value.length\n : tree.value\n ? !(treeData.value && treeData.value.root.value > 0)\n : !model.value.y.y && !model.value.y.y2,\n)\n\n// a number axis of what look like times in ms: most likely meant as a time axis\nlet timestampWarned = false\nwatch(model, (m) => {\n if (process.env.NODE_ENV === 'production' || timestampWarned) return\n if (m.xKind !== 'linear' || axes.value.x.type || !m.x) return\n if (m.x[0] > 1e11 && m.x[1] < 1e13) {\n timestampWarned = true\n console.warn(\n '[@dou-ui/chart] the x values look like times in ms. Add <DouChartAxis for=\"x\" type=\"time\" /> to show them as dates.',\n )\n }\n})\n\nconst TONES = new Set(['neutral', 'primary', 'success', 'warning', 'danger'])\n\n/** A color given as a CSS color or a tone name, as CSS. */\nconst toneOrColor = (color: string) =>\n color === 'neutral'\n ? 'var(--dou-color-chart-1)'\n : TONES.has(color)\n ? `var(--dou-color-${color})`\n : color\n\n/** The chart's own palette (`palette`), when one is given. */\nconst ownPalette = computed(() => (props.palette?.length ? props.palette : null))\n\n/** The palette's color for the series at `index`: the chart's own, or the theme's eight. */\nfunction paletteColor(index: number): string {\n const own = ownPalette.value\n return own ? toneOrColor(own[index % own.length]!) : `var(--dou-color-chart-${(index % 8) + 1})`\n}\n\n/** A series' color: its own, its tone's, or the palette's by its place among all series. */\nfunction seriesColor(p: SeriesPart['props'], index: number): string {\n const own = typeof p.color === 'string' ? p.color : undefined\n return resolveColor(own ?? (p.tone ? `var(--dou-color-${p.tone})` : paletteColor(index)))\n}\n\n/** A color given as a CSS color or a tone name, as the canvas takes it. */\nconst itemColor = (color: string) => resolveColor(toneOrColor(color))\n\n/**\n * A waterfall's colors, unless it has its own: rises in the success tone,\n * falls in the danger tone, totals in the series' color.\n */\nfunction waterfallColors(s: ChartSeries): Array<string | undefined> | null {\n if (typeof s.props.color === 'string') return null\n const rise = itemColor('success')\n const fall = itemColor('danger')\n const out: Array<string | undefined> = []\n for (let i = 0; i < s.y.length; i++)\n out.push(isTotal(s, i) ? undefined : s.y[i]! < 0 ? fall : rise)\n return out\n}\n\n/** The colors of single bars or points, by row, when `color` is a function. */\nfunction itemColors(s: ChartSeries): Array<string | undefined> | null {\n const of = s.props.color\n if (typeof of !== 'function') return s.kind.waterfall ? waterfallColors(s) : null\n const out: Array<string | undefined> = []\n // a few colors for many rows: each worked out once\n const seen = new Map<string, string>()\n for (let i = 0; i < s.y.length; i++) {\n const color = of(rowOf(s.rows, i), i)\n if (!color) {\n out.push(undefined)\n continue\n }\n let css = seen.get(color)\n if (css === undefined) seen.set(color, (css = itemColor(color)))\n out.push(css)\n }\n return out\n}\n\nconst series = computed<ChartSeries[]>(() => {\n void themeVersion.value\n return model.value.series.map((s) => {\n const { props: p, index } = s.input\n const shown: ChartSeries = {\n ...s,\n index,\n kind: s.input.kind,\n props: p,\n color: seriesColor(p, index),\n pattern: seriesPattern(p, s.input.kind, index),\n }\n shown.colors = itemColors(shown)\n return shown\n })\n})\n\n/**\n * The kinds whose fill can take a pattern: bars (a histogram's too) and\n * areas. A waterfall's colors say which way each step goes, and a box\n * plot's are light: they take none.\n */\nconst FILLED = new Set(['bar', 'area'])\n\n/** A series' pattern: its own, or with the chart's `patterns`, one by its place. */\nfunction seriesPattern(\n p: SeriesPart['props'],\n kind: { type: string; waterfall?: boolean },\n index: number,\n): ChartPattern | null {\n if (!FILLED.has(kind.type) || kind.waterfall) return null\n const own = p.pattern as ChartPattern | 'none' | undefined\n if (own) return own === 'none' ? null : own\n return props.patterns ? CHART_PATTERNS[index % CHART_PATTERNS.length]! : null\n}\n\n/** A pattern as a legend swatch shows it, over the swatch's color. */\nconst swatchPattern = (pattern: ChartPattern | null | undefined) =>\n pattern\n ? patternCss(pattern, 'color-mix(in oklab, var(--dou-chart-surface) 70%, transparent)')\n : undefined\n\n/** Each slice's pattern, by its place, with the chart's `patterns`. */\nconst slicePatterns = computed(() =>\n props.patterns && !pie.value?.gauge\n ? slices.value.map((slice) => CHART_PATTERNS[slice.index % CHART_PATTERNS.length]!)\n : undefined,\n)\n\n/** The colored part of the palette: slices leave the neutral first color for \"other\". */\nconst SLICE_COLORS = 7\n\nconst sliceColors = computed(() => {\n void themeVersion.value\n const palette = ownPalette.value\n return slices.value.map((slice) => {\n const own = slice.color\n // `neutral` is the palette's own gray, softer than the neutral tone; a\n // palette of the chart's own is taken in order, its first color too\n const css = own\n ? toneOrColor(own)\n : palette\n ? toneOrColor(palette[slice.index % palette.length]!)\n : `var(--dou-color-chart-${(slice.index % SLICE_COLORS) + 2})`\n return resolveColor(css)\n })\n})\n\nif (process.env.NODE_ENV !== 'production')\n watch(slices, (list) => {\n const count = ownPalette.value?.length ?? SLICE_COLORS\n if (list.length > count && pie.value && pie.value.props.color === undefined)\n console.warn(\n `[@dou-ui/chart] a pie of ${list.length} slices repeats colors after ${count}: merge the small ones into one slice, or give each a \\`color\\`.`,\n )\n })\n\n/** The legend: one entry per series, or per slice of a pie, turned off or not. */\nconst legendEntries = computed(() => {\n if (empty.value) return []\n void themeVersion.value\n if (tree.value) return []\n if (pie.value) {\n if (pie.value.gauge || !(props.legend ?? slices.value.length > 1)) return []\n const last = shownSlices.value.length === 1\n return slices.value.map((slice, k) => ({\n text: slice.label,\n color: sliceColors.value[k]!,\n kind: 'pie',\n dashed: false,\n off: slice.hidden,\n locked: last && !slice.hidden,\n scale: undefined as string[] | undefined,\n pattern: swatchPattern(slicePatterns.value?.[slice.index]),\n }))\n }\n // a heatmap's scale says what its colors mean, even alone\n const scaled = seriesParts.value.some((part) => part.kind.categoryY)\n if (!(props.legend ?? (seriesParts.value.length > 1 || scaled))) return []\n const last = seriesParts.value.filter((part) => !part.hidden.value).length === 1\n return seriesParts.value.map((part, index) => {\n const color = seriesColor(part.props, index)\n const entry = {\n text: seriesName({ index, props: part.props }),\n color,\n kind: part.kind.type,\n dashed: !!part.props.dashed,\n off: part.hidden.value,\n // the last one shown can't be turned off\n locked: last && !part.hidden.value,\n /** A heatmap's scale: its colors, least to most. */\n scale: undefined as string[] | undefined,\n pattern: swatchPattern(seriesPattern(part.props, part.kind, index)),\n }\n const s = part.kind.categoryY ? series.value.find((one) => one.index === index) : undefined\n const range = s && heatRange(s)\n if (s && range) {\n // its scale, from least to most, and the values at its ends\n const text = heatText(s)\n const surface = colors.value.surface\n entry.text = `${text(range[0])} – ${text(range[1])}`\n entry.scale = [0, 0.5, 1].map((t) => heatColor(s.color, surface, t))\n }\n return entry\n })\n})\n\n/** The legend's names for the layout: a heatmap's scale takes a wider swatch. */\nconst legendNames = computed<LegendName[]>(() =>\n legendEntries.value.map((entry) =>\n entry.scale ? { text: entry.text, swatch: HEAT_SWATCH } : entry.text,\n ),\n)\n\n/** Turns an entry's series (or slice) on or off; the last one shown stays on. */\nfunction toggle(index: number) {\n const pieChart = pie.value\n if (pieChart) {\n const slice = slices.value[index]\n if (!slice) return\n const hidden = pieChart.hidden.value\n if (slice.hidden) pieChart.hidden.value = hidden.filter((label) => label !== slice.label)\n else if (shownSlices.value.length > 1) pieChart.hidden.value = [...hidden, slice.label]\n } else {\n const part = seriesParts.value[index]\n if (!part) return\n if (part.hidden.value) part.hidden.value = false\n else if (seriesParts.value.filter((p) => !p.hidden.value).length > 1) part.hidden.value = true\n }\n if (focused.value === index) focused.value = null\n}\n\n/** The legend entry the pointer or focus is on: its series is brought forward. */\nconst focused = ref<number | null>(null)\n\n/**\n * Shows only the entry's series (or slice), or all of them again when it\n * already is the only one: its legend entry clicked with Alt, held down on\n * a touch screen, or Alt+Enter.\n */\nfunction isolate(index: number) {\n const pieChart = pie.value\n if (pieChart) {\n const slice = slices.value[index]\n if (!slice) return\n const alone = shownSlices.value.length === 1 && !slice.hidden\n pieChart.hidden.value = alone\n ? []\n : slices.value.filter((other) => other !== slice).map((other) => other.label)\n } else {\n const parts = seriesParts.value\n const part = parts[index]\n if (!part) return\n const alone = !part.hidden.value && parts.every((p) => p === part || p.hidden.value)\n for (const p of parts) p.hidden.value = alone ? false : p !== part\n }\n focused.value = null\n}\n\n/* zoom: the stretch of x (and of the values) shown */\n\nconst zoomPart = computed(() => (!pie.value && zoomParts.value[0]) || null)\nconst rangePart = computed(() => (!pie.value && rangeParts.value[0]) || null)\nconst brushPart = computed(() => {\n const part = brushParts.value[0]\n return !pie.value && part && !part.props.disabled ? part : null\n})\n/** Whether the chart zooms with the wheel, fingers and keys. */\nconst zoomOn = computed(() => !!zoomPart.value && !zoomPart.value.props.disabled && !empty.value)\nconst zoomAxes = computed(() => {\n const axis = zoomPart.value?.props.axis ?? 'x'\n return { x: zoomOn.value && axis !== 'y', y: zoomOn.value && axis !== 'x' }\n})\n\n/** The models the stretch of x is kept in: the zoom's and the strip's. */\nconst xModels = computed(() => {\n const list: Array<IntervalRef> = []\n if (zoomPart.value && !zoomPart.value.props.disabled) list.push(zoomPart.value.x)\n if (rangePart.value) list.push(rangePart.value.x)\n return list\n})\ntype IntervalRef = ZoomPart['x']\n\n/**\n * The windows shown, in the scales' own numbers. Kept here rather than\n * read from the models each time: a drag over categories moves smoothly\n * through parts of them, while the models get whole categories.\n */\nconst xWindow = shallowRef<Window | null>(null)\nconst yWindow = shallowRef<Window | null>(null)\n/** What was last given to the models, to tell it from a value set by the page. */\nlet sentX: unknown = null\nlet sentY: unknown = null\n\nwatch(\n () => [xModels.value[0]?.value, model.value] as const,\n ([value]) => {\n const raw = value ? toRaw(value) : null\n if (raw === sentX && raw !== null) return\n const m = model.value\n xWindow.value = intervalToWindow(raw, m.xKind, m.categories)\n },\n { immediate: true },\n)\n\nwatch(\n () => (zoomAxes.value.y ? zoomPart.value?.y.value : null),\n (value) => {\n const raw = value ? toRaw(value) : null\n if (raw === sentY && raw !== null) return\n yWindow.value = intervalToWindow(raw, 'linear', [])\n },\n { immediate: true },\n)\n\n/** The y axis that zooming the values follows: `y`, or `y2` when it is alone. */\nconst primaryY = (l: ChartLayout) => l.y.y ?? l.y.y2\n\n/** The least that can be shown: one category, a few of the closest x values, a thousandth of the values. */\nconst leastX = computed(() => {\n const m = model.value\n if (m.xKind === 'category') return 1\n let gap = Infinity\n for (const s of m.series) {\n const g = smallestGap(s.x.values)\n if (g < gap) gap = g\n }\n const span = m.x ? m.x[1] - m.x[0] : 1\n return gap < Infinity ? gap * 4 : span / 1000\n})\n\nconst sameInterval = (a: ChartInterval | null, b: ChartInterval | null | undefined) =>\n a === b ||\n (!!a && !!b && a.every((v, i) => +v === +b[i]! || (v === b[i] && typeof v === 'string')))\n\n/** Shows `window` of x (`null` for all of it); `settle` moves a drag over categories to whole ones. */\nfunction showX(window: Window | null, settle = false) {\n const l = layout.value\n if (!l) return\n const m = model.value\n const category = m.xKind === 'category'\n let next = window && clampWindow(window, l.x.full, leastX.value)\n if (next && settle && category) next = clampWindow(snapCategories(next), l.x.full, 1)\n xWindow.value = next\n let interval = next ? windowToInterval(next, m.xKind, m.categories) : null\n if (interval && next && m.xKind === 'linear') interval = rounded(next)\n // a model the page hasn't updated yet still holds what it had: compare with what was sent too\n const last = sentX as ChartInterval | null\n for (const kept of xModels.value) {\n if (sameInterval(interval, kept.value) && sameInterval(interval, last)) continue\n sentX = interval\n kept.value = interval\n }\n}\n\n/** Shows `window` of the values (on `y`, or `y2` alone); `null` for all of them. */\nfunction showY(window: Window | null) {\n const l = layout.value\n const axis = l && primaryY(l)\n const part = zoomPart.value\n if (!axis || !part) return\n const units = unitsOf(axis.scale)\n const span = units.to(axis.full[1]) - units.to(axis.full[0])\n const next = window && clampWindow(window, axis.full, span / 1000, units)\n yWindow.value = next\n const interval: ChartInterval | null = next ? rounded(next) : null\n if (sameInterval(interval, part.y.value) && sameInterval(interval, sentY as ChartInterval | null))\n return\n sentY = interval\n part.y.value = interval\n}\n\n/** A window of numbers as given back: a thousandth of its span is as fine as it gets, not 62.1344726775542. */\nfunction rounded([a, b]: Window): [number, number] {\n const span = Math.abs(b - a)\n const digits = span > 0 ? Math.min(12, Math.max(0, Math.ceil(-Math.log10(span / 1000)))) : 0\n return [Number(a.toFixed(digits)), Number(b.toFixed(digits))]\n}\n\nconst zoomed = computed(() => !!xWindow.value || !!yWindow.value)\n\n/** Where a point is along x, and along the values, in px. */\nconst alongX = ([px, py]: [number, number]) => (props.horizontal ? py : px)\nconst alongY = ([px, py]: [number, number]) => (props.horizontal ? px : py)\n\n/** A scale like `like` over `window`. */\nfunction scaleOver(window: Window, like: Scale): Scale {\n if (like.kind === 'log') return logScale(window, like.range)\n return linearScale(window, like.range)\n}\n\ninterface Scales {\n x: Scale\n y: Scale | null\n}\n\nfunction scalesNow(): Scales | null {\n const l = layout.value\n return l && { x: l.x.scale, y: primaryY(l)?.scale ?? null }\n}\n\n/** Zooms by `factor` (below 1 is in) about `at`; from `from`, the scales as they were. */\nfunction zoomBy(factor: number, at: [number, number], from = scalesNow()) {\n if (!from) return\n if (zoomAxes.value.x) showX(zoomWindow(from.x, alongX(at), factor))\n if (zoomAxes.value.y && from.y) showY(zoomWindow(from.y, alongY(at), factor))\n}\n\n/** Moves what is shown with a drag of `by` px; from `from`, the scales as the drag started. */\nfunction panBy(by: [number, number], from = scalesNow()) {\n if (!from) return\n if (zoomAxes.value.x && xWindow.value) showX(panWindow(from.x, -alongX(by)))\n if (zoomAxes.value.y && yWindow.value && from.y) showY(panWindow(from.y, -alongY(by)))\n}\n\nfunction resetZoom(announce = false) {\n if (!zoomed.value) return\n showX(null)\n if (zoomPart.value) showY(null)\n if (announce) zoomNote.value = messages.value.zoomReset\n}\n\n/** Read out after zooming with the keys. */\nconst zoomNote = ref('')\n\n/** Below this width, a legend down the right side goes under the chart: it would leave the plot too narrow. */\nconst LEGEND_SIDE_LEAST = 480\n/** Where the legend goes: as asked, else under the chart. */\nconst legendPlacement = computed<ChartLegendPlacement>(() => {\n const asked = props.legendPlacement ?? 'bottom'\n return asked === 'right' && size.width.value && size.width.value < LEGEND_SIDE_LEAST\n ? 'bottom'\n : asked\n})\n\nconst layout = computed(() => {\n const width = size.width.value\n const height = size.height.value\n if (!width || !height || pie.value || tree.value || radar.value || funnel.value) return null\n void themeVersion.value\n return layoutChart({\n model: model.value,\n axes: axes.value,\n horizontal: props.horizontal,\n width,\n height,\n locale: locale.value.name,\n measure,\n legend: legendNames.value,\n coarse: coarse.value,\n legendPlacement: legendPlacement.value,\n zoom: { x: xWindow.value, y: zoomAxes.value.y ? yWindow.value : null },\n strip: !!rangePart.value && !empty.value,\n trailing: endLabelRoom.value,\n })\n})\n\nconst pieLayout = computed(() => {\n const width = size.width.value\n const height = size.height.value\n if (!width || !height || !pie.value) return null\n void themeVersion.value\n return layoutPie({\n width,\n height,\n measure,\n legend: legendNames.value,\n coarse: coarse.value,\n legendPlacement: legendPlacement.value,\n sideLabels: pieLabelsOutside.value ? pieSideWidths.value : undefined,\n arc: pieArc.value,\n })\n})\n\nconst radarLayout = computed(() => {\n const width = size.width.value\n const height = size.height.value\n if (!width || !height || !radar.value) return null\n void themeVersion.value\n const m = model.value\n return layoutRadar({\n model: m,\n axes: axes.value,\n width,\n height,\n locale: locale.value.name,\n measure,\n legend: legendNames.value,\n coarse: coarse.value,\n legendPlacement: legendPlacement.value,\n spokes: m.categories.map((_, i) => xText(i)),\n })\n})\n\n/** The funnel drawn: the first one, if the chart is a funnel. */\nconst funnelSeries = computed(() =>\n funnel.value ? (series.value.find((s) => s.kind.funnel) ?? null) : null,\n)\n\n/** Each stage's value (`NaN` without one), and its share of the stage before it and of the first. */\nconst funnelStages = computed(() => {\n const s = funnelSeries.value\n const n = model.value.categories.length\n const values = Array.from({ length: n }, () => Number.NaN)\n if (s)\n for (let i = 0; i < s.y.length; i++) {\n const x = s.x.values[i]!\n if (x === x && s.y[i] === s.y[i]) values[x] = s.y[i]!\n }\n const first = values.find((v) => v === v)\n return values.map((value, k) => {\n const before = k > 0 ? values[k - 1]! : Number.NaN\n return {\n value,\n row: s ? rowAt(s.x.values, k) : -1,\n step: k > 0 && before > 0 && value === value ? value / before : null,\n total: first !== undefined && first > 0 && value === value ? value / first : null,\n }\n })\n})\n\nconst funnelLayout = computed(() => {\n const width = size.width.value\n const height = size.height.value\n const s = funnelSeries.value\n if (!width || !height || !s) return null\n void themeVersion.value\n const stages = funnelStages.value\n return layoutFunnel({\n width,\n height,\n measure,\n legend: legendNames.value,\n coarse: coarse.value,\n legendPlacement: legendPlacement.value,\n stages: model.value.categories.map((_, i) => xText(i)),\n values: stages.map((stage) => (stage.row < 0 ? '' : seriesText(s, stage.row))),\n rates: stages.map((stage) => (stage.step === null ? null : rate.value.format(stage.step))),\n max: Math.max(0, ...stages.map((stage) => (stage.value === stage.value ? stage.value : 0))),\n })\n})\n\n/* markers: lines, bands and points written into the chart */\n\n/** A marker's x as a number on the x scale: one, or the two ends of a band; `undefined` when it can't be read. */\nfunction markerX(x: ChartMarkerProps['x']): MarkerInput['x'] | undefined {\n if (x === undefined || x === null) return null\n const m = model.value\n if (Array.isArray(x)) {\n const [a, b] = x as ChartInterval\n // a band of one category, or of one time, is that category or time\n if (\n m.xKind !== 'category' &&\n valueToNumber(a, m.xKind, m.categories) === valueToNumber(b, m.xKind, m.categories)\n )\n return markerX(a)\n return intervalToWindow(x as ChartInterval, m.xKind, m.categories) ?? undefined\n }\n const at = valueToNumber(x as ChartTickValue, m.xKind, m.categories)\n return at === at ? at : undefined\n}\n\nconst placedMarkers = computed(() => {\n const l = layout.value\n if (!l || empty.value || !markerParts.value.length) return []\n const inputs: MarkerInput[] = []\n for (const part of markerParts.value) {\n const p = part.props\n const x = markerX(p.x)\n if (x === undefined) continue\n inputs.push({\n x,\n y: p.y ?? null,\n axis: p.axis ?? defaultAxis.value,\n label: p.label,\n tone: p.tone ?? 'neutral',\n solid: p.dashed === false,\n })\n }\n return placeMarkers(inputs, {\n plot: l.plot,\n x: l.x.scale,\n y: (axis) => l.y[axis]?.scale ?? null,\n horizontal: !!props.horizontal,\n measure,\n })\n})\n\n/** The markers' labels, as text over the chart. */\nconst markerLabels = computed(() =>\n placedMarkers.value.flatMap((marker, i) =>\n marker.label\n ? [\n {\n ...marker.label,\n key: `marker:${i}`,\n tone: marker.tone,\n // it may be over the data: on a chip to stay readable\n backdrop: true,\n },\n ]\n : [],\n ),\n)\n\n/* data labels: values written by the points and on the bars */\n\ntype LabelProps = {\n labels?: boolean | ChartLabelFormat\n labelPosition?: string\n lineWidth?: number\n dots?: boolean | 'auto'\n}\n\n/** The text of a data label, or `null` for none. */\nfunction labelText(s: ChartSeries, row: number): string | null {\n const given = (s.props as LabelProps).labels\n const value = s.y[row]!\n if (value !== value) return null\n const share =\n s.stackEnds && declaredAxes.value[s.axis]?.percent\n ? Math.abs(s.top[row]! - s.base![row]!)\n : undefined\n if (typeof given === 'function') {\n const text = given({\n value,\n share,\n low: s.base && !s.stackEnds && !s.kind.waterfall ? s.base[row] : undefined,\n name: s.name,\n row: rowOf(s.rows, row),\n index: row,\n })\n return text == null || text === '' ? null : String(text)\n }\n if (s.kind.categoryY) return heatText(s)(value)\n // a waterfall's change says which way it went\n if (s.kind.waterfall && !isTotal(s, row)) return signed(valueText(s.axis), value)\n // a share, with a decimal as in the tooltip, unless the axis writes its own\n if (share !== undefined) {\n const own = declaredAxes.value[s.axis]?.format\n return own ? own(share) : percent.value.format(share)\n }\n return valueText(s.axis)(value)\n}\n\n/** Series with labels at the end of their line: the room they need past the plot, in px. */\nconst endLabelRoom = computed(() => {\n if (pie.value || props.horizontal) return 0\n let widest = 0\n for (const part of seriesParts.value) {\n const p = part.props as LabelProps\n if (!p.labels || p.labelPosition !== 'end' || part.hidden.value) continue\n const s = series.value.find((x) => x.props === part.props)\n if (!s) continue\n for (let i = s.y.length - 1; i >= 0; i--) {\n const text = s.y[i] === s.y[i] ? labelText(s, i) : null\n if (text === null) continue\n widest = Math.max(widest, measure(text))\n break\n }\n }\n return widest ? Math.ceil(widest) + 8 : 0\n})\n\n/* a pie's labels */\n\n/** The most of the chart's width a pie's labels outside may take, each side. */\nconst PIE_LABEL_SHARE = 0.26\n\n/**\n * The smallest a pie gets to keep its labels outside: a share of its size\n * without them, or a radius in px that still reads. Smaller, they go inside.\n */\nconst PIE_LEAST = 0.6\nconst PIE_LEAST_RADIUS = 48\n\n/** Each slice's label: its own text, given by a function; else its name and share. `null` for none. */\nconst pieLabelParts = computed<Array<{ text?: string; name: string; share: string } | null>>(() => {\n const part = pie.value\n const given = part?.props.labels\n if (!part || !given) return []\n return slices.value.map((slice) => {\n if (slice.hidden) return null\n const share = percent.value.format(slice.share)\n if (typeof given !== 'function') return { name: slice.label, share }\n const text = given({\n value: slice.value,\n share: slice.share,\n name: slice.label,\n row: rowOf(part.props.data ?? props.data, slice.index),\n index: slice.index,\n })\n return text == null || text === '' ? null : { text: String(text), name: slice.label, share }\n })\n})\n\nconst outsideText = (p: { text?: string; name: string; share: string }) =>\n p.text ?? `${p.name} ${p.share}`\n\n/** Which side of the pie a slice's label goes, outside it. */\nconst sideOf = (slice: { start: number; end: number }) =>\n Math.sin((slice.start + slice.end) / 2) >= 0 ? 'right' : 'left'\n\n/** The widest label outside the pie on each side, at most a share of the chart's width. */\nconst pieSideWidths = computed(() => {\n const widths = { left: 0, right: 0 }\n const cap = size.width.value * PIE_LABEL_SHARE\n slices.value.forEach((slice, k) => {\n const p = pieLabelParts.value[k]\n if (!p || !(slice.end > slice.start)) return\n const side = sideOf(slice)\n widths[side] = Math.max(widths[side], Math.ceil(Math.min(cap, measure(outsideText(p)))))\n })\n return widths\n})\n\n/**\n * Whether the pie's labels go outside it: as asked (the default), unless\n * the room they take would leave the pie too small; then inside, where\n * slices fit them.\n */\nconst pieLabelsOutside = computed(() => {\n const part = pie.value\n if (!part?.props.labels || (part.props.labelPosition ?? 'outside') !== 'outside') return false\n const width = size.width.value\n const height = size.height.value\n if (!width || !height) return true\n void themeVersion.value\n const base = {\n width,\n height,\n measure,\n legend: legendNames.value,\n coarse: coarse.value,\n legendPlacement: legendPlacement.value,\n arc: pieArc.value,\n }\n const alone = layoutPie(base).radius\n const radius = layoutPie({ ...base, sideLabels: pieSideWidths.value }).radius\n return radius >= Math.min(alone * PIE_LEAST, PIE_LEAST_RADIUS)\n})\n\n/** Each slice's label text, by its place in `slices`; `null` for none. */\nconst pieTexts = computed<Array<string | null>>(() => {\n const outside = pieLabelsOutside.value\n return pieLabelParts.value.map((p) =>\n !p ? null : outside ? outsideText(p) : (p.text ?? p.share),\n )\n})\n\n/** A line from a slice out to its label, in px. */\ntype Leader = Array<[number, number]>\n\n/** The pie's labels, and the lines out to those outside it. */\nconst pieLabels = computed(() => {\n const l = pieLayout.value\n const texts = pieTexts.value\n const out: {\n labels: Array<PlacedDataLabel & { ink?: string; width?: number }>\n leaders: Leader[]\n } = {\n labels: [],\n leaders: [],\n }\n if (!l || !texts.length || empty.value) return out\n void themeVersion.value\n const { cx, cy, radius } = l\n const list = slices.value\n if (!pieLabelsOutside.value) {\n // in each slice, in the middle of its ring: where it fits\n const inner = radius * holeRatio.value\n list.forEach((slice, k) => {\n const text = texts[k]\n if (!text || !(slice.end > slice.start)) return\n // a rose's slice reaches only as far as its value\n const outer = sliceOuter(slice, inner, radius)\n const at = inner > 0 ? (outer + inner) / 2 : outer * 0.62\n const thickness = outer - inner\n const width = measure(text)\n const arc = (slice.end - slice.start) * at\n if (arc < width + 8 || thickness < DATA_LABEL + 4) return\n const middle = (slice.start + slice.end) / 2\n out.labels.push({\n key: `slice:${slice.index}`,\n series: -1,\n text,\n left: cx + Math.sin(middle) * at,\n top: cy - Math.cos(middle) * at - DATA_LABEL / 2,\n align: 'middle',\n on: sliceColors.value[k],\n ink: inkOn(sliceColors.value[k]!),\n })\n })\n return out\n }\n // outside: a column of labels either side, each joined to its slice by a line\n const widths = pieSideWidths.value\n // the pie's own room, above the legend, less a little at the edges\n const room = { top: EDGE_ROOM, bottom: l.bottom + EDGE_ROOM }\n const sides: Record<'left' | 'right', Array<{ k: number; y: number; middle: number }>> = {\n left: [],\n right: [],\n }\n list.forEach((slice, k) => {\n if (!texts[k] || !(slice.end > slice.start)) return\n const middle = (slice.start + slice.end) / 2\n const side = sideOf(slice)\n sides[side].push({ k, y: cy - Math.cos(middle) * (radius + 10), middle })\n })\n const capacity = Math.max(1, Math.floor((room.bottom - room.top) / DATA_LABEL))\n for (const side of ['left', 'right'] as const) {\n let items = sides[side]\n // too many to fit: the smallest slices go without\n if (items.length > capacity) {\n const kept = [...items]\n kept.sort((a, b) => list[b.k]!.share - list[a.k]!.share)\n const keep = new Set(kept.slice(0, capacity))\n items = items.filter((item) => keep.has(item))\n }\n const centers = spread(\n items.map((item) => item.y),\n DATA_LABEL,\n room.top,\n room.bottom,\n )\n const right = side === 'right'\n const widest = widths[side]\n const column = right ? cx + radius + PIE_LABEL_ROOM : cx - radius - PIE_LABEL_ROOM\n items.forEach((item, n) => {\n const y = centers[n]!\n const sin = Math.sin(item.middle)\n const cos = Math.cos(item.middle)\n // out from the slice to the label's height, then straight across to it; the\n // turn stays clear of the pie, so the line across doesn't run over it\n const end = column + (right ? -4 : 4)\n const clear = Math.sqrt(Math.max(0, (radius + 8) ** 2 - (y - cy) ** 2))\n const reach = Math.max(Math.abs(sin) * (radius + 10), clear)\n const turn = right ? Math.min(cx + reach, end) : Math.max(cx - reach, end)\n // a rose's slice ends short of the rim: the line starts at its edge\n const hole = radius * holeRatio.value\n const edge = sliceOuter(list[item.k]!, hole, radius)\n out.leaders.push([\n [cx + sin * (edge + 2), cy - cos * (edge + 2)],\n [turn, y],\n [end, y],\n ])\n const text = texts[item.k]!\n const parts = pieLabelParts.value[item.k]!\n const long = measure(text) > widest + 0.5\n // longer than there is room for: the name is cut short, so the share still shows\n const fitted =\n long && parts.text === undefined\n ? `${fitText(parts.name, widest - measure(` ${parts.share}`))} ${parts.share}`\n : text\n const cut = long && fitted === text\n out.labels.push({\n key: `slice:${list[item.k]!.index}`,\n series: -1,\n text: fitted,\n left: column,\n top: y - DATA_LABEL / 2,\n align: right ? 'start' : 'end',\n width: cut ? widest : undefined,\n })\n })\n }\n return out\n})\n\n/** Room kept clear at the chart's top and bottom edges, in px. */\nconst EDGE_ROOM = 4\n\n/** Whether data labels show: not before the chart is first drawn, nor while it comes in. */\nconst labelsShown = ref(false)\n\n/** The data labels, placed: the ends of lines first, then the bars', then the points'. */\nconst dataLabels = computed<Array<PlacedDataLabel & { ink?: string; width?: number }>>(() => {\n if (pie.value) return pieLabels.value.labels\n if (tree.value) return treeLabels.value\n const l = layout.value\n if (!l || empty.value) return []\n void themeVersion.value\n const { plot } = l\n const bounds: Rect = {\n x: plot.x - 4,\n y: plot.y - 4,\n width: plot.width + 8,\n height: plot.height + 8,\n }\n const ends: Array<{ input: DataLabelInput; s: ChartSeries }> = []\n const bars: DataLabelInput[] = []\n const points: DataLabelInput[] = []\n for (const s of series.value) {\n const p = s.props as LabelProps\n if (!p.labels || !s.kind.labels) continue\n const view = viewOf(s)\n if (!view) continue\n const lineWidth = p.lineWidth ?? 2\n // past the dot, when there is one\n const offset = s.kind.band ? 0 : Math.max(2.5, lineWidth + 0.5)\n // above: a cap on how many, for a chart of very many points\n for (const anchor of s.kind.labels(s, view).slice(0, 1000)) {\n const text = labelText(s, anchor.index)\n if (text === null) continue\n const input: DataLabelInput = {\n key: `${s.index}:${anchor.index}`,\n series: s.index,\n text,\n anchor,\n offset,\n }\n if (p.labelPosition === 'end') ends.push({ input, s })\n else if (s.kind.band) bars.push(input)\n else points.push(input)\n }\n }\n const taken: Array<[number, number, number, number]> = []\n const out: Array<PlacedDataLabel & { ink?: string }> = []\n if (ends.length) {\n // each line keeps its label: moved apart rather than left out\n const centers = spread(\n ends.map((e) => e.input.anchor.at[1]),\n DATA_LABEL,\n plot.y - 4,\n plot.y + plot.height + 4,\n )\n ends.forEach(({ input, s }, k) => {\n const left = input.anchor.at[0] + 4 + (input.offset ?? 0)\n const top = centers[k]! - DATA_LABEL / 2\n taken.push([left, top, left + measure(input.text), top + DATA_LABEL])\n out.push({\n key: input.key,\n series: s.index,\n text: input.text,\n left,\n top,\n align: 'start',\n ink: s.color,\n })\n })\n }\n for (const label of placeDataLabels(bars, bounds, measure, taken))\n out.push({ ...label, ink: label.on && inkOn(label.on) })\n out.push(...placeDataLabels(points, bounds, measure, taken))\n return out\n})\n\n/** Text that reads on a bar of `color`: the page's text color or its surface, whichever stands out more. */\nfunction inkOn(color: string): string {\n const bar = luminance(resolveColor(color))\n const text = luminance(resolveColor('var(--dou-color-text)'))\n const surface = luminance(resolveColor('var(--dou-chart-surface)'))\n if (bar === null || text === null || surface === null) return 'var(--dou-color-text)'\n return contrast(bar, text) >= contrast(bar, surface)\n ? 'var(--dou-color-text)'\n : 'var(--dou-chart-surface)'\n}\n\nconst markerText = (tone: Tone) =>\n tone === 'neutral' ? 'var(--dou-color-text-secondary)' : `var(--dou-color-${tone}-text)`\n\nconst markerColors = computed(() => {\n void themeVersion.value\n const surface = colors.value.surface\n const of = (line: string, dot: string, fill: string): MarkerColors => ({\n line: resolveColor(line),\n dot: resolveColor(dot),\n fill: resolveColor(fill),\n surface,\n })\n const tone = (name: string) =>\n of(\n `var(--dou-color-${name})`,\n `var(--dou-color-${name})`,\n `color-mix(in oklab, var(--dou-color-${name}) 10%, transparent)`,\n )\n return {\n neutral: of(\n 'var(--dou-chart-marker)',\n 'var(--dou-color-text-secondary)',\n 'color-mix(in oklab, var(--dou-color-text) 5%, transparent)',\n ),\n primary: tone('primary'),\n success: tone('success'),\n warning: tone('warning'),\n danger: tone('danger'),\n } satisfies Record<Tone, MarkerColors>\n})\n\n/* the tooltip: what is under the pointer, or picked with the keys */\n\nconst tooltipPart = computed(() => tooltipParts.value[0] ?? null)\n/** Whether the chart follows the pointer and can be focused. */\n// a gauge's value is in the middle of it: nothing to point at\nconst interactive = computed(\n () => !tooltipPart.value?.props.disabled && !empty.value && !props.table && !pie.value?.gauge,\n)\nconst trigger = computed(\n () =>\n tooltipPart.value?.props.trigger ??\n (pie.value || tree.value || series.value.some((s) => s.kind.tooltip === 'item')\n ? 'item'\n : 'axis'),\n)\n\n/** An x (with every series at it), one point of a series, or a slice. */\ntype Target =\n | { type: 'axis'; x: number }\n | { type: 'item'; series: number; row: number; radius: number }\n | { type: 'slice'; slice: number }\n\ntype Active = Target & {\n /** Where the pointer is; `null` when picked with the keys. */\n pointer: [number, number] | null\n /** Picked with a finger: the tooltip goes above it, where the hand doesn't cover it. */\n touch?: boolean\n /** Shown because another chart of the tooltip's `group` points at this x. */\n synced?: boolean\n}\n\nconst active = shallowRef<Active | null>(null)\n\n/** What is under `(px, py)`, in px from the chart's top left. */\nfunction hitAt(px: number, py: number): Target | null {\n const tl = treeLayout.value\n if (tl && treeData.value) {\n const root = treeData.value.root\n let node: TreeNode | null\n if (tree.value?.shape === 'treemap') node = treemapAt(root, px, py)\n else {\n const r = Math.hypot(px - tl.cx, py - tl.cy)\n node =\n r < tl.inner || r > tl.radius ? null : sunburstAt(root, angleAt(tl.cx, tl.cy, px, py), r)\n }\n return node ? { type: 'slice', slice: node.index } : null\n }\n const p = pieLayout.value\n if (p) {\n const r = Math.hypot(px - p.cx, py - p.cy)\n const inner = p.radius * holeRatio.value\n if (r > p.radius || r < inner) return null\n // the pointer's angle on the pie's turn, which may start before 12 o'clock\n let angle = angleAt(p.cx, p.cy, px, py)\n while (angle < pieArc.value[0]) angle += Math.PI * 2\n while (angle >= pieArc.value[0] + Math.PI * 2) angle -= Math.PI * 2\n const k = slices.value.findIndex(\n (s) => !s.hidden && angle >= s.start && angle < s.end && r <= sliceOuter(s, inner, p.radius),\n )\n return k < 0 ? null : { type: 'slice', slice: k }\n }\n const f = funnelLayout.value\n if (f) {\n // anywhere along a stage's row: its bar, its name or its value\n const k = Math.floor((py - f.plot.y) / f.step)\n if (k < 0 || k >= f.count || funnelStages.value[k]!.row < 0) return null\n return { type: 'axis', x: k }\n }\n const r = radarLayout.value\n if (r) {\n // the spoke nearest the pointer, within the rim and the names round it\n if (!r.count || Math.hypot(px - r.cx, py - r.cy) > r.radius + 16) return null\n return { type: 'axis', x: nearestSpoke(angleAt(r.cx, r.cy, px, py), r.count) }\n }\n const l = layout.value\n if (!l) return null\n const { plot } = l\n // a little room around the plot, for points on its edge\n const room = trigger.value === 'item' ? 8 : 0\n if (px < plot.x - room || px > plot.x + plot.width + room) return null\n if (py < plot.y - room || py > plot.y + plot.height + room) return null\n if (trigger.value === 'axis') {\n const along = props.horizontal ? py : px\n const x = nearestX(\n series.value.map((s) => s.x.values),\n l.x.scale,\n along,\n )\n // zoomed in: only what is shown\n if (x === null) return null\n const at = l.x.scale.map(x)\n const [r0, r1] = l.x.scale.range\n return at < Math.min(r0, r1) - 0.5 || at > Math.max(r0, r1) + 0.5 ? null : { type: 'axis', x }\n }\n // the series drawn last is on top\n for (let k = series.value.length - 1; k >= 0; k--) {\n const s = series.value[k]!\n const view = viewOf(s)\n if (!view) continue\n const hit = s.kind.hit ? s.kind.hit(s, view, px, py) : nearestOf(s, view, px, py)\n if (!hit) continue\n // zoomed in: a point cut off at the plot's edge can't be picked\n const [left, top] = view.point(s.x.values[hit.index]!, s.top[hit.index]!)\n if (left < plot.x - 4 || left > plot.x + plot.width + 4) continue\n if (top < plot.y - 4 || top > plot.y + plot.height + 4) continue\n return { type: 'item', series: s.index, row: hit.index, radius: hit.radius }\n }\n return null\n}\n\n/** How near a line the pointer comes before its series is brought forward, in px. */\nconst NEAR_LINE = 8\n\n/**\n * The series under the pointer, brought forward while the tooltip shows\n * all of them: the line it is near, or the bar or area it is over. A\n * point picked on its own (a scatter's) brings its series forward too.\n * `null` with a single series, or none under the pointer.\n */\nconst pointed = computed<number | null>(() => {\n const a = active.value\n if (!a?.pointer || pie.value || radar.value || funnel.value || series.value.length < 2)\n return null\n if (a.type === 'item') return a.series\n if (a.type !== 'axis') return null\n const along = alongX(a.pointer)\n const value = alongY(a.pointer)\n let near: { index: number; distance: number } | null = null\n let over: number | null = null\n for (const s of series.value) {\n const row = rowAt(s.x.values, a.x)\n const view = row < 0 ? null : viewOf(s)\n const top = view ? s.top[row]! : Number.NaN\n if (!view || top !== top) continue\n const end = alongY(view.point(a.x, top))\n if (s.kind.band) {\n const { offset, width } = barPlacement(view.band, s.slot)\n const u = view.x.map(a.x) + offset\n const start = s.base ? view.y.map(s.base[row]!) : baseline(view.y)\n if (\n along >= u &&\n along <= u + width &&\n value >= Math.min(start, end) &&\n value <= Math.max(start, end)\n )\n over = s.index\n continue\n }\n const distance = Math.abs(value - end)\n if (distance <= NEAR_LINE && (!near || distance < near.distance))\n near = { index: s.index, distance }\n // an area: over it, between its bottom and its top\n if (s.kind.zero && !s.kind.band) {\n const start = s.base ? view.y.map(s.base[row]!) : baseline(view.y)\n if (value >= Math.min(start, end) && value <= Math.max(start, end)) over = s.index\n }\n }\n return near?.index ?? over\n})\n\n/** The point of `s` nearest to `(px, py)`, within 12px. */\nfunction nearestOf(s: ChartSeries, view: ChartView, px: number, py: number): ChartHit | null {\n const xs = s.x.values\n const hit = nearestPoint(\n Math.min(xs.length, s.top.length),\n (i) => (xs[i] === xs[i] && s.top[i] === s.top[i] ? view.point(xs[i]!, s.top[i]!) : null),\n px,\n py,\n () => 12,\n )\n return hit && { index: hit.index, radius: 4 }\n}\n\nconst percent = computed(\n () => new Intl.NumberFormat(locale.value.name, { style: 'percent', maximumFractionDigits: 1 }),\n)\n\n/** A funnel's rates: always one decimal, so a column of them lines up. */\nconst rate = computed(\n () =>\n new Intl.NumberFormat(locale.value.name, {\n style: 'percent',\n minimumFractionDigits: 1,\n maximumFractionDigits: 1,\n }),\n)\n\n/** What is shown for the active x, point or slice. */\nconst tip = computed<Tip | null>(() => {\n if (!interactive.value) return null\n const t = tipOf(active.value)\n return t && active.value?.touch ? { ...t, above: true } : t\n})\n\nfunction tipOf(a: Active | null): Tip | null {\n if (!a) return null\n if (a.type === 'slice' && tree.value) return treeTip(a.slice, a.pointer)\n if (a.type === 'slice') {\n const p = pieLayout.value\n const slice = slices.value[a.slice]\n if (!p || !slice || slice.hidden) return null\n const middle = (slice.start + slice.end) / 2\n const inner = p.radius * holeRatio.value\n const outer = sliceOuter(slice, inner, p.radius)\n const at = inner > 0 ? (inner + outer) / 2 : outer * 0.6\n const off = slices.value.length - shownSlices.value.length\n return {\n x: slice.label,\n note: off ? format(messages.value.hiddenSlices, { count: off }) : undefined,\n items: [\n {\n name: slice.label,\n text: format(messages.value.share, {\n value: numberFormatFull(locale.value.name)(slice.value),\n share: percent.value.format(slice.share),\n }),\n value: slice.value,\n color: sliceColors.value[a.slice],\n row: rowOf(pie.value!.props.data ?? props.data, slice.index),\n },\n ],\n anchor: a.pointer ?? [p.cx + Math.sin(middle) * at, p.cy - Math.cos(middle) * at],\n marks: [],\n }\n }\n if (a.type === 'axis' && radarLayout.value) return radarTip(radarLayout.value, a)\n if (a.type === 'axis' && funnelLayout.value) return funnelTip(funnelLayout.value, a)\n const l = layout.value\n if (!l) return null\n const { plot } = l\n const horizontal = !!props.horizontal\n if (a.type === 'item') {\n const s = series.value.find((x) => x.index === a.series)\n const view = s && viewOf(s)\n if (!s || !view) return null\n const x = s.x.values[a.row]!\n const y = s.y[a.row]!\n if (x !== x || y !== y) return null\n const [left, top] = view.point(x, s.top[a.row]!)\n if (s.kind.categoryY) return heatTip(s, view, a.row, x, left, top)\n const items: ChartTooltipItem[] = [\n { name: axes.value.x.title ?? 'x', text: xText(x), value: m0x() ? x : undefined },\n {\n name: axes.value[s.axis]?.title ?? (s.axis === 'y2' ? 'y2' : 'y'),\n text: seriesText(s, a.row),\n value: y,\n color: s.colors?.[a.row] ?? s.color,\n },\n ]\n const sizeOf = s.props.size as ChartAccessor | undefined\n if (sizeOf !== undefined) {\n const value = Number(read(rowOf(s.rows, a.row), sizeOf, a.row))\n const name =\n (s.props.sizeName as string | undefined) ?? (typeof sizeOf === 'string' ? sizeOf : '')\n if (value === value)\n items.push({ name, text: numberFormatFull(locale.value.name)(value), value })\n }\n for (const item of items) item.row = rowOf(s.rows, a.row)\n // a point with a name of its own (a city) is titled by it\n const label = s.props.label as ChartAccessor | undefined\n const own = label === undefined ? null : read(rowOf(s.rows, a.row), label, a.row)\n return {\n x: rawX(x),\n title: own == null || own === '' ? s.name : String(own),\n items,\n anchor: [left, top],\n marks: [{ left, top, color: s.colors?.[a.row] ?? s.color, radius: a.radius + 3, ring: true }],\n }\n }\n // every series at one x\n const x = a.x\n const at = l.x.scale.map(x)\n const items: ChartTooltipItem[] = []\n /** The series under the pointer, brought forward. */\n const under = pointed.value\n /** The series of each item. */\n const owners: number[] = []\n const marks: Tip['marks'] = []\n let band = false\n /** A title of a series' own (a histogram's bin), in place of the x. */\n let title: string | undefined\n for (const s of series.value) {\n const row = rowAt(s.x.values, x)\n const view = viewOf(s)\n if (row < 0 || !view) continue\n const y = s.y[row]!\n if (y !== y) continue\n title ??= s.kind.xTitle?.(s, row, xText)\n if (s.kind.box) {\n const own = boxItems(s, row)\n items.push(...own)\n for (const _ of own) owners.push(s.index)\n band = true\n continue\n }\n items.push({\n name: s.name,\n text: seriesText(s, row),\n value: y,\n color: s.colors?.[row] ?? s.color,\n row: rowOf(s.rows, row),\n })\n owners.push(s.index)\n if (s.kind.band) band = true\n else {\n const [left, top] = view.point(x, s.top[row]!)\n marks.push({\n left,\n top,\n color: s.colors?.[row] ?? s.color,\n radius: 4,\n ring: false,\n faded: under !== null && s.index !== under,\n })\n }\n }\n if (!items.length) return null\n if (under !== null && items.length > 1)\n for (let k = 0; k < owners.length; k++) if (owners[k] === under) items[k]!.active = true\n const crosshair = tooltipPart.value?.props.crosshair ?? true\n const room = band ? (viewOf(series.value[0]!)?.band ?? 0) : 1\n const across = (start: number, length: number): Rect =>\n horizontal\n ? { x: plot.x, y: start, width: plot.width, height: length }\n : { x: start, y: plot.y, width: length, height: plot.height }\n const dpr = dprNow()\n const line = crisp(at, dpr) - 0.5\n // with the keys: beside the highest point, or the middle of the plot\n let anchor = a.pointer\n if (!anchor) {\n if (horizontal) {\n const right = marks.length ? Math.max(...marks.map((m) => m.left)) : plot.x + plot.width / 2\n anchor = [right, at]\n } else {\n const top = marks.length ? Math.min(...marks.map((m) => m.top)) : plot.y + plot.height / 2\n anchor = [at, top]\n }\n }\n // a finger on the screen: beside the x, clear of its bars and the hand\n const width = band ? room : 24\n return {\n x: rawX(x),\n title: title ?? xText(x),\n items,\n focused: items.some((item) => item.active),\n anchor,\n clear: a.touch ? across(at - width / 2, width) : undefined,\n marks,\n band: crosshair && band ? across(at - room / 2, room) : undefined,\n line: crosshair && !band ? across(line, 1) : undefined,\n }\n}\n\n/** A funnel stage's tooltip: its value, and what it kept of the stage before and of the first; its row shaded. */\nfunction funnelTip(f: FunnelLayout, a: Active & { type: 'axis' }): Tip | null {\n const s = funnelSeries.value\n const stage = funnelStages.value[a.x]\n if (!s || !stage || stage.row < 0) return null\n const m = messages.value\n const row = rowOf(s.rows, stage.row)\n const items: ChartTooltipItem[] = [\n { name: s.name, text: seriesText(s, stage.row), value: stage.value, color: s.color, row },\n ]\n if (stage.step !== null)\n items.push({\n name: m.stageRate,\n text: rate.value.format(stage.step),\n value: stage.step,\n row,\n })\n if (stage.total !== null && a.x > 0)\n items.push({\n name: m.totalRate,\n text: rate.value.format(stage.total),\n value: stage.total,\n row,\n })\n const top = f.plot.y + f.step * a.x\n // the row shaded from the names to the values\n const texts = [...f.names, ...f.values, ...f.rates]\n const from = Math.min(f.plot.x, ...texts.map((t) => t.left)) - 4\n const to = Math.max(f.plot.x + f.plot.width, ...texts.map((t) => t.left + t.width)) + 4\n const view = funnelView(f, dprNow(), false)\n const [right, middle] = view.point(a.x, stage.value)\n return {\n x: rawX(a.x),\n title: xText(a.x),\n items,\n anchor: a.pointer ?? [right, middle],\n marks: [],\n band: { x: from, y: top, width: to - from, height: f.step },\n }\n}\n\n/** A radar's tooltip: every series along one spoke, a dot on each, beside the outermost. */\nfunction radarTip(r: RadarLayout, a: Active & { type: 'axis' }): Tip | null {\n const x = a.x\n const items: ChartTooltipItem[] = []\n const marks: Tip['marks'] = []\n const view = radarView(r, dprNow(), false)\n let far: [number, number] | null = null\n let farthest = -1\n for (const s of series.value) {\n const row = rowAt(s.x.values, x)\n if (row < 0) continue\n const y = s.y[row]!\n if (y !== y) continue\n items.push({\n name: s.name,\n text: seriesText(s, row),\n value: y,\n color: s.color,\n row: rowOf(s.rows, row),\n })\n const [left, top] = view.point(x, s.top[row]!)\n marks.push({ left, top, color: s.color, radius: 4, ring: false })\n const out = Math.hypot(left - r.cx, top - r.cy)\n if (out > farthest) {\n farthest = out\n far = [left, top]\n }\n }\n if (!items.length) return null\n return {\n x: rawX(x),\n title: xText(x),\n items,\n anchor: a.pointer ?? far ?? [r.cx, r.cy],\n marks,\n }\n}\n\n/**\n * A box plot's numbers in the tooltip, top to bottom as drawn, and how many\n * values are past the whiskers. Beside other series, each says whose it is.\n */\nfunction boxItems(s: ChartSeries, row: number): ChartTooltipItem[] {\n const box = boxes(s)[row]\n if (!box) return []\n const m = messages.value\n const text = valueText(s.axis)\n const own = series.value.length > 1 ? `${s.name} ` : ''\n const data = rowOf(s.rows, row)\n const items: ChartTooltipItem[] = (\n [\n [m.boxHigh, box.high],\n [m.boxQ3, box.q3],\n [m.boxMedian, box.median],\n [m.boxQ1, box.q1],\n [m.boxLow, box.low],\n ] as const\n ).map(([name, value]) => ({ name: own + name, text: text(value), value, row: data }))\n items[2]!.color = s.color\n if (box.outliers.length)\n items.push({\n name: own + format(m.boxOutliers, { count: box.outliers.length }),\n // a few of them: a long list would bury the box's own numbers\n text:\n box.outliers.slice(0, 6).map(text).join(m.nameSeparator) +\n (box.outliers.length > 6 ? '…' : ''),\n row: data,\n })\n return items\n}\n\n/** A heatmap cell's tooltip: where it is (its x and row) as the title, its value in its color, the cell ringed. */\nfunction heatTip(\n s: ChartSeries,\n view: ChartView,\n row: number,\n x: number,\n left: number,\n top: number,\n): Tip {\n const value = s.y[row]!\n const range = heatRange(s)\n const color = range ? heatColor(s.color, colors.value.surface, heatShare(value, range)) : s.color\n const item: ChartTooltipItem = { name: s.name, text: heatText(s)(value), value, color }\n item.row = rowOf(s.rows, row)\n const across = view.band\n const down = Math.abs(view.y.map(0) - view.y.map(1))\n const [width, height] = view.horizontal ? [down, across] : [across, down]\n // the ring reaches a little past the cell, over the gap around it\n const ring = 1\n return {\n x: rawX(x),\n // the row, then the column, as the table reads\n title: `${yCategoryText(s.axis, s.top[row]!)}${messages.value.itemSeparator}${xText(x)}`,\n items: [item],\n anchor: [left + width / 2, top],\n marks: [],\n cell: {\n x: left - width / 2 - ring,\n y: top - height / 2 - ring,\n width: width + ring * 2 - 1,\n height: height + ring * 2 - 1,\n },\n }\n}\n\n/** An x as given: the category, a `Date` on a time axis, or the number. */\nfunction rawX(x: number): unknown {\n const kind = model.value.xKind\n return kind === 'category' ? model.value.categories[x] : kind === 'time' ? new Date(x) : x\n}\n\n/** What `select` and `hover` give: what the tooltip shows there. */\nconst eventOf = (t: Tip): ChartPointEvent => ({ x: t.x, title: t.title, items: t.items })\n\n/** Tells the page what was picked: what the tooltip shows there. */\nfunction select(t: Tip) {\n emit('select', eventOf(t))\n}\n\n/**\n * What `hover` tells: what the tooltip shows for this chart's own pointer,\n * finger or keys. An x shown because another chart of the group points at it\n * is not hovered here. Worked out only when someone listens; it follows the\n * data too, so a hovered bar whose data is replaced or changed is told again.\n */\nconst hovering = computed<ChartPointEvent | null>(() => {\n if (!instance?.vnode.props?.onHover) return null\n const a = active.value\n if (!a || a.synced || !interactive.value) return null\n const t = tipOf(a)\n return t && eventOf(t)\n})\n\n/** The same value: a `Date` by its time. */\nconst sameValue = (a: unknown, b: unknown) =>\n Object.is(a, b) || (a instanceof Date && b instanceof Date && a.getTime() === b.getTime())\n\n/** Whether two `hover` events say the same: so a pointer moving over one bar tells it once. */\nfunction sameHover(a: ChartPointEvent | null, b: ChartPointEvent | null) {\n if (!a || !b) return a === b\n return (\n sameValue(a.x, b.x) &&\n a.title === b.title &&\n a.items.length === b.items.length &&\n a.items.every(\n (item, i) =>\n item.name === b.items[i]!.name &&\n item.text === b.items[i]!.text &&\n item.row === b.items[i]!.row &&\n sameValue(item.value, b.items[i]!.value),\n )\n )\n}\n\n/** What the page was last told, so it hears each change once. */\nlet hoverTold: ChartPointEvent | null = null\n\nwatch(hovering, (next) => {\n if (sameHover(next, hoverTold)) return\n hoverTold = next\n emit('hover', next)\n})\n\n// a chart taken away while hovered lets the page know, so nothing stays highlighted\nonBeforeUnmount(() => {\n if (hoverTold) emit('hover', null)\n})\n\n/** Whether anyone listens to `select`: then what can be picked shows a pointing hand. */\nconst selectable = () => !!instance?.vnode.props?.onSelect\n\nfunction onClick(event: MouseEvent) {\n // the legend's own buttons\n if ((event.target as Element).closest?.('button')) return\n if (dragged) {\n dragged = false\n return\n }\n const at = local(event)\n // a click beside the selection lets it go\n const kept = selection.value\n if (kept && inPlot(at) && !inRect(at, kept)) clearBrush()\n const target = hitAt(...at)\n const t = target && tipOf({ ...target, pointer: at })\n if (t) select(t)\n}\n\nwatch(active, (a) => {\n const root = rootRef.value\n if (root && selectable()) root.style.cursor = a?.pointer && !a.touch ? 'pointer' : ''\n})\n\n/** Whether x is a number worth giving as `value` (not a category's index). */\nconst m0x = () => model.value.xKind !== 'category'\n\nfunction setActive(next: Target | null, pointer: [number, number] | null, touch = false) {\n const a = active.value\n if (!next) {\n if (a) {\n active.value = null\n if (!a.synced) tellX(null)\n }\n zoomNote.value = ''\n return\n }\n zoomNote.value = ''\n // the same thing under a pointer that moved: only the tooltip moves\n active.value = { ...next, pointer, touch } as Active\n if (next.type === 'axis' && (a?.type !== 'axis' || a.x !== next.x || a.synced)) tellX(next.x)\n}\n\n/* charts whose tooltips share a group follow one another's x */\n\nconst group = computed(() => tooltipPart.value?.props.group)\n\n/** The x of this chart as the group shares it: a category's name, else its number. */\nfunction sharedX(x: number): SharedX {\n return model.value.xKind === 'category' ? (model.value.categories[x] ?? null) : x\n}\n\n/** Tells the group this chart's x, or that it shows none. */\nfunction tellX(x: number | null) {\n const name = group.value\n if (name) tellGroup(name, x === null ? null : sharedX(x), follow)\n}\n\n/** Shows the x another chart of the group points at, if this chart has it. */\nfunction follow(x: SharedX) {\n const a = active.value\n // this chart's own pointer or keys win\n if (a && !a.synced) return\n const mine = x === null || !interactive.value || trigger.value !== 'axis' ? null : localX(x)\n if (mine === null) {\n if (a) active.value = null\n return\n }\n active.value = { type: 'axis', x: mine, pointer: null, synced: true }\n}\n\n/** The x of this chart that `x` from the group names: the same category, or the same number. */\nfunction localX(x: string | number): number | null {\n const m = model.value\n if (m.xKind === 'category') {\n const k = typeof x === 'string' ? m.categories.indexOf(x) : -1\n return k < 0 ? null : k\n }\n if (typeof x !== 'number') return null\n // only an x some series has: no tooltip of values that aren't there\n for (const s of series.value) if (rowAt(s.x.values, x) >= 0) return x\n return null\n}\n\nwatch(\n group,\n (name, _, onCleanup) => {\n if (name) onCleanup(joinGroup(name, follow))\n },\n { immediate: true },\n)\n\n/* pointer: a mouse hovers; a finger taps, and a tap elsewhere closes */\n\nlet pointerFrame = 0\nlet lastPointer: [number, number] | null = null\n\nfunction local(event: MouseEvent): [number, number] {\n const rect = rootRef.value!.getBoundingClientRect()\n return [event.clientX - rect.left, event.clientY - rect.top]\n}\n\nfunction onPointerMove(event: PointerEvent) {\n if (gesture(event)) return\n if (!interactive.value || event.pointerType === 'touch') return\n lastPointer = local(event)\n // once a frame, however fast the pointer moves\n if (pointerFrame || typeof requestAnimationFrame === 'undefined') {\n if (!pointerFrame) followPointer()\n return\n }\n pointerFrame = requestAnimationFrame(() => {\n pointerFrame = 0\n followPointer()\n })\n}\n\nfunction followPointer() {\n if (!lastPointer || drag?.moved) return\n const [x, y] = lastPointer\n setActive(hitAt(x, y), lastPointer)\n}\n\nfunction onPointerLeave(event: PointerEvent) {\n if (event.pointerType === 'touch' || drag?.moved) return\n lastPointer = null\n if (active.value?.pointer) setActive(null, null)\n}\n\n/* dragging: to pan when zoomed, to select with a brush; two fingers zoom */\n\n/** A press on the plot that may turn into a pan or a selection. */\nlet drag: {\n id: number\n touch: boolean\n start: [number, number]\n /** What it does once it moves; `null` for nothing (yet: a finger held still starts a selection). */\n mode: 'pan' | 'brush' | null\n moved: boolean\n /** The scales as it started: the pan follows the pointer from there. */\n from: Scales\n hold: PointerHold\n timer: ReturnType<typeof setTimeout> | undefined\n} | null = null\n\n/** Two fingers on the plot: they zoom about the point between them. */\nlet pinch: { distance: number; middle: [number, number]; from: Scales } | null = null\nconst fingers = new Map<number, [number, number]>()\n\n/** The selection being dragged, in px. */\nconst brushDraft = shallowRef<Rect | null>(null)\n/** A drag just ended: the click that follows it isn't one. */\nlet dragged = false\n\n/** How far a press moves before it is a drag, and how long a finger is held to select. */\nconst SLOP = { mouse: 3, touch: 8 }\nconst HOLD = 400\n\nfunction inPlot([px, py]: [number, number]): boolean {\n const plot = layout.value?.plot\n return (\n !!plot &&\n px >= plot.x &&\n px <= plot.x + plot.width &&\n py >= plot.y &&\n py <= plot.y + plot.height\n )\n}\n\nlet tapped = false\nfunction onPointerDown(event: PointerEvent) {\n const touch = event.pointerType === 'touch'\n tapped = touch && interactive.value\n if (event.button !== 0 || (event.target as Element).closest?.('button')) return\n const at = local(event)\n const from = scalesNow()\n if (!from || !inPlot(at) || !(zoomOn.value || brushPart.value)) return\n if (touch) {\n fingers.set(event.pointerId, at)\n if (fingers.size === 2 && zoomOn.value) {\n startPinch(from)\n return\n }\n if (fingers.size > 1) return\n }\n // a mouse pans when zoomed, and selects with Shift held (or when it can't zoom); a finger pans, and selects when held still\n const brush = !!brushPart.value\n const { sideways, upDown } = panDirections()\n const mode = touch\n ? sideways || upDown\n ? 'pan'\n : null\n : brush && (event.shiftKey || !zoomOn.value)\n ? 'brush'\n : zoomOn.value\n ? 'pan'\n : null\n if (!mode && !(touch && brush)) return\n const hold = holdPointer(event, rootRef.value)\n drag = {\n id: event.pointerId,\n touch,\n start: at,\n mode,\n moved: false,\n from,\n hold,\n timer: undefined,\n }\n if (touch && brush)\n drag.timer = setTimeout(() => {\n if (!drag || drag.moved) return\n drag.mode = 'brush'\n startDrag()\n brushDraft.value = brushRect(drag.start, drag.start)\n }, HOLD)\n}\n\n/** The press became a drag: it keeps the pointer, and the tooltip goes. */\nfunction startDrag() {\n if (!drag) return\n drag.moved = true\n tapped = false\n clearTimeout(drag.timer)\n drag.hold.grab()\n if (drag.mode === 'pan' && rootRef.value) rootRef.value.style.cursor = 'grabbing'\n if (!drag.touch) {\n try {\n rootRef.value?.setPointerCapture(drag.id)\n } catch {\n // the pointer is already gone\n }\n }\n setActive(null, null)\n}\n\nfunction startPinch(from: Scales) {\n endDrag(false)\n tapped = false\n const [a, b] = [...fingers.values()] as [[number, number], [number, number]]\n pinch = {\n distance: Math.max(1, Math.hypot(a[0] - b[0], a[1] - b[1])),\n middle: [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2],\n from,\n }\n setActive(null, null)\n}\n\n/** Follows a drag or a pinch; `true` when the move was one. */\nfunction gesture(event: PointerEvent): boolean {\n if (pinch && fingers.has(event.pointerId)) {\n fingers.set(event.pointerId, local(event))\n if (fingers.size < 2) return true\n const [a, b] = [...fingers.values()] as [[number, number], [number, number]]\n const distance = Math.max(1, Math.hypot(a[0] - b[0], a[1] - b[1]))\n const middle: [number, number] = [(a[0] + b[0]) / 2, (a[1] + b[1]) / 2]\n const p = pinch\n onceAFrame(() => {\n // zoomed about where the fingers started, then moved with them\n const factor = p.distance / distance\n const x = zoomWindow(p.from.x, alongX(p.middle), factor)\n const y = p.from.y && zoomWindow(p.from.y, alongY(p.middle), factor)\n const by: [number, number] = [middle[0] - p.middle[0], middle[1] - p.middle[1]]\n if (zoomAxes.value.x) showX(panWindow(scaleOver(x, p.from.x), -alongX(by)))\n if (zoomAxes.value.y && y && p.from.y) showY(panWindow(scaleOver(y, p.from.y), -alongY(by)))\n })\n return true\n }\n if (!drag || event.pointerId !== drag.id) return false\n const at = local(event)\n const d = drag\n const by: [number, number] = [at[0] - d.start[0], at[1] - d.start[1]]\n if (!d.moved) {\n if (Math.hypot(...by) < SLOP[d.touch ? 'touch' : 'mouse']) return true\n // a finger that moves before it is held long enough, or the way the chart can't pan, scrolls the page\n const { sideways, upDown } = panDirections()\n const across = Math.abs(by[0]) >= Math.abs(by[1])\n if (!d.mode || (d.touch && d.mode === 'pan' && !(across ? sideways : upDown))) {\n endDrag(false)\n return false\n }\n startDrag()\n }\n if (d.mode === 'pan') onceAFrame(() => panBy(by, d.from))\n else brushDraft.value = brushRect(d.start, at)\n return true\n}\n\nlet gestureFrame = 0\nlet gestureNext: (() => void) | null = null\n/** Runs `step` once a frame, the latest one, however fast the pointer moves. */\nfunction onceAFrame(step: () => void) {\n gestureNext = step\n if (gestureFrame) return\n if (typeof requestAnimationFrame === 'undefined') {\n gestureNext = null\n step()\n return\n }\n gestureFrame = requestAnimationFrame(() => {\n gestureFrame = 0\n const next = gestureNext\n gestureNext = null\n next?.()\n })\n}\n\n/** Ends the drag: `done` when it was let go (not cancelled), which settles a pan and selects. */\nfunction endDrag(done: boolean, at?: [number, number]) {\n const d = drag\n if (!d) return\n drag = null\n clearTimeout(d.timer)\n d.hold.release()\n if (!d.moved) return\n if (d.mode === 'pan' && rootRef.value) rootRef.value.style.cursor = ''\n dragged = !d.touch\n if (gestureFrame) {\n cancelAnimationFrame(gestureFrame)\n gestureFrame = 0\n gestureNext?.()\n gestureNext = null\n }\n if (d.mode === 'pan') showX(xWindow.value, true)\n else if (d.mode === 'brush') {\n const rect = brushDraft.value\n brushDraft.value = null\n if (done && rect) brushTo(at ? brushRect(d.start, at) : rect)\n }\n}\n\nfunction onPointerCancel(event: PointerEvent) {\n // the page scrolled: not a tap\n tapped = false\n fingers.delete(event.pointerId)\n if (pinch && fingers.size < 2) endPinch()\n if (drag?.id === event.pointerId) endDrag(false)\n}\n\nfunction endPinch() {\n pinch = null\n if (gestureFrame) {\n cancelAnimationFrame(gestureFrame)\n gestureFrame = 0\n gestureNext?.()\n gestureNext = null\n }\n showX(xWindow.value, true)\n}\n\nfunction onPointerUp(event: PointerEvent) {\n fingers.delete(event.pointerId)\n if (pinch) {\n if (fingers.size < 2) endPinch()\n return\n }\n const wasDrag = drag?.id === event.pointerId && drag.moved\n if (drag?.id === event.pointerId) endDrag(true, local(event))\n if (!tapped || wasDrag) return\n tapped = false\n const at = local(event)\n setActive(hitAt(...at), at, true)\n}\n\n/* the brush: a stretch selected by dragging */\n\nconst brushAxes = computed(() => {\n const axis = brushPart.value?.props.axis ?? 'x'\n return { x: axis !== 'y', y: axis !== 'x' }\n})\n\nconst clampTo = (v: number, from: number, length: number) =>\n Math.min(Math.max(v, from), from + length)\n\n/** The selection from `a` to `b` (in px), across the whole plot along an axis it doesn't select. */\nfunction brushRect(a: [number, number], b: [number, number]): Rect | null {\n const plot = layout.value?.plot\n if (!plot) return null\n const x0 = clampTo(Math.min(a[0], b[0]), plot.x, plot.width)\n const x1 = clampTo(Math.max(a[0], b[0]), plot.x, plot.width)\n const y0 = clampTo(Math.min(a[1], b[1]), plot.y, plot.height)\n const y1 = clampTo(Math.max(a[1], b[1]), plot.y, plot.height)\n const { x: bx, y: by } = brushAxes.value\n // which of the rect's sides each axis selects along\n const horizontal = !!props.horizontal\n const across = horizontal ? by : bx\n const down = horizontal ? bx : by\n return {\n x: across ? x0 : plot.x,\n y: down ? y0 : plot.y,\n width: across ? x1 - x0 : plot.width,\n height: down ? y1 - y0 : plot.height,\n }\n}\n\nconst inRect = ([px, py]: [number, number], r: Rect) =>\n px >= r.x && px <= r.x + r.width && py >= r.y && py <= r.y + r.height\n\n/** The px a rect spans along x, and along the values. */\nconst spanX = (r: Rect): Window => (props.horizontal ? [r.y, r.y + r.height] : [r.x, r.x + r.width])\nconst spanY = (r: Rect): Window => (props.horizontal ? [r.x, r.x + r.width] : [r.y, r.y + r.height])\n\n/** The values `scale` shows over the px `span`, from the smallest. */\nfunction valuesOver(scale: Scale, [a, b]: Window): Window {\n const [u, v] = [scale.invert(a), scale.invert(b)]\n return u <= v ? [u, v] : [v, u]\n}\n\n/** Keeps the selection of `rect` (in px) and tells the page; a selection too small to mean one lets it go. */\nfunction brushTo(rect: Rect | null) {\n const l = layout.value\n const part = brushPart.value\n brushAnchor = null\n if (!l || !part || !rect) return\n const { x: bx, y: by } = brushAxes.value\n const xs = spanX(rect)\n const ys = spanY(rect)\n if ((bx && xs[1] - xs[0] < 4) || (by && ys[1] - ys[0] < 4)) {\n clearBrush()\n return\n }\n const m = model.value\n let x: Window | null = null\n if (bx) {\n x = valuesOver(l.x.scale, xs)\n if (m.xKind === 'category') {\n // the categories whose middle is in it\n const from = Math.ceil(x[0])\n const to = Math.floor(x[1])\n if (from > to) {\n clearBrush()\n return\n }\n x = [from - 0.5, to + 0.5]\n }\n }\n const primary = primaryY(l)\n const y = by && primary ? valuesOver(primary.scale, ys) : null\n const xInterval = x\n ? m.xKind === 'linear'\n ? rounded(x)\n : windowToInterval(x, m.xKind, m.categories)\n : null\n const yInterval: ChartInterval | null = y ? rounded(y) : null\n part.x.value = xInterval\n part.y.value = yInterval\n part.select({\n ...(xInterval && { x: xInterval }),\n ...(yInterval && { y: yInterval }),\n ...rowsIn(x, y),\n })\n}\n\n/** Where a selection made with Shift and the arrow keys started, along x. */\nlet brushAnchor: number | null = null\n\n/** The x of an x or a point picked. */\nfunction xOf(target: Target | null): number | null {\n if (!target || target.type === 'slice') return null\n if (target.type === 'axis') return target.x\n return series.value.find((s) => s.index === target.series)?.x.values[target.row] ?? null\n}\n\n/** Shift and an arrow: moves on `step` and selects from where it started to there. */\nfunction brushWithKeys(step: number) {\n const part = brushPart.value\n const from = xOf(active.value)\n const next = moveAlong(step)\n const to = xOf(next)\n if (!part || !next || to === null) return\n bringIntoView(next)\n setActive(next, null)\n brushAnchor ??= from ?? to\n const m = model.value\n const lo = Math.min(brushAnchor, to)\n const hi = Math.max(brushAnchor, to)\n const window: Window = m.xKind === 'category' ? [lo - 0.5, hi + 0.5] : [lo, hi]\n const x = windowToInterval(window, m.xKind, m.categories)\n part.x.value = x\n part.y.value = null\n part.select({ x, ...rowsIn(window, null) })\n}\n\n/** Lets the selection go, and tells the page: nothing is selected. */\nfunction clearBrush() {\n const part = brushPart.value\n brushAnchor = null\n if (!part || (!part.x.value && !part.y.value)) return\n part.x.value = null\n part.y.value = null\n part.select({ rows: [], series: [] })\n}\n\n/** The rows with a point in the selection: x in `x`, and drawn within `y` of the values. */\nfunction rowsIn(x: Window | null, y: Window | null): Pick<ChartBrushEvent, 'rows' | 'series'> {\n const l = layout.value!\n const primary = primaryY(l)\n // the values' stretch in px, to test series on either value axis alike\n const ys = y && primary ? ([primary.scale.map(y[0]), primary.scale.map(y[1])] as Window) : null\n const lowY = ys ? Math.min(...ys) - 0.5 : 0\n const highY = ys ? Math.max(...ys) + 0.5 : 0\n const all = new Set<ChartRow>()\n const bySeries: ChartBrushEvent['series'] = []\n for (const s of series.value) {\n const view = viewOf(s)\n if (!view) continue\n const rows: ChartRow[] = []\n for (const i of sortedOrder(s.x.values)) {\n const value = s.x.values[i]!\n const top = s.top[i]!\n if (top !== top || (x && !within(value, x))) continue\n if (ys) {\n const at = alongY(view.point(value, top))\n if (at < lowY || at > highY) continue\n }\n rows.push(rowOf(s.rows, i))\n all.add(rowOf(s.rows, i))\n }\n bySeries.push({ name: s.name, rows })\n }\n return { rows: [...all], series: bySeries }\n}\n\n/** The selection to keep the rest faded around, while it is dragged or kept. */\nconst dimmed = computed(() =>\n brushPart.value && brushPart.value.props.dim !== false\n ? (brushDraft.value ?? selection.value)\n : null,\n)\n\n/** The selection kept (`v-model:x` / `v-model:y` of the brush), in px over the plot. */\nconst selection = computed<Rect | null>(() => {\n const part = brushPart.value\n const l = layout.value\n if (!part || !l || (!part.x.value && !part.y.value)) return null\n const m = model.value\n const { plot } = l\n const x = intervalToWindow(part.x.value, m.xKind, m.categories)\n const y = part.y.value ? intervalToWindow(part.y.value, 'linear', []) : null\n const primary = primaryY(l)\n const xs: Window = x\n ? [l.x.scale.map(x[0]), l.x.scale.map(x[1])]\n : props.horizontal\n ? [plot.y, plot.y + plot.height]\n : [plot.x, plot.x + plot.width]\n const ys: Window =\n y && primary\n ? [primary.scale.map(y[0]), primary.scale.map(y[1])]\n : props.horizontal\n ? [plot.x, plot.x + plot.width]\n : [plot.y + plot.height, plot.y]\n const [a, b] = props.horizontal ? [ys, xs] : [xs, ys]\n // kept to the plot: zoomed in, part of it may be out of sight\n const left = Math.max(plot.x, Math.min(a[0], a[1]))\n const right = Math.min(plot.x + plot.width, Math.max(a[0], a[1]))\n const top = Math.max(plot.y, Math.min(b[0], b[1]))\n const bottom = Math.min(plot.y + plot.height, Math.max(b[0], b[1]))\n if (right <= left || bottom <= top) return null\n return { x: left, y: top, width: right - left, height: bottom - top }\n})\n\n/* the wheel and a double click */\n\n/** How much a wheel turn zooms, per px of its delta (pinches send small deltas, wheels large ones). */\nconst WHEEL_ZOOM = 0.01\nconst WHEEL_MOST = 40\n\nfunction onWheel(event: WheelEvent) {\n if (!zoomOn.value) return\n const at = local(event)\n if (!inPlot(at)) return\n const lines = event.deltaMode === 1 ? 16 : event.deltaMode === 2 ? 400 : 1\n let dx = event.deltaX * lines\n let dy = event.deltaY * lines\n // a pinch on a trackpad comes as the wheel with Ctrl held\n const pinching = event.ctrlKey || event.metaKey\n if (pinching || zoomPart.value?.props.wheel) {\n // all shown, zooming out: the wheel scrolls the page on\n if (!pinching && !zoomed.value && dy > 0) return\n event.preventDefault()\n const d = Math.max(-WHEEL_MOST, Math.min(WHEEL_MOST, dy))\n setActive(null, null)\n onceAFrame(() => zoomBy(Math.exp(d * WHEEL_ZOOM), at))\n settleSoon()\n return\n }\n // zoomed in: a sideways scroll (or Shift and the wheel) pans along x\n if (event.shiftKey && !dx) [dx, dy] = [dy, 0]\n if (!zoomed.value || !(Math.abs(dx) > Math.abs(dy))) return\n event.preventDefault()\n setActive(null, null)\n const by: [number, number] = props.horizontal ? [0, -dx] : [-dx, 0]\n onceAFrame(() => panBy(by))\n settleSoon()\n}\n\nlet settleTimer: ReturnType<typeof setTimeout> | undefined\n/** Once the wheel stops, categories cut part way are shown whole. */\nfunction settleSoon() {\n clearTimeout(settleTimer)\n settleTimer = setTimeout(() => showX(xWindow.value, true), 160)\n}\nonBeforeUnmount(() => clearTimeout(settleTimer))\n\nfunction onDblclick(event: MouseEvent) {\n if (!zoomOn.value || !inPlot(local(event))) return\n event.preventDefault()\n resetZoom()\n}\n\n// a press anywhere else closes a tooltip opened by a tap or the keys\nfunction onOutsidePress(event: PointerEvent) {\n if (!active.value) return\n const root = rootRef.value\n if (root && !root.contains(event.target as Node)) setActive(null, null)\n}\nonMounted(() => document.addEventListener('pointerdown', onOutsidePress, true))\nonBeforeUnmount(() => {\n document.removeEventListener('pointerdown', onOutsidePress, true)\n if (pointerFrame) cancelAnimationFrame(pointerFrame)\n})\n\n/* keys: arrows move along x and between series; Home and End go to the ends */\n\nfunction onKeydown(event: KeyboardEvent) {\n if (!interactive.value || event.target !== rootRef.value) return\n if (event.key === 'Enter') {\n if (tip.value) select(tip.value)\n return\n }\n if (event.key === 'Escape') {\n if (active.value) setActive(null, null)\n else if (selection.value) clearBrush()\n else return\n event.stopPropagation()\n return\n }\n if (zoomOn.value && zoomKey(event)) {\n event.preventDefault()\n return\n }\n const horizontal = !!props.horizontal\n // the arrows along the x axis move on (right and down) or back (left and up);\n // the other two change series, where there is another to go to (points of\n // several series, a heatmap's rows), else they move on and back too\n const switches =\n !pie.value &&\n !tree.value &&\n !funnel.value &&\n !radar.value &&\n trigger.value !== 'axis' &&\n (series.value.length > 1 || series.value.some((s) => s.kind.categoryY))\n const forth = { ArrowRight: 1, ArrowDown: 1, ArrowLeft: -1, ArrowUp: -1 }\n const along: Record<string, number> = !switches\n ? forth\n : horizontal\n ? { ArrowDown: 1, ArrowUp: -1 }\n : { ArrowRight: 1, ArrowLeft: -1 }\n const between: Record<string, number> = !switches\n ? {}\n : horizontal\n ? { ArrowRight: 1, ArrowLeft: -1 }\n : { ArrowUp: 1, ArrowDown: -1 }\n const step =\n along[event.key] ?? (event.key === 'Home' ? -Infinity : event.key === 'End' ? Infinity : 0)\n const turn = between[event.key] ?? 0\n // Shift and an arrow that moves along x grows a selection; one that changes series does nothing\n if (event.shiftKey && brushPart.value && brushAxes.value.x && !pie.value && (step || turn)) {\n event.preventDefault()\n if (step) brushWithKeys(step)\n return\n }\n if (step || turn) brushAnchor = null\n const next = step ? moveAlong(step) : turn ? moveBetween(turn) : undefined\n if (next === undefined) return\n event.preventDefault()\n if (next) bringIntoView(next)\n if (next) setActive(next, null)\n}\n\n/** `+` and `-` zoom about what is picked (or the middle), `0` shows all; `true` when it was one. */\nfunction zoomKey(event: KeyboardEvent): boolean {\n const l = layout.value\n if (!l || event.ctrlKey || event.metaKey || event.altKey) return false\n const factor = event.key === '+' || event.key === '=' ? 0.5 : event.key === '-' ? 2 : 0\n if (event.key === '0') {\n resetZoom(true)\n return true\n }\n if (!factor) return false\n const { plot } = l\n const t = tip.value\n const at: [number, number] = t\n ? [t.anchor[0], t.anchor[1]]\n : [plot.x + plot.width / 2, plot.y + plot.height / 2]\n // about the x picked, along the x axis\n if (t?.x !== undefined && active.value?.type === 'axis') {\n const x = l.x.scale.map(active.value.x)\n if (props.horizontal) at[1] = x\n else at[0] = x\n }\n zoomBy(factor, at)\n showX(xWindow.value, true)\n const now = layout.value\n if (!now) return true\n const [from, to] = now.x.scale.domain\n const m = model.value\n const ends =\n m.xKind === 'category'\n ? windowToInterval([from, to], m.xKind, m.categories).map(String)\n : [xText(from), xText(to)]\n zoomNote.value = zoomed.value\n ? format(messages.value.zoomed, { from: ends[0]!, to: ends[1]! })\n : messages.value.zoomReset\n return true\n}\n\n/** Zoomed in: moves what is shown so the x the keys moved to is in sight. */\nfunction bringIntoView(target: Target) {\n const l = layout.value\n if (!l || !xWindow.value || target.type === 'slice') return\n const x =\n target.type === 'axis'\n ? target.x\n : series.value.find((s) => s.index === target.series)?.x.values[target.row]\n if (x === undefined) return\n const [a, b] = xWindow.value\n const span = b - a\n // a little room past it, or the whole category\n const room = model.value.xKind === 'category' ? 0.5 : span * 0.05\n if (x - room < a) showX([x - room, x - room + span], true)\n else if (x + room > b) showX([x + room - span, x + room], true)\n}\n\n/**\n * The place `step` on from `at` among `n`, kept to the ends; from nothing\n * picked, the first (or the last, going back).\n */\nfunction stepTo(at: number, step: number, n: number): number {\n if (at < 0 && Number.isFinite(step)) return step > 0 ? 0 : n - 1\n return Math.max(0, Math.min(n - 1, at + step))\n}\n\n/** The next x, point or slice `step` along (±Infinity for the ends). */\nfunction moveAlong(step: number): Target | null {\n const a = active.value\n // a tree: its nodes in order, each group before what is in it\n if (tree.value) {\n const count = (treeData.value?.nodes.length ?? 1) - 1\n if (count < 1) return null\n const at = a?.type === 'slice' ? a.slice - 1 : -1\n return { type: 'slice', slice: stepTo(at, step, count) + 1 }\n }\n if (pie.value) {\n const shown = slices.value.flatMap((slice, k) => (slice.hidden ? [] : [k]))\n if (!shown.length) return null\n const at = a?.type === 'slice' ? shown.indexOf(a.slice) : -1\n const k = stepTo(at, step, shown.length)\n return { type: 'slice', slice: shown[k]! }\n }\n if (trigger.value === 'axis') {\n const xs = xValues.value\n if (!xs.length) return null\n const at = a?.type === 'axis' ? xs.indexOf(a.x) : -1\n // round a radar, past the last spoke to the first\n const k =\n radar.value && at >= 0 && Number.isFinite(step)\n ? (at + step + xs.length) % xs.length\n : stepTo(at, step, xs.length)\n return { type: 'axis', x: xs[k]! }\n }\n const s =\n (a?.type === 'item' && series.value.find((x) => x.index === a.series)) || series.value[0]\n if (!s) return null\n const mine = a?.type === 'item' && a.series === s.index\n // a heatmap's cells: along its row\n const order = s.kind.categoryY && mine ? pointsOf(s, s.top[a.row]) : pointsOf(s)\n if (!order.length) return null\n const at = mine ? order.indexOf(a.row) : -1\n const k = stepTo(at, step, order.length)\n return itemOf(s, order[k]!)\n}\n\n/** The point of the next series `turn` away, nearest to the current x. */\nfunction moveBetween(turn: number): Target | null | undefined {\n const a = active.value\n if (pie.value || trigger.value === 'axis') return undefined\n const from = a?.type === 'item' ? series.value.find((x) => x.index === a.series) : undefined\n if (from?.kind.categoryY && a?.type === 'item') return heatRow(from, a.row, turn)\n const list = series.value.filter((s) => pointsOf(s).length)\n if (!list.length) return null\n const at = a?.type === 'item' ? list.findIndex((s) => s.index === a.series) : -1\n const s = list[at < 0 ? 0 : (at + turn + list.length) % list.length]!\n const order = pointsOf(s)\n if (a?.type !== 'item') return itemOf(s, order[0]!)\n const x = from ? from.x.values[a.row]! : 0\n let best = order[0]!\n for (const row of order)\n if (Math.abs(s.x.values[row]! - x) < Math.abs(s.x.values[best]! - x)) best = row\n return itemOf(s, best)\n}\n\n/** The rows of `s` with a value, from the smallest x; for a heatmap, only those in its row `place`. */\nfunction pointsOf(s: ChartSeries, place?: number): number[] {\n const order = sortedOrder(s.x.values)\n const out: number[] = []\n for (const row of order)\n if (s.top[row] === s.top[row] && (place === undefined || s.top[row] === place)) out.push(row)\n return out\n}\n\n/**\n * The heatmap cell a row up or down from `row` (across, when horizontal),\n * at the same x: `turn` 1 is up (right), as the keys go. Rows without a\n * cell there are passed over; at the edge it stays.\n */\nfunction heatRow(s: ChartSeries, row: number, turn: number): Target {\n const view = viewOf(s)\n const x = s.x.values[row]!\n // which way the next category lies on screen\n let step = turn\n if (view) {\n const [l0, t0] = view.point(x, 0)\n const [l1, t1] = view.point(x, 1)\n if ((props.horizontal ? l1 - l0 : t0 - t1) < 0) step = -turn\n }\n const n = model.value.yCategories[s.axis]?.length ?? 0\n for (let place = s.top[row]! + step; place >= 0 && place < n; place += step) {\n for (let i = 0; i < s.y.length; i++)\n if (s.top[i] === place && s.x.values[i] === x && s.y[i] === s.y[i]) return itemOf(s, i)\n }\n return itemOf(s, row)\n}\n\nfunction itemOf(s: ChartSeries, row: number): Target {\n const view = viewOf(s)\n const x = s.x.values[row]!\n const at = view?.point(x, s.top[row]!)\n // the hit at the point itself, for the size of its mark\n const hit = view && at && s.kind.hit ? s.kind.hit(s, view, at[0], at[1]) : null\n return { type: 'item', series: s.index, row, radius: hit?.index === row ? hit.radius : 4 }\n}\n\n/** Every x with a value, from the smallest: where the keys stop. */\nconst xValues = computed(() => allX(series.value.map((s) => s.x.values)))\n\n// an x, point or slice gone from the data: nothing to show\nwatch([series, slices], () => {\n const a = active.value\n if (!a) return\n if (a.pointer) {\n const next = hitAt(...a.pointer)\n setActive(next, a.pointer, a.touch)\n } else if (!tip.value) setActive(null, null)\n})\n\n/** Read out as the keys move: the x (or series) and its values, or what zooming shows. */\nconst live = computed(() => {\n if (zoomNote.value) return zoomNote.value\n const t = tip.value\n // read out only what the keys picked here, not what another chart points at\n if (!t || active.value?.pointer || active.value?.synced) return ''\n const items = t.items\n .map((item) => `${item.name} ${item.text}`)\n .join(messages.value.itemSeparator)\n const text = t.title ? `${t.title}${messages.value.itemSeparator}${items}` : items\n return t.note ? `${text}${messages.value.itemSeparator}${t.note}` : text\n})\n\nconst pointer: PointerState = {\n tip,\n size: computed(() => {\n const l =\n layout.value ?? pieLayout.value ?? treeLayout.value ?? radarLayout.value ?? funnelLayout.value\n return l && { width: l.width, height: l.height }\n }),\n content: computed(() => tooltipPart.value?.content()),\n live,\n}\n\n/* drawing: everything that changes asks for one frame */\n\nlet pending = 0\nfunction request() {\n if (pending || typeof requestAnimationFrame === 'undefined') return\n pending = requestAnimationFrame(() => {\n pending = 0\n draw()\n })\n}\nonBeforeUnmount(() => pending && cancelAnimationFrame(pending))\n\nwatch(\n // every series prop, so a style change (smooth, dashed) redraws too\n () => [\n layout.value,\n pieLayout.value,\n series.value,\n sliceColors.value,\n colors.value,\n seriesParts.value.map((part) => ({ ...part.props })),\n pie.value && { ...pie.value.props },\n focused.value,\n pointed.value,\n pieLabels.value,\n labelsShown.value,\n pie.value && active.value,\n radarLayout.value,\n funnelLayout.value,\n treeLayout.value,\n treeColors.value,\n tree.value && { ...tree.value.props },\n tree.value && active.value,\n radar.value && active.value,\n dimmed.value,\n ],\n request,\n { flush: 'post' },\n)\n\n/*\n * What makes zooming and the first hover quick (summaries of long lines, a\n * scatter's grid), worked out once the data has stayed a moment and the\n * page is idle: live data, replaced many times a second, never pays for it.\n */\n\nconst STEADY = 300\nlet steady = 0\nlet idle = 0\nfunction cancelPrepare() {\n if (steady) clearTimeout(steady)\n if (idle) (typeof cancelIdleCallback === 'function' ? cancelIdleCallback : clearTimeout)(idle)\n steady = idle = 0\n}\nwatch(\n series,\n (list) => {\n cancelPrepare()\n if (!list.some((s) => s.kind.prepare)) return\n const work = () => {\n idle = 0\n for (const s of list) if (s.kind.prepare) s.prepared = s.kind.prepare(s)\n }\n steady = setTimeout(() => {\n steady = 0\n idle =\n typeof requestIdleCallback === 'function'\n ? requestIdleCallback(work, { timeout: 1000 })\n : (setTimeout(work) as unknown as number)\n }, STEADY) as unknown as number\n },\n { flush: 'post' },\n)\nonBeforeUnmount(cancelPrepare)\n\n/* motion: series come in, and move to new values */\n\nconst reduced = useReducedMotion()\n/** Above this many points, changes show at once. */\nconst MOTION_LIMIT = 2000\nconst ENTER = 320\nconst UPDATE = 220\nconst easeOut = (t: number) => 1 - (1 - t) ** 3\n\ninterface Shown {\n top: Float64Array\n base: Float64Array | null\n ends: { up: Float64Array; down: Float64Array } | null\n}\n\n/** A move under way: from what was shown to the current data. */\nlet motion: {\n start: number\n duration: number\n /** Coming in for the first time: lines are drawn from the start, bars grow. */\n enter: boolean\n series: Map<number, Shown>\n slices: Map<number, [number, number]>\n} | null = null\n/** The model and slices last drawn, and how they were drawn, to move from. */\nlet drawnModel: ChartModel | null = null\nlet drawnSlices: PieSlice[] | null = null\nlet lastSeries: ChartSeries[] = []\nlet lastSlices: PieSlice[] = []\n\nfunction pointCount(): number {\n if (pie.value) return slices.value.length\n let n = 0\n for (const s of model.value.series) n += s.y.length\n return n\n}\n\n/** Whether the chart has been on screen: it comes in when first seen, not while scrolled away. */\nlet seen = typeof IntersectionObserver === 'undefined'\n/**\n * Whether the chart is on screen, or near it. Off screen nothing is drawn\n * (live data keeps coming), and it is drawn as it is when it comes back.\n */\nlet onScreen = true\nlet missed = false\nlet watcher: IntersectionObserver | undefined\nonMounted(() => {\n if (typeof IntersectionObserver === 'undefined' || !rootRef.value) return\n watcher = new IntersectionObserver(\n (entries) => {\n const entry = entries[entries.length - 1]\n if (!entry) return\n onScreen = entry.isIntersecting\n if (!onScreen) return\n // first seen: it comes in now\n if (!seen || missed) request()\n seen = true\n missed = false\n },\n { rootMargin: '200px 0px' },\n )\n watcher.observe(rootRef.value)\n})\nonBeforeUnmount(() => watcher?.disconnect())\n\n/** Starts a move when the data changed since the last frame. */\nfunction startMotion(now: number) {\n if (!seen) return\n const m = model.value\n const changed = pie.value ? drawnSlices !== slices.value : drawnModel !== m\n const first = pie.value ? !drawnSlices : !drawnModel\n if (!changed || empty.value) return\n drawnModel = m\n drawnSlices = slices.value\n if (reduced.value || pointCount() > MOTION_LIMIT) {\n motion = null\n return\n }\n const from = new Map<number, Shown>()\n const angles = new Map<number, [number, number]>()\n if (!first) {\n // from where things were last drawn, mid-move or not\n for (const s of lastSeries) from.set(s.index, { top: s.top, base: s.base, ends: s.stackEnds })\n for (const slice of lastSlices) angles.set(slice.index, [slice.start, slice.end])\n }\n // labels come in once the series have\n if (first) labelsShown.value = false\n motion = {\n start: now,\n duration: first ? ENTER : UPDATE,\n enter: first,\n series: from,\n slices: angles,\n }\n}\n\nfunction lerp(from: Float64Array, to: Float64Array, t: number): Float64Array {\n if (from.length !== to.length) return to\n const out = new Float64Array(to.length)\n for (let i = 0; i < to.length; i++) {\n const a = from[i]!\n const b = to[i]!\n // a value that comes or goes shows at once\n out[i] = a === a ? a + (b - a) * t : b\n }\n return out\n}\n\n/** The series `t` of the way (0 to 1) from what was shown. */\nfunction shownSeries(t: number): ChartSeries[] {\n const list = series.value\n if (!motion || t >= 1) return list\n return list.map((s) => {\n let from = motion!.series.get(s.index)\n // bars and areas grow from the baseline; lines come in from the start (see `paint`).\n // Coming in, a stack grows as a whole (each slice's base grows too, so the\n // slices stay on each other); a series added later grows from its own base.\n if (!from && s.kind.zero) {\n const zero = new Float64Array(s.top.length).fill(baselineValue(s))\n const base = motion!.enter ? s.base && zero : s.base\n const start = base ?? zero\n from = { top: start, base, ends: s.stackEnds && { up: start, down: start } }\n }\n if (!from) return s\n return {\n ...s,\n top: lerp(from.top, s.top, t),\n base: s.base && from.base ? lerp(from.base, s.base, t) : s.base,\n stackEnds:\n s.stackEnds && from.ends\n ? {\n up: lerp(from.ends.up, s.stackEnds.up, t),\n down: lerp(from.ends.down, s.stackEnds.down, t),\n }\n : s.stackEnds,\n }\n })\n}\n\n/** Where a series' bars grow from: 0, or the end of the axis nearest to it. */\nfunction baselineValue(s: ChartSeries): number {\n const axis = layout.value?.y[s.axis]\n if (!axis) return 0\n const [lo, hi] = axis.scale.domain\n return Math.min(Math.max(0, lo), hi)\n}\n\nfunction shownSlicesAt(t: number): PieSlice[] {\n const list = slices.value\n if (!motion || motion.enter || t >= 1) return list\n return list.map((slice) => {\n const from = motion!.slices.get(slice.index)\n if (!from) return slice\n return {\n ...slice,\n start: from[0] + (slice.start - from[0]) * t,\n end: from[1] + (slice.end - from[1]) * t,\n }\n })\n}\n\nfunction draw() {\n const canvas = canvasRef.value\n const l =\n layout.value ?? pieLayout.value ?? treeLayout.value ?? radarLayout.value ?? funnelLayout.value\n if (!canvas || !l) return\n if (!onScreen) {\n missed = true\n return\n }\n const now = typeof performance === 'undefined' ? Date.now() : performance.now()\n // the server's drawing is already showing: the chart doesn't come in again\n if (fromServer.value) {\n drawnModel = model.value\n drawnSlices = slices.value\n }\n startMotion(now)\n const dpr = window.devicePixelRatio || 1\n const width = Math.round(l.width * dpr)\n const height = Math.round(l.height * dpr)\n if (canvas.width !== width) canvas.width = width\n if (canvas.height !== height) canvas.height = height\n // set here, not in the template: the chart itself doesn't render again on resize\n canvas.style.width = `${l.width}px`\n canvas.style.height = `${l.height}px`\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, l.width, l.height)\n if (empty.value) return\n const done = motion ? Math.min(1, (now - motion.start) / motion.duration) : 1\n const t = easeOut(done)\n const entering = motion?.enter ? t : 1\n if (pieLayout.value) paintPie(ctx, t, entering)\n else if (treeLayout.value) paintTree(ctx, entering, false, dpr)\n else if (radarLayout.value) paintRadar(ctx, dpr, t)\n else if (funnelLayout.value) paintFunnel(ctx, dpr, t)\n else paint(ctx, dpr, t, entering)\n // the canvas shows the chart now: the server's image goes\n fromServer.value = false\n // the next frame of the move\n if (done >= 1) motion = null\n else request()\n if (!motion?.enter) labelsShown.value = true\n}\n\n/** Draws the pie; `still` leaves out what follows the pointer and the legend (an export). */\nfunction paintPie(painter: Painter, t: number, sweep: number, still = false) {\n const l = pieLayout.value!\n const a = still ? null : active.value\n const legendFocus = still || focused.value === null ? undefined : slices.value[focused.value]\n const hovered = a?.type === 'slice' ? slices.value[a.slice] : undefined\n const focus = legendFocus && !legendFocus.hidden ? legendFocus : hovered\n const shown = shownSlicesAt(t)\n if (!still) lastSlices = shown\n drawPie(painter, shown, sliceColors.value, {\n cx: l.cx,\n cy: l.cy,\n radius: l.radius,\n inner: l.radius * holeRatio.value,\n surface: colors.value.surface,\n focus: focus?.index,\n fade: legendFocus ? FADED : 0.56,\n sweep,\n from: pieArc.value[0],\n patterns: slicePatterns.value,\n })\n // the lines out to the labels, once they show\n const leaders = pieLabels.value.leaders\n if (!leaders.length || !(still || labelsShown.value)) return\n painter.save()\n painter.strokeStyle = colors.value.baseline\n painter.lineWidth = 1\n painter.lineJoin = 'round'\n painter.beginPath()\n for (const line of leaders)\n line.forEach(([x, y], k) => (k ? painter.lineTo(x, y) : painter.moveTo(x, y)))\n painter.stroke()\n painter.restore()\n}\n\n/**\n * Draws the radar: its rings and spokes, the spoke picked, then each\n * series, those not brought forward faded. `still` leaves out what follows\n * the pointer and the legend (an export).\n */\nfunction paintRadar(painter: Painter, dpr: number, t: number, still = false) {\n const r = radarLayout.value!\n const { cx, cy, count } = r\n const corner = (k: number, out: number): [number, number] => {\n const angle = spokeAngle(k, count)\n return [cx + Math.sin(angle) * out, cy - Math.cos(angle) * out]\n }\n painter.save()\n painter.lineWidth = 1\n painter.strokeStyle = colors.value.grid\n painter.beginPath()\n // the rings: polygons through the spokes, so equal values lie on a straight line\n if (axes.value.y?.grid !== false)\n for (const tick of r.ticks) {\n const out = r.scale.map(tick)\n if (out < 1 || count < 3) continue\n for (let k = 0; k <= count; k++) {\n const [x, y] = corner(k % count, out)\n if (k) painter.lineTo(x, y)\n else painter.moveTo(x, y)\n }\n }\n // the spokes\n for (let k = 0; k < count; k++) {\n const [x, y] = corner(k, r.radius)\n painter.moveTo(cx, cy)\n painter.lineTo(x, y)\n }\n painter.stroke()\n // the spoke picked, darker\n const a = still ? null : active.value\n if (a?.type === 'axis' && count) {\n const [x, y] = corner(a.x, r.radius)\n painter.strokeStyle = colors.value.baseline\n painter.beginPath()\n painter.moveTo(cx, cy)\n painter.lineTo(x, y)\n painter.stroke()\n }\n painter.restore()\n ringValues(painter, r)\n const shown = shownSeries(t)\n if (!still) lastSeries = shown\n const focus = still ? -1 : (focused.value ?? -1)\n const fading = focus >= 0 && shown.some((s) => s.index === focus)\n const vector = isSvg(painter)\n // the one brought forward goes on top\n const order = fading\n ? [...shown.filter((s) => s.index !== focus), ...shown.filter((s) => s.index === focus)]\n : shown\n for (const s of order) {\n const view = radarView(r, dpr, vector)\n painter.save()\n if (fading && s.index !== focus) painter.globalAlpha = FADED\n s.kind.draw(painter, s, view)\n painter.restore()\n }\n}\n\n/** Draws the funnel, as it comes in: its bars grow from the middle. */\nfunction paintFunnel(painter: Painter, dpr: number, t: number, still = false) {\n const f = funnelLayout.value!\n const s = funnelSeries.value\n if (!s) return\n const shown = shownSeries(t)\n if (!still) lastSeries = shown\n const now = shown.find((one) => one.index === s.index) ?? s\n s.kind.draw(painter, now, funnelView(f, dpr, isSvg(painter)))\n}\n\n/**\n * A radar's ring values, drawn over the grid and under the series: ringed\n * with the surface so grid lines don't cut them, while the series' lines\n * pass over them unbroken.\n */\nfunction ringValues(painter: Painter, r: RadarLayout) {\n if (!r.values.length) return\n const ink = resolveColor('var(--dou-chart-label)')\n const surface = colors.value.surface\n if (isSvg(painter)) {\n painter.raw(\n r.values\n .map((tick) =>\n svgText(tick.text, tick.left, tick.top, { color: ink, size: 12, halo: surface }),\n )\n .join(''),\n )\n return\n }\n // only the canvas writes text itself: everything else draws shapes\n const ctx = painter as CanvasRenderingContext2D\n if (typeof ctx.fillText !== 'function') return\n const root = rootRef.value\n const family = root ? getComputedStyle(root).fontFamily : 'sans-serif'\n ctx.save()\n ctx.font = `12px ${family}`\n ctx.textBaseline = 'alphabetic'\n ctx.lineJoin = 'round'\n ctx.lineWidth = 3\n ctx.strokeStyle = surface\n ctx.fillStyle = ink\n for (const tick of r.values) {\n // the same baseline as the page's text and the SVG's\n const y = tick.top + 8 + 12 * 0.35\n ctx.strokeText(tick.text, tick.left, y)\n ctx.fillText(tick.text, tick.left, y)\n }\n ctx.restore()\n}\n\nconst holeRatio = computed(() => Math.min(0.95, Math.max(0, pie.value?.props.innerRadius ?? 0)))\n\n/** Whether an axis is drawn across the chart (along the bottom or top), so its grid lines stand up. */\nconst across = (axis: AxisLayout) => axis.position === 'bottom' || axis.position === 'top'\n\n/** The scales and room a series draws with; `vector` for an SVG, which takes no images. */\nfunction viewOf(s: ChartSeries, dpr = dprNow(), vector = false): ChartView | null {\n const r = radarLayout.value\n if (r) return radarView(r, dpr, vector)\n const f = funnelLayout.value\n if (f) return funnelView(f, dpr, vector)\n const l = layout.value\n if (!l) return null\n const y = l.y[s.axis]\n if (!y) return null\n const horizontal = !!props.horizontal\n const { plot } = l\n const xScale = l.x.scale\n const ys = y.scale\n const step = model.value.xStep\n const band =\n xScale.kind === 'category'\n ? xScale.step\n : step > 0\n ? step * Math.abs(xScale.k)\n : (horizontal ? plot.height : plot.width) / 8\n const point: ChartView['point'] = horizontal\n ? (x, value) => [ys.map(value), xScale.map(x)]\n : (x, value) => [xScale.map(x), ys.map(value)]\n return { x: xScale, y: ys, horizontal, band, point, plot, dpr, vector, colors: colors.value }\n}\n\n/** What a radar's series draw with: a spoke and a value give a point round the center. */\nfunction radarView(r: RadarLayout, dpr: number, vector: boolean): ChartView {\n const { cx, cy, radius, count, scale } = r\n const point: ChartView['point'] = (x, value) => {\n const angle = spokeAngle(x, count)\n const out = Math.max(0, scale.map(value))\n return [cx + Math.sin(angle) * out, cy - Math.cos(angle) * out]\n }\n return {\n x: linearScale([0, count], [0, Math.PI * 2]),\n y: scale,\n horizontal: false,\n band: 0,\n point,\n plot: { x: cx - radius, y: cy - radius, width: radius * 2, height: radius * 2 },\n dpr,\n vector,\n colors: colors.value,\n polar: { cx, cy, radius, count },\n }\n}\n\n/** What a funnel draws with: a stage and a value give the right end of its bar, at its middle. */\nfunction funnelView(f: FunnelLayout, dpr: number, vector: boolean): ChartView {\n const { plot, step, scale } = f\n const cx = plot.x + plot.width / 2\n return {\n x: linearScale([0, f.count], [plot.y, plot.y + plot.height]),\n y: scale,\n horizontal: false,\n band: step * FUNNEL_BAR,\n point: (x, value) => [cx + scale.map(value), plot.y + step * x + step / 2],\n plot,\n dpr,\n vector,\n colors: colors.value,\n }\n}\n\nconst dprNow = () => (typeof window === 'undefined' ? 1 : window.devicePixelRatio || 1)\n\n/** A canvas to draw faded series on, then onto the chart at once: a series sets its own alpha. */\nlet fadeLayer: HTMLCanvasElement | null = null\n\nconst markerColor = (tone: Tone) => markerColors.value[tone]\n\n/**\n * Draws the chart with axes. `still` draws it as it stands, without what\n * follows the pointer, the legend or a selection: for an SVG.\n */\nfunction paint(painter: Painter, dpr: number, t: number, entering: number, still = false) {\n const l = layout.value!\n const { plot } = l\n const c = colors.value\n const right = plot.x + plot.width\n const bottom = plot.y + plot.height\n // a heatmap's cells end the plot themselves: no line under them\n const xLine = !axes.value.x.hidden && !series.value.some((s) => s.kind.categoryY)\n const horizontal = !!props.horizontal\n\n // grid lines, under everything\n painter.save()\n painter.lineWidth = 1\n painter.strokeStyle = c.grid\n painter.beginPath()\n for (const axis of [l.x, l.y.y, l.y.y2]) {\n if (!axis?.grid) continue\n for (const tick of axis.ticks) {\n const at = crisp(axis.scale.map(tick), dpr)\n if (across(axis)) {\n // the line on the left is the x axis\n if (horizontal && xLine && at <= plot.x + 0.5) continue\n painter.moveTo(at, plot.y)\n painter.lineTo(at, bottom)\n } else {\n // the line at the bottom is the x axis\n if (!horizontal && xLine && at >= bottom - 0.5) continue\n painter.moveTo(plot.x, at)\n painter.lineTo(right, at)\n }\n }\n }\n painter.stroke()\n painter.restore()\n\n // bands, under the series\n const markers = placedMarkers.value\n drawMarkers(painter, markers, markerColor, dpr, true)\n\n // series, kept to the plot (with room for a line's width and a dot at the edge)\n const xRoom = xWindow.value ? 0 : 4\n const yRoom = zoomAxes.value.y && yWindow.value ? 0 : 4\n const clip = (target: Painter, s: ChartSeries) => {\n target.beginPath()\n // coming in: lines and points are drawn from the start of the x axis\n const reveal = s.kind.zero ? 1 : entering\n // zoomed in, what runs past the plot is cut at its edge\n const [ax, ay] = horizontal ? [yRoom, xRoom] : [xRoom, yRoom]\n const width = plot.width + ax * 2\n const height = plot.height + ay * 2\n if (horizontal) target.rect(plot.x - ax, plot.y - ay, width, height * reveal)\n else target.rect(plot.x - ax, plot.y - ay, width * reveal, height)\n target.clip()\n }\n const shown = shownSeries(t)\n if (!still) lastSeries = shown\n const focus = still ? -1 : (focused.value ?? pointed.value ?? -1)\n const fading = focus >= 0 && shown.some((s) => s.index === focus)\n const vector = isSvg(painter)\n /** Draws `s` faded, all at once; `false` where it can't be. */\n const drawFaded = (s: ChartSeries, view: ChartView) => {\n if (isSvg(painter)) {\n painter.layer(FADED, () => {\n painter.save()\n clip(painter, s)\n s.kind.draw(painter, s, view)\n painter.restore()\n })\n return true\n }\n const layer = fadeOn(painter as CanvasRenderingContext2D, l.width, l.height, dpr)\n if (!layer) return false\n layer.save()\n clip(layer, s)\n s.kind.draw(layer, s, view)\n layer.restore()\n painter.save()\n painter.globalAlpha = FADED\n painter.drawImage(layer.canvas, 0, 0, l.width, l.height)\n painter.restore()\n return true\n }\n // a selection: what is outside it is faded, with room past the plot's edges it reaches\n const kept = still ? null : dimmed.value\n const keep = kept && {\n x: kept.x <= plot.x ? kept.x - 4 : kept.x,\n y: kept.y <= plot.y ? kept.y - 4 : kept.y,\n right: kept.x + kept.width >= right ? right + 4 : kept.x + kept.width,\n bottom: kept.y + kept.height >= bottom ? bottom + 4 : kept.y + kept.height,\n }\n for (const s of shown) {\n const view = viewOf(s, dpr, vector)\n if (!view) continue\n if (fading && s.index !== focus && drawFaded(s, view)) continue\n if (keep && !drawFaded(s, view)) continue\n painter.save()\n clip(painter, s)\n if (keep) {\n painter.beginPath()\n painter.rect(keep.x, keep.y, keep.right - keep.x, keep.bottom - keep.y)\n painter.clip()\n }\n s.kind.draw(painter, s, view)\n painter.restore()\n }\n\n // the x axis line, and a line at 0 when the values cross it\n painter.save()\n painter.lineWidth = 1\n painter.strokeStyle = c.baseline\n painter.beginPath()\n if (xLine) {\n if (horizontal) {\n const x = crisp(plot.x, dpr)\n painter.moveTo(x, plot.y)\n painter.lineTo(x, bottom)\n } else {\n const y = crisp(bottom, dpr)\n painter.moveTo(plot.x, y)\n painter.lineTo(right, y)\n }\n }\n const primary = l.y.y ?? l.y.y2\n // categories along it (a heatmap's) have no 0\n const listed = model.value.yCategories[l.y.y ? 'y' : 'y2']\n if (primary && primary.scale.kind === 'linear' && !listed) {\n const [lo, hi] = primary.scale.domain\n if (lo < 0 && hi > 0) {\n const at = crisp(primary.scale.map(0), dpr)\n if (horizontal) {\n painter.moveTo(at, plot.y)\n painter.lineTo(at, bottom)\n } else {\n painter.moveTo(plot.x, at)\n painter.lineTo(right, at)\n }\n }\n }\n painter.stroke()\n painter.restore()\n\n // lines and points, over everything\n drawMarkers(painter, markers, markerColor, dpr, false)\n}\n\n/** A clear canvas the size of the chart to draw a faded series on; `null` where there is none. */\nfunction fadeOn(main: CanvasRenderingContext2D, width: number, height: number, dpr: number) {\n if (typeof document === 'undefined') return null\n fadeLayer ??= document.createElement('canvas')\n if (fadeLayer.width !== main.canvas.width) fadeLayer.width = main.canvas.width\n if (fadeLayer.height !== main.canvas.height) fadeLayer.height = main.canvas.height\n const ctx = fadeLayer.getContext('2d')\n if (!ctx) return null\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, width, height)\n return ctx\n}\n\n/* what is read out */\n\n/** A heatmap's values, as its `format` writes them. */\nfunction heatText(s: Pick<ChartSeries, 'props'>): (value: number) => string {\n return (\n (s.props.format as ((value: number) => string) | undefined) ??\n numberFormatFull(locale.value.name)\n )\n}\n\n/** The category down the value axis at `place` (a heatmap's row), as the axis writes it. */\nfunction yCategoryText(axis: ChartValueAxis, place: number): string {\n const label = model.value.yCategories[axis]?.[place] ?? ''\n const own = axes.value[axis]?.format\n return own ? own(label) : label\n}\n\n/** A change as text, with `+` before a rise (a fall has its minus already). */\nconst signed = (text: (value: number) => string, value: number) =>\n value > 0 ? `+${text(value)}` : text(value)\n\n/** Values as their axis shows them. */\nfunction valueText(axis: ChartValueAxis): (value: number) => string {\n return axes.value[axis]?.format ?? numberFormatFull(locale.value.name)\n}\n\n/**\n * A series' value at `row` as the tooltip writes it: a band's two ends, a\n * share of a whole stack with its value, or the value as its axis shows it.\n */\nfunction seriesText(s: ChartSeries, row: number): string {\n const y = s.y[row]!\n if (s.kind.categoryY) return heatText(s)(y)\n if (s.kind.box) {\n const box = boxes(s)[row]\n if (!box) return ''\n const text = valueText(s.axis)\n const m = messages.value\n const line = format(m.box, {\n median: text(box.median),\n q1: text(box.q1),\n q3: text(box.q3),\n low: text(box.low),\n high: text(box.high),\n })\n // the values past the whiskers too, as the tooltip lists them\n if (!box.outliers.length) return line\n return `${line}${m.itemSeparator}${format(m.boxOutliers, { count: box.outliers.length })} ${box.outliers.map(text).join(m.nameSeparator)}`\n }\n if (s.kind.waterfall) {\n const text = valueText(s.axis)\n if (isTotal(s, row)) return text(y)\n return format(messages.value.waterfallStep, {\n change: signed(text, y),\n total: text(s.top[row]!),\n })\n }\n if (s.base && !s.stackEnds) {\n const text = valueText(s.axis)\n return format(messages.value.band, { from: text(s.base[row]!), to: text(y) })\n }\n if (s.stackEnds && axes.value[s.axis] && declaredAxes.value[s.axis]?.percent)\n return format(messages.value.share, {\n value: numberFormatFull(locale.value.name)(y),\n share: percent.value.format(Math.abs(s.top[row]! - s.base![row]!)),\n })\n return valueText(s.axis)(y)\n}\n\n/** An x as the axis shows it, in full. */\nfunction xText(value: number): string {\n const m0 = model.value\n const name = locale.value.name\n const xFormat = axes.value.x.format\n if (m0.xKind === 'category') {\n const category = m0.categories[value] ?? ''\n return xFormat ? xFormat(category) : category\n }\n if (m0.xKind === 'time') {\n if (xFormat) return xFormat(new Date(value))\n // as precise as the time itself, and as its nearest neighbor needs\n let gap = Number.POSITIVE_INFINITY\n for (const s of series.value) gap = Math.min(gap, neighborGap(s.x.values, value))\n const { unit, digits } = timePrecision(value, gap)\n return timeFormatFull(name, unit, digits)(value)\n }\n if (xFormat) return xFormat(value)\n // whole numbers on the axis (years) read as the ticks show them\n return m0.xIntegers && m0.x\n ? numberTickFormat(name, m0.x, { years: true })(value)\n : numberFormatFull(name)(value)\n}\n\nconst label = computed(() => {\n if (props.ariaLabel) return props.ariaLabel\n const m = messages.value\n const name = locale.value.name\n const m0 = model.value\n if (empty.value) return format(m.summary, { chart: m.chart, series: m.empty })\n const td = tree.value && treeData.value\n if (td) {\n const value = numberFormatFull(name)\n const list = td.root.children\n .map((node) =>\n format(m.slice, {\n label: node.name,\n value: value(node.value),\n share: percent.value.format(node.value / td.root.value),\n }),\n )\n .join(m.listSeparator)\n const title = tree.value!.props.name\n return withKeys(\n format(m.summary, {\n chart: m.chart,\n series: title ? format(m.pie, { name: title, slices: list }) : list,\n }),\n )\n }\n const gauge = pie.value?.gauge?.()\n if (gauge) {\n const text = numberFormatFull(name)\n return format(m.summary, {\n chart: m.chart,\n series: format(pie.value!.props.name ? m.gauge : m.gaugeValue, {\n name: pie.value!.props.name ?? '',\n value: gauge.text,\n min: text(gauge.min),\n max: text(gauge.max),\n }),\n })\n }\n if (pie.value) {\n const value = numberFormatFull(name)\n const list = shownSlices.value\n .map((slice) =>\n format(m.slice, {\n label: slice.label,\n value: value(slice.value),\n share: percent.value.format(slice.share),\n }),\n )\n .join(m.listSeparator)\n const off = slices.value.length - shownSlices.value.length\n const shown = off ? `${list}${m.itemSeparator}${format(m.hiddenSlices, { count: off })}` : list\n const title = pie.value.props.name\n return withKeys(\n format(m.summary, {\n chart: m.chart,\n series: title ? format(m.pie, { name: title, slices: shown }) : shown,\n }),\n )\n }\n const fs = funnelSeries.value\n if (fs) {\n const stages = funnelStages.value\n .flatMap((stage, k) => {\n if (stage.row < 0) return []\n const value = seriesText(fs, stage.row)\n return stage.step === null\n ? [`${xText(k)} ${value}`]\n : [\n format(m.slice, {\n label: xText(k),\n value,\n share: `${m.stageRate} ${rate.value.format(stage.step)}`,\n }),\n ]\n })\n .join(m.listSeparator)\n return withKeys(\n format(m.summary, {\n chart: m.chart,\n series: format(m.pie, { name: fs.name, slices: stages }),\n }),\n )\n }\n const count = numberFormatFull(name)\n const parts = m0.series.map((s) => {\n if (s.input.kind.categoryY) return heatSummary(s)\n // a box plot reaches from its lowest value to its highest, outliers too\n let range = s.input.kind.box ? extent(s.top) : extent(s.y)\n // a band reaches down to its bottom\n const low = s.base && !s.stackEnds ? extent(s.base) : null\n if (range && low) range = [Math.min(range[0], low[0]), Math.max(range[1], low[1])]\n if (!range) return format(m.seriesEmpty, { name: s.name })\n let points = 0\n for (let i = 0; i < s.y.length; i++) if (s.y[i] === s.y[i]) points++\n // a percent axis writes shares; the values themselves are read out\n const text =\n s.stackEnds && declaredAxes.value[s.axis]?.percent\n ? numberFormatFull(name)\n : valueText(s.axis)\n const message = s.input.kind.box ? m.boxSeries : s.input.kind.xTitle ? m.binsSeries : m.series\n return format(message, {\n name: s.name,\n count: count(points),\n min: text(range[0]),\n max: text(range[1]),\n })\n })\n let chart = m.chart\n // a histogram's x runs from the start of its first bin to the end of its last\n const bins = m0.series.find((s) => s.input.kind.xTitle)?.rows as\n Array<{ x0: number; x1: number }> | undefined\n if (bins?.length) {\n chart = format(props.horizontal ? m.rangeDown : m.range, {\n chart: m.chart,\n from: xText(bins[0]!.x0),\n to: xText(bins[bins.length - 1]!.x1),\n })\n } else if (m0.x && !radar.value) {\n chart = format(props.horizontal ? m.rangeDown : m.range, {\n chart: m.chart,\n from: xText(m0.x[0]),\n to: xText(m0.x[1]),\n })\n }\n return withKeys(format(m.summary, { chart, series: parts.join(m.listSeparator) }))\n})\n\n/** What is read out for a heatmap: its size, its range, and where its largest value is. */\nfunction heatSummary(s: ModelSeries): string {\n const m = messages.value\n const count = numberFormatFull(locale.value.name)\n let top = -1\n for (let i = 0; i < s.y.length; i++)\n if (s.y[i] === s.y[i] && (top < 0 || s.y[i]! > s.y[top]!)) top = i\n const range = extent(s.y)\n if (!range || top < 0) return format(m.seriesEmpty, { name: s.name })\n const text = heatText(s.input)\n return format(m.heatmap, {\n name: s.name,\n columns: count(allX([s.x.values]).length),\n rows: count(model.value.yCategories[s.axis]?.length ?? 0),\n min: text(range[0]),\n max: text(range[1]),\n at: `${yCategoryText(s.axis, s.top[top]!)}${m.itemSeparator}${xText(s.x.values[top]!)}`,\n })\n}\n\n/* the table view: the data as rows and columns, in the chart's place */\n\n/** The most rows the table shows: more would take long to lay out, and to read. */\nconst TABLE_ROWS = 1000\n\n/** The table's head, and every row's cells (the first is the row's head). */\nconst tableCells = computed<{ head: string[]; rows: string[][] }>(() => {\n if (!props.table || empty.value) return { head: [], rows: [] }\n const m = messages.value\n const td = tree.value && treeData.value\n if (td) {\n const value = numberFormatFull(locale.value.name)\n return {\n head: [m.tableNode, tree.value!.props.name ?? m.tableValue, m.tableShare],\n rows: td.nodes\n .filter((node) => node.depth > 0)\n .map((node) => [\n treePath(node).join(' / '),\n value(node.value),\n percent.value.format(node.value / td.root.value),\n ]),\n }\n }\n const gauge = pie.value?.gauge?.()\n if (gauge) return { head: [pie.value!.props.name ?? m.tableValue], rows: [[gauge.text]] }\n if (pie.value) {\n const value = numberFormatFull(locale.value.name)\n const title =\n typeof (pie.value.props.label ?? props.x) === 'string'\n ? String(pie.value.props.label ?? props.x)\n : ''\n return {\n head: [title, pie.value.props.name ?? m.tableValue, m.tableShare],\n rows: shownSlices.value.map((slice) => [\n slice.label,\n value(slice.value),\n percent.value.format(slice.share),\n ]),\n }\n }\n const list = series.value\n const xHead = axes.value.x.title ?? (typeof props.x === 'string' ? props.x : '')\n // a funnel: each stage, its value and what it kept\n const fs = funnelSeries.value\n if (fs)\n return {\n head: [xHead, fs.name, m.stageRate, m.totalRate],\n rows: funnelStages.value.flatMap((stage, k) =>\n stage.row < 0\n ? []\n : [\n [\n xText(k),\n seriesText(fs, stage.row),\n stage.step === null ? '' : rate.value.format(stage.step),\n stage.total === null ? '' : rate.value.format(stage.total),\n ],\n ],\n ),\n }\n // a heatmap as its grid: a row per category down, a column per x\n const heat = list.find((s) => s.kind.categoryY)\n if (heat) {\n const xs = allX([heat.x.values])\n const down = model.value.yCategories[heat.axis] ?? []\n const cells = down.map(() => xs.map(() => ''))\n const text = heatText(heat)\n for (let i = 0; i < heat.y.length; i++) {\n const at = xs.indexOf(heat.x.values[i]!)\n const row = cells[heat.top[i]!]\n if (at >= 0 && row && heat.y[i] === heat.y[i]) row[at] = text(heat.y[i]!)\n }\n return {\n head: [axes.value[heat.axis]?.title ?? '', ...xs.map((x) => xText(x))],\n rows: down.map((_, k) => [yCategoryText(heat.axis, k), ...cells[k]!]),\n }\n }\n // points on their own (a scatter's): one row each, with its series\n if (list.some((s) => s.kind.tooltip === 'item')) {\n const rows: string[][] = []\n for (const s of list)\n for (let i = 0; i < s.y.length; i++) {\n const x = s.x.values[i]!\n if (x !== x || s.y[i] !== s.y[i]) continue\n rows.push([s.name, xText(x), seriesText(s, i)])\n }\n return { head: [m.tableSeries, xHead, axes.value.y?.title ?? m.tableValue], rows }\n }\n // each x a row, each series a column\n const xs = allX(list.map((s) => s.x.values))\n // a histogram's x is a bin: its row says the range, headed by what was counted\n const binned = list.find((s) => s.kind.xTitle)\n const xCell = (x: number) => {\n const row = binned ? rowAt(binned.x.values, x) : -1\n return binned && row >= 0 ? binned.kind.xTitle!(binned, row, xText) : xText(x)\n }\n const counted = binned?.props.value\n return {\n // a value's unit is in its axis' title (“销售额(万元)”): its column says it too\n head: [\n xHead || (typeof counted === 'string' ? counted : ''),\n ...list.map((s) => withUnit(s.name, axes.value[s.axis]?.title)),\n ],\n rows: xs.map((x) => [\n xCell(x),\n ...list.map((s) => {\n const row = rowAt(s.x.values, x)\n return row < 0 || s.y[row] !== s.y[row] ? '' : seriesText(s, row)\n }),\n ]),\n }\n})\n\n/** `name` with the unit at the end of `title` (in brackets), if it hasn't one already. */\nfunction withUnit(name: string, title: string | undefined): string {\n const unit = title && /\\s*[((][^()()]+[))]\\s*$/.exec(title)?.[0].trim()\n return unit && !name.endsWith(unit) ? `${name}${unit}` : name\n}\n\n/** The table's caption: the chart's name, else what its series are. */\nconst tableCaption = computed(() => {\n if (props.ariaLabel) return props.ariaLabel\n const m = messages.value\n const names = pie.value\n ? [pie.value.props.name].filter((name): name is string => !!name)\n : series.value.map((s) => s.name)\n return names.length ? format(m.tableOf, { names: names.join(m.nameSeparator) }) : m.table\n})\n\nconst table: TableState = {\n shown: computed(() => !!props.table && !fromServer.value),\n caption: tableCaption,\n head: computed(() => tableCells.value.head),\n rows: computed(() => tableCells.value.rows.slice(0, TABLE_ROWS)),\n more: computed(() => {\n const count = tableCells.value.rows.length\n if (count <= TABLE_ROWS) return ''\n const number = numberFormatFull(locale.value.name)\n return format(messages.value.tableMore, { shown: number(TABLE_ROWS), count: number(count) })\n }),\n close: () => {\n emit('update:table', false)\n // back on the chart, where the keys were\n rootRef.value?.focus()\n },\n}\n\n/** The summary, and how to explore it when the chart can be. */\nfunction withKeys(summary: string): string {\n if (!interactive.value) return summary\n return format(zoomOn.value ? messages.value.zoomKeys : messages.value.keys, { summary })\n}\n\nconst labels = computed(() => {\n const f = funnelLayout.value\n if (f)\n return [\n ...f.names.map((tick, i) => ({ ...tick, key: `stage:${i}`, axis: 'stage' })),\n ...f.values.map((tick, i) => ({ ...tick, key: `value:${i}`, axis: 'value' })),\n ...f.rates.map((tick, i) => ({ ...tick, key: `rate:${i}`, axis: 'rate' })),\n ]\n const r = radarLayout.value\n // the rings' values are drawn with the grid, under the series (see `ringValues`)\n if (r) return r.labels.map((tick, i) => ({ ...tick, key: `spoke:${i}`, axis: 'spoke' }))\n const l = layout.value\n if (!l) return []\n const out: Array<TickLabel & { key: string; axis: string }> = []\n for (const axis of [l.x, l.y.y, l.y.y2]) {\n if (!axis) continue\n axis.labels.forEach((tick, i) =>\n out.push({ ...tick, key: `${axis.position}:${i}`, axis: axis.position }),\n )\n }\n return out\n})\n\nconst legend = computed(() => {\n const l =\n layout.value ?? pieLayout.value ?? treeLayout.value ?? radarLayout.value ?? funnelLayout.value\n if (!l) return []\n return l.legend.map((item) => ({ ...item, ...legendEntries.value[item.index]! }))\n})\n\nconst titles = computed(() => {\n const l = layout.value\n if (!l) return []\n return [l.x, l.y.y, l.y.y2].flatMap((axis) =>\n axis?.title ? [{ key: axis.position, ...axis.title }] : [],\n )\n})\n\n/** The size of what is drawn: a chart with axes, or a pie. */\nconst frame = computed(\n () =>\n layout.value ?? pieLayout.value ?? treeLayout.value ?? radarLayout.value ?? funnelLayout.value,\n)\n\nconst overlay: OverlayState = {\n // while the server's drawing shows, its own text does\n shown: computed(() => !!frame.value && !empty.value && !fromServer.value),\n labels,\n titles,\n legend,\n legendBox: computed(\n () =>\n (\n layout.value ??\n pieLayout.value ??\n treeLayout.value ??\n radarLayout.value ??\n funnelLayout.value\n )?.legendBox,\n ),\n hole: computed(() => {\n const tl = treeLayout.value\n if (tl && tree.value?.shape === 'sunburst' && tl.inner > 0 && !empty.value && !fromServer.value)\n return { left: tl.cx, top: tl.cy, width: tl.inner * 2 * 0.8 }\n const l = pieLayout.value\n if (!l || empty.value || fromServer.value || !(holeRatio.value > 0)) return null\n // a half donut opening downward: what goes in it sits on its flat edge\n const box = arcBox(pieArc.value[0], pieArc.value[1])\n return {\n left: l.cx,\n top: l.cy,\n width: l.radius * holeRatio.value * 2 * 0.8,\n above: box.bottom < 0.01,\n }\n }),\n // the pie's default slot\n center: () => pie.value?.center() ?? tree.value?.center?.(),\n toggle,\n isolate,\n hint: computed(() => messages.value.legendHint),\n focus: (index) => (focused.value = index),\n data: dataLabels,\n dataShown: computed(() => labelsShown.value),\n dataFocus: computed(() => (pie.value ? null : (focused.value ?? pointed.value))),\n markers: markerLabels,\n empty: computed(() => empty.value && !props.loading),\n emptyContent: () => (slots.empty?.() as VNodeChild) ?? messages.value.empty,\n loading: computed(() => !!props.loading),\n}\n\n/* the range strip: all of x, small, with the part shown */\n\nconst stripState = computed(() => {\n const l = layout.value\n if (!l?.strip || !rangePart.value) return null\n const [f0, f1] = l.x.full\n const [d0, d1] = l.x.scale.domain\n const span = f1 - f0 || 1\n return {\n rect: l.strip,\n horizontal: !!props.horizontal,\n from: Math.max(0, (d0 - f0) / span),\n to: Math.min(1, (d1 - f0) / span),\n }\n})\n\n/**\n * What the strip's sketch is drawn from: its box, all of x and each y axis'\n * whole span. Kept the same object while they stay, so panning, which only\n * moves the shown part, doesn't draw the sketch again.\n */\ninterface StripSketch {\n rect: Rect\n x: Window\n y: Record<string, { full: Window; log: boolean }>\n}\n\nconst sameWindow = (a: Window, b: Window) => a[0] === b[0] && a[1] === b[1]\n\nconst stripSketch = computed<StripSketch | null>((old) => {\n const l = layout.value\n if (!l?.strip || !rangePart.value) return null\n const next: StripSketch = { rect: l.strip, x: l.x.full, y: {} }\n for (const [name, axis] of Object.entries(l.y)) {\n if (axis) next.y[name] = { full: axis.full, log: axis.scale.kind === 'log' }\n }\n if (\n old &&\n old.rect.x === next.rect.x &&\n old.rect.y === next.rect.y &&\n old.rect.width === next.rect.width &&\n old.rect.height === next.rect.height &&\n sameWindow(old.x, next.x) &&\n Object.keys(old.y).length === Object.keys(next.y).length &&\n Object.entries(next.y).every(([name, axis]) => {\n const was = old.y[name]\n return !!was && was.log === axis.log && sameWindow(was.full, axis.full)\n })\n )\n return old\n return next\n})\n\n/** Draws every series shown on the strip, in one quiet ink, over all of x. */\nfunction paintStrip(canvas: HTMLCanvasElement) {\n const sketch = stripSketch.value\n if (!sketch) return\n const strip = sketch.rect\n void themeVersion.value\n const dpr = dprNow()\n const width = Math.round(strip.width * dpr)\n const height = Math.round(strip.height * dpr)\n if (canvas.width !== width) canvas.width = width\n if (canvas.height !== height) canvas.height = height\n canvas.style.width = `${strip.width}px`\n canvas.style.height = `${strip.height}px`\n const ctx = canvas.getContext('2d')\n if (!ctx) return\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, strip.width, strip.height)\n drawStrip(ctx, sketch, dpr)\n}\n\n/** The strip's sketch, in the strip's own px. */\nfunction drawStrip(ctx: Painter, sketch: StripSketch, dpr: number) {\n const strip = sketch.rect\n const horizontal = !!props.horizontal\n // in the strip's own px, a little in from its edges\n const pad = 4\n const plot: Rect = { x: 0, y: 0, width: strip.width, height: strip.height }\n const along: [number, number] = horizontal ? [0, strip.height] : [0, strip.width]\n const m = model.value\n const x =\n m.xKind === 'category'\n ? categoryScale(m.categories, along)\n : linearScale(sketch.x, along, m.xKind === 'time' ? 'time' : 'linear')\n const ink = resolveColor('var(--dou-chart-range-ink)')\n const length = horizontal ? strip.height : strip.width\n for (const s of series.value) {\n const axis = sketch.y[s.axis]\n if (!axis) continue\n const span: [number, number] = horizontal ? [pad, strip.width - pad] : [strip.height - pad, pad]\n // the data's own span, so the sketch fills the strip\n const data = m.y[s.axis] ?? axis.full\n const ends: Window = m.zero[s.axis]\n ? [Math.min(0, data[0]), Math.max(0, data[1])]\n : [data[0], data[1] > data[0] ? data[1] : data[0] + 1]\n const y = axis.log ? logScale(axis.full, span) : linearScale(ends, span)\n const step = m.xStep\n const band = x.kind === 'category' ? x.step : step > 0 ? step * Math.abs(x.k) : length / 8\n const view: ChartView = {\n x,\n y,\n horizontal,\n band,\n point: horizontal\n ? (v, value) => [y.map(value), x.map(v)]\n : (v, value) => [x.map(v), y.map(value)],\n plot,\n dpr,\n vector: isSvg(ctx),\n colors: colors.value,\n }\n ctx.save()\n ctx.beginPath()\n ctx.rect(0, 0, strip.width, strip.height)\n ctx.clip()\n // thin and without dots: a sketch of the data, not the data\n s.kind.draw(ctx, { ...s, color: ink, props: { ...s.props, dots: false, lineWidth: 1 } }, view)\n ctx.restore()\n }\n}\n\nconst zoomLayer: ZoomLayerState = {\n brush: computed(() => brushDraft.value ?? selection.value),\n strip: stripState,\n sketch: stripSketch,\n least: computed(() => {\n const l = layout.value\n if (!l) return 0\n const span = l.x.full[1] - l.x.full[0]\n return span > 0 ? Math.min(1, leastX.value / span) : 1\n }),\n step: computed(() => {\n const l = layout.value\n const m = model.value\n if (!l || m.xKind !== 'category') return 0.01\n return 1 / Math.max(1, l.x.full[1] - l.x.full[0])\n }),\n texts: computed(() => {\n const l = layout.value\n if (!l) return ['', '']\n const m = model.value\n const [from, to] = l.x.scale.domain\n if (m.xKind === 'category') {\n const [a, b] = windowToInterval([from, to], m.xKind, m.categories)\n return [String(a), String(b)]\n }\n return [xText(from), xText(to)]\n }),\n labels: computed(() => [messages.value.rangeStart, messages.value.rangeEnd]),\n show: (from, to, settle) => {\n const l = layout.value\n if (!l) return\n const [f0, f1] = l.x.full\n const span = f1 - f0\n showX([f0 + from * span, f0 + to * span], settle)\n },\n reset: () => showX(null),\n start: () => setActive(null, null),\n paint: paintStrip,\n}\n\n/* the chart as an SVG: drawn by the same code as the canvas, with its text */\n\nconst uid = useId()\nlet drawings = 0\n\nconst SRGB = /^(#|rgba?\\()/\nlet normalizer: CanvasRenderingContext2D | null | undefined\n\n/**\n * A computed color as `#rrggbb` or `rgba(…)`, which every SVG reader\n * understands. Colors a canvas keeps in another space (`oklab(…)`) are\n * painted on a pixel and read back.\n */\nfunction plainColor(color: string): string {\n if (SRGB.test(color) || typeof document === 'undefined') return color\n normalizer ??= document.createElement('canvas').getContext('2d', { willReadFrequently: true })\n if (!normalizer) return color\n normalizer.fillStyle = '#000'\n normalizer.fillStyle = color\n const parsed = String(normalizer.fillStyle)\n if (SRGB.test(parsed)) return parsed\n normalizer.clearRect(0, 0, 1, 1)\n normalizer.fillRect(0, 0, 1, 1)\n const [r, g, b, alpha] = normalizer.getImageData(0, 0, 1, 1).data\n return alpha === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${num(alpha! / 255)})`\n}\n\n/** Room either side of a marker's label on its backdrop. */\nconst BACKDROP = 4\n\ninterface TextStyle {\n color: string\n size: number\n weight?: string\n anchor?: 'start' | 'middle' | 'end'\n /** A ring of this color round the letters, so lines under them don't cut them. */\n halo?: string\n}\n\n/** A line of text whose 16px box starts at `top`, centered on its cap height as in the page. */\nfunction svgText(text: string, x: number, top: number, style: TextStyle): string {\n let attributes = ` x=\"${num(x)}\" y=\"${num(top + 8 + style.size * 0.35)}\"${paintAttribute('fill', style.color)}`\n if (style.size !== 12) attributes += ` font-size=\"${num(style.size)}\"`\n if (style.weight && style.weight !== '400' && style.weight !== 'normal')\n attributes += ` font-weight=\"${style.weight}\"`\n if (style.anchor && style.anchor !== 'start') attributes += ` text-anchor=\"${style.anchor}\"`\n if (style.halo)\n attributes += `${paintAttribute('stroke', style.halo)} stroke-width=\"3\" stroke-linejoin=\"round\" paint-order=\"stroke\"`\n return `<text${attributes}>${escapeXml(text)}</text>`\n}\n\n/** `text` cut short with an ellipsis to fit `width`, as a clipped tick label shows. */\nfunction fitText(text: string, width: number): string {\n if (measure(text) <= width) return text\n const chars = [...text]\n let end = chars.length\n while (end > 0 && measure(`${chars.slice(0, end).join('')}…`) > width) end--\n return `${chars.slice(0, end).join('')}…`\n}\n\n/** A legend entry's swatch, as the page draws it. */\nfunction swatch(kind: string, dashed: boolean, left: number, top: number, color: string): string {\n const fill = paintAttribute('fill', color)\n const box = (x: number, y: number, width: number, height: number, r: number) =>\n `<rect x=\"${num(x)}\" y=\"${num(y)}\" width=\"${width}\" height=\"${height}\" rx=\"${r}\"${fill}/>`\n if (kind === 'area' || kind === 'radar') return box(left, top + 4, 12, 8, 2)\n if (kind === 'bar' || kind === 'pie') return box(left + 2, top + 4, 8, 8, 2)\n if (kind === 'scatter') return `<circle cx=\"${num(left + 6)}\" cy=\"${num(top + 8)}\" r=\"4\"${fill}/>`\n if (dashed) return box(left, top + 7, 4, 2, 0) + box(left + 7, top + 7, 4, 2, 0)\n return box(left, top + 7, 12, 2, 1)\n}\n\n/** A heatmap's scale in the legend, as the page draws it. */\nfunction scaleSwatch(\n svg: SvgPainter,\n stops: string[],\n left: number,\n top: number,\n width: number,\n): string {\n const id = svg.id('scale')\n const marks = stops\n .map(\n (stop, i) =>\n `<stop offset=\"${num(i / Math.max(1, stops.length - 1))}\"${paintAttribute('stop-color', stop)}/>`,\n )\n .join('')\n return `<defs><linearGradient id=\"${id}\">${marks}</linearGradient></defs><rect x=\"${num(left)}\" y=\"${num(top + 4)}\" width=\"${width}\" height=\"8\" rx=\"2\" fill=\"url(#${id})\"/>`\n}\n\n/** The texts in an element of the chart (a donut's center), where the page shows them. */\nfunction textsIn(el: Element, origin: DOMRect, color: (css: string) => string): string {\n const out: string[] = []\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT)\n const range = document.createRange()\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const text = node.textContent?.trim()\n const parent = node.parentElement\n if (!text || !parent) continue\n range.selectNodeContents(node)\n const box = range.getBoundingClientRect()\n if (!box.width) continue\n const style = getComputedStyle(parent)\n const fontSize = Number.parseFloat(style.fontSize) || 12\n out.push(\n svgText(text, box.left - origin.left, box.top - origin.top + box.height / 2 - 8, {\n color: color(style.color),\n size: fontSize,\n weight: style.fontWeight,\n }),\n )\n }\n return out.join('')\n}\n\n/** A filled box; nothing when it has no room. */\nconst svgBox = (r: Rect, fill: string) =>\n r.width > 0 && r.height > 0\n ? `<rect x=\"${num(r.x)}\" y=\"${num(r.y)}\" width=\"${num(r.width)}\" height=\"${num(r.height)}\"${paintAttribute('fill', fill)}/>`\n : ''\n\n/** The range strip: its sketch, the parts not shown washed out and the part shown. */\nfunction stripMarkup(svg: SvgPainter, color: (css: string) => string, radius: number) {\n const state = stripState.value\n const sketch = stripSketch.value\n if (!state || !sketch) return\n const { rect, horizontal } = state\n const box = svgBox\n svg.raw(\n `<rect x=\"${num(rect.x + 0.5)}\" y=\"${num(rect.y + 0.5)}\" width=\"${num(rect.width - 1)}\" height=\"${num(rect.height - 1)}\" rx=\"${num(Math.max(0, radius - 0.5))}\" fill=\"none\"${paintAttribute('stroke', color('var(--dou-color-border-subtle)'))}/>`,\n )\n svg.raw(`<g transform=\"translate(${num(rect.x)} ${num(rect.y)})\">`)\n svg.layer(0.56, () => drawStrip(svg, sketch, 1))\n svg.raw('</g>')\n const length = horizontal ? rect.height : rect.width\n const start = horizontal ? rect.y : rect.x\n const a = start + state.from * length\n const b = start + state.to * length\n const stretch = (from: number, to: number): Rect =>\n horizontal\n ? { x: rect.x, y: from, width: rect.width, height: to - from }\n : { x: from, y: rect.y, width: to - from, height: rect.height }\n const shade = color('color-mix(in oklab, var(--dou-chart-surface) 72%, transparent)')\n const edge = color('color-mix(in oklab, var(--dou-color-text) 32%, transparent)')\n const shown = stretch(a, b)\n svg.raw(\n box(stretch(start, a), shade) +\n box(stretch(b, start + length), shade) +\n box(shown, color('color-mix(in oklab, var(--dou-color-text) 6%, transparent)')),\n )\n const edges = horizontal\n ? [\n { x: shown.x, y: shown.y, width: 1, height: shown.height },\n { x: shown.x + shown.width - 1, y: shown.y, width: 1, height: shown.height },\n ]\n : [\n { x: shown.x, y: shown.y, width: shown.width, height: 1 },\n { x: shown.x, y: shown.y + shown.height - 1, width: shown.width, height: 1 },\n ]\n svg.raw(edges.map((r) => box(r, edge)).join(''))\n}\n\n/** The chart as it is shown, as an SVG document. */\nfunction exportSVG(options: ChartExportOptions = {}): string {\n const root = rootRef.value\n const style = root && typeof getComputedStyle !== 'undefined' ? getComputedStyle(root) : null\n const svg = new SvgPainter(`${uid}-${drawings++}-`, plainColor)\n const color = (css: string) => plainColor(resolveColor(css))\n drawSvg(svg, color, style)\n const { width, height, padding } = exportSize(options)\n const background =\n options.background === false\n ? ''\n : `<rect width=\"${num(width)}\" height=\"${num(height)}\"${paintAttribute('fill', color('var(--dou-chart-surface)'))}/>`\n const font = escapeXml(style?.fontFamily || 'sans-serif')\n return (\n `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${num(width)}\" height=\"${num(height)}\" viewBox=\"0 0 ${num(width)} ${num(height)}\" font-family=\"${font}\" font-size=\"12\">` +\n `<title>${escapeXml(label.value)}</title>${background}` +\n `<g transform=\"translate(${num(padding)} ${num(padding)})\">${svg.markup()}</g></svg>`\n )\n}\n\n/** The exported image's size: the chart's, with the room around it. */\nfunction exportSize(options: ChartExportOptions) {\n const padding = Math.max(0, options.padding ?? 16)\n return {\n width: (frame.value?.width ?? 0) + padding * 2,\n height: (frame.value?.height ?? 0) + padding * 2,\n padding,\n }\n}\n\n/**\n * Draws the whole chart into `svg`: what the canvas shows, then its text.\n * `color` makes a color the SVG can take; `style` is the chart's computed\n * style, `null` on the server.\n */\nfunction drawSvg(\n svg: SvgPainter,\n color: (css: string) => string,\n style: CSSStyleDeclaration | null,\n) {\n const l = frame.value\n const root = rootRef.value\n const width = l?.width ?? 0\n const height = l?.height ?? 0\n const texts: string[] = []\n if (l && empty.value) {\n // what the page shows instead: the empty message\n const text =\n root?.querySelector(`.${ns.e('empty')}`)?.textContent?.trim() || messages.value.empty\n texts.push(\n svgText(text, width / 2, height / 2 - 8, {\n color: color('var(--dou-color-text-tertiary)'),\n size: Number.parseFloat(style?.getPropertyValue('--dou-font-size-sm') ?? '') || 12,\n anchor: 'middle',\n }),\n )\n } else if (treeLayout.value) {\n paintTree(svg, 1, true)\n const center = root?.querySelector(`.${ns.e('center')}`)\n if (center && root) texts.push(textsIn(center, root.getBoundingClientRect(), color))\n } else if (pieLayout.value) {\n paintPie(svg, 1, 1, true)\n const center = root?.querySelector(`.${ns.e('center')}`)\n if (center && root) texts.push(textsIn(center, root.getBoundingClientRect(), color))\n } else if (funnelLayout.value) {\n paintFunnel(svg, 1, 1, true)\n const ink = color('var(--dou-chart-label)')\n const strong = color('var(--dou-color-text-secondary)')\n for (const tick of labels.value) {\n const text = tick.clipped ? fitText(tick.text, tick.width) : tick.text\n texts.push(\n svgText(text, tick.left, tick.top, {\n color: tick.axis === 'value' ? strong : ink,\n size: 12,\n }),\n )\n }\n } else if (radarLayout.value) {\n paintRadar(svg, 1, 1, true)\n const ink = color('var(--dou-chart-label)')\n for (const tick of labels.value) {\n const text = tick.clipped ? fitText(tick.text, tick.width) : tick.text\n texts.push(svgText(text, tick.left, tick.top, { color: ink, size: 12 }))\n }\n } else if (layout.value) {\n paint(svg, 1, 1, 1, true)\n const radius = Number.parseFloat(style?.getPropertyValue('--dou-radius-control') ?? '') || 6\n stripMarkup(svg, color, radius)\n const ink = color('var(--dou-chart-label)')\n for (const tick of labels.value) {\n const text = tick.clipped ? fitText(tick.text, tick.width) : tick.text\n texts.push(svgText(text, tick.left, tick.top, { color: ink, size: 12 }))\n }\n const title = color('var(--dou-chart-title)')\n const weight = style?.getPropertyValue('--dou-font-weight-medium').trim() || '500'\n for (const t of titles.value)\n texts.push(\n svgText(t.text, t.left, t.top, { color: title, size: 12, weight, anchor: t.align }),\n )\n for (const m of markerLabels.value) {\n if (m.backdrop) {\n // the page's 4px either side of the text, rounded\n const plate = measure(m.text) + BACKDROP * 2\n const shift =\n m.align === 'start'\n ? 0\n : m.align === 'middle'\n ? plate / 2 - BACKDROP\n : plate - BACKDROP * 2\n texts.push(\n `<rect x=\"${num(m.left - BACKDROP - shift)}\" y=\"${num(m.top)}\" width=\"${num(plate)}\" height=\"16\" rx=\"4\"${paintAttribute('fill', color(`color-mix(in oklab, ${markerText(m.tone)} 10%, var(--dou-chart-surface))`))}/>`,\n )\n }\n texts.push(\n svgText(m.text, m.left, m.top, {\n color: color(markerText(m.tone)),\n size: 12,\n anchor: m.align,\n }),\n )\n }\n }\n // data labels, as the page shows them once they have come in\n if (l && !empty.value) {\n const ink = color('var(--dou-color-text-secondary)')\n const weight = style?.getPropertyValue('--dou-font-weight-medium').trim() || '500'\n for (const value of dataLabels.value) {\n const text = value.width === undefined ? value.text : fitText(value.text, value.width)\n texts.push(\n svgText(text, value.left, value.top, {\n color: value.ink ? color(value.ink) : ink,\n size: 12,\n anchor: value.align,\n weight: value.on ? weight : undefined,\n }),\n )\n }\n }\n const on = color('var(--dou-color-text-secondary)')\n const off = color('var(--dou-color-text-disabled)')\n // the entries in sight: where they scroll, those at the top\n const box = l?.legendBox\n for (const item of legend.value) {\n if (box && item.top + 16 > box.y + box.height + 0.5) continue\n const room = (item.swatch ?? 12) + 6\n const mark = item.scale\n ? scaleSwatch(svg, item.scale, item.left, item.top, item.swatch ?? HEAT_SWATCH)\n : swatch(item.kind, item.dashed, item.left, item.top, color(item.color))\n texts.push(item.off ? `<g opacity=\"0.32\">${mark}</g>` : mark)\n const text = item.clipped ? fitText(item.text, item.width - room) : item.text\n texts.push(svgText(text, item.left + room, item.top, { color: item.off ? off : on, size: 12 }))\n }\n svg.raw(texts.join(''))\n}\n\nconst PNG_SOURCE = { scope: '@dou-ui/chart', hint: 'use a smaller padding or exportSVG()' }\n\n/** The chart as a PNG image, from its SVG. */\nasync function exportPNG(options: ChartImageOptions = {}): Promise<Blob> {\n const { width, height } = exportSize(options)\n return svgToPNG(exportSVG(options), {\n width,\n height,\n pixelRatio: options.pixelRatio,\n ...PNG_SOURCE,\n })\n}\n\ndefineExpose<ChartExpose>({ exportSVG, exportPNG })\n\n/*\n * On the server: the chart as an SVG, its text too, in the theme's\n * variables so it follows the theme like the page. It scales to fit the\n * chart's box, whose width the server can't know.\n */\nconst serverDrawing = computed(() => {\n if (typeof window !== 'undefined' || !frame.value || empty.value) return ''\n const svg = new SvgPainter(`${uid}-`)\n drawSvg(svg, (css) => resolveColor(css), null)\n return svg.markup()\n})\n\nconst staticState: StaticState = {\n shown: computed(() => fromServer.value && !!frame.value && !empty.value),\n size: computed(() => ({ width: frame.value?.width ?? 0, height: frame.value?.height ?? 0 })),\n markup: serverDrawing,\n label,\n}\n\n/** Which ways on the screen what is shown can be moved: only when zoomed in along them. */\nfunction panDirections() {\n const { x, y } = zoomAxes.value\n const panX = x && !!xWindow.value\n const panY = y && !!yWindow.value\n return props.horizontal ? { sideways: panY, upDown: panX } : { sideways: panX, upDown: panY }\n}\n\n/** Which way a finger may scroll the page over the plot: not the way it pans. */\nconst touchAction = computed(() => {\n if (!zoomOn.value) return undefined\n const { sideways, upDown } = panDirections()\n // two fingers always zoom the chart, not the page\n return sideways && upDown ? 'none' : sideways ? 'pan-y' : upDown ? 'pan-x' : 'pan-x pan-y'\n})\n\nonBeforeUnmount(() => {\n if (drag) endDrag(false)\n if (gestureFrame) cancelAnimationFrame(gestureFrame)\n})\n\nconst cssLength = (value: number | string) => (typeof value === 'number' ? `${value}px` : value)\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[\n ns.b(),\n ns.is('interactive', interactive),\n ns.is('zoomed', zoomOn && zoomed),\n ns.is('brushing', !!brushPart && !zoomOn),\n ns.is('loading', !!loading),\n ns.is('table', table.shown.value),\n ]\"\n :style=\"{ height: cssLength(height), touchAction }\"\n :role=\"fromServer ? undefined : interactive || table.shown.value ? 'group' : 'img'\"\n :aria-roledescription=\"interactive && !fromServer ? messages.chart : undefined\"\n :aria-label=\"fromServer ? undefined : label\"\n :aria-busy=\"loading || undefined\"\n :tabindex=\"interactive && !fromServer ? 0 : undefined\"\n @pointermove=\"onPointerMove\"\n @pointerleave=\"onPointerLeave\"\n @pointerdown=\"onPointerDown\"\n @pointerup=\"onPointerUp\"\n @pointercancel=\"onPointerCancel\"\n @keydown=\"onKeydown\"\n @click=\"onClick\"\n @wheel=\"onWheel\"\n @dblclick=\"onDblclick\"\n @blur=\"active && !active.pointer && setActive(null, null)\"\n >\n <div :class=\"ns.e('parts')\" hidden><slot /></div>\n <canvas ref=\"canvas\" :class=\"ns.e('canvas')\" aria-hidden=\"true\" />\n <!-- after the parts: on the server they are known only once their slot has rendered -->\n <ChartStatic :state=\"staticState\" />\n <ChartOverlay :state=\"overlay\" />\n <ChartZoomLayer :state=\"zoomLayer\" />\n <ChartPointer :state=\"pointer\" />\n <ChartTable :state=\"table\" />\n </div>\n</template>\n"],"mappings":"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"}
|